diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a7b50b96 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +Route4MeSDK.sln +Route4MeSDKTest/Route4MeSDKTest.csproj +*.userprefs +/**/obj/ +/packages/ diff --git a/.nuget/packages.config b/.nuget/packages.config new file mode 100644 index 00000000..18f45ea6 --- /dev/null +++ b/.nuget/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..b04e7dd9 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,26 @@ +# ============================================================================= +# Access Route4Me's logistics-as-a-service API using our C# SDK +# +# Copyright (C) 2016-2017 Route4Me +# +# ============================================================================= + +sudo: false +language: csharp +solution: Route4MeSDK.sln + +mono: + - latest + - 3.8.0 +# - 2.10.8 # fails: https://travis-ci.org/maxkoryukov/route4me-csharp-sdk/jobs/194265821 + +# dotnet: +# - 1.0.0-preview2-003121 + +cache: + directories: + - packages + +script: + - xbuild /p:Configuration=Release Route4MeSDK.sln + - mono ./packages/NUnit.ConsoleRunner.3.6.0/tools/nunit3-console.exe ./Route4MeSDKTest/bin/Debug/Route4MeSDKTest.exe diff --git a/README.md b/README.md new file mode 100755 index 00000000..71fe84f7 --- /dev/null +++ b/README.md @@ -0,0 +1,223 @@ +# Route4Me Route Optimization SaaS C# SDK + +[![Build Status](https://travis-ci.org/route4me/route4me-csharp-sdk.svg?branch=master)](https://travis-ci.org/route4me/route4me-csharp-sdk) +[![Build status](https://ci.appveyor.com/api/projects/status/8iq2b0ctti0lw79k?svg=true)](https://ci.appveyor.com/project/novapulsar/route4me-csharp-sdk) + + +### What does the Route4Me SDK permit me to do? +This SDK makes it easier for you use the Route4Me API, which creates optimally sequenced driving routes for many drivers. + +### Who can use the Route4Me SDK (and API)? +The service is typically used by organizations who must route many drivers to many destinations. In addition to route optimization for new (future) routes, the API can also be used to analyze historical routes, and to distribute routes to field personnel. + +### Who is prohibited from using the Route4Me SDK (and API)? +The Route4Me SDK and API cannot be resold or used in a product or system that competes directly with Route4Me. This means that developers cannot resell route optimization services to other businesses or developers. However, developers can integrate our route optimization SDK/API into their software applications. Developers and startups are also permitted to use our software for internal purposes (i.e. a same day delivery startup). + + +### How does the API/SDK Integration Work? +A Route4Me customer, integrator, or partner incorporates the Route4Me SDK or API into their code base. +Route4Me permits any paying subscriber to interact with every part of its system using it’s API. +The API is RESTful, which means that it’s web based and can be accessed by other programs and machines +The API/SDK should be used to automate the route planning process, or to generate many routes with minimal manual intervention + + + +### Do optimized routes automatically appear inside my Route4Me account? +Every Route4Me SDK instance needs a unique API key. The API key can be retrieved inside your Route4Me.com account, inside the Settings tab called API. When a route is planned, it appears inside the corresponding Route4Me account. Because Route4Me web and mobile accounts are synchronized, the routes will appear in both environments at the same time. + +### Can I test the SDK with other addresses without a valid API Key? +No. The sample API key only permits you to optimize routes with the sample address coordinates that are part of this SDK. + +### Does the SDK have rate limits? +The number of requests you can make per second is limited by your current subscription plan. Typically, there are different rate limits for these core features: +Address Geocoding & Address Reverse Geocoding +Route Optimization & Management +Viewing a Route + +### What is the recommended architecture for the Route4Me SDK? +There are two typical integration strategies that we recommend. Using this SDK, you can make optimization requests and then the SDK polls the Route4Me API to detect state changes as the optimization progresses. Alternatively, you can provide a webhook/callback url, and the API will notify that callback URL every time there is a state change. + +### I don't need route management or mobile capabilities. Is there a lower level Route4Me API just for the optimization engine? +Yes. Please contact support@route4me.com to learn about the low-level RESTful API. + +### How fast is the route Route4Me Optimization Web Service? +Most routes having less than 200 destinations are optimized in 1 second or less. + +### Can I disable optimization when planning routes? +Yes. You can send routes with optimization disabled if you want to conveniently see them on a map, or distribute them to your drivers in the order you prefer. + +### Can the API be used for aerial vehicles such as drones or self-driving cars? +Yes. The API can accept lat/lng and an unlimited amount of per-address metadata. The metadata will be preserved as passthrough data by our API, so that the receiving device will have access to critical data when our API invokes a webhook callback to the device. + +### Are all my optimized routes stored permanently stored in the Route4Me database? +Yes. All routes are permanently stored in the database and are no longer accessible to you after your subscription is terminated. + + +### Can I incorporate your API into my mobile application? +Route4Me’s route planning and optimization technology can only be added into applications that do not directly compete with Route4Me. +This means the application’s primary capabilities must be unrelated to route optimization, route planning, or navigation. + +### Can I pay you to develop a custom algorithm? +Yes + +### Can I use your API and resell it to my customers? +White-labeling and private-labeling Route4Me is possible but the deal’s licensing terms vary considerably based on customer count, route count, and the level of support that Route4Me should provide to your customers. + +### Does the API/SDK have TMS or EDI, or EDI translator capabilities? +Route4Me is currently working on these features but they are not currently available for sale. + +### Can the API/SDK send notifications back to our system using callbacks, notifications, pushes, or webhooks? + +Because Route4Me processes all routes asynchronously, Route4Me will conveniently notify the endpoint you specify as the route optimization job progresses through each state of the optimization. Every stage of the route optimization process has a unique stage id. + +### Does the Route4Me API and SDK work in my country? +Route4Me.com, as well as all of Route4Me’s mobile applications use the Route4Me SDK’s and API. +Since Route4Me works globally, this means that all of Route4Me’s capabilities are available using the SDK’s in every country + + +### Will the Route4Me API/SDK work in my program on the Mac, PC, or Linux? +Customers are encouraged to select their preferred operating system environment. The Route4Me API/SDK will function on any operating system that supports the preferred programming language of the customer. At this point in time, almost every supported SDK can run on any operating system. + + +### Does the Route4Me API/SDK require me to buy my own servers? +Route4Me has its own computing infrastructure that you can access using the API and SDKs. Customers typically have to run the SDK code on their own computers and/or servers to access this infrastructure. + +### Does Route4Me have an on-premise solution? +Route4Me does not currently lease or sell servers, and does not have on-premise appliance solution. This would only be possible in exceptionally unique scenarios. + + +### Does the Route4Me API/SDK require me to have my own programmers? +The time required to integrate the SDK can be as little as 1 hour or may take several weeks, depending on the number of features being incorporated into the customer’s application and how much integration testing will be done by the client. A programmer’s involvement is almost always required to use Route4Me’s technology when accessing it through the API. + + + +### Installation and Usage + +1. Add reference to Route4MeSDKLibrary.dll +2. Use the class Route4MeSDK.Route4MeManager for accessing the Route4ME API +3. Use methods Route4MeManager.GetRoute(), Route4MeManager.UpdateOptimization() etc. to access the main functionality of Route4Me API. +4. Use generic methods Route4MeManager.GetStringResponseFromAPI() and Route4MeManager.GetJsonObjectFromAPI() for accessing any Route4Me API functionally via custom defined classes (see example in Route4MeSDKTest.SingleDriverRoundTripGeneric.cs) + +### Examples and Tests + +1. See project Route4MeSDKTest (class Route4MeSDKTest.Examples) for some examples of using Route4MeSDKLibrary +2. See an example of creating a simple route below + +### Creating a Simple Route + +``` C# +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void SingleDriverRoundTrip() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Prepare the addresses + Address[] addresses = new Address[] + { + #region Addresses + + new Address() { AddressString = "754 5th Ave New York, NY 10019", + Alias = "Bergdorf Goodman", + //designate the point of origination in the route + //single driver routes should have one point of origin (single depot) + //multiple depot routes can have multiple addresses marked as depots + //and the optimization algorithm will determine the optimal departure depot + //for each generated route + IsDepot = true, + Latitude = 40.7636197, //all addresses must be properly geocoded + Longitude = -73.9744388, //all addresses must be properly geocoded + Time = 0 }, + + new Address() { AddressString = "717 5th Ave New York, NY 10022", + Alias = "Giorgio Armani", + Latitude = 40.7669692, //all addresses must be properly geocoded + Longitude = -73.9693864, //all addresses must be properly geocoded + Time = 0 }, + + new Address() { AddressString = "888 Madison Ave New York, NY 10014", + Alias = "Ralph Lauren Women's and Home", + Latitude = 40.7715154, //all addresses must be properly geocoded + Longitude = -73.9669241, //all addresses must be properly geocoded + Time = 0 }, + + new Address() { AddressString = "1011 Madison Ave New York, NY 10075", + Alias = "Yigal Azrou'l", + Latitude = 40.7772129, //all addresses must be properly geocoded + Longitude = -73.9669, //all addresses must be properly geocoded + Time = 0 }, + + new Address() { AddressString = "440 Columbus Ave New York, NY 10024", + Alias = "Frank Stella Clothier", + Latitude = 40.7808364, //all addresses must be properly geocoded + Longitude = -73.9732729,//all addresses must be properly geocoded + Time = 0 }, + + new Address() { AddressString = "324 Columbus Ave #1 New York, NY 10023", + Alias = "Liana", + Latitude = 40.7803123,//all addresses must be properly geocoded + Longitude = -73.9793079,//all addresses must be properly geocoded + Time = 0 }, + + new Address() { AddressString = "110 W End Ave New York, NY 10023", + Alias = "Toga Bike Shop", + Latitude = 40.7753077,//all addresses must be properly geocoded + Longitude = -73.9861529,//all addresses must be properly geocoded + Time = 0 }, + + new Address() { AddressString = "555 W 57th St New York, NY 10019", + Alias = "BMW of Manhattan", + Latitude = 40.7718005,//all addresses must be properly geocoded + Longitude = -73.9897716,//all addresses must be properly geocoded + Time = 0 }, + + new Address() { AddressString = "57 W 57th St New York, NY 10019", + Alias = "Verizon Wireless", + Latitude = 40.7558695,//all addresses must be properly geocoded + Longitude = -73.9862019,//all addresses must be properly geocoded + Time = 0 }, + + #endregion + }; + + // Set parameters + RouteParameters parameters = new RouteParameters() + { + AlgorithmType = AlgorithmType.TSP, + StoreRoute = false, + RouteName = "Single Driver Round Trip", + + RouteTime = 0, + RouteMaxDuration = 86400, + VehicleCapacity = "1", + VehicleMaxDistanceMI = "10000", + + Optimize = Optimize.Distance.Description(), + DistanceUnit = DistanceUnit.MI.Description(), + DeviceType = DeviceType.Web.Description(), + TravelMode = TravelMode.Driving.Description(), + }; + + OptimizatonParameters optimizatonParameters = new OptimizatonParameters() + { + Addresses = addresses, + Parameters = parameters + }; + + // Run the query + string errorString; + DataObject dataObject = route4Me.RunOptimization(optimizatonParameters, out errorString); + + // Output the result + PrintExampleOptimizationResult("SingleDriverRoundTrip", dataObject, errorString); + } + } +} + +``` diff --git a/Route4MeSDK.sln b/Route4MeSDK.sln new file mode 100644 index 00000000..de49168d --- /dev/null +++ b/Route4MeSDK.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Route4MeSDKLibrary", "Route4MeSDKLibrary\Route4MeSDKLibrary.csproj", "{37E5D3FC-BBF7-4BD8-98E6-A58DC9138D98}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Route4MeSDKTest", "Route4MeSDKTest\Route4MeSDKTest.csproj", "{DBA0AA41-4223-4404-B3E6-4948FE147A40}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{8BA18B34-5258-42D7-BCAE-6EEB86520598}" + ProjectSection(SolutionItems) = preProject + .nuget\packages.config = .nuget\packages.config + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {37E5D3FC-BBF7-4BD8-98E6-A58DC9138D98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37E5D3FC-BBF7-4BD8-98E6-A58DC9138D98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37E5D3FC-BBF7-4BD8-98E6-A58DC9138D98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37E5D3FC-BBF7-4BD8-98E6-A58DC9138D98}.Release|Any CPU.Build.0 = Release|Any CPU + {DBA0AA41-4223-4404-B3E6-4948FE147A40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DBA0AA41-4223-4404-B3E6-4948FE147A40}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DBA0AA41-4223-4404-B3E6-4948FE147A40}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DBA0AA41-4223-4404-B3E6-4948FE147A40}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Route4MeSDK.v11.suo b/Route4MeSDK.v11.suo new file mode 100755 index 00000000..f7fad525 Binary files /dev/null and b/Route4MeSDK.v11.suo differ diff --git a/Route4MeSDKLibrary/Consts.cs b/Route4MeSDKLibrary/Consts.cs new file mode 100755 index 00000000..222fb730 --- /dev/null +++ b/Route4MeSDKLibrary/Consts.cs @@ -0,0 +1,53 @@ + +namespace Route4MeSDK +{ + /// + /// Route4Me infrastructure settings + /// Api version 4 hosts constants + /// + public static class R4MEInfrastructureSettings + { + #region Api V4 + + public const string ApiVersion = "4"; + + public const string MainHost = "https://www.route4me.com"; + public const string ApiHost = MainHost + "/api.v4/optimization_problem.php"; + public const string ShowRouteHost = MainHost + "/route4me.php"; + public const string RouteHost = MainHost + "/api.v4/route.php"; + public const string SetGpsHost = MainHost + "/track/set.php"; + public const string GetUsersHost = MainHost + "/api.v4/user.php"; + public const string UserAuthentication = MainHost + "/actions/authenticate.php"; + public const string ValidateSession = MainHost + "/datafeed/session/validate_session.php"; + public const string UserRegistration = MainHost + "/actions/register_action.php"; + public const string UserConfiguration = MainHost + "/api.v4/configuration-settings.php"; + public const string AddRouteNotesHost = MainHost + "/actions/addRouteNotes.php"; + public const string ActivityFeedHost = MainHost + "/api.v4/activity_feed.php"; + public const string GetAddress = MainHost + "/api.v4/address.php"; + public const string DuplicateRoute = MainHost + "/actions/duplicate_route.php"; + public const string MoveRouteDestination = MainHost + "/actions/route/move_route_destination.php"; + public const string AddressBook = MainHost + "/api.v4/address_book.php"; + public const string Avoidance = MainHost + "/api.v4/avoidance.php"; + public const string Territory = MainHost + "/api.v4/territory.php"; + public const string Order = MainHost + "/api.v4/order.php"; + public const string MergeRoutes = MainHost + "/actions/merge_routes.php"; + public const string RouteReoptimize = MainHost + "/api.v3/route/reoptimize_2.php"; + public const string RouteSharing = MainHost + "/actions/route/share_route.php"; + + public const string MarkAddressDeparted = MainHost + "/api/route/mark_address_departed.php"; + public const string MarkAddressVisited = MainHost + "/actions/address/update_address_visited.php"; + + public const string Geocoder = MainHost + "/api/geocoder.php"; + public const string RapidStreetData = "https://rapid.route4me.com/street_data"; + public const string RapidStreetZipcode = "https://rapid.route4me.com/street_data/zipcode"; + public const string RapidStreetService = "https://rapid.route4me.com/street_data/service"; + + //public const string AssetTracking = MainHost + "/api/asset/find_route.php"; + public const string AssetTracking = MainHost + "/api.v4/status.php"; + public const string ViewVehicles = MainHost + "/api/vehicles/view_vehicles.php"; + + public const string HybridOptimization = MainHost + "/api.v4/hybrid_date_optimization.php"; + + #endregion + } +} diff --git a/Route4MeSDKLibrary/DataTypes/Activity.cs b/Route4MeSDKLibrary/DataTypes/Activity.cs new file mode 100644 index 00000000..3309af05 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/Activity.cs @@ -0,0 +1,54 @@ +using Route4MeSDK.QueryTypes; +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + /// + /// + /// + [DataContract] + public sealed class Activity : GenericParameters + { + /// + /// Activity Id + /// + [DataMember(Name = "activity_id", EmitDefaultValue = false)] + public string ActivityId { get; set; } + + /// + /// Activity type + /// + [DataMember(Name = "activity_type", EmitDefaultValue = false)] + public string ActivityType { get; set; } + + /// + /// Activity timestamp + /// + [DataMember(Name = "activity_timestamp", EmitDefaultValue = false)] + public uint? ActivityTimestamp { get; set; } + + /// + /// Activity message + /// + [DataMember(Name = "activity_message", EmitDefaultValue = false)] + public string ActivityMessage { get; set; } + + /// + /// Member Id + /// + [DataMember(Name = "member_id", EmitDefaultValue = false)] + public string MemberId { get; set; } + + /// + /// Route Id + /// + [DataMember(Name = "route_id", EmitDefaultValue = false)] + public string RouteId { get; set; } + + /// + /// Destination Id + /// + [DataMember(Name = "route_destination_id", EmitDefaultValue = false)] + public string RouteDestinationId { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/Address.cs b/Route4MeSDKLibrary/DataTypes/Address.cs new file mode 100755 index 00000000..898afcdc --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/Address.cs @@ -0,0 +1,218 @@ +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + + [DataContract] + public sealed class Address + { + [DataMember(Name = "route_destination_id", EmitDefaultValue = false)] + public int? RouteDestinationId { get; set; } + + [DataMember(Name = "alias", EmitDefaultValue = false)] + public string Alias { get; set; } + + //the id of the member inside the route4me system + [DataMember(Name = "member_id", EmitDefaultValue = false)] + public string MemberId { get; set; } + + [DataMember(Name = "first_name", EmitDefaultValue = false)] + public string FirstName + { + get { return m_FirstName; } + set { m_FirstName = value; } + } + private string m_FirstName; + + [DataMember(Name = "last_name", EmitDefaultValue = false)] + public string LastName + { + get { return m_LastName; } + set { m_LastName = value; } + } + private string m_LastName; + + [DataMember(Name = "address")] + public string AddressString { get; set; } + + //designate this stop as a depot + //a route may have multiple depots/points of origin + [DataMember(Name = "is_depot", EmitDefaultValue = false)] + public bool? IsDepot { get; set; } + + //the latitude of this address + [DataMember(Name = "lat")] + public double Latitude { get; set; } + + //the longitude of this address + [DataMember(Name = "lng")] + public double Longitude { get; set; } + + //the id of the route being viewed, modified, erased + [DataMember(Name = "route_id", EmitDefaultValue = false)] + public string RouteId { get; set; } + + //if this route was duplicated from an existing route, this value would have the original route's id + [DataMember(Name = "original_route_id", EmitDefaultValue = false)] + public string OriginalRouteId { get; set; } + + //the id of the optimization request that was used to initially instantiate this route + [DataMember(Name = "optimization_problem_id", EmitDefaultValue = false)] + public string OptimizationProblemId { get; set; } + + [DataMember(Name = "sequence_no", EmitDefaultValue = false)] + public int? SequenceNo { get; set; } + + [DataMember(Name = "geocoded", EmitDefaultValue = false)] + public bool? Geocoded { get; set; } + + [DataMember(Name = "preferred_geocoding", EmitDefaultValue = false)] + public int? PreferredGeocoding { get; set; } + + [DataMember(Name = "failed_geocoding", EmitDefaultValue = false)] + public bool? FailedGeocoding { get; set; } + + //when planning a route from the address book or using existing address book ids + //pass the address book id (contact_id) for an address so that route4me can run + //analytics on the address book addresses that were used to plan routes, and to find previous visits to + //favorite addresses + [DataMember(Name = "contact_id", EmitDefaultValue = false)] + public int? ContactId { get; set; } + + //status flag to mark an address as visited (aka check in) + [DataMember(Name = "is_visited", EmitDefaultValue = false)] + public bool? IsVisited { get; set; } + + //status flag to mark an address as departed (aka check out) + [DataMember(Name = "is_departed", EmitDefaultValue = false)] + public bool? IsDeparted { get; set; } + + //the last known visited timestamp of this address + [DataMember(Name = "timestamp_last_visited", EmitDefaultValue = false)] + public uint? TimestampLastVisited { get; set; } + + //the last known departed timestamp of this address + [DataMember(Name = "timestamp_last_departed", EmitDefaultValue = false)] + public uint? TimestampLastDeparted { get; set; } + + //pass-through data about this route destination + //the data will be visible on the manifest, website, and mobile apps + [DataMember(Name = "customer_po", EmitDefaultValue = false)] + public object CustomerPo { get; set; } + + //pass-through data about this route destination + //the data will be visible on the manifest, website, and mobile apps + [DataMember(Name = "invoice_no", EmitDefaultValue = false)] + public object InvoiceNo { get; set; } + + //pass-through data about this route destination + //the data will be visible on the manifest, website, and mobile apps + [DataMember(Name = "reference_no", EmitDefaultValue = false)] + public object ReferenceNo { get; set; } + + //pass-through data about this route destination + //the data will be visible on the manifest, website, and mobile apps + [DataMember(Name = "order_no", EmitDefaultValue = false)] + public object OrderNo { get; set; } + + [DataMember(Name = "order_id", EmitDefaultValue = false)] + public System.Nullable OrderId + { + get { return m_OrderId; } + set { m_OrderId = value; } + } + private System.Nullable m_OrderId; + + [DataMember(Name = "weight", EmitDefaultValue = false)] + public object Weight { get; set; } + + [DataMember(Name = "cost", EmitDefaultValue = false)] + public object Cost { get; set; } + + [DataMember(Name = "revenue", EmitDefaultValue = false)] + public object Revenue { get; set; } + + //the cubic volume that this destination/order/line-item consumes/contains + //this is how much space it will take up on a vehicle + [DataMember(Name = "cube", EmitDefaultValue = false)] + public object Cube { get; set; } + + //the number of pieces/palllets that this destination/order/line-item consumes/contains on a vehicle + [DataMember(Name = "pieces", EmitDefaultValue = false)] + public object Pieces { get; set; } + + //pass-through data about this route destination + //the data will be visible on the manifest, website, and mobile apps + //also used to email clients when vehicles are approaching (future capability) + [DataMember(Name = "email", EmitDefaultValue = false)] + public object Email { get; set; } + + //pass-through data about this route destination + //the data will be visible on the manifest, website, and mobile apps + //also used to sms message clients when vehicles are approaching (future capability) + [DataMember(Name = "phone", EmitDefaultValue = false)] + public object Phone { get; set; } + + //the number of notes that are already associated with this address on the route + [DataMember(Name = "destination_note_count", EmitDefaultValue = false)] + public int? DestinationNoteCount { get; set; } + + //server-side generated amount of km/miles that it will take to get to the next location on the route + [DataMember(Name = "drive_time_to_next_destination", EmitDefaultValue = false)] + public int? DriveTimeToNextDestination { get; set; } + + //server-side generated amount of seconds that it will take to get to the next location + [DataMember(Name = "distance_to_next_destination", EmitDefaultValue = false)] + public double? DistanceToNextDestination { get; set; } + + + //estimated time window start based on the optimization engine, after all the sequencing has been completed + [DataMember(Name = "generated_time_window_start", EmitDefaultValue = false)] + public int? GeneratedTimeWindowStart { get; set; } + + //estimated time window end based on the optimization engine, after all the sequencing has been completed + [DataMember(Name = "generated_time_window_end", EmitDefaultValue = false)] + public int? GeneratedTimeWindowEnd { get; set; } + + //the unique socket channel name which should be used to get real time alerts + [DataMember(Name = "channel_name", EmitDefaultValue = false)] + public string ChannelName { get; set; } + + [DataMember(Name = "time_window_start", EmitDefaultValue = false)] + public int? TimeWindowStart { get; set; } + + [DataMember(Name = "time_window_end", EmitDefaultValue = false)] + public int? TimeWindowEnd { get; set; } + + //the expected amount of time that will be spent at this address by the driver/user + [DataMember(Name = "time", EmitDefaultValue = false)] + public int? Time { get; set; } + + [DataMember(Name = "notes", EmitDefaultValue = false)] + public AddressNote[] Notes { get; set; } + + //if present, the priority will sequence addresses in all the optimal routes so that + //higher priority addresses are general at the beginning of the route sequence + //1 is the highest priority, 100000 is the lowest + [DataMember(Name = "priority", EmitDefaultValue = false)] + public int? Priority { get; set; } + + //generate optimal routes and driving directions to this curbside lat + [DataMember(Name = "curbside_lat")] + public double? CurbsideLatitude { get; set; } + + //generate optimal routes and driving directions to the curbside lang + [DataMember(Name = "curbside_lng")] + public double? CurbsideLongitude { get; set; } + + [DataMember(Name = "time_window_start_2", EmitDefaultValue = false)] + public int? TimeWindowStart2 { get; set; } + + [DataMember(Name = "time_window_end_2", EmitDefaultValue = false)] + public int? TimeWindowEnd2 { get; set; } + + [DataMember(Name = "custom_fields", EmitDefaultValue = false)] + public Dictionary CustomFields { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/AddressBookContact.cs b/Route4MeSDKLibrary/DataTypes/AddressBookContact.cs new file mode 100644 index 00000000..dde71e7d --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/AddressBookContact.cs @@ -0,0 +1,95 @@ +using Route4MeSDK.QueryTypes; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class AddressBookContact : GenericParameters + { + [DataMember(Name = "territory_name", EmitDefaultValue = false)] + public string territory_name { get; set; } + + [DataMember(Name = "created_timestamp", EmitDefaultValue = false)] + public int created_timestamp { get; set; } + + [DataMember(Name = "address_id", EmitDefaultValue = false)] + public int? address_id { get; set; } + + [DataMember(Name = "address_1")] + public string address_1 { get; set; } + + [DataMember(Name = "address_2", EmitDefaultValue = false)] + public string address_2 { get; set; } + + [DataMember(Name = "address_alias", EmitDefaultValue = false)] + public string address_alias { get; set; } + + [DataMember(Name = "address_group", EmitDefaultValue = false)] + public string address_group { get; set; } + + [DataMember(Name = "first_name", EmitDefaultValue = false)] + public string first_name { get; set; } + + [DataMember(Name = "last_name", EmitDefaultValue = false)] + public string last_name { get; set; } + + [DataMember(Name = "address_email", EmitDefaultValue = false)] + public string address_email { get; set; } + + [DataMember(Name = "address_phone_number", EmitDefaultValue = false)] + public string address_phone_number { get; set; } + + [DataMember(Name = "cached_lat")] + public double cached_lat { get; set; } + + [DataMember(Name = "cached_lng")] + public double cached_lng { get; set; } + + [DataMember(Name = "curbside_lat")] + public double? curbside_lat { get; set; } + + [DataMember(Name = "curbside_lng")] + public double? curbside_lng { get; set; } + + [DataMember(Name = "address_city", EmitDefaultValue = false)] + public string address_city { get; set; } + + [DataMember(Name = "address_state_id", EmitDefaultValue = false)] + public string address_state_id { get; set; } + + [DataMember(Name = "address_country_id", EmitDefaultValue = false)] + public string address_country_id { get; set; } + + [DataMember(Name = "address_zip", EmitDefaultValue = false)] + public string address_zip { get; set; } + + [DataMember(Name = "address_custom_data", EmitDefaultValue = false)] + public object address_custom_data + { + get { + if (m_address_custom_data == null) return null; + string sTypeName = m_address_custom_data.GetType().Name; + if (sTypeName == "Object[]") return new Dictionary(); + return (Dictionary)m_address_custom_data; + } + set { m_address_custom_data = value; } + } + private object m_address_custom_data; + + [DataMember(Name = "schedule", EmitDefaultValue = false)] + public IList schedule { get; set; } + + [DataMember(Name = "schedule_blacklist", EmitDefaultValue = false)] + public string[] schedule_blacklist { get; set; } + + [DataMember(Name = "service_time", EmitDefaultValue = false)] + public int? service_time { get; set; } + + [DataMember(Name = "color", EmitDefaultValue = false)] + public string color { get; set; } + + [DataMember(Name = "address_icon", EmitDefaultValue = false)] + public string address_icon { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/AddressBookContactsResponse.cs b/Route4MeSDKLibrary/DataTypes/AddressBookContactsResponse.cs new file mode 100644 index 00000000..6abf1a49 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/AddressBookContactsResponse.cs @@ -0,0 +1,16 @@ +using Route4MeSDK.QueryTypes; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class AddressBookContactsResponse : GenericParameters + { + [DataMember(Name = "results", EmitDefaultValue = false)] + public AddressBookContact[] results { get; set; } + + [DataMember(Name = "total", EmitDefaultValue = false)] + public int? total { get; set; } + } +} \ No newline at end of file diff --git a/Route4MeSDKLibrary/DataTypes/AddressNote.cs b/Route4MeSDKLibrary/DataTypes/AddressNote.cs new file mode 100644 index 00000000..14289588 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/AddressNote.cs @@ -0,0 +1,47 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class AddressNote + { + [DataMember(Name = "note_id", EmitDefaultValue = false)] + public int NoteId { get; set; } + + [DataMember(Name = "route_id", EmitDefaultValue = false)] + public string RouteId { get; set; } + + [DataMember(Name = "route_destination_id", EmitDefaultValue = false)] + public int RouteDestinationId { get; set; } + + [DataMember(Name = "upload_id")] + public string UploadId { get; set; } + + [DataMember(Name = "ts_added", EmitDefaultValue = false)] + public uint? TimestampAdded { get; set; } + + [DataMember(Name = "lat")] + public double Latitude { get; set; } + + [DataMember(Name = "lng")] + public double Longitude { get; set; } + + [DataMember(Name = "activity_type")] + public string ActivityType { get; set; } + + [DataMember(Name = "contents")] + public string Contents { get; set; } + + [DataMember(Name = "upload_type")] + public string UploadType { get; set; } + + [DataMember(Name = "upload_url")] + public string UploadUrl { get; set; } + + [DataMember(Name = "upload_extension")] + public string UploadExtension { get; set; } + + [DataMember(Name = "device_type")] + public string DeviceType { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/AvoidanceZone.cs b/Route4MeSDKLibrary/DataTypes/AvoidanceZone.cs new file mode 100644 index 00000000..f8d253f0 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/AvoidanceZone.cs @@ -0,0 +1,41 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + /// + /// Avoidance Zone + /// + [DataContract] + public sealed class AvoidanceZone + { + /// + /// Avoidance zone id + /// + [DataMember(Name = "territory_id")] + public string TerritoryId { get; set; } + + /// + /// Territory name + /// + [DataMember(Name = "territory_name")] + public string TerritoryName { get; set; } + + /// + /// Territory color + /// + [DataMember(Name = "territory_color")] + public string TerritoryColor { get; set; } + + /// + /// Member Id + /// + [DataMember(Name = "member_id")] + public string MemberId { get; set; } + + /// + /// Territory parameters + /// + [DataMember(Name = "territory")] + public Territory Territory { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/DataObject.cs b/Route4MeSDKLibrary/DataTypes/DataObject.cs new file mode 100755 index 00000000..e8e2787c --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/DataObject.cs @@ -0,0 +1,46 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + /// + /// Main data object data-structure + /// See https://www.assembla.com/spaces/route4me_api/wiki/Optimization_Problem_V4 + /// + [DataContract] + [KnownType(typeof(DataObjectRoute))] + public class DataObject + { + [DataMember(Name = "optimization_problem_id")] + public string OptimizationProblemId { get; set; } + + [DataMember(Name = "state")] + public OptimizationState State { get; set; } + + [DataMember(Name = "user_errors")] + public string[] UserErrors { get; set; } + + [DataMember(Name = "sent_to_background")] + public bool IsSentToBackground { get; set; } + + [DataMember(Name = "parameters")] + public RouteParameters Parameters { get; set; } + + [DataMember(Name = "addresses")] + public Address[] Addresses { get; set; } + + [DataMember(Name = "routes")] + public DataObjectRoute[] Routes { get; set; } + + [DataMember(Name = "links")] + public Links Links { get; set; } + + [DataMember(Name = "tracking_history")] + public TrackingHistory[] TrackingHistory { get; set; } + + [DataMember(Name = "directions")] + public Direction[] Directions { get; set; } + + [DataMember(Name = "path")] + public DirectionPathPoint[] Path { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/Direction.cs b/Route4MeSDKLibrary/DataTypes/Direction.cs new file mode 100644 index 00000000..c0ce2e32 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/Direction.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class Direction + { + /// + /// Location + /// + [DataMember(Name = "location")] + public DirectionLocation Location { get; set; } + + /// + /// Steps + /// + [DataMember(Name = "steps")] + public DirectionStep[] Steps { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/DirectionLocation.cs b/Route4MeSDKLibrary/DataTypes/DirectionLocation.cs new file mode 100644 index 00000000..45d532b0 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/DirectionLocation.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Route4MeSDK.DataTypes +{ + /// + /// Edge by edge turn-by-turn direction. + /// + [DataContract] + public sealed class DirectionLocation + { + /// + /// Name + /// + [DataMember(Name = "name")] + public string Name { get; set; } + + /// + /// Segment time (seconds) + /// + [DataMember(Name = "time")] + public int Time { get; set; } + + /// + /// Segment distance + /// + [DataMember(Name = "segment_distance")] + public double SegmentDistance { get; set; } + + /// + /// Start Location + /// + [DataMember(Name = "start_location")] + public string StartLocation { get; set; } + + /// + /// End Location + /// + [DataMember(Name = "end_location")] + public string EndLocation { get; set; } + + /// + /// Directions Error + /// + [DataMember(Name = "directions_error")] + public string DirectionsError { get; set; } + + /// + /// Error Code + /// + [DataMember(Name = "error_code")] + public int ErrorCode { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/DirectionPathPoint.cs b/Route4MeSDKLibrary/DataTypes/DirectionPathPoint.cs new file mode 100644 index 00000000..8412dd8a --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/DirectionPathPoint.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Route4MeSDK.DataTypes +{ + /// + /// Direction Path Point + /// + [DataContract] + public sealed class DirectionPathPoint + { + /// + /// Latitude + /// + [DataMember(Name = "lat")] + public double Lat { get; set; } + + /// + /// Longitude + /// + [DataMember(Name = "lng")] + public double Lng { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/DirectionStep.cs b/Route4MeSDKLibrary/DataTypes/DirectionStep.cs new file mode 100644 index 00000000..bd784887 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/DirectionStep.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Route4MeSDK.DataTypes +{ + /// + /// Direction Step + /// + [DataContract] + public sealed class DirectionStep + { + /// + /// Name (detailed) + /// + [DataMember(Name = "direction")] + public string Direction { get; set; } + + /// + /// Name (brief) + /// + [DataMember(Name = "directions")] + public string Directions { get; set; } + + /// + /// Distance + /// + [DataMember(Name = "distance")] + public double Distance { get; set; } + + /// + /// Distance units + /// + [DataMember(Name = "distance_unit")] + public string DistanceUnit { get; set; } + + /// + /// Maneuver Type + /// + [DataMember(Name = "maneuverType")] + public string ManeuverType { get; set; } + + /// + /// Compass Direction + /// + [DataMember(Name = "compass_direction")] + public string CompassDirection { get; set; } + + /// + /// Duration (seconds) + /// + [DataMember(Name = "duration_sec")] + public int DurationSec { get; set; } + + /// + /// Maneuver Point + /// + [DataMember(Name = "maneuverPoint")] + public DirectionPathPoint ManeuverPoint { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/Enums.cs b/Route4MeSDKLibrary/DataTypes/Enums.cs new file mode 100755 index 00000000..69c79fe7 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/Enums.cs @@ -0,0 +1,217 @@ +using System.ComponentModel; + +namespace Route4MeSDK.DataTypes +{ + + public enum AlgorithmType + { + TSP = 1, //single depot, single driver route + VRP = 2, //single depot, multiple driver, no constraints, no time windows, no capacities + CVRP_TW_SD = 3, //single depot, multiple driver, capacitated, time windows + CVRP_TW_MD = 4, //multiple depot, multiple driver, capacitated, time windows + TSP_TW = 5, //single depot, single driver, time windows + TSP_TW_CR = 6, //single depot, single driver, time windows, continuous optimization (minimal location shifting) + BBCVRP = 7, //shifts addresses from one route to another over time on a recurring schedule + ALG_NONE = 100, + ALG_LEGACY_DISTRIBUTED = 101 + } + + + public enum TravelMode : uint + { + [Description("Driving")] + Driving, + + [Description("Walking")] + Walking, + + [Description("Trucking")] + Trucking + } + + + public enum DistanceUnit : uint + { + [Description("mi")] + MI, + + [Description("km")] + KM + } + public enum Avoid + { + [Description("Highways")] + Highways, + + [Description("Tolls")] + Tolls, + + [Description("minimizeHighways")] + MinimizeHighways, + + [Description("minimizeTolls")] + MinimizeTolls, + + [Description("")] + None + } + + + public enum Optimize : uint + { + [Description("Distance")] + Distance, + + [Description("Time")] + Time, + + [Description("timeWithTraffic")] + TimeWithTraffic + } + + + public enum Metric : uint + { + Euclidean = 1, //measures point to point distance as a straight line + Manhattan = 2, //measures point to point distance as taxicab geometry line + Geodesic = 3, //measures point to point distance approximating curvature of the earth + Matrix = 4, //measures point to point distance by traversing the actual road network + Exact_2D = 5 //measures point to point distance using 2d rectilinear distance + } + + public enum DeviceType + { + [Description("web")] + Web, + + [Description("iphone")] + IPhone, + + [Description("ipad")] + IPad, + + [Description("android_phone")] + AndroidPhone, + + [Description("android_tablet")] + AndroidTablet + } + + + public enum Format + { + [Description("csv")] + Csv, + + [Description("serialized")] + Serialized, + + [Description("xml")] + Xml + } + + + //an optimization problem can be at one state at any given time + //every state change invokes a socket notification to the associated member id + //every state change invokes a callback webhook event invocation if it was provided during the initial optimization + public enum OptimizationState : uint + { + Initial = 1, + MatrixProcessing = 2, + Optimizing = 3, + Optimized = 4, + Error = 5, + ComputingDirections = 6 + } + + //if the actual polylines of the driving path between all the stops on the route should be returned + public enum RoutePathOutput : uint + { + [Description("None")] + None, + + [Description("Points")] + Points + } + + public enum StatusUpdateType + { + [Description("pickup")] + Pickup, + + [Description("dropoff")] + DropOff, + + [Description("noanswer")] + NoAnswer, + + [Description("notfound")] + NotFound, + + [Description("notpaid")] + NotPaid, + + [Description("paid")] + Paid, + + [Description("wrongdelivery")] + WrongDelivery, + + [Description("wrongaddressrecipient")] + WrongAddressRecipient, + + [Description("notpresent")] + NotPresent, + + [Description("parts_missing")] + PartsMissing, + + [Description("service_rendered")] + ServiceRendered, + + [Description("follow_up")] + FollowUp, + + [Description("left_information")] + LeftInformation, + + [Description("spoke_with_decision_maker")] + SpokeWithDecisionMaker, + + [Description("spoke_with_decision_influencer")] + SpokeWithDecisionInfluencer, + + [Description("competitive_account")] + CompetitiveAccount, + + [Description("scheduled_follow_up_meeting")] + ScheduledFollowUpMeeting, + + [Description("scheduled_lunch")] + ScheduledLunch, + + [Description("scheduled_product_demo")] + ScheduledProductDemo, + + [Description("scheduled_clinical_demo")] + ScheduledClinicalDemo, + + [Description("no_opportunity")] + NoOpportunity + } + + /// + /// Territory type (circle, rectangle, polygon) + /// + public enum TerritoryType : uint + { + [Description("circle")] + Circle, + + [Description("poly")] + Poly, + + [Description("rect")] + Rect + } +} diff --git a/Route4MeSDKLibrary/DataTypes/ErrorResponse.cs b/Route4MeSDKLibrary/DataTypes/ErrorResponse.cs new file mode 100644 index 00000000..de00a448 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/ErrorResponse.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Route4MeSDKLibrary.DataTypes +{ + /// + /// Errors data-structure + /// + [DataContract] + public class ErrorResponse + { + [DataMember(Name = "errors")] + public List Errors { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/FindAssetResponse.cs b/Route4MeSDKLibrary/DataTypes/FindAssetResponse.cs new file mode 100644 index 00000000..78b01c75 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/FindAssetResponse.cs @@ -0,0 +1,107 @@ +using System.Runtime.Serialization; +using System.Collections.Generic; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class FindAssetResponse + { + [DataMember(Name = "tracking_number")] + public string TrackingNumber + { + get { return m_TrackingNumber; } + set { m_TrackingNumber = value; } + } + private string m_TrackingNumber; + + [DataMember(Name = "status_history")] + public string[] StatusHistory + { + get { return m_StatusHistory; } + set { m_StatusHistory = value; } + } + private string[] m_StatusHistory; + + [DataMember(Name = "locations")] + public FindAssetResponseLocations[] Locations + { + get { return m_Locations; } + set { m_Locations = value; } + } + private FindAssetResponseLocations[] m_Locations; + + [DataMember(Name = "custom_data", EmitDefaultValue = false)] + public Dictionary CustomData + { + get { return m_CustomData; } + set { m_CustomData = value; } + } + private Dictionary m_CustomData; + + [DataMember(Name = "arrival")] + public FindAssetResponseArrival[] Arrival + { + get { return m_Arrival; } + set { m_Arrival = value; } + } + private FindAssetResponseArrival[] m_Arrival; + + [DataMember(Name = "delivered", EmitDefaultValue = false)] + public System.Nullable Delivered + { + get { return m_Delivered; } + set { m_Delivered = value; } + } + private System.Nullable m_Delivered; + } + + [DataContract()] + public sealed class FindAssetResponseLocations + { + [DataMember(Name = "lat")] + public double Latitude + { + get { return m_Latitude; } + set { m_Latitude = value; } + } + private double m_Latitude; + + [DataMember(Name = "lng")] + public double Longitude + { + get { return m_Longitude; } + set { m_Longitude = value; } + } + private double m_Longitude; + + [DataMember(Name = "icon")] + public string Icon + { + get { return m_Icon; } + set { m_Icon = value; } + } + private string m_Icon; + } + + [DataContract()] + public sealed class FindAssetResponseArrival + { + [DataMember(Name = "from_unix_timestamp")] + public System.Nullable FromUnixTimestamp + { + get { return m_FromUnixTimestamp; } + set { m_FromUnixTimestamp = value; } + } + private System.Nullable m_FromUnixTimestamp; + + + [DataMember(Name = "to_unix_timestamp")] + public System.Nullable ToUnixTimestamp + { + get { return m_ToUnixTimestamp; } + set { m_ToUnixTimestamp = value; } + } + private System.Nullable m_ToUnixTimestamp; + } + + } diff --git a/Route4MeSDKLibrary/DataTypes/GeoPoint.cs b/Route4MeSDKLibrary/DataTypes/GeoPoint.cs new file mode 100644 index 00000000..15684ff8 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/GeoPoint.cs @@ -0,0 +1,24 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class GeoPoint + { + [DataMember(Name = "lat")] + public double Latitude + { + get { return m_Latitude; } + set { m_Latitude = value; } + } + private double m_Latitude; + + [DataMember(Name = "lng")] + public double Longitude + { + get { return m_Longitude; } + set { m_Longitude = value; } + } + private double m_Longitude; + } +} diff --git a/Route4MeSDKLibrary/DataTypes/Links.cs b/Route4MeSDKLibrary/DataTypes/Links.cs new file mode 100755 index 00000000..5d02ebca --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/Links.cs @@ -0,0 +1,18 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + + [DataContract] + public sealed class Links + { + [DataMember(Name = "route")] + public string Route { get; set; } + + [DataMember(Name = "view")] + public string View { get; set; } + + [DataMember(Name = "optimization_problem_id")] + public string OptimizationProblemId { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/MemberConfigurationData.cs b/Route4MeSDKLibrary/DataTypes/MemberConfigurationData.cs new file mode 100644 index 00000000..d5003359 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/MemberConfigurationData.cs @@ -0,0 +1,32 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class MemberConfigurationData + { + [DataMember(Name = "member_id", EmitDefaultValue = false)] + public int member_id + { + get { return m_member_id; } + set { m_member_id = value; } + } + private int m_member_id; + + [DataMember(Name = "config_key", EmitDefaultValue = false)] + public string config_key + { + get { return m_config_key; } + set { m_config_key = value; } + } + private string m_config_key; + + [DataMember(Name = "config_value", EmitDefaultValue = false)] + public string config_value + { + get { return m_config_value; } + set { m_config_value = value; } + } + private string m_config_value; + } +} \ No newline at end of file diff --git a/Route4MeSDKLibrary/DataTypes/MemberConfigurationDataRersponse.cs b/Route4MeSDKLibrary/DataTypes/MemberConfigurationDataRersponse.cs new file mode 100644 index 00000000..90f9bf8b --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/MemberConfigurationDataRersponse.cs @@ -0,0 +1,24 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class MemberConfigurationDataRersponse + { + [DataMember(Name = "config_key", EmitDefaultValue = false)] + public string result + { + get { return m_result; } + set { m_result = value; } + } + private string m_result; + + [DataMember(Name = "data", EmitDefaultValue = false)] + public MemberConfigurationData[] data + { + get { return m_data; } + set { m_data = value; } + } + private MemberConfigurationData[] m_data; + } +} \ No newline at end of file diff --git a/Route4MeSDKLibrary/DataTypes/MemberConfigurationResponse.cs b/Route4MeSDKLibrary/DataTypes/MemberConfigurationResponse.cs new file mode 100644 index 00000000..f6e08a78 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/MemberConfigurationResponse.cs @@ -0,0 +1,25 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class MemberConfigurationResponse + { + [DataMember(Name = "result")] + public string result + { + get { return m_result; } + set { m_result = value; } + } + private string m_result; + + [DataMember(Name = "affected")] + public int affected + { + get { return m_affected; } + set { m_affected = value; } + } + private int m_affected; + + } +} diff --git a/Route4MeSDKLibrary/DataTypes/MemberResponse.cs b/Route4MeSDKLibrary/DataTypes/MemberResponse.cs new file mode 100644 index 00000000..71782c57 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/MemberResponse.cs @@ -0,0 +1,216 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class MemberResponse + { + [DataMember(Name = "status")] + public System.Nullable Status + { + get { return m_Status; } + set { m_Status = value; } + } + private System.Nullable m_Status; + + [DataMember(Name = "geocoding_service")] + public string GeocodingService + { + get { return m_GeocodingService; } + set { m_GeocodingService = value; } + } + private string m_GeocodingService; + + [DataMember(Name = "session_id")] + public System.Nullable SessionId + { + get { return m_SessionId; } + set { m_SessionId = value; } + } + private System.Nullable m_SessionId; + + [DataMember(Name = "session_guid")] + public string SessionGuid + { + get { return m_SessionGuid; } + set { m_SessionGuid = value; } + } + private string m_SessionGuid; + + [DataMember(Name = "member_id")] + public System.Nullable MemberId + { + get { return m_MemberId; } + set { m_MemberId = value; } + } + private System.Nullable m_MemberId; + + [DataMember(Name = "api_key")] + public string ApiKey + { + get { return m_ApiKey; } + set { m_ApiKey = value; } + } + private string m_ApiKey; + + [DataMember(Name = "tracking_ttl")] + public System.Nullable TrackingTtl + { + get { return m_TrackingTtl; } + set { m_TrackingTtl = value; } + } + private System.Nullable m_TrackingTtl; + + [DataMember(Name = "geofence_polygon_shape")] + public string GeofencePolygonShape + { + get { return m_GeofencePolygonShape; } + set { m_GeofencePolygonShape = value; } + } + private string m_GeofencePolygonShape; + + [DataMember(Name = "geofence_polygon_size")] + public System.Nullable GeofencePolygonSize + { + get { return m_GeofencePolygonSize; } + set { m_GeofencePolygonSize = value; } + } + private System.Nullable m_GeofencePolygonSize; + + [DataMember(Name = "geofence_time_onsite_trigger_secs")] + public System.Nullable GeofenceTimeOnsiteTriggerSecs + { + get { return m_GeofenceTimeOnsiteTriggerSecs; } + set { m_GeofenceTimeOnsiteTriggerSecs = value; } + } + private System.Nullable m_GeofenceTimeOnsiteTriggerSecs; + + [DataMember(Name = "geofence_minimum_trigger_speed")] + public System.Nullable GeofenceMinimumTriggerSpeed + { + get { return m_GeofenceMinimumTriggerSpeed; } + set { m_GeofenceMinimumTriggerSpeed = value; } + } + private System.Nullable m_GeofenceMinimumTriggerSpeed; + + [DataMember(Name = "is_subscription_past_due")] + public System.Nullable IsSubscriptionPastDue + { + get { return m_IsSubscriptionPastDue; } + set { m_IsSubscriptionPastDue = value; } + } + private System.Nullable m_IsSubscriptionPastDue; + + [DataMember(Name = "visited_departed_enabled")] + public string VisitedDepartedEnabled + { + get { return m_VisitedDepartedEnabled; } + set { m_VisitedDepartedEnabled = value; } + } + private string m_VisitedDepartedEnabled; + + [DataMember(Name = "long_press_enabled")] + public string LongPressEnabled + { + get { return m_LongPressEnabled; } + set { m_LongPressEnabled = value; } + } + private string m_LongPressEnabled; + + [DataMember(Name = "account_type_id")] + public System.Nullable AccountTypeId + { + get { return m_AccountTypeId; } + set { m_AccountTypeId = value; } + } + private System.Nullable m_AccountTypeId; + + [DataMember(Name = "account_type_alias")] + public string AccountTypeAlias + { + get { return m_AccountTypeAlias; } + set { m_AccountTypeAlias = value; } + } + private string m_AccountTypeAlias; + + [DataMember(Name = "member_type")] + public string MemberType + { + get { return m_MemberType; } + set { m_MemberType = value; } + } + private string m_MemberType; + + [DataMember(Name = "max_stops_per_route")] + public System.Nullable MaxStopsPerRoute + { + get { return m_MaxStopsPerRoute; } + set { m_MaxStopsPerRoute = value; } + } + private System.Nullable m_MaxStopsPerRoute; + + [DataMember(Name = "max_routes")] + public System.Nullable MaxRoutes + { + get { return m_MaxRoutes; } + set { m_MaxRoutes = value; } + } + private System.Nullable m_MaxRoutes; + + [DataMember(Name = "routes_planned")] + public System.Nullable RoutesPlanned + { + get { return m_RoutesPlanned; } + set { m_RoutesPlanned = value; } + } + private System.Nullable m_RoutesPlanned; + + [DataMember(Name = "preferred_units")] + public string PreferredUnits + { + get { return m_PreferredUnits; } + set { m_PreferredUnits = value; } + } + private string m_PreferredUnits; + + [DataMember(Name = "preferred_language")] + public string PreferredLanguage + { + get { return m_PreferredLanguage; } + set { m_PreferredLanguage = value; } + } + private string m_PreferredLanguage; + + [DataMember(Name = "HIDE_ROUTED_ADDRESSES")] + public string HideRoutedAddresses + { + get { return m_HideRoutedAddresses; } + set { m_HideRoutedAddresses = value; } + } + private string m_HideRoutedAddresses; + + [DataMember(Name = "HIDE_VISITED_ADDRESSES")] + public string HideVisitedAddresses + { + get { return m_HideVisitedAddresses; } + set { m_HideVisitedAddresses = value; } + } + private string m_HideVisitedAddresses; + + [DataMember(Name = "HIDE_NONFUTURE_ROUTES")] + public string HideNonfutureAddresses + { + get { return m_HideNonfutureAddresses; } + set { m_HideNonfutureAddresses = value; } + } + private string m_HideNonfutureAddresses; + + [DataMember(Name = "auto_logout_ts")] + public System.Nullable AutoLogoutTs + { + get { return m_AutoLogoutTs; } + set { m_AutoLogoutTs = value; } + } + private System.Nullable m_AutoLogoutTs; + } +} \ No newline at end of file diff --git a/Route4MeSDKLibrary/DataTypes/MemberResponseV4.cs b/Route4MeSDKLibrary/DataTypes/MemberResponseV4.cs new file mode 100644 index 00000000..25026f57 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/MemberResponseV4.cs @@ -0,0 +1,175 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class MemberResponseV4 + { + [DataMember(Name = "HIDE_NONFUTURE_ROUTES", EmitDefaultValue = false)] + public string HIDE_NONFUTURE_ROUTES + { + get { return m_HIDE_NONFUTURE_ROUTES; } + set { m_HIDE_NONFUTURE_ROUTES = value; } + } + private string m_HIDE_NONFUTURE_ROUTES; + + [DataMember(Name = "HIDE_ROUTED_ADDRESSES", EmitDefaultValue = false)] + public string HIDE_ROUTED_ADDRESSES + { + get { return m_HIDE_ROUTED_ADDRESSES; } + set { m_HIDE_ROUTED_ADDRESSES = value; } + } + private string m_HIDE_ROUTED_ADDRESSES; + + [DataMember(Name = "HIDE_VISITED_ADDRESSES", EmitDefaultValue = false)] + public string HIDE_VISITED_ADDRESSES + { + get { return m_HIDE_VISITED_ADDRESSES; } + set { m_HIDE_VISITED_ADDRESSES = value; } + } + private string m_HIDE_VISITED_ADDRESSES; + + [DataMember(Name = "member_id")] + public string member_id + { + get { return m_member_id; } + set { m_member_id = value; } + } + private string m_member_id; + + [DataMember(Name = "OWNER_MEMBER_ID")] + public string OWNER_MEMBER_ID + { + get { return m_OWNER_MEMBER_ID; } + set { m_OWNER_MEMBER_ID = value; } + } + private string m_OWNER_MEMBER_ID; + + [DataMember(Name = "READONLY_USER")] + public string READONLY_USER + { + get { return m_READONLY_USER; } + set { m_READONLY_USER = value; } + } + private string m_READONLY_USER; + + [DataMember(Name = "SHOW_ALL_DRIVERS")] + public string SHOW_ALL_DRIVERS + { + get { return m_SHOW_ALL_DRIVERS; } + set { m_SHOW_ALL_DRIVERS = value; } + } + private string m_SHOW_ALL_DRIVERS; + + [DataMember(Name = "SHOW_ALL_VEHICLES")] + public string SHOW_ALL_VEHICLES + { + get { return m_SHOW_ALL_VEHICLES; } + set { m_SHOW_ALL_VEHICLES = value; } + } + private string m_SHOW_ALL_VEHICLES; + + [DataMember(Name = "date_of_birth")] + public string date_of_birth + { + get { return m_date_of_birth; } + set { m_date_of_birth = value; } + } + private string m_date_of_birth; + + [DataMember(Name = "member_email")] + public string member_email + { + get { return m_member_email; } + set { m_member_email = value; } + } + private string m_member_email; + + [DataMember(Name = "member_first_name")] + public string member_first_name + { + get { return m_member_first_name; } + set { m_member_first_name = value; } + } + private string m_member_first_name; + + [DataMember(Name = "member_last_name")] + public string member_last_name + { + get { return m_member_last_name; } + set { m_member_last_name = value; } + } + private string m_member_last_name; + + [DataMember(Name = "member_phone")] + public string member_phone + { + get { return m_member_phone; } + set { m_member_phone = value; } + } + private string m_member_phone; + + [DataMember(Name = "member_picture")] + public string member_picture { + get { return m_member_picture; } + set { m_member_picture = value; } + } + private string m_member_picture; + + [DataMember(Name = "member_type")] + public string member_type + { + get { return m_member_type; } + set { m_member_type = value; } + } + private string m_member_type; + + [DataMember(Name = "member_zipcode")] + public string member_zipcode + { + get { return m_member_zipcode; } + set { m_member_zipcode = value; } + } + private string m_member_zipcode; + + [DataMember(Name = "preferred_language")] + public string preferred_language + { + get { return m_preferred_language; } + set { m_preferred_language = value; } + } + private string m_preferred_language; + + [DataMember(Name = "preferred_units")] + public string preferred_units + { + get { return m_preferred_units; } + set { m_preferred_units = value; } + } + private string m_preferred_units; + + [DataMember(Name = "timezone")] + public string timezone + { + get { return m_timezone; } + set { m_timezone = value; } + } + private string m_timezone; + + [DataMember(Name = "user_reg_country_id")] + public string user_reg_country_id + { + get { return m_user_reg_country_id; } + set { m_user_reg_country_id = value; } + } + private string m_user_reg_country_id; + + [DataMember(Name = "user_reg_state_id")] + public string user_reg_state_id + { + get { return m_user_reg_state_id; } + set { m_user_reg_state_id = value; } + } + private string m_user_reg_state_id; + } +} diff --git a/Route4MeSDKLibrary/DataTypes/Order.cs b/Route4MeSDKLibrary/DataTypes/Order.cs new file mode 100644 index 00000000..ff750294 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/Order.cs @@ -0,0 +1,185 @@ +using Route4MeSDK.QueryTypes; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class Order : GenericParameters + { + + /// + /// Order ID. + /// + [DataMember(Name = "order_id", EmitDefaultValue = false)] + public int order_id { get; set; } + + /// + /// Address 1 field. Required + /// + [DataMember(Name = "address_1")] + public string address_1 { get; set; } + + /// + /// Address 2 field + /// + [DataMember(Name = "address_2", EmitDefaultValue = false)] + public string address_2 { get; set; } + + /// + /// Geo latitude. Required + /// + [DataMember(Name = "cached_lat")] + public double cached_lat { get; set; } + + /// + /// Geo longitude. Required + /// + [DataMember(Name = "cached_lng")] + public double cached_lng { get; set; } + + /// + /// Generate optimal routes and driving directions to this curbside latitude + /// + [DataMember(Name = "curbside_lat", EmitDefaultValue = false)] + public double? curbside_lat { get; set; } + + /// + /// Generate optimal routes and driving directions to the curbside langitude + /// + [DataMember(Name = "curbside_lng", EmitDefaultValue = false)] + public double? curbside_lng { get; set; } + + /// + /// Scheduled day + /// + [DataMember(Name = "day_scheduled_for_YYMMDD", EmitDefaultValue = false)] + public string day_scheduled_for_YYMMDD { get; set; } + + /// + /// Address Alias. Required + /// + [DataMember(Name = "address_alias")] + public string address_alias { get; set; } + + /// + /// Local time window start + /// + [DataMember(Name = "local_time_window_start", EmitDefaultValue = false)] + public int? local_time_window_start { get; set; } + + /// + /// Local time window end + /// + [DataMember(Name = "local_time_window_end", EmitDefaultValue = false)] + public int? local_time_window_end { get; set; } + + /// + /// Second Local time window start + /// + [DataMember(Name = "local_time_window_start_2", EmitDefaultValue = false)] + public int? local_time_window_start_2 { get; set; } + + /// + /// Second local time window end + /// + [DataMember(Name = "local_time_window_end_2", EmitDefaultValue = false)] + public int? local_time_window_end_2 { get; set; } + + /// + /// Second time + /// + [DataMember(Name = "service_time", EmitDefaultValue = false)] + public int? service_time { get; set; } + + /// + /// Address City + /// + [DataMember(Name = "address_city", EmitDefaultValue = false)] + public string address_city { get; set; } + + /// + /// Address state ID + /// + [DataMember(Name = "address_state_id", EmitDefaultValue = false)] + public string address_state_id { get; set; } + + /// + /// Address country ID + /// + [DataMember(Name = "address_country_id", EmitDefaultValue = false)] + public string address_country_id { get; set; } + + /// + /// Address ZIP + /// + [DataMember(Name = "address_zip", EmitDefaultValue = false)] + public string address_zip { get; set; } + + /// + /// Order status ID + /// + [DataMember(Name = "order_status_id", EmitDefaultValue = false)] + public int order_status_id { get; set; } + + /// + /// The id of the member inside the route4me system + /// + [DataMember(Name = "member_id", EmitDefaultValue = false)] + public int member_id { get; set; } + + /// + /// First name + /// + [DataMember(Name = "EXT_FIELD_first_name", EmitDefaultValue = false)] + public string EXT_FIELD_first_name { get; set; } + + /// + /// Last name + /// + [DataMember(Name = "EXT_FIELD_last_name", EmitDefaultValue = false)] + public string EXT_FIELD_last_name { get; set; } + + /// + /// Email + /// + [DataMember(Name = "EXT_FIELD_email", EmitDefaultValue = false)] + public string EXT_FIELD_email { get; set; } + + /// + /// Phone number + /// + [DataMember(Name = "EXT_FIELD_phone", EmitDefaultValue = false)] + public string EXT_FIELD_phone { get; set; } + + /// + /// Custom data + /// + [DataMember(Name = "EXT_FIELD_custom_data", EmitDefaultValue = false)] + public object EXT_FIELD_custom_data + { + get + { + if (m_EXT_FIELD_custom_data == null) return null; + string sTypeName = m_EXT_FIELD_custom_data.GetType().Name; + if (sTypeName == "Object[]") return new Dictionary(); + return (Dictionary)m_EXT_FIELD_custom_data; + } + set { m_EXT_FIELD_custom_data = value; } + } + private object m_EXT_FIELD_custom_data; + + /// + /// Local timezone string + /// + [DataMember(Name = "local_timezone_string", EmitDefaultValue = false)] + public string local_timezone_string { get; set; } + + /// + /// Order icon + /// + [DataMember(Name = "order_icon", EmitDefaultValue = false)] + public string order_icon { get; set; } + + } +} diff --git a/Route4MeSDKLibrary/DataTypes/OrdersResponse.cs b/Route4MeSDKLibrary/DataTypes/OrdersResponse.cs new file mode 100644 index 00000000..5d06ada6 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/OrdersResponse.cs @@ -0,0 +1,16 @@ +using Route4MeSDK.QueryTypes; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class OrdersResponse : GenericParameters + { + [DataMember(Name = "results", EmitDefaultValue = false)] + public Order[] results { get; set; } + + [DataMember(Name = "total", EmitDefaultValue = false)] + public int? total { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/Route.cs b/Route4MeSDKLibrary/DataTypes/Route.cs new file mode 100755 index 00000000..97987b9b --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/Route.cs @@ -0,0 +1,49 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + + + [DataContract] + public sealed class DataObjectRoute : DataObject + { + [DataMember(Name = "route_id", EmitDefaultValue = false)] + public string RouteID { get; set; } + + [DataMember(Name = "member_id", EmitDefaultValue = false)] + public string MemberId { get; set; } + + [DataMember(Name = "member_email", EmitDefaultValue = false)] + public string MemberEmail { get; set; } + + [DataMember(Name = "vehicle_alias", EmitDefaultValue = false)] + public string VehicleAlias { get; set; } + + [DataMember(Name = "driver_alias", EmitDefaultValue = false)] + public string DriverAlias { get; set; } + + [DataMember(Name = "route_cost", EmitDefaultValue = false)] + public double? RouteCost { get; set; } + + [DataMember(Name = "route_revenue", EmitDefaultValue = false)] + public double? RouteRevenue { get; set; } + + [DataMember(Name = "net_revenue_per_distance_unit", EmitDefaultValue = false)] + public double? NetRevenuePerDistanceUnit { get; set; } + + [DataMember(Name = "created_timestamp", EmitDefaultValue = false)] + public int? CreatedTimestamp { get; set; } + + [DataMember(Name = "mpg", EmitDefaultValue = false)] + public string mpg { get; set; } + + [DataMember(Name = "trip_distance", EmitDefaultValue = false)] + public double? TripDistance { get; set; } + + [DataMember(Name = "gas_price", EmitDefaultValue = false)] + public double? GasPrice { get; set; } + + [DataMember(Name = "route_duration_sec", EmitDefaultValue = false)] + public int? RouteDurationSec { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/RouteParameters.cs b/Route4MeSDKLibrary/DataTypes/RouteParameters.cs new file mode 100755 index 00000000..b8022986 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/RouteParameters.cs @@ -0,0 +1,209 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + + [DataContract] + public sealed class RouteParameters + { + + //let the R4M api know if this sdk request is coming from a file upload within your environment (for analytics) + [DataMember(Name = "is_upload", EmitDefaultValue = false)] + public string IsUpload { get; set; } + + //the tour type of this route. rt is short for round trip, the optimization engine changes its behavior for round trip routes + [DataMember(Name = "rt", EmitDefaultValue = false)] + public bool? RT { get; set; } + + //by disabling optimization, the route optimization engine will not resequence the stops in your + [DataMember(Name = "disable_optimization", EmitDefaultValue = false)] + public bool? DisableOptimization { get; set; } + + //the name of this route. this route name will be accessible in the search API, and also will be displayed on the mobile device of a user + [DataMember(Name = "route_name", EmitDefaultValue = false)] + public string RouteName { get; set; } + + //the route start date in UTC, unix timestamp seconds. + //used to show users when the route will begin, also used for reporting and analytics + [DataMember(Name = "route_date", EmitDefaultValue = false)] + public long? RouteDate { get; set; } + + //offset in seconds relative to the route start date (i.e. 9AM would be 60 * 60 * 9) + [DataMember(Name = "route_time", EmitDefaultValue = false)] + public object RouteTime { get; set; } + + //deprecated + //specify if the route can be viewed by unauthenticated users + [DataMember(Name = "shared_publicly", EmitDefaultValue = false)] + public string SharedPublicly { get; set; } + + + [DataMember(Name = "optimize", EmitDefaultValue = false)] + public string Optimize { get; set; } + + //when the tour type is not round trip (rt = false), enable lock last so that the final destination is fixed + //example: driver leaves a depot, but must always arrive at home ( or a specific gas station) at the end of the route + [DataMember(Name = "lock_last", EmitDefaultValue = false)] + public bool? LockLast { get; set; } + + + [DataMember(Name = "vehicle_capacity", EmitDefaultValue = false)] + public string VehicleCapacity { get; set; } + + [DataMember(Name = "vehicle_max_distance_mi", EmitDefaultValue = false)] + public string VehicleMaxDistanceMI { get; set; } + + //km or mi, the route4me api will convert all measurements into these units + [DataMember(Name = "distance_unit", EmitDefaultValue = false)] + public string DistanceUnit { get; set; } + + [DataMember(Name = "travel_mode", EmitDefaultValue = false)] + public string TravelMode { get; set; } + + [DataMember(Name = "avoid", EmitDefaultValue = false)] + public string Avoid { get; set; } + + [DataMember(Name = "vehicle_id", EmitDefaultValue = false)] + public string VehicleId { get; set; } + + //deprecated, all new routes should be assigned to a member_id + [DataMember(Name = "driver_id", EmitDefaultValue = false)] + public string DriverId { get; set; } + + //the latitude of the device making this sdk request + [DataMember(Name = "dev_lat", EmitDefaultValue = false)] + public double? DevLatitude { get; set; } + + //the longitude of the device making this sdk request + [DataMember(Name = "dev_lng", EmitDefaultValue = false)] + public double? DevLongitude { get; set; } + + //when using a multiple driver algorithm, this is the maximum permissible duration of a generated route + //the optimization system will automatically create more routes when the route_max_duration is exceeded for a route + //however it will create an 'unrouted' list of addresses if the maximum number of drivers is exceeded + [DataMember(Name = "route_max_duration", EmitDefaultValue = false)] + public int? RouteMaxDuration { get; set; } + + //the email address to notify upon completion of an optimization request + [DataMember(Name = "route_email", EmitDefaultValue = false)] + public string RouteEmail { get; set; } + + //type of route being created: ENUM(api,null) + [DataMember(Name = "route_type", EmitDefaultValue = false)] + public string RouteType { get; set; } + + //deprecated + //all routes are stored by default at this time + [DataMember(Name = "store_route", EmitDefaultValue = false)] + public bool? StoreRoute { get; set; } + + //1 = ROUTE4ME_METRIC_EUCLIDEAN (use euclidean distance when computing point to point distance) + //2 = ROUTE4ME_METRIC_MANHATTAN (use manhattan distance (taxicab geometry) when computing point to point distance) + //3 = ROUTE4ME_METRIC_GEODESIC (use geodesic distance when computing point to point distance) + //#4 is the default and suggested metric + //4 = ROUTE4ME_METRIC_MATRIX (use road network driving distance when computing point to point distance) + //5 = ROUTE4ME_METRIC_EXACT_2D (use exact rectilinear distance) + [DataMember(Name = "metric", EmitDefaultValue = false)] + public Metric Metric { get; set; } + + //the type of algorithm to use when optimizing the route + [DataMember(Name = "algorithm_type", EmitDefaultValue = false)] + public AlgorithmType AlgorithmType { get; set; } + + //in order for users in your organization to have routes assigned to them, + //you must provide their member id within the route4me system + //a list of member ids can be retrieved with view_users api method + [DataMember(Name = "member_id", EmitDefaultValue = false)] + public string MemberId { get; set; } + + + //specify the ip address of the remote user making this optimization request + [DataMember(Name = "ip", EmitDefaultValue = false)] + public string Ip { get; set; } + + + //the method to use when compute the distance between the points in a route + //1 = DEFAULT (R4M PROPRIETARY ROUTING) + //2 = DEPRECRATED + //3 = R4M TRAFFIC ENGINE + //4 = DEPRECATED + //5 = DEPRECATED + //6 = TRUCKING + [DataMember(Name = "dm", EmitDefaultValue = false)] + public int? DM { get; set; } + + //directions method + //1 = DEFAULT (R4M PROPRIETARY INTERNAL NAVIGATION SYSTEM) + //2 = DEPRECATED + //3 = TRUCKING + //4 = DEPRECATED + [DataMember(Name = "dirm", EmitDefaultValue = false)] + public int? Dirm { get; set; } + + [DataMember(Name = "parts", EmitDefaultValue = false)] + public int? Parts { get; set; } + + //deprecated + [DataMember(Name = "device_id", EmitDefaultValue = false)] + public object DeviceID { get; set; } + + //the type of device making this request + //ENUM("web", "iphone", "ipad", "android_phone", "android_tablet") + [DataMember(Name = "device_type", EmitDefaultValue = false)] + public string DeviceType { get; set; } + + //for routes that have trucking directions enabled, directions generated + //will ensure compliance so that road directions generated do not take the vehicle + //where trailers are prohibited + [DataMember(Name = "has_trailer", EmitDefaultValue = false)] + public bool? HasTrailer { get; set; } + + //for routes that have trucking directions enabled, directions generated + //will ensure compliance so that road directions generated do not take the vehicle + //on roads where the weight of the vehicle in tons exceeds this value + [DataMember(Name = "trailer_weight_t", EmitDefaultValue = false)] + public double? TrailerWeightT { get; set; } + + + [DataMember(Name = "limited_weight_t", EmitDefaultValue = false)] + public double? LimitedWeightT { get; set; } + + //for routes that have trucking directions enabled, directions generated + //will ensure compliance so that road directions generated do not take the vehicle + //where the weight per axle in tons exceeds this value + [DataMember(Name = "weight_per_axle_t", EmitDefaultValue = false)] + public double? WeightPerAxleT { get; set; } + + //for routes that have trucking directions enabled, directions generated + //will ensure compliance of this maximum height of truck when generating road network driving directions + [DataMember(Name = "truck_height_meters", EmitDefaultValue = false)] + public int? TruckHeightMeters { get; set; } + + //for routes that have trucking directions enabled, directions generated + //will ensure compliance of this width of the truck when generating road network driving directions + [DataMember(Name = "truck_width_meters", EmitDefaultValue = false)] + public int? TruckWidthMeters { get; set; } + + //for routes that have trucking directions enabled, directions generated + //will ensure compliance of this length of the truck when generating road network driving directions + [DataMember(Name = "truck_length_meters", EmitDefaultValue = false)] + public int? TruckLengthMeters { get; set; } + + + //the minimum number of stops permitted per created subroute + [DataMember(Name = "min_tour_size", EmitDefaultValue = false)] + public int? MinTourSize { get; set; } + + //the maximum number of stops permitted per created subroute + [DataMember(Name = "max_tour_size", EmitDefaultValue = false)] + public int? MaxTourSize { get; set; } + + //there are 3 types of optimization qualities that are optimizations goals + //1 - Generate Optimized Routes As Quickly as Possible + //2 - Generate Routes That Look Better On A Map + //3 - Generate The Shortest And Quickest Possible Routes + + [DataMember(Name = "optimization_quality", EmitDefaultValue = false)] + public int? OptimizationQuality { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/RouteResponse.cs b/Route4MeSDKLibrary/DataTypes/RouteResponse.cs new file mode 100644 index 00000000..acc18519 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/RouteResponse.cs @@ -0,0 +1,291 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class RouteResponse + { + [DataMember(Name = "route_id")] + public string RouteID + { + get { return m_RouteID; } + set { m_RouteID = value; } + } + private string m_RouteID; + + [DataMember(Name = "optimization_problem_id")] + public string OptimizationProblemId + { + get { return m_OptimizationProblemId; } + set { m_OptimizationProblemId = value; } + } + private string m_OptimizationProblemId; + + /// + /// Route rating by user [0 - 5] + /// + [DataMember(Name = "user_route_rating")] + public System.Nullable UserRouteRating + { + get { return m_UserRouteRating; } + set { m_UserRouteRating = value; } + } + private System.Nullable m_UserRouteRating; + + [DataMember(Name = "member_id")] + public System.Nullable MemberId + { + get { return m_MemberId; } + set { m_MemberId = value; } + } + private System.Nullable m_MemberId; + + [DataMember(Name = "member_email")] + public string MemberEmail + { + get { return m_MemberEmail; } + set { m_MemberEmail = value; } + } + private string m_MemberEmail; + + [DataMember(Name = "member_first_name")] + public string MemberFirstName + { + get { return m_MemberFirstName; } + set { m_MemberFirstName = value; } + } + private string m_MemberFirstName; + + [DataMember(Name = "member_last_name")] + public string MemberLastName + { + get { return m_MemberLastName; } + set { m_MemberLastName = value; } + } + private string m_MemberLastName; + + [DataMember(Name = "channel_name")] + public string ChannelName + { + get { return m_ChannelName; } + set { m_ChannelName = value; } + } + private string m_ChannelName; + + [DataMember(Name = "vehicle_alias")] + public string VehicleAlias + { + get { return m_VehicleAlias; } + set { m_VehicleAlias = value; } + } + private string m_VehicleAlias; + + [DataMember(Name = "driver_alias")] + public string DriverAlias + { + get { return m_DriverAlias; } + set { m_DriverAlias = value; } + } + private string m_DriverAlias; + + [DataMember(Name = "trip_distance")] + public System.Nullable TripDistance + { + get { return m_TripDistance; } + set { m_TripDistance = value; } + } + private System.Nullable m_TripDistance; + + [DataMember(Name = "is_unrouted")] + public bool IsUnrouted + { + get { return m_IsUnrouted; } + set { m_IsUnrouted = value; } + } + private bool m_IsUnrouted; + + [DataMember(Name = "route_cost")] + public System.Nullable RouteCost + { + get { return m_RouteCost; } + set { m_RouteCost = value; } + } + private System.Nullable m_RouteCost; + + [DataMember(Name = "route_revenue")] + public System.Nullable RouteRevenue + { + get { return m_RouteRevenue; } + set { m_RouteRevenue = value; } + } + private System.Nullable m_RouteRevenue; + + [DataMember(Name = "net_revenue_per_distance_unit")] + public System.Nullable NetRevenuePerDistanceUnit + { + get { return m_NetRevenuePerDistanceUnit; } + set { m_NetRevenuePerDistanceUnit = value; } + } + private System.Nullable m_NetRevenuePerDistanceUnit; + + [DataMember(Name = "created_timestamp")] + public System.Nullable CreatedTimestamp + { + get { return m_CreatedTimestamp; } + set { m_CreatedTimestamp = value; } + } + private System.Nullable m_CreatedTimestamp; + + [DataMember(Name = "mpg")] + public System.Nullable mpg + { + get { return m_mpg; } + set { m_mpg = value; } + } + private System.Nullable m_mpg; + + [DataMember(Name = "gas_price")] + public System.Nullable GasPrice + { + get { return m_GasPrice; } + set { m_GasPrice = value; } + } + private System.Nullable m_GasPrice; + + [DataMember(Name = "route_duration_sec")] + public System.Nullable RouteDurationSec + { + get { return m_RouteDurationSec; } + set { m_RouteDurationSec = value; } + } + private System.Nullable m_RouteDurationSec; + + [DataMember(Name = "planned_total_route_duration")] + public System.Nullable PlannedTotalRouteDuration + { + get { return m_PlannedTotalRouteDuration; } + set { m_PlannedTotalRouteDuration = value; } + } + private System.Nullable m_PlannedTotalRouteDuration; + + [DataMember(Name = "actual_travel_distance")] + public System.Nullable ActualTravelDistance + { + get { return m_ActualTravelDistance; } + set { m_ActualTravelDistance = value; } + } + private System.Nullable m_ActualTravelDistance; + + [DataMember(Name = "actual_travel_time")] + public System.Nullable ActualTravelTime + { + get { return m_ActualTravelTime; } + set { m_ActualTravelTime = value; } + } + private System.Nullable m_ActualTravelTime; + + [DataMember(Name = "actual_footsteps")] + public System.Nullable ActualFootSteps + { + get { return m_ActualFootSteps; } + set { m_ActualFootSteps = value; } + } + private System.Nullable m_ActualFootSteps; + + [DataMember(Name = "working_time")] + public System.Nullable WorkingTime + { + get { return m_WorkingTime; } + set { m_WorkingTime = value; } + } + private System.Nullable m_WorkingTime; + + [DataMember(Name = "driving_time")] + public System.Nullable DrivingTime + { + get { return m_DrivingTime; } + set { m_DrivingTime = value; } + } + private System.Nullable m_DrivingTime; + + [DataMember(Name = "idling_time")] + public System.Nullable IdlingTime + { + get { return m_IdlingTime; } + set { m_IdlingTime = value; } + } + private System.Nullable m_IdlingTime; + + [DataMember(Name = "paying_miles")] + public System.Nullable PayingMiles + { + get { return m_PayingMiles; } + set { m_PayingMiles = value; } + } + private System.Nullable m_PayingMiles; + + [DataMember(Name = "geofence_polygon_type")] + public string GeofencePolygonType + { + get { return m_GeofencePolygonType; } + set { m_GeofencePolygonType = value; } + } + private string m_GeofencePolygonType; + + [DataMember(Name = "geofence_polygon_size")] + public System.Nullable GeofencePolygonSize + { + get { return m_GeofencePolygonSize; } + set { m_GeofencePolygonSize = value; } + } + private System.Nullable m_GeofencePolygonSize; + + [DataMember(Name = "parameters")] + public RouteParameters Parameters + { + get { return m_Parameters; } + set { m_Parameters = value; } + } + private RouteParameters m_Parameters; + + [DataMember(Name = "addresses")] + public Address[] Addresses + { + get { return m_Addresses; } + set { m_Addresses = value; } + } + private Address[] m_Addresses; + + [DataMember(Name = "links")] + public Links Links + { + get { return m_Links; } + set { m_Links = value; } + } + private Links m_Links; + + [DataMember(Name = "notes")] + public AddressNote[] Notes + { + get { return m_Notes; } + set { m_Notes = value; } + } + private AddressNote[] m_Notes; + + [DataMember(Name = "path")] + public GeoPoint[] Path + { + get { return m_Path; } + set { m_Path = value; } + } + private GeoPoint[] m_Path; + + [DataMember(Name = "directions")] + public Direction[] Directions + { + get { return m_Directions; } + set { m_Directions = value; } + } + private Direction[] m_Directions; + } +} diff --git a/Route4MeSDKLibrary/DataTypes/Schedule.cs b/Route4MeSDKLibrary/DataTypes/Schedule.cs new file mode 100644 index 00000000..66180ad7 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/Schedule.cs @@ -0,0 +1,239 @@ +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.ComponentModel.DataAnnotations; + +namespace Route4MeSDK.DataTypes +{ + /// + /// A trip schedule to a location + /// + [DataContract] + public sealed class Schedule + { + public Schedule(string sMode, bool blNth) + { + switch (sMode) + { + case "daily": + this.daily = new schedule_daily(); + this.mode = "daily"; + break; + case "weekly": + this.weekly = new schedule_weekly(); + this.mode = "weekly"; + //this.weekly.weekdays = new int[]{}; + break; + case "monthly": + this.monthly = new schedule_monthly(); + this.mode = "monthly"; + if (blNth) this.monthly.nth = new schedule_monthly_nth(); + break; + case "annually": + this.annually = new schedule_annually(); + this.mode = "annually"; + if (blNth) this.annually.nth = new schedule_monthly_nth(); + //this.annually.months = new int[] { }; + break; + } + + } + + public Schedule() + { + + } + + [DataMember(Name = "enabled")] + public bool enabled { get; set; } + + [DataMember(Name = "mode"), CustomValidation(typeof(PropertyValidation), "ValidateScheduleMode")] + public string mode { get; set; } + + [DataMember(Name = "daily", EmitDefaultValue = false, IsRequired = false)] + public schedule_daily daily { get; set; } + + [DataMember(Name = "weekly", EmitDefaultValue = false, IsRequired = false)] + public schedule_weekly weekly { get; set; } + + [DataMember(Name = "monthly", EmitDefaultValue = false, IsRequired = false)] + public schedule_monthly monthly { get; set; } + + [DataMember(Name = "annually", EmitDefaultValue = false, IsRequired = false)] + public schedule_annually annually { get; set; } + + public bool ValidateScheduleMode(object ScheduleMode) + { + if (ScheduleMode == null) return false; + if (Array.IndexOf(new string[]{"daily","weekly","monthly","annually"},ScheduleMode.ToString())>=0) return true; + return false; + } + + public bool ValidateScheduleEnabled(object ScheduleEnabled) + { + bool blValid = false; + if (bool.TryParse(ScheduleEnabled.ToString(), out blValid)) return true; else return false; + } + + public bool ValidateScheduleUseNth(object ScheduleUseNth) + { + bool blValid = false; + if (bool.TryParse(ScheduleUseNth.ToString(), out blValid)) return true; else return false; + } + + public bool ValidateScheduleEvery(object ScheduleEvery) + { + int iEvery = -1; + if (int.TryParse(ScheduleEvery.ToString(), out iEvery)) return true; else return false; + } + + public bool ValidateScheduleWeekdays(object Weekdays) + { + if (Weekdays == null) return false; + + bool blValid = true; + + string[] arWeekdays = Weekdays.ToString().Split(','); + + foreach (string weekday in arWeekdays) + { + int iWeekday = -1; + if (!int.TryParse(weekday, out iWeekday)) { blValid = false; break; } + + iWeekday = Convert.ToInt32(weekday); + if (iWeekday > 7 || iWeekday < 1) { blValid = false; break; } + } + + return blValid; + } + + public bool ValidateScheduleMonthDays(object ScheduleMonthDays) + { + if (ScheduleMonthDays == null) return false; + + bool blValid = true; + + string[] arMonthdays = ScheduleMonthDays.ToString().Split(','); + + foreach (string monthday in arMonthdays) + { + int iMonthday = -1; + if (!int.TryParse(monthday, out iMonthday)) { blValid = false; break; } + + iMonthday = Convert.ToInt32(monthday); + if (iMonthday > 31 || iMonthday < 1) { blValid = false; break; } + } + + return blValid; + } + + public bool ValidateScheduleYearMonths(object ScheduleYearMonths) + { + if (ScheduleYearMonths == null) return false; + + bool blValid = true; + + string[] arYearMonth = ScheduleYearMonths.ToString().Split(','); + + foreach (string yearmonth in arYearMonth) + { + int iYearmonth = -1; + if (!int.TryParse(yearmonth, out iYearmonth)) { blValid = false; break; } + + iYearmonth = Convert.ToInt32(yearmonth); + if (iYearmonth > 12 || iYearmonth < 1) { blValid = false; break; } + } + + return blValid; + } + + public bool ValidateScheduleMonthlyMode(object ScheduleMonthlyMode) + { + if (ScheduleMonthlyMode == null) return false; + if (Array.IndexOf(new string[] { "dates", "nth" }, ScheduleMonthlyMode.ToString()) >= 0) return true; + return false; + } + + public bool ValidateScheduleNthN(object ScheduleNthN) + { + int iN = -1; + if (!int.TryParse(ScheduleNthN.ToString(), out iN)) return false; + iN = Convert.ToInt32(ScheduleNthN); + + if (Array.IndexOf(new int[] { 1, 2, 3, 4, 5, -1 }, iN) < 0) return false; + + return true; + } + + public bool ValidateScheduleNthWhat(object ScheduleNthWhat) + { + int iN = -1; + if (!int.TryParse(ScheduleNthWhat.ToString(), out iN)) return false; + iN = Convert.ToInt32(ScheduleNthWhat); + + if (Array.IndexOf(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, iN) < 0) return false; + + return true; + } + + } + + [DataContract] + public class schedule_daily + { + [DataMember(Name = "every")] + public int every { get; set; } + } + + [DataContract] + public class schedule_weekly + { + [DataMember(Name = "every")] + public int every { get; set; } + + [DataMember(Name = "weekdays", EmitDefaultValue = false), Range(1, 7, ErrorMessage = "Weekday must be between 1 and 7")] + public int[] weekdays { get; set; } + } + + [DataContract] + public class schedule_monthly_nth + { + [DataMember(Name = "n", EmitDefaultValue = false), CustomValidation(typeof(PropertyValidation), "ValidateMonthlyNthN")] + public int n { get; set; } + + [DataMember(Name = "what", EmitDefaultValue = false), Range(1, 10, ErrorMessage = "Wrong value for the What Time parameter")] + public int what { get; set; } + } + + [DataContract] + public class schedule_monthly + { + [DataMember(Name = "every")] + public int every { get; set; } + + [DataMember(Name = "mode"), CustomValidation(typeof(PropertyValidation), "ValidateScheduleMonthlyMode")] + public string mode { get; set; } + + [DataMember(Name = "dates", EmitDefaultValue = false), Range(1, 31, ErrorMessage = "Month day must be between 1 and 31")] + public int[] dates { get; set; } + + [DataMember(Name = "nth", EmitDefaultValue = false)] + public schedule_monthly_nth nth { get; set; } + } + + [DataContract] + public class schedule_annually + { + [DataMember(Name = "every")] + public int every { get; set; } + + [DataMember(Name = "use_nth")] + public bool use_nth { get; set; } + + [DataMember(Name = "months", EmitDefaultValue = false), Range(1, 12, ErrorMessage = "Month number must be between 1 and 12")] + public int[] months { get; set; } + + [DataMember(Name = "nth", EmitDefaultValue = false)] + public schedule_monthly_nth nth { get; set; } + } +} \ No newline at end of file diff --git a/Route4MeSDKLibrary/DataTypes/Territory.cs b/Route4MeSDKLibrary/DataTypes/Territory.cs new file mode 100644 index 00000000..e9eb83f6 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/Territory.cs @@ -0,0 +1,23 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + /// + /// Territory parameters + /// + [DataContract] + public sealed class Territory + { + /// + /// Territory type (circle, rectangle, polygon) + /// + [DataMember(Name = "type")] + public string Type { get; set; } + + /// + /// Territory figure data + /// + [DataMember(Name = "data")] + public string[] Data { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/TerritoryZone.cs b/Route4MeSDKLibrary/DataTypes/TerritoryZone.cs new file mode 100644 index 00000000..cd820de1 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/TerritoryZone.cs @@ -0,0 +1,77 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + /// + /// Territory Zone + /// + [DataContract] + public sealed class TerritoryZone + { + /// + /// Avoidance zone id + /// + [DataMember(Name = "territory_id")] + public string TerritoryId + { + get { return m_TerritoryId; } + set { m_TerritoryId = value; } + } + private string m_TerritoryId; + + /// + /// Territory name + /// + [DataMember(Name = "territory_name")] + public string TerritoryName + { + get { return m_TerritoryName; } + set { m_TerritoryName = value; } + } + private string m_TerritoryName; + + /// + /// Territory color + /// + [DataMember(Name = "territory_color")] + public string TerritoryColor + { + get { return m_TerritoryColor; } + set { m_TerritoryColor = value; } + } + private string m_TerritoryColor; + + /// + /// Territory addresses + /// + [DataMember(Name = "addresses")] + public int[] addresses + { + get { return m_addresses; } + set { m_addresses = value; } + } + private int[] m_addresses; + + /// + /// Member Id + /// + [DataMember(Name = "member_id")] + public string MemberId + { + get { return m_MemberId; } + set { m_MemberId = value; } + } + private string m_MemberId; + + /// + /// Territory parameters + /// + [DataMember(Name = "territory")] + public Territory Territory + { + get { return m_Territory; } + set { m_Territory = value; } + } + private Territory m_Territory; + } +} diff --git a/Route4MeSDKLibrary/DataTypes/TrackingHistory.cs b/Route4MeSDKLibrary/DataTypes/TrackingHistory.cs new file mode 100755 index 00000000..1b06c778 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/TrackingHistory.cs @@ -0,0 +1,34 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + + [DataContract] + public sealed class TrackingHistory + { + /* tracking data key names are shortened to reduce bandwidth usage (even with compression on) */ + // speed at the time of the location transaction event + [DataMember(Name = "s")] + public double? Speed {get; set; } + + // latitude at the time of the location transaction event + [DataMember(Name = "lt")] + public double? Latitude { get; set; } + + // longitude at the time of the location transaction event + [DataMember(Name = "lg")] + public double? Longitude { get; set; } + + // direction/heading at the time of the location transaction event + [DataMember(Name = "d")] + public string D {get; set; } + + // the original timestamp in unix timestamp format at the moment location transaction event + [DataMember(Name = "ts")] + public string TimeStamp {get; set; } + + // the original timestamp in a human readable timestamp format at the moment location transaction event + [DataMember(Name = "ts_friendly")] + public string TimeStampFriendly { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/User.cs b/Route4MeSDKLibrary/DataTypes/User.cs new file mode 100644 index 00000000..b651ea4d --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/User.cs @@ -0,0 +1,36 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class User + { + //the id of the member inside the route4me system + [DataMember(Name = "member_id", EmitDefaultValue = false)] + public int? MemberId { get; set; } + + [DataMember(Name = "account_type_id", EmitDefaultValue = false)] + public int? AccountTypeId { get; set; } + + [DataMember(Name = "member_type", EmitDefaultValue = false)] + public string MemberType { get; set; } + + [DataMember(Name = "member_first_name")] + public string MemberFirstName { get; set; } + + [DataMember(Name = "member_last_name")] + public string MemberLasttName { get; set; } + + [DataMember(Name = "member_email")] + public string MemberEmail { get; set; } + + [DataMember(Name = "phone_number")] + public string PhoneNumber { get; set; } + + [DataMember(Name = "readonly_user", EmitDefaultValue = false)] + public bool? ReadonlyUser { get; set; } + + [DataMember(Name = "show_superuser_addresses", EmitDefaultValue = false)] + public bool? ShowSuperuserAddresses { get; set; } + } +} diff --git a/Route4MeSDKLibrary/DataTypes/VehicleResponse.cs b/Route4MeSDKLibrary/DataTypes/VehicleResponse.cs new file mode 100644 index 00000000..2413322f --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/VehicleResponse.cs @@ -0,0 +1,194 @@ +using Route4MeSDK.QueryTypes; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace Route4MeSDK.DataTypes +{ + [DataContract] + public sealed class VehicleResponse : GenericParameters + { + [DataMember(Name = "vehicle_id")] + public string VehicleId + { + get { return m_VehicleId; } + set { m_VehicleId = value; } + } + private string m_VehicleId; + + [DataMember(Name = "created_time")] + public string CreatedTime + { + get { return m_CreatedTime; } + set { m_CreatedTime = value; } + } + private string m_CreatedTime; + + [DataMember(Name = "member_id")] + public string MemberId + { + get { return m_MemberId; } + set { m_MemberId = value; } + } + private string m_MemberId; + + [DataMember(Name = "vehicle_alias")] + public string VehicleAlias + { + get { return m_VehicleAlias; } + set { m_VehicleAlias = value; } + } + private string m_VehicleAlias; + + [DataMember(Name = "vehicle_vin")] + public string VehicleVin + { + get { return m_VehicleVin; } + set { m_VehicleVin = value; } + } + private string m_VehicleVin; + + [DataMember(Name = "vehicle_reg_state")] + public string VehicleRegState + { + get { return m_VehicleRegState; } + set { m_VehicleRegState = value; } + } + private string m_VehicleRegState; + + [DataMember(Name = "vehicle_reg_state_id")] + public System.Nullable VehicleRegStateId + { + get { return m_VehicleRegStateId; } + set { m_VehicleRegStateId = value; } + } + private System.Nullable m_VehicleRegStateId; + + [DataMember(Name = "vehicle_reg_country")] + public string VehicleRegCountry + { + get { return m_VehicleRegCountry; } + set { m_VehicleRegCountry = value; } + } + private string m_VehicleRegCountry; + + [DataMember(Name = "vehicle_reg_country_id")] + public System.Nullable VehicleRegCountryId + { + get { return m_VehicleRegCountryId; } + set { m_VehicleRegCountryId = value; } + } + private System.Nullable m_VehicleRegCountryId; + + [DataMember(Name = "vehicle_license_plate")] + public string VehicleLicensePlate + { + get { return m_VehicleLicensePlate; } + set { m_VehicleLicensePlate = value; } + } + private string m_VehicleLicensePlate; + + [DataMember(Name = "vehicle_make")] + public string VehicleMake + { + get { return m_VehicleMake; } + set { m_VehicleMake = value; } + } + private string m_VehicleMake; + + [DataMember(Name = "vehicle_model_year")] + public System.Nullable VehicleModelYear + { + get { return m_VehicleModelYear; } + set { m_VehicleModelYear = value; } + } + private System.Nullable m_VehicleModelYear; + + [DataMember(Name = "vehicle_model")] + public string VehicleModel + { + get { return m_VehicleModel; } + set { m_VehicleModel = value; } + } + private string m_VehicleModel; + + [DataMember(Name = "vehicle_year_acquired")] + public System.Nullable VehicleYearAcquired + { + get { return m_VehicleYearAcquired; } + set { m_VehicleYearAcquired = value; } + } + private System.Nullable m_VehicleYearAcquired; + + [DataMember(Name = "vehicle_cost_new")] + public System.Nullable VehicleCostNew + { + get { return m_VehicleCostNew; } + set { m_VehicleCostNew = value; } + } + private System.Nullable m_VehicleCostNew; + + [DataMember(Name = "license_start_date")] + public string LicenseStartDate + { + get { return m_LicenseStartDate; } + set { m_LicenseStartDate = value; } + } + private string m_LicenseStartDate; + + [DataMember(Name = "license_end_date")] + public string LicenseEndDate + { + get { return m_LicenseEndDate; } + set { m_LicenseEndDate = value; } + } + private string m_LicenseEndDate; + + [DataMember(Name = "vehicle_axle_count")] + public System.Nullable VehicleAxleCount + { + get { return m_VehicleAxleCount; } + set { m_VehicleAxleCount = value; } + } + private System.Nullable m_VehicleAxleCount; + + [DataMember(Name = "mpg_city")] + public System.Nullable MpgCity + { + get { return m_MpgCity; } + set { m_MpgCity = value; } + } + private System.Nullable m_MpgCity; + + [DataMember(Name = "mpg_highway")] + public System.Nullable MpgHighway + { + get { return m_MpgHighway; } + set { m_MpgHighway = value; } + } + private System.Nullable m_MpgHighway; + + [DataMember(Name = "fuel_type")] + public string FuelType + { + get { return m_FuelType; } + set { m_FuelType = value; } + } + private string m_FuelType; + + [DataMember(Name = "height_inches")] + public System.Nullable HeightInches + { + get { return m_HeightInches; } + set { m_HeightInches = value; } + } + private System.Nullable m_HeightInches; + + [DataMember(Name = "weight_lb")] + public System.Nullable WeightLb + { + get { return m_WeightLb; } + set { m_WeightLb = value; } + } + private System.Nullable m_WeightLb; + } +} diff --git a/Route4MeSDKLibrary/DataTypes/cDatabase.cs b/Route4MeSDKLibrary/DataTypes/cDatabase.cs new file mode 100644 index 00000000..477f83a5 --- /dev/null +++ b/Route4MeSDKLibrary/DataTypes/cDatabase.cs @@ -0,0 +1,1066 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Json; +using System.Data; +using System.Data.Common; +using System.Configuration; +using System.Data.OleDb; +using System.Web.Script; + +namespace Route4MeSDK.DataTypes +{ + public enum R4M_DataType + { + Activity, + Addressbook, + AvoidanceZone, + Member, + Note, + Optimization, + Order, + Route, + Telematics, + Territory, + Vehicle + } + + public enum DB_Type + { + MSSQL, + MySQL, + PostgreSQL, + SQLite, + MS_Access + } + + public class cDatabase : IDisposable + { + private IDbConnection _con; + private IDbCommand _cmd; + + private IDbTransaction _transaction; + private DbDataAdapter _adapter; + private IDataReader _dr; + private DbProviderFactory _factory; + private ConnectionStringSettings _conStngInstitute; + + private bool _isDisposed; + + private string sStartupFolder; + + + public cDatabase(DB_Type db_type) + { + switch (db_type) + { + case DB_Type.MySQL: + _conStngInstitute = ConfigurationManager.ConnectionStrings["conMySQL"]; + break; + case DB_Type.MSSQL: + _conStngInstitute = ConfigurationManager.ConnectionStrings["conMSSQL"]; + break; + case DB_Type.PostgreSQL: + _conStngInstitute = ConfigurationManager.ConnectionStrings["conPostgreSQL"]; + break; + case DB_Type.SQLite: + //_conStngInstitute = ConfigurationManager.ConnectionStrings["conInstitute"]; + break; + case DB_Type.MS_Access: + _conStngInstitute = ConfigurationManager.ConnectionStrings["conOLEDB"]; + break; + } + + _factory = DbProviderFactories.GetFactory(_conStngInstitute.ProviderName); + + _con = _factory.CreateConnection(); + _con.ConnectionString = _conStngInstitute.ConnectionString; + _cmd = _con.CreateCommand(); + + _adapter = _factory.CreateDataAdapter(); + + _isDisposed = false; + + sStartupFolder = AppDomain.CurrentDomain.BaseDirectory; + } + + public bool IsDisposed + { + get + { + lock (this) + { + return _isDisposed; + } + } + } + + public void Dispose() + { + if (!IsDisposed) + { + lock (this) + { + CleanUp(); + _isDisposed = true; + GC.SuppressFinalize(this); + } + } + } + + protected virtual void CleanUp() + { + if (_con != null) + { + _con.Close(); + _con.Dispose(); + } + + if (_cmd != null) + { + _cmd.Dispose(); + } + + if (_dr != null) + { + _dr.Close(); + _dr.Dispose(); + } + } + + public void OpenConnection() + { + try + { + if (_con.State != ConnectionState.Open) _con.Open(); + } + catch (Exception ex) { Console.WriteLine("Connection not established!.."); } + } + + public void CloseConnection() + { + if (_con.State != ConnectionState.Closed) _con.Close(); + } + + /* Parsing of the multi-command SQL texts, ommiting commentaries and extracting of the puare SQL commands; + * Note: + * - after semicolon ';' shouldn't be written anything (blank spaces allowed). + * - befor '/*' shouldn't be written anything (blank spaces allowed). + * */ + public int ExecuteMulticoomandSql(string sQuery) + { + try + { + sQuery = sQuery.Replace(";", ";^"); + string[] arCommands = sQuery.Split('^'); + int iRet = 0; + _transaction = _con.BeginTransaction(IsolationLevel.Unspecified); + _cmd.Connection = _con; + _cmd.CommandType = CommandType.Text; + _cmd.Transaction = _transaction; + bool blComment = false; + foreach (string s0 in arCommands) + { + string[] arLines = s0.Split(new[] {"\r\n", "\r", "\n"}, StringSplitOptions.None); + string sCurCommand = ""; + foreach (string s1 in arLines) + { + string s2 = s1.Trim(); + if (s2.Length < 1) continue; + if (s2.IndexOf("--") == 0) continue; + if (s2.IndexOf(@"/*") == 0) + { + if (s2.IndexOf(@"*/") == s1.Length - 2) blComment = false; else blComment = true; + continue; + } + if (s2.Length>=2 && s2.IndexOf(@"*/") == s1.Length - 2) + { + blComment = false; continue; + } + + if (!blComment) + { + if (s2.IndexOf(";") != s2.Length - 1) + { + sCurCommand += s2 + System.Environment.NewLine; + } + else + { + sCurCommand += s2; + _cmd.CommandText = sCurCommand; + iRet = _cmd.ExecuteNonQuery(); + sCurCommand = ""; + } + + } + + } + } + _transaction.Commit(); + return 1; + } + catch (Exception ex) { Console.WriteLine(":( Transaction failed... " + ex.Message); _transaction.Rollback(); return 0; } + + } + + // Table for correspondance between Route4Me CSV exported file fields and Route4Me API fields + public DataTable GetCsv2ApiDictionary(string sTableName) + { + DataTable tblDictionary = new DataTable(); + + try + { + tblDictionary = fillTable("SELECT * FROM csv_to_api_dictionary WHERE table_name='" + sTableName+"'"); + return tblDictionary; + } + catch (Exception ex) { Console.WriteLine(":( csv_to_api_dictionary table reading failed!.. "+ex.Message); } + + return tblDictionary; + } + + /* Method for importing an addressbook CSV file (with structure equal to exported by Route4Me web UI CSV file) to an addressbook table on the SQL type server. + * sFileName --- CSV file name. + * sTableName --- Server addressbook table name. + * sIdName --- The name of id column of the server addressbook table (it's differs from address_id, you need it for editing prior updloading to the Route4Me server) + * isFirstRowHeader --- If true, first column of the CSV file is header. + * */ + public void Csv2Table(string sFileName, string sTableName, string sIdName, int iFieldsNumber, bool isFirstRowHeader) + { + if (!File.Exists(sFileName)) + { + Console.WriteLine("The file " + sFileName + " doesn't exist..."); return; + } + + string header = isFirstRowHeader ? "Yes" : "No"; + + string pathOnly = System.IO.Path.GetDirectoryName(sFileName); + string fileName = System.IO.Path.GetFileName(sFileName); + + string csvCom = @"SELECT * FROM [" + fileName + "]"; + + DataTable tblDictionary = GetCsv2ApiDictionary(sTableName); + + DataTable tblTempTable = new DataTable(); + + using (OleDbConnection csvCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + ";Extended Properties=\"Text;HDR=" + header + "\"")) + using (OleDbCommand comCsv = new OleDbCommand(csvCom, csvCon)) + using (OleDbDataAdapter csvAdapter = new OleDbDataAdapter(comCsv)) + { + tblTempTable.Locale = System.Globalization.CultureInfo.CurrentCulture; + csvAdapter.Fill(tblTempTable); + } + + foreach (DataRow row in tblTempTable.Rows) + { + int id = -1; + + bool blNew = true; + + if (row.Table.Columns.Contains(sIdName)) + { + if (int.TryParse(row[sIdName].ToString(), out id)) id = Convert.ToInt32(row[sIdName]); + + if (id > 0) blNew = IsNewAddress(sTableName, sIdName, id); + } + string sList = "("; + string sValues = "Values ("; + + if (!blNew) + { + sList = "SET "; + + for (int iCol = 0; iCol < iFieldsNumber; iCol++) + { + bool isValid = IsValidValue(tblTempTable.Columns[iCol], row[iCol]); + if (isValid) + { + string sCsvFieldName = tblTempTable.Columns[iCol].ColumnName; + + if (sCsvFieldName == sIdName) continue; + + DataRow[] arRows = tblDictionary.Select("r4m_csv_field_name='" + sCsvFieldName + "'"); + if (arRows.Length == 1) + { + string sFieldApiName= arRows[0]["api_field_name"].ToString(); + string sApiFieldType = arRows[0]["api_field_type"].ToString(); + string sCsvFieldType = arRows[0]["csv_field_type"].ToString(); + + if (sFieldApiName == "day_scheduled_for_YYMMDD") + { + + var oSchedule = ExceptFields2QueryValue(sFieldApiName, row[iCol]); + if (oSchedule == null) + { + sList += sFieldApiName + "=null,"; + } + else sList += sFieldApiName + "='" + oSchedule + "',"; + } + else + { + switch (tblTempTable.Columns[iCol].DataType.Name) + { + case "String": + sList += sFieldApiName + "=N'" + row[iCol].ToString() + "',"; + break; + case "Int32": + sList += sFieldApiName + "=" + row[iCol].ToString() + ","; ; + break; + case "Double": + sList += sFieldApiName + "=" + row[iCol].ToString() + ","; + break; + case "DateTime": + DateTime dt1900 = new DateTime(1900, 1, 1, 0, 0, 0); + if (DateTime.TryParse(row[iCol].ToString(), out dt1900)) + { + dt1900 = Convert.ToDateTime(row[iCol]); + if (sApiFieldType != sCsvFieldType && sApiFieldType == "int") + { + long iUnixTime = R4MeUtils.ConvertToUnixTimestamp(dt1900); + sList += sFieldApiName + "=" + iUnixTime + ","; + } + else + { + if (_conStngInstitute.ProviderName == "System.Data.OleDb") + { + sList += sFieldApiName + "=#" + dt1900.ToString("yyyy-MM-dd HH:mm:ss") + "#,"; + } + else sList += sFieldApiName + "='" + dt1900.ToString("yyyy-MM-dd HH:mm:ss") + "',"; + } + } + break; + } + } + + } + else continue; + } + } + sList = sList.TrimEnd(','); + + if (tblTempTable.Columns.Count > 33) + { + System.Text.StringBuilder sbCustom = new System.Text.StringBuilder(); + sbCustom.Append("{"); + for (int iCol = 33; iCol < tblTempTable.Columns.Count; iCol++) + { + System.Text.StringBuilder sbCustom1 = new System.Text.StringBuilder(); + sbCustom1.Append("{"); + for (int iCol1 = 33; iCol1 < tblTempTable.Columns.Count; iCol1++) + { + bool isValid = IsValidValue(tblTempTable.Columns[iCol1], row[iCol1]); + if (isValid) + { + if (tblTempTable.Columns[iCol1].DataType.Name == "String") + { + string sFieldName = tblTempTable.Columns[iCol1].ColumnName; + string sValue = row[iCol1].ToString(); + sbCustom1.Append("\"" + sFieldName + "\": \"" + sValue + "\","); + } + } + } + string sCustom = sbCustom.ToString(); + sCustom = sCustom.TrimEnd(','); + sCustom += "}"; + if (sCustom.Length > 3) + { + sList += "address_custom_data='" + " N'" + sCustom + "'"; + } + } + } + + string sQuery2 = "UPDATE " + sTableName + " " + sList + " WHERE " + sIdName + "=" + id; + + int iResult2 = ExecuteNon(sQuery2); + + if (iResult2 > 0) + { + Console.WriteLine(":) The row with "+sIdName+"d=" + id + " was updated in the table "+sTableName); + } + else + { + Console.WriteLine(":( Can not updated the row in the table "+sTableName); + } + } + else + { + for (int iCol = 0; iCol < iFieldsNumber; iCol++) + { + bool isValid = IsValidValue(tblTempTable.Columns[iCol], row[iCol]); + + if (isValid) + { + string sCvsFieldName = tblTempTable.Columns[iCol].ColumnName; + DataRow[] arRows = tblDictionary.Select("r4m_csv_field_name='" + sCvsFieldName + "'"); + if (arRows.Length == 1) + { + string sFieldApiName = arRows[0]["api_field_name"].ToString(); + string sApiFieldType = arRows[0]["api_field_type"].ToString(); + string sCsvFieldType = arRows[0]["csv_field_type"].ToString(); + + //sFields += prop.Name + ","; + if (sFieldApiName == "day_scheduled_for_YYMMDD") + { + sList += sFieldApiName + ","; + var oSchedule = ExceptFields2QueryValue(sFieldApiName, row[iCol]); + if (oSchedule == null) + { + sValues += "null"; + } + else sValues += "'" + oSchedule + "',"; + } + else + { + switch (tblTempTable.Columns[iCol].DataType.Name) + { + case "String": + sList += sFieldApiName + ","; + sValues += "N'" + row[iCol].ToString() + "',"; + break; + case "Int32": + sList += sFieldApiName + ","; + sValues += row[iCol].ToString() + ","; + break; + case "Double": + sList += sFieldApiName + ","; + sValues += row[iCol].ToString() + ","; + break; + case "DateTime": + DateTime dt1900 = new DateTime(1900, 1, 1, 0, 0, 0); + if (DateTime.TryParse(row[iCol].ToString(), out dt1900)) + { + dt1900 = Convert.ToDateTime(row[iCol]); + sList += sFieldApiName + ","; + if (sApiFieldType != sCsvFieldType && sApiFieldType == "int") + { + long iUnixTime = R4MeUtils.ConvertToUnixTimestamp(dt1900); + sValues += iUnixTime + ","; + } + else + { + if (_conStngInstitute.ProviderName == "System.Data.OleDb") + { + sValues += "#" + dt1900.ToString("yyyy-MM-dd HH:mm:ss") + "#,"; + } + else sValues += "'" + dt1900.ToString("yyyy-MM-dd HH:mm:ss") + "',"; + } + } + break; + } + } + + } + } + } + + #region custom fields in case of the addressbook contact, added in csv export as additional columns. + if (tblTempTable.Columns.Count > 33) + { + System.Text.StringBuilder sbCustom = new System.Text.StringBuilder(); + sbCustom.Append("{"); + for (int iCol = 33; iCol < tblTempTable.Columns.Count; iCol++) + { + bool isValid = IsValidValue(tblTempTable.Columns[iCol], row[iCol]); + if (isValid) + { + if (tblTempTable.Columns[iCol].DataType.Name == "String") + { + string sFieldName = tblTempTable.Columns[iCol].ColumnName; + string sValue = row[iCol].ToString(); + sbCustom.Append("\"" + sFieldName + "\": \"" + sValue + "\","); + } + } + } + string sCustom = sbCustom.ToString(); + sCustom = sCustom.TrimEnd(','); + sCustom += "}"; + if (sCustom.Length > 3) + { + sList += "address_custom_data,"; + sValues += " N'" + sCustom + "'"; + } + + } + #endregion + + sList = sList.TrimEnd(','); sList += ")"; + sValues = sValues.TrimEnd(','); sValues += ")"; + string sQuery1 = "INSERT INTO "+sTableName+" " + sList + " " + sValues; + + int iResult = ExecuteNon(sQuery1); + + if (iResult > 0) + { + Console.WriteLine(":) New row with "+sIdName+ "=" + id + " was added to the table "+sTableName); + } + else + { + Console.WriteLine(":( Can not created new row in the table "+sTableName); + } + } + } + } + + /* Method for exporting addressbook data from SQL type server to the CSV file (with structure equal to the exported by Route4Me web UI CSV file) + * sFileName --- CSV file name. + * sTableName --- Server addressbook table name. + * WithId --- If true, CSV file will have first ID of SQL addressbook table (you need it for editing in CSV file and updating server table using Csv2Table method. + * */ + public void Table2Csv(string sFileName, string sTableName, bool WithId) + { + if (!CheckDataFolder(sFileName, true)) return; + + DataTable tblTemp = fillTable("SELECT * FROM "+sTableName); + + List lsCsvContent = new List(); + + string sFileHeader = ""; + if (WithId) sFileHeader += "\"" + tblTemp.Columns[0].ColumnName + "\","; + + DataTable tblDictionary = GetCsv2ApiDictionary(sTableName); + + foreach (DataRow dictRow in tblDictionary.Rows) + { + sFileHeader += "\"" + dictRow["r4m_csv_field_name"].ToString() + "\","; + } + + #region Convert JSON string of the custom data to the csv fields (as they are represented in the exported from Route4Me csv file + foreach (DataRow row in tblTemp.Rows) + { + if (IsValidValue(tblTemp.Columns["address_custom_Data"], row["address_custom_Data"])) + { + var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); + Dictionary dict = (Dictionary)jsSerializer.DeserializeObject(row["address_custom_Data"].ToString()); + + foreach (KeyValuePair kvpair in dict) + { + DataRow[] fRows = tblDictionary.Select("r4m_csv_field_name='" + kvpair.Key + "'"); + + if (fRows.Length < 1) + { + DataRow newRow = tblDictionary.NewRow(); + + newRow["r4m_csv_field_name"] = kvpair.Key; + newRow["table_name"] = "addressbook_v4"; + newRow["csv_field_nom"] = tblDictionary.Rows.Count; + newRow["api_field_name"] = "_cf__" + kvpair.Key; + + tblDictionary.Rows.Add(newRow); + + sFileHeader += "\"" + kvpair.Key + "\","; + } + + } + } + } + #endregion + + sFileHeader = sFileHeader.TrimEnd(','); + + lsCsvContent.Add(sFileHeader); + + foreach (DataRow row in tblTemp.Rows) + { + string sRow = ""; + + if (WithId) + { + if (IsValidValue(tblTemp.Columns[0], row[0])) + { + sRow += row[0].ToString() + ","; + } + } + + foreach (DataRow dictRow in tblDictionary.Rows) + { + string sCsvFieldName = dictRow["r4m_csv_field_name"].ToString(); + + string sApiFieldName = dictRow["api_field_name"].ToString(); + + if (sApiFieldName.IndexOf("_cf__") == 0) + { + string sKeyName = sApiFieldName.Substring(5); + + if (IsValidValue(tblTemp.Columns["address_custom_Data"], row["address_custom_Data"])) + { + var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); + Dictionary dict = (Dictionary)jsSerializer.DeserializeObject(row["address_custom_Data"].ToString()); + + bool blExists = false; + foreach (KeyValuePair kvpair in dict) + { + if (kvpair.Key == sKeyName) + { + string sVal = kvpair.Value.ToString(); + sVal = sVal.Replace("\"", "\"\""); + sRow += "\"" + sVal + "\","; + blExists = true; + break; + } + } + + if (!blExists) sRow += ","; + } + else sRow += ","; + } + else + { + DataColumn apiCol = tblTemp.Columns[sApiFieldName]; + + if (IsValidValue(apiCol, row[apiCol.ColumnName])) + { + switch (apiCol.DataType.ToString()) + { + case "System.String": + string sVal = row[apiCol.ColumnName].ToString(); + sVal = sVal.Replace("\"", "\"\""); + sRow += "\"" + sVal + "\","; + break; + case "System.DdateTime": + sRow += "\"" + Convert.ToDateTime(row[apiCol.ColumnName]).ToString("yyyy-MM-dd HH:mm:ss") + "\","; + break; + default: + sRow += row[apiCol.ColumnName] + ","; + break; + } + + } + else sRow += ","; + } + + } + + sRow = sRow.TrimEnd(','); + lsCsvContent.Add(sRow); + } + + File.WriteAllLines(sFileName, lsCsvContent.ToArray()); + + Console.WriteLine("The file "+sFileName+" was created. You can fill it with data for upoloading on the server."); + } + + /* Create data folder if it doesn't exist. + * */ + private bool CheckDataFolder(string file_name, bool blCreateIfNotExists) + { + try + { + DirectoryInfo iDir = Directory.GetParent(file_name); + if (File.Exists(iDir.FullName)) + { + return true; + + } + else + { + if (blCreateIfNotExists) Directory.CreateDirectory(iDir.FullName); + return true; + } + + } + catch (Exception ex) + { + Console.WriteLine("Creation of the data folder failed... "+ex.Message); + return false; + } + } + + /* Method FieldValue2QueryValue converts value of the type ttype to value for sqlquery operations (update, insert) + **/ + private string FieldValue2QueryValue(Type ttype, object oValue) + { + string sQueryValue = ""; + + switch (ttype.Name) + { + case "String": + sQueryValue = "N'" + oValue.ToString() + "'"; + break; + case "Int32": + sQueryValue = oValue.ToString(); + break; + case "Double": + sQueryValue = oValue.ToString(); + break; + case "DateTime": + DateTime dt1900 = new DateTime(1900, 1, 1, 0, 0, 0); + if (DateTime.TryParse(oValue.ToString(), out dt1900)) + { + dt1900 = Convert.ToDateTime(oValue); + if (_conStngInstitute.ProviderName == "System.Data.OleDb") + { + sQueryValue = "#" + dt1900.ToString("yyyy-MM-dd HH:mm:ss") + "#"; + } + else sQueryValue = "'" + dt1900.ToString("yyyy-MM-dd HH:mm:ss") + "'"; + } + break; + } + + return sQueryValue; + } + + private string ExceptFields2QueryValue(string PropertyName, object oValue) + { + string sQueryValue = ""; + if (oValue == null) return "null"; + + switch (PropertyName) + { + case "day_scheduled_for_YYMMDD": + DateTime dt1900 = new DateTime(1900, 1, 1, 0, 0, 0); + if (DateTime.TryParse(oValue.ToString(), out dt1900)) + { + dt1900 = Convert.ToDateTime(oValue); + return dt1900.ToShortDateString(); + } else return null; + break; + case "EXT_FIELD_custom_data": + System.Text.StringBuilder sbOrderCustom = new System.Text.StringBuilder(); + sbOrderCustom.Append("{"); + foreach (KeyValuePair kvpair in (Dictionary)oValue) + { + if (kvpair.Value == null) + { + sbOrderCustom.Append("\"" + kvpair.Key + "\": null,"); + } + else sbOrderCustom.Append("\"" + kvpair.Key + "\": \"" + kvpair.Value.ToString() + "\","); + } + sQueryValue = sbOrderCustom.ToString().TrimEnd(','); + sQueryValue += "}"; + break; + case "address_custom_data": + System.Text.StringBuilder sbCustom = new System.Text.StringBuilder(); + sbCustom.Append("{"); + foreach (KeyValuePair kvpair in (Dictionary)oValue) + { + if (kvpair.Value == null) + { + sbCustom.Append("\"" + kvpair.Key + "\": null,"); + } + else sbCustom.Append("\"" + kvpair.Key + "\": \"" + kvpair.Value.ToString() + "\","); + } + sQueryValue = sbCustom.ToString().TrimEnd(','); + sQueryValue += "}"; + break; + case "schedule": + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(IList)); + + using (MemoryStream ms = new MemoryStream()) + { + serializer.WriteObject(ms, oValue); + sQueryValue = System.Text.Encoding.Default.GetString(ms.ToArray()); + } + break; + case "schedule_blacklist": + System.Text.StringBuilder sbBlackList = new System.Text.StringBuilder(); + foreach (string dt1 in (string[])oValue) + { + sbBlackList.Append("\""+dt1+"\","); + } + sQueryValue = sbBlackList.ToString(); + sQueryValue = sQueryValue.TrimEnd(','); + break; + + } + + return sQueryValue; + } + + /* Upload JSON response file, generated by the process of getting addressbook contacts by Route4Me API, to the SQL type server. + * */ + public void Json2Table(string sFileName, string sTableName, string sIdName, R4M_DataType r4m_dtype) + { + if (!File.Exists(sFileName)) + { + Console.WriteLine("The file " + sFileName + " doesn't exist..."); return; + } + + string pathOnly = System.IO.Path.GetDirectoryName(sFileName); + string fileName = System.IO.Path.GetFileName(sFileName); + + string jsonContent = File.ReadAllText(sFileName); + + DataTable tblTempTable = new DataTable(); + + var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); + + switch (r4m_dtype) + { + case R4M_DataType.Addressbook: + //var jsSerializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(AddressBookContactsResponse)); + AddressBookContactsResponse Data = jsSerializer.Deserialize(jsonContent); + if (Data.total == 0) break; + + foreach (AddressBookContact contact in Data.results) + { + string sQuery = ""; + if (IsNewAddressID("addressbook_v4", contact.address_id )) + { + sQuery = "INSERT INTO addressbook_v4 "; + string sFields = ""; + string sValues = ""; + foreach (System.Reflection.PropertyInfo prop in typeof(AddressBookContact).GetProperties()) + { + if (prop.Name=="address_id") continue; + if (prop.Name == "ConvertBooleansToInteger") continue; + if (prop.MemberType != System.Reflection.MemberTypes.Property) continue; + var vValue = contact.GetType().GetProperty(prop.Name).GetValue(contact, null); + if (vValue == null) continue; + + Console.WriteLine("Properyt type=" + prop.PropertyType.Name); + + sFields += prop.Name + ","; + if (prop.Name == "address_custom_data" || prop.Name == "schedule" || prop.Name == "schedule_blacklist") + { + sValues += "'" + ExceptFields2QueryValue(prop.Name, vValue) + "',"; + } + else + { + sValues += FieldValue2QueryValue(vValue.GetType(), vValue) + ","; + } + + } + sFields = sFields.TrimEnd(','); + sValues=sValues.TrimEnd(','); + + sFields = "("+sFields+")"; + sValues = "(" + sValues + ")"; + + sQuery += sFields + " VALUES " +sValues; + } + else + { + int address_id = (int)contact.address_id; + sQuery = "UPDATE addressbook_v4 SET "; + string sSet = ""; + foreach (System.Reflection.PropertyInfo prop in typeof(AddressBookContact).GetProperties()) + { + if (prop.Name == "address_id") continue; + if (prop.Name == "ConvertBooleansToInteger") continue; + if (prop.MemberType != System.Reflection.MemberTypes.Property) continue; + var vValue = contact.GetType().GetProperty(prop.Name).GetValue(contact,null); + if (vValue == null) continue; + + Console.WriteLine("Properyt type=" + prop.PropertyType.Name); + if (prop.Name == "address_custom_data" || prop.Name == "schedule" || prop.Name == "schedule_blacklist") + { + sSet += prop.Name + "='" + ExceptFields2QueryValue(prop.Name, vValue) + "',"; + } + else sSet += prop.Name + "=" + FieldValue2QueryValue(vValue.GetType(), vValue) + ","; + } + sSet = sSet.TrimEnd(','); + sQuery += sSet + " WHERE address_id=" + address_id; + } + int iSuccess = ExecuteNon(sQuery); + + } + break; + case R4M_DataType.Order: + OrdersResponse ordersData = jsSerializer.Deserialize(jsonContent); + if (ordersData.total == 0) break; + + foreach (Order order in ordersData.results) + { + string sQuery = ""; + if (IsNewOrderID("orders", order.order_id)) + { + sQuery = "INSERT INTO orders "; + string sFields = ""; + string sValues = ""; + + foreach (System.Reflection.PropertyInfo prop in typeof(Order).GetProperties()) + { + //if (prop.Name == "order_id") continue; + if (prop.Name == "ConvertBooleansToInteger") continue; + if (prop.MemberType != System.Reflection.MemberTypes.Property) continue; + var vValue = order.GetType().GetProperty(prop.Name).GetValue(order, null); + if (vValue == null) continue; + + Console.WriteLine("Properyt type=" + prop.PropertyType.Name); + + sFields += prop.Name + ","; + if (prop.Name == "EXT_FIELD_custom_data") + { + sValues += "'" + ExceptFields2QueryValue(prop.Name, vValue) + "',"; + } + else + { + sValues += FieldValue2QueryValue(vValue.GetType(), vValue) + ","; + } + + } + sFields = sFields.TrimEnd(','); + sValues = sValues.TrimEnd(','); + + sFields = "(" + sFields + ")"; + sValues = "(" + sValues + ")"; + + sQuery += sFields + " VALUES " + sValues; + + } + else + { + int order_id = (int)order.order_id; + sQuery = "UPDATE orders SET "; + string sSet = ""; + + foreach (System.Reflection.PropertyInfo prop in typeof(Order).GetProperties()) + { + if (prop.Name == "order_id") continue; + if (prop.Name == "ConvertBooleansToInteger") continue; + if (prop.MemberType != System.Reflection.MemberTypes.Property) continue; + var vValue = order.GetType().GetProperty(prop.Name).GetValue(order, null); + if (vValue == null) continue; + + Console.WriteLine("Properyt type=" + prop.PropertyType.Name); + if (prop.Name == "EXT_FIELD_custom_data") + { + sSet += prop.Name + "='" + ExceptFields2QueryValue(prop.Name, vValue) + "',"; + } + else sSet += prop.Name + "=" + FieldValue2QueryValue(vValue.GetType(), vValue) + ","; + } + sSet = sSet.TrimEnd(','); + sQuery += sSet + " WHERE order_id=" + order_id; + } + int iOrderSuccess = ExecuteNon(sQuery); + } + + break; + case R4M_DataType.Route: + + break; + } + } + + public bool IsNewAddress(string sTableName, string sIdName, int AddressId) + { + bool blNew = true; + string sCom = @"SELECT COUNT(*) as rba FROM "+sTableName+ " WHERE "+sIdName+"="+AddressId; + object result = ExecuteScalar(sCom); + int iRows = -1; + if (int.TryParse(result.ToString(), out iRows)) iRows = Convert.ToInt32(result); + if (iRows > 0) blNew = false; + return blNew; + } + + public bool IsNewAddressID(string sTableName, object oAddressId) + { + bool blNew = true; + int AddressId = -1; + if (int.TryParse(oAddressId.ToString(), out AddressId)) AddressId = Convert.ToInt32(oAddressId); else return true; + + string sCom = @"SELECT COUNT(*) as rba FROM " + sTableName + " WHERE address_id=" + AddressId; + object result = ExecuteScalar(sCom); + int iRows = -1; + if (int.TryParse(result.ToString(), out iRows)) iRows = Convert.ToInt32(result); + if (iRows > 0) blNew = false; + return blNew; + } + + public bool IsNewOrderID(string sTableName, object oOrderId) + { + bool blNew = true; + int OrderId = -1; + if (int.TryParse(oOrderId.ToString(), out OrderId)) OrderId = Convert.ToInt32(oOrderId); else return true; + + string sCom = @"SELECT COUNT(*) as rba FROM " + sTableName + " WHERE order_id=" + OrderId; + object result = ExecuteScalar(sCom); + int iRows = -1; + if (int.TryParse(result.ToString(), out iRows)) iRows = Convert.ToInt32(result); + if (iRows > 0) blNew = false; + return blNew; + } + + public object ExecuteScalar(string sQuery) + { + object result = null; + try + { + int iResult = -1; + OpenConnection(); + _cmd.CommandText = sQuery; + result = _cmd.ExecuteScalar(); + + if (int.TryParse(result.ToString(), out iResult)) iResult = Convert.ToInt32(result); + return iResult; + } + catch (Exception ex) { Console.WriteLine(ex.Message); return 0; } + finally + { + CloseConnection(); + } + + } + + public int ExecuteNon(string sQuery) + { + try + { + int iResult = -1; + _cmd.CommandText = sQuery; + OpenConnection(); + iResult = _cmd.ExecuteNonQuery(); + + return iResult; + } + catch (Exception ex) { Console.WriteLine(ex.Message); return 0; } + finally + { + CloseConnection(); + } + + } + + public bool IsValidValue(DataColumn col, object value) + { + bool isValid = false; + + string sType = col.DataType.Name; + + switch (sType) + { + case "Int32": + int i_val = -1; + if (int.TryParse(value.ToString(), out i_val)) isValid = true; + break; + case "String": + if (value.ToString().Length>0) isValid = true; + break; + case "Double": + double d_val = 0; + if (double.TryParse(value.ToString(), out d_val)) isValid = true; + break; + case "DateTime": + DateTime dt1908 = new DateTime(1899,1,1,0,0,0); + if (DateTime.TryParse(value.ToString(), out dt1908)) isValid = true; + break; + } + + return isValid; + } + + public DataTable fillTable(string sSQLSelect) + { + DataTable dtbElements = new DataTable(); + + try + { + OpenConnection(); + + _cmd.CommandText = sSQLSelect; + _adapter.SelectCommand = (DbCommand)_cmd; + + _adapter.Fill(dtbElements); + + return dtbElements; + } + catch (Exception ex) { Console.WriteLine(""); return dtbElements; } + finally + { + CloseConnection(); + } + + } + } +} diff --git a/Route4MeSDKLibrary/Properties/AssemblyInfo.cs b/Route4MeSDKLibrary/Properties/AssemblyInfo.cs new file mode 100755 index 00000000..c6e90fde --- /dev/null +++ b/Route4MeSDKLibrary/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Route4MeSDKLibrary")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Route4MeSDKLibrary")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e3fa443f-066c-4a22-8c95-f8552c918a9e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Route4MeSDKLibrary/PropertyValidation.cs b/Route4MeSDKLibrary/PropertyValidation.cs new file mode 100644 index 00000000..8b98e1c4 --- /dev/null +++ b/Route4MeSDKLibrary/PropertyValidation.cs @@ -0,0 +1,72 @@ +using System; +using System.ComponentModel; +using System.Reflection; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.ComponentModel.DataAnnotations; + +namespace Route4MeSDK +{ + /// + /// Validation of the class properties + /// + public static class PropertyValidation + { + public static ValidationResult ValidateMonthlyNthN(int N) + { + bool isValid=false; + + int[] nList = {1,2,3,4,5,-1}; + // Perform validation logic here and set isValid to true or false. + + if (Array.IndexOf(nList,N)>=0) + { + isValid = true; + return ValidationResult.Success; + } + else + { + return new ValidationResult( + "The selected option is not available for this type of the schedule."); + } + } + + public static ValidationResult ValidateScheduleMode(string sMode) + { + bool isValid = false; + + string[] sList = { "daily", "weekly", "monthly", "annually" }; + // Perform validation logic here and set isValid to true or false. + + if (Array.IndexOf(sList, sMode) >= 0) + { + isValid = true; + return ValidationResult.Success; + } + else + { + return new ValidationResult( + "The selected option is not available for this type of the schedule."); + } + } + + public static ValidationResult ValidateScheduleMonthlyMode(string sMode) + { + bool isValid = false; + + string[] sList = { "dates", "nth" }; + // Perform validation logic here and set isValid to true or false. + + if (Array.IndexOf(sList, sMode) >= 0) + { + isValid = true; + return ValidationResult.Success; + } + else + { + return new ValidationResult( + "The selected option is not available for this type of the schedule."); + } + } + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/ActivityParameters.cs b/Route4MeSDKLibrary/QueryTypes/ActivityParameters.cs new file mode 100644 index 00000000..c6f97968 --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/ActivityParameters.cs @@ -0,0 +1,36 @@ + +namespace Route4MeSDK.QueryTypes +{ + public sealed class ActivityParameters : GenericParameters + { + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId { get; set; } + + [HttpQueryMemberAttribute(Name = "device_id", EmitDefaultValue = false)] + public string DeviceID { get; set; } + + [HttpQueryMemberAttribute(Name = "member_id", EmitDefaultValue = false)] + public int? MemberId { get; set; } + + [HttpQueryMemberAttribute(Name = "limit", EmitDefaultValue = false)] + public uint? Limit { get; set; } + + [HttpQueryMemberAttribute(Name = "offset", EmitDefaultValue = false)] + public uint? Offset { get; set; } + + [HttpQueryMemberAttribute(Name = "team", EmitDefaultValue = false)] + public string Team { get; set; } + + [HttpQueryMemberAttribute(Name = "start", EmitDefaultValue = false)] + public uint? Start { get; set; } + + [HttpQueryMemberAttribute(Name = "end", EmitDefaultValue = false)] + public uint? End { get; set; } + + [HttpQueryMemberAttribute(Name = "activity_type", EmitDefaultValue = false)] + public string ActivityType { get; set; } + + [HttpQueryMemberAttribute(Name = "activity_message", EmitDefaultValue = false)] + public string ActivityMessage { get; set; } + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/AddressBookParameters.cs b/Route4MeSDKLibrary/QueryTypes/AddressBookParameters.cs new file mode 100644 index 00000000..0a013756 --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/AddressBookParameters.cs @@ -0,0 +1,26 @@ +namespace Route4MeSDK.QueryTypes +{ + public sealed class AddressBookParameters : GenericParameters + { + [HttpQueryMemberAttribute(Name = "address_id", EmitDefaultValue = false)] + public string AddressId { get; set; } + + [HttpQueryMemberAttribute(Name = "limit", EmitDefaultValue = false)] + public uint? Limit { get; set; } + + [HttpQueryMemberAttribute(Name = "offset", EmitDefaultValue = false)] + public uint? Offset { get; set; } + + [HttpQueryMemberAttribute(Name = "start", EmitDefaultValue = false)] + public uint? Start { get; set; } + + [HttpQueryMemberAttribute(Name = "query", EmitDefaultValue = false)] + public string Query { get; set; } + + [HttpQueryMemberAttribute(Name = "fields", EmitDefaultValue = false)] + public string Fields { get; set; } + + [HttpQueryMemberAttribute(Name = "display", EmitDefaultValue = false)] + public string Display { get; set; } + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/AddressParameters.cs b/Route4MeSDKLibrary/QueryTypes/AddressParameters.cs new file mode 100644 index 00000000..ecda010f --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/AddressParameters.cs @@ -0,0 +1,25 @@ + +namespace Route4MeSDK.QueryTypes +{ + public sealed class AddressParameters : GenericParameters + { + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId { get; set; } + + [HttpQueryMemberAttribute(Name = "route_destination_id", EmitDefaultValue = false)] + public int RouteDestinationId { get; set; } + + [HttpQueryMemberAttribute(Name = "address_id", EmitDefaultValue = false)] + public int AddressId { get; set; } + + [HttpQueryMemberAttribute(Name = "notes")] + public bool Notes { get; set; } + + [HttpQueryMemberAttribute(Name = "is_departed")] + public bool IsDeparted { get; set; } + + [HttpQueryMemberAttribute(Name = "is_visited")] + public bool IsVisited { get; set; } + + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/AvoidanceZoneParameters.cs b/Route4MeSDKLibrary/QueryTypes/AvoidanceZoneParameters.cs new file mode 100644 index 00000000..efbc9c1d --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/AvoidanceZoneParameters.cs @@ -0,0 +1,49 @@ +using Route4MeSDK.DataTypes; +using System.Runtime.Serialization; + +namespace Route4MeSDK.QueryTypes +{ + /// + /// Avoidance zone parameters + /// + [DataContract] + public sealed class AvoidanceZoneParameters : GenericParameters + { + /// + /// Device Id + /// + [IgnoreDataMember] // Don't serialize as JSON + [HttpQueryMemberAttribute(Name = "device_id", EmitDefaultValue = false)] + public string DeviceID { get; set; } + + /// + /// Territory Id + /// + [HttpQueryMemberAttribute(Name = "territory_id", EmitDefaultValue = false)] + public string TerritoryId { get; set; } + + /// + /// Territory name + /// + [DataMember(Name = "territory_name")] + public string TerritoryName { get; set; } + + /// + /// Territory color + /// + [DataMember(Name = "territory_color")] + public string TerritoryColor { get; set; } + + /// + /// Member Id + /// + [DataMember(Name = "member_id")] + public string MemberId { get; set; } + + /// + /// Territory parameters + /// + [DataMember(Name = "territory")] + public Territory Territory { get; set; } + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/AvoidanceZoneQuerry.cs b/Route4MeSDKLibrary/QueryTypes/AvoidanceZoneQuerry.cs new file mode 100644 index 00000000..4a8637cf --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/AvoidanceZoneQuerry.cs @@ -0,0 +1,23 @@ +using Route4MeSDK.DataTypes; +using System.Runtime.Serialization; + +namespace Route4MeSDK.QueryTypes +{ + /// + /// Avoidance zone query + /// + public sealed class AvoidanceZoneQuery : GenericParameters + { + /// + /// Device Id + /// + [HttpQueryMemberAttribute(Name = "device_id", EmitDefaultValue = false)] + public string DeviceID { get; set; } + + /// + /// Territory Id + /// + [HttpQueryMemberAttribute(Name = "territory_id", EmitDefaultValue = false)] + public string TerritoryId { get; set; } + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/GPSParameters.cs b/Route4MeSDKLibrary/QueryTypes/GPSParameters.cs new file mode 100755 index 00000000..682b95fe --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/GPSParameters.cs @@ -0,0 +1,67 @@ + +namespace Route4MeSDK.QueryTypes +{ + /// + /// Helper class, for setting GPS data + /// Used to create the suitable query string + /// See example in Route4MeExamples.SetGPSPosition() + /// + public sealed class GPSParameters : GenericParameters + { + [HttpQueryMemberAttribute(Name = "format")] + public string Format {get; set; } + + [HttpQueryMemberAttribute(Name = "member_id")] + public int MemberId {get; set; } + + [HttpQueryMemberAttribute(Name = "route_id")] + public string RouteId { get; set; } + + [HttpQueryMemberAttribute(Name = "tx_id")] + public string TxId { get; set; } + + [HttpQueryMemberAttribute(Name = "vehicle_id")] + public int VehicleId { get; set; } + + [HttpQueryMemberAttribute(Name = "course")] + public int Course { get; set; } + + [HttpQueryMemberAttribute(Name = "speed")] + public double Speed { get; set; } + + [HttpQueryMemberAttribute(Name = "lat")] + public double Latitude { get; set; } + + [HttpQueryMemberAttribute(Name = "lng")] + public double Longitude { get; set; } + + [HttpQueryMemberAttribute(Name = "last_position")] + public bool last_position { get; set; } + + [HttpQueryMemberAttribute(Name = "time_period")] + public string time_period { get; set; } + + [HttpQueryMemberAttribute(Name = "start_date")] + public int start_date { get; set; } + + [HttpQueryMemberAttribute(Name = "end_date")] + public int end_date { get; set; } + + [HttpQueryMemberAttribute(Name = "altitude", EmitDefaultValue = false)] + public double Altitude { get; set; } + + [HttpQueryMemberAttribute(Name = "device_type")] + public string DeviceType { get; set; } + + [HttpQueryMemberAttribute(Name = "device_guid")] + public string DeviceGuid { get; set; } + + [HttpQueryMemberAttribute(Name = "device_timestamp", EmitDefaultValue = false)] + public string DeviceTimestamp { get; set; } + + [HttpQueryMemberAttribute(Name = "app_version", EmitDefaultValue = false)] + public string AppVersion { get; set; } + + + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/GenericParameters.cs b/Route4MeSDKLibrary/QueryTypes/GenericParameters.cs new file mode 100755 index 00000000..ab03ebba --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/GenericParameters.cs @@ -0,0 +1,101 @@ +using Route4MeSDK.DataTypes; +using System.Collections.Specialized; +using System.Reflection; +using System.Runtime.Serialization; +using System.Web; + +namespace Route4MeSDK.QueryTypes +{ + /// + /// Helper class, for easy REST query parameters string generation + /// 1. Use GenericParameters.Serialize() to generate the query string + /// 2. Use GenericParameters.ParametersCollection for adding query parameters + /// 3. Inherit this class, to create usable parameters holders + /// Add an attribute [HttpQueryMemberAttribute] on each property for serializing it automatically + /// 4. Modify ConvertBooleansToInteger.GenericParameters to serialize bool and bool? as "0" and "1" + /// Important: You have to add here all derived classes, that are serealized as json as a KnownType + /// + [DataContract] + [KnownType(typeof(OptimizationParameters))] + [KnownType(typeof(AddressBookContact))] + [KnownType(typeof(ActivityParameters))] + [KnownType(typeof(AddressBookParameters))] + [KnownType(typeof(AddressParameters))] + [KnownType(typeof(GPSParameters))] + [KnownType(typeof(NoteParameters))] + [KnownType(typeof(RouteParameters))] + [KnownType(typeof(RouteParametersQuery))] + [KnownType(typeof(AvoidanceZoneParameters))] + [KnownType(typeof(AvoidanceZoneQuery))] + [KnownType(typeof(GeocodingParameters))] + [KnownType(typeof(MemberParameters))] + public class GenericParameters + { + #region Fields + + [IgnoreDataMember] + public NameValueCollection ParametersCollection = new NameValueCollection(); + + [IgnoreDataMember] + public bool ConvertBooleansToInteger {get; protected set;} + + #endregion + + #region Methods + + public GenericParameters() + { + this.PrepareForSerialization(); + } + + public void PrepareForSerialization() + { + ConvertBooleansToInteger = true; + if (ParametersCollection == null) + ParametersCollection = new NameValueCollection(); + } + + public string Serialize(string apiKey = null) + { + var paramsCollection = HttpUtility.ParseQueryString(string.Empty); + + paramsCollection.Add(ParametersCollection); + + var properties = GetType().GetProperties(); + + foreach (var property in properties) + { + var attribute = property.GetCustomAttribute(typeof(HttpQueryMemberAttribute)) as HttpQueryMemberAttribute; + + if (attribute != null) + { + var valueObj = property.GetValue(this); + var value = valueObj != null ? valueObj.ToString() : "null"; + + if (ConvertBooleansToInteger && + valueObj != null && + (property.PropertyType == typeof(bool) || property.PropertyType == typeof(bool?))) + { + value = ((bool)valueObj) ? "1" : "0"; + } + + var name = attribute.Name ?? property.Name; + var emit = valueObj != attribute.DefaultValue || + attribute.EmitDefaultValue; + + if (emit) + { + paramsCollection.Add(name, value); + } + } + } + + string apiKeyStr = string.IsNullOrEmpty(apiKey) ? "?" : string.Format("?api_key={0}", apiKey); + string result = paramsCollection.Count > 0 ? string.Format("{0}&{1}", apiKeyStr, paramsCollection.ToString()) : apiKeyStr; + + return result; + } + + #endregion + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/GeocodingParameters.cs b/Route4MeSDKLibrary/QueryTypes/GeocodingParameters.cs new file mode 100644 index 00000000..10ed6633 --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/GeocodingParameters.cs @@ -0,0 +1,61 @@ +namespace Route4MeSDK.QueryTypes +{ + public sealed class GeocodingParameters : GenericParameters + { + [HttpQueryMemberAttribute(Name = "addresses", EmitDefaultValue = false)] + public string Addresses + { + get { return m_Addresses; } + set { m_Addresses = value; } + } + private string m_Addresses; + + [HttpQueryMemberAttribute(Name = "format", EmitDefaultValue = false)] + public string Format + { + get { return m_Format; } + set { m_Format = value; } + } + private string m_Format; + + [HttpQueryMemberAttribute(Name = "pk", EmitDefaultValue = false)] + public int Pk + { + get { return m_pk; } + set { m_pk = value; } + } + private int m_pk; + + [HttpQueryMemberAttribute(Name = "offset", EmitDefaultValue = false)] + public int Offset + { + get { return m_Offset; } + set { m_Offset = value; } + } + private int m_Offset; + + [HttpQueryMemberAttribute(Name = "limit", EmitDefaultValue = false)] + public int Limit + { + get { return m_Limit; } + set { m_Limit = value; } + } + private int m_Limit; + + [HttpQueryMemberAttribute(Name = "zipcode", EmitDefaultValue = false)] + public string Zipcode + { + get { return m_Zipcode; } + set { m_Zipcode = value; } + } + private string m_Zipcode; + + [HttpQueryMemberAttribute(Name = "housenumber", EmitDefaultValue = false)] + public string Housenumber + { + get { return m_Housenumber; } + set { m_Housenumber = value; } + } + private string m_Housenumber; + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/HttpQueryMemberAttribute.cs b/Route4MeSDKLibrary/QueryTypes/HttpQueryMemberAttribute.cs new file mode 100755 index 00000000..3683b433 --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/HttpQueryMemberAttribute.cs @@ -0,0 +1,37 @@ +using System; + +namespace Route4MeSDK.QueryTypes +{ + + public sealed class HttpQueryMemberAttribute : Attribute + { + #region Properties + + /// + /// The serialized argument name, if specifed overrides the property name + /// + public string Name { get; set; } + + /// + /// Specifies whether to emit the property value, if its value is a default value + /// + public bool EmitDefaultValue { get; set; } + + /// + /// Specifies the default value, that is used when emiting the property value + /// If not specified null is used as a default value + /// + public object DefaultValue { get; set; } + + #endregion + + #region Methods + + public HttpQueryMemberAttribute() + { + EmitDefaultValue = true; + } + + #endregion + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/HybridOptimizationParameters.cs b/Route4MeSDKLibrary/QueryTypes/HybridOptimizationParameters.cs new file mode 100644 index 00000000..bef2195b --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/HybridOptimizationParameters.cs @@ -0,0 +1,19 @@ +using Route4MeSDK.DataTypes; +using System.Runtime.Serialization; + +namespace Route4MeSDK.QueryTypes +{ + + [DataContract] + public sealed class HybridOptimizationParameters : GenericParameters + { + [IgnoreDataMember] // Don't serialize as JSON + [HttpQueryMemberAttribute(Name = "target_date_string", EmitDefaultValue = false)] + public string target_date_string { get; set; } + + [IgnoreDataMember] // Don't serialize as JSON + [HttpQueryMemberAttribute(Name = "timezone_offset_minutes", EmitDefaultValue = false)] + public int timezone_offset_minutes { get; set; } + + } +} \ No newline at end of file diff --git a/Route4MeSDKLibrary/QueryTypes/MemberConfigurationParameters.cs b/Route4MeSDKLibrary/QueryTypes/MemberConfigurationParameters.cs new file mode 100644 index 00000000..2dade714 --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/MemberConfigurationParameters.cs @@ -0,0 +1,23 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.QueryTypes +{ + public sealed class MemberConfigurationParameters : GenericParameters + { + [DataMember(Name = "config_key", EmitDefaultValue = false)] + public string config_key + { + get { return m_config_key; } + set { m_config_key = value; } + } + private string m_config_key; + + [DataMember(Name = "config_value", EmitDefaultValue = false)] + public string config_value + { + get { return m_config_value; } + set { m_config_value = value; } + } + private string m_config_value; + } +} \ No newline at end of file diff --git a/Route4MeSDKLibrary/QueryTypes/MemberParameters.cs b/Route4MeSDKLibrary/QueryTypes/MemberParameters.cs new file mode 100644 index 00000000..6e39b8f6 --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/MemberParameters.cs @@ -0,0 +1,129 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.QueryTypes +{ + public sealed class MemberParameters : GenericParameters + { + [HttpQueryMemberAttribute(Name = "session_guid", EmitDefaultValue = false)] + public string SessionGuid + { + get { return m_SessionGuid; } + set { m_SessionGuid = value; } + } + private string m_SessionGuid; + + [HttpQueryMemberAttribute(Name = "format", EmitDefaultValue = false)] + public string hFormat + { + get { return m_hFormat; } + set { m_hFormat = value; } + } + private string m_hFormat; + + [HttpQueryMemberAttribute(Name = "member_id", EmitDefaultValue = false)] + public System.Nullable MemberId + { + get { return m_MemberId; } + set { m_MemberId = value; } + } + private System.Nullable m_MemberId; + + [HttpQueryMemberAttribute(Name = "plan", EmitDefaultValue = false)] + public string Plan + { + get { return m_Plan; } + set { m_Plan = value; } + } + private string m_Plan; + + [HttpQueryMemberAttribute(Name = "member_type", EmitDefaultValue = false)] + public System.Nullable MemberType + { + get { return m_MemberType; } + set { m_MemberType = value; } + } + private System.Nullable m_MemberType; + + [DataMember(Name = "strEmail", EmitDefaultValue = false)] + public string StrEmail + { + get { return m_StrEmail; } + set { m_StrEmail = value; } + } + private string m_StrEmail; + + [DataMember(Name = "strPassword", EmitDefaultValue = false)] + public string StrPassword + { + get { return m_StrPassword; } + set { m_StrPassword = value; } + } + private string m_StrPassword; + + [DataMember(Name = "format", EmitDefaultValue = false)] + public string Format + { + get { return m_Format; } + set { m_Format = value; } + } + private string m_Format; + + [DataMember(Name = "strIndustry", EmitDefaultValue = false)] + public string StrIndustry + { + get { return m_StrIndustry; } + set { m_StrIndustry = value; } + } + private string m_StrIndustry; + + [DataMember(Name = "strFirstName", EmitDefaultValue = false)] + public string StrFirstName + { + get { return m_StrFirstName; } + set { m_StrFirstName = value; } + } + private string m_StrFirstName; + + [DataMember(Name = "strLastName", EmitDefaultValue = false)] + public string StrLastName + { + get { return m_StrLastName; } + set { m_StrLastName = value; } + } + private string m_StrLastName; + + [DataMember(Name = "chkTerms", EmitDefaultValue = false)] + public System.Nullable ChkTerms + { + get { return m_ChkTerms; } + set { m_ChkTerms = value; } + } + private System.Nullable m_ChkTerms; + + [DataMember(Name = "device_type", EmitDefaultValue = false)] + public string DeviceType + { + get { return m_DeviceType; } + set { m_DeviceType = value; } + } + private string m_DeviceType; + + [DataMember(Name = "strPassword_1", EmitDefaultValue = false)] + public string StrPassword_1 + { + get { return m_StrPassword1; } + set { m_StrPassword1 = value; } + } + private string m_StrPassword1; + + [DataMember(Name = "strPassword_2", EmitDefaultValue = false)] + public string StrPassword_2 + { + get { return m_StrPassword2; } + set { m_StrPassword2 = value; } + } + private string m_StrPassword2; + + + } +} \ No newline at end of file diff --git a/Route4MeSDKLibrary/QueryTypes/MemberParametersV4.cs b/Route4MeSDKLibrary/QueryTypes/MemberParametersV4.cs new file mode 100644 index 00000000..134ae72d --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/MemberParametersV4.cs @@ -0,0 +1,137 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.QueryTypes +{ + public sealed class MemberParametersV4 : GenericParameters + { + [HttpQueryMemberAttribute(Name = "member_id", EmitDefaultValue = false)] + public System.Nullable member_id + { + get { return m_member_id; } + set { m_member_id = value; } + } + private System.Nullable m_member_id; + + [DataMember(Name = "HIDE_ROUTED_ADDRESSES", EmitDefaultValue = false)] + public bool HIDE_ROUTED_ADDRESSES + { + get { return m_HIDE_ROUTED_ADDRESSES; } + set { m_HIDE_ROUTED_ADDRESSES = value; } + } + private bool m_HIDE_ROUTED_ADDRESSES; + + + [DataMember(Name = "HIDE_VISITED_ADDRESSES", EmitDefaultValue = false)] + public bool HIDE_VISITED_ADDRESSES + { + get { return m_HIDE_VISITED_ADDRESSES; } + set { m_HIDE_VISITED_ADDRESSES = value; } + } + private bool m_HIDE_VISITED_ADDRESSES; + + [DataMember(Name = "READONLY_USER", EmitDefaultValue = false)] + public bool READONLY_USER + { + get { return m_READONLY_USER; } + set { m_READONLY_USER = value; } + } + private bool m_READONLY_USER; + + + [DataMember(Name = "HIDE_NONFUTURE_ROUTES", EmitDefaultValue = false)] + public bool HIDE_NONFUTURE_ROUTES + { + get { return m_HIDE_NONFUTURE_ROUTES; } + set { m_HIDE_NONFUTURE_ROUTES = value; } + } + private bool m_HIDE_NONFUTURE_ROUTES; + + [DataMember(Name = "SHOW_ALL_VEHICLES", EmitDefaultValue = false)] + public bool SHOW_ALL_VEHICLES + { + get { return m_SHOW_ALL_VEHICLES; } + set { m_SHOW_ALL_VEHICLES = value; } + } + private bool m_SHOW_ALL_VEHICLES; + + [DataMember(Name = "SHOW_ALL_DRIVERS", EmitDefaultValue = false)] + public bool SHOW_ALL_DRIVERS + { + get { return m_SHOW_ALL_DRIVERS; } + set { m_SHOW_ALL_DRIVERS = value; } + } + private bool m_SHOW_ALL_DRIVERS; + + [DataMember(Name = "member_phone", EmitDefaultValue = false)] + public string member_phone + { + get { return m_member_phone; } + set { m_member_phone = value; } + } + private string m_member_phone; + + [DataMember(Name = "member_zipcode", EmitDefaultValue = false)] + public string member_zipcode + { + get { return m_member_zipcode; } + set { m_member_zipcode = value; } + } + private string m_member_zipcode; + + [HttpQueryMemberAttribute(Name = "route_count", EmitDefaultValue = false)] + public System.Nullable route_count + { + get { return m_route_count; } + set { m_route_count = value; } + } + private System.Nullable m_route_count; + + [DataMember(Name = "member_email", EmitDefaultValue = false)] + public string member_email + { + get { return m_member_email; } + set { m_member_email = value; } + } + private string m_member_email; + + [DataMember(Name = "member_type", EmitDefaultValue = false)] + public string member_type + { + get { return m_member_type; } + set { m_member_type = value; } + } + private string m_member_type; + + [DataMember(Name = "date_of_birth", EmitDefaultValue = false)] + public string date_of_birth + { + get { return m_date_of_birth; } + set { m_date_of_birth = value; } + } + private string m_date_of_birth; + + [DataMember(Name = "member_first_name", EmitDefaultValue = false)] + public string member_first_name + { + get { return m_member_first_name; } + set { m_member_first_name = value; } + } + private string m_member_first_name; + + [DataMember(Name = "member_password", EmitDefaultValue = false)] + public string member_password + { + get { return m_member_password; } + set { m_member_password = value; } + } + private string m_member_password; + + [DataMember(Name = "member_last_name", EmitDefaultValue = false)] + public string member_last_name + { + get { return m_member_last_name; } + set { m_member_last_name = value; } + } + private string m_member_last_name; + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/NoteParameters.cs b/Route4MeSDKLibrary/QueryTypes/NoteParameters.cs new file mode 100644 index 00000000..d3c0f3b0 --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/NoteParameters.cs @@ -0,0 +1,28 @@ + +namespace Route4MeSDK.QueryTypes +{ + + public sealed class NoteParameters : GenericParameters + { + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId { get; set; } + + [HttpQueryMemberAttribute(Name = "address_id", EmitDefaultValue = false)] + public int AddressId { get; set; } + + [HttpQueryMemberAttribute(Name = "dev_lat")] + public double Latitude { get; set; } + + [HttpQueryMemberAttribute(Name = "dev_lng")] + public double Longitude { get; set; } + + [HttpQueryMemberAttribute(Name = "device_type")] + public string DeviceType { get; set; } + + [HttpQueryMemberAttribute(Name = "strUpdateType")] + public string ActivityType { get; set; } + + //[HttpQueryMemberAttribute(Name = "strNoteContents", EmitDefaultValue = false)] + //public string StrNoteContents { get; set; } + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/OptimizationParameters.cs b/Route4MeSDKLibrary/QueryTypes/OptimizationParameters.cs new file mode 100644 index 00000000..82c4bcec --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/OptimizationParameters.cs @@ -0,0 +1,40 @@ +using Route4MeSDK.DataTypes; +using System.Runtime.Serialization; + +namespace Route4MeSDK.QueryTypes +{ + + [DataContract] + public sealed class OptimizationParameters : GenericParameters + { + [IgnoreDataMember] // Don't serialize as JSON + [HttpQueryMemberAttribute(Name = "optimization_problem_id", EmitDefaultValue = false)] + public string OptimizationProblemID { get; set; } + + [IgnoreDataMember] // Don't serialize as JSON + [HttpQueryMemberAttribute(Name = "reoptimize", EmitDefaultValue = false)] + public bool? ReOptimize { get; set; } + + /// + /// If true will be redirected + /// + [IgnoreDataMember()] + [HttpQueryMemberAttribute(Name = "redirect", EmitDefaultValue = false)] + public System.Nullable Redirect + { + get { return m_Redirect; } + set { m_Redirect = value; } + } + private System.Nullable m_Redirect; + + [IgnoreDataMember] // Don't serialize as JSON + [HttpQueryMemberAttribute(Name = "show_directions", EmitDefaultValue = false)] + public bool? ShowDirections { get; set; } + + [DataMember(Name = "parameters", EmitDefaultValue = false)] + public RouteParameters Parameters { get; set; } + + [DataMember(Name = "addresses", EmitDefaultValue = false)] + public Address[] Addresses { get; set; } + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/OrderParameters.cs b/Route4MeSDKLibrary/QueryTypes/OrderParameters.cs new file mode 100644 index 00000000..e4e4e372 --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/OrderParameters.cs @@ -0,0 +1,70 @@ + +namespace Route4MeSDK.QueryTypes +{ + public sealed class OrderParameters : GenericParameters + { + + /// + /// Limit per page, if you use 0 you will get all records + /// + [HttpQueryMemberAttribute(Name = "limit", EmitDefaultValue = false)] + public uint? Limit { get; set; } + + /// + /// Offset + /// + [HttpQueryMemberAttribute(Name = "offset", EmitDefaultValue = false)] + public uint? Offset { get; set; } + + /// + /// if query is array search engine will search by fields, if query is string will search by all text fields. Array / string. + /// + [HttpQueryMemberAttribute(Name = "query", EmitDefaultValue = false)] + public string Query { get; set; } + + /// + /// Use it for get specific fields. String / coma separated + /// + [HttpQueryMemberAttribute(Name = "fields", EmitDefaultValue = false)] + public string Fields { get; set; } + + /// + /// filter routed/unrouted. enum(all,routed,unrouted) + /// + [HttpQueryMemberAttribute(Name = "display", EmitDefaultValue = false)] + public string Display { get; set; } + + /// + /// Order ID. + /// + [HttpQueryMemberAttribute(Name = "order_id", EmitDefaultValue = false)] + public string OrderId + { + get { return m_OrderId; } + set { m_OrderId = value; } + } + private string m_OrderId; + + /// + /// Date an order was inserted + /// + [HttpQueryMemberAttribute(Name = "day_added_YYMMDD", EmitDefaultValue = false)] + public string DayAddedYYMMDD + { + get { return m_DayAddedYYMMDD; } + set { m_DayAddedYYMMDD = value; } + } + private string m_DayAddedYYMMDD; + + /// + /// Date an order was scheduled for + /// + [HttpQueryMemberAttribute(Name = "scheduled_for_YYMMDD", EmitDefaultValue = false)] + public string ScheduledForYYMMDD + { + get { return m_ScheduledForYYMMDD; } + set { m_ScheduledForYYMMDD = value; } + } + private string m_ScheduledForYYMMDD; + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/RouteParametersQuery.cs b/Route4MeSDKLibrary/QueryTypes/RouteParametersQuery.cs new file mode 100755 index 00000000..c62e4882 --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/RouteParametersQuery.cs @@ -0,0 +1,144 @@ + +using Route4MeSDK.DataTypes; +using System.Runtime.Serialization; +namespace Route4MeSDK.QueryTypes +{ + /// + /// Route parameters accepted by endpoints + /// + [DataContract] + public sealed class RouteParametersQuery : GenericParameters + { + /// + /// Route Identifier + /// + [IgnoreDataMember] // Don't serialize as JSON + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId { get; set; } + + /// + /// Pass True to return directions and the route path + /// + [IgnoreDataMember] + [HttpQueryMemberAttribute(Name = "directions", EmitDefaultValue = false)] + public bool? Directions { get; set; } + + /// + /// "None" - no path output. "Points" - points path output + /// + [IgnoreDataMember] + [HttpQueryMemberAttribute(Name = "route_path_output", EmitDefaultValue = false)] + public string RoutePathOutput { get; set; } + + /// + /// Output route tracking data in response + /// + [IgnoreDataMember] + [HttpQueryMemberAttribute(Name = "device_tracking_history", EmitDefaultValue = false)] + public bool? DeviceTrackingHistory { get; set; } + + /// + /// The number of existing routes that should be returned per response when looking at a list of all the routes. + /// + [IgnoreDataMember] + [HttpQueryMemberAttribute(Name = "limit", EmitDefaultValue = false)] + public uint? Limit { get; set; } + + /// + /// The page number for route listing pagination. Increment the offset by the limit number to move to the next page. + /// + [IgnoreDataMember] + [HttpQueryMemberAttribute(Name = "offset", EmitDefaultValue = false)] + public uint? Offset { get; set; } + + /// + /// Output addresses and directions in the original optimization request sequence. This is to allow us to compare routes before & after optimization. + /// + [IgnoreDataMember] + [HttpQueryMemberAttribute(Name = "original", EmitDefaultValue = false)] + public bool? Original { get; set; } + + /// + /// Output route and stop-specific notes. The notes will have timestamps, note types, and geospatial information if available + /// + [IgnoreDataMember] + [HttpQueryMemberAttribute(Name = "notes", EmitDefaultValue = false)] + public bool? Notes { get; set; } + + /// + /// Search query + /// + [IgnoreDataMember] + [HttpQueryMemberAttribute(Name = "query", EmitDefaultValue = false)] + public string Query { get; set; } + + /// + /// Updating a route supports the reoptimize=1 parameter, which reoptimizes only that route. Also supports the parameters from GET. + /// + [IgnoreDataMember] + [HttpQueryMemberAttribute(Name = "reoptimize", EmitDefaultValue = false)] + public bool? ReOptimize { get; set; } + + + [IgnoreDataMember()] + [HttpQueryMemberAttribute(Name = "disable_optimization", EmitDefaultValue = false)] + public System.Nullable DisableOptimization + { + get { return m_DisableOptimization; } + set { m_DisableOptimization = value; } + } + private System.Nullable m_DisableOptimization; + + [IgnoreDataMember()] + [HttpQueryMemberAttribute(Name = "optimize", EmitDefaultValue = false)] + public string Optimize + { + get { return m_Optimize; } + set { m_Optimize = value; } + } + private string m_Optimize; + + /// + /// By sending recompute_directions=1 we request that the route directions be recomputed (note that this does happen automatically if certain properties of the route are updated, such as stop sequence_no changes or round-tripness) + /// + [IgnoreDataMember] + [HttpQueryMemberAttribute(Name = "recompute_directions", EmitDefaultValue = false)] + public bool? RecomputeDirections { get; set; } + + [IgnoreDataMember()] + [HttpQueryMemberAttribute(Name = "response_format", EmitDefaultValue = false)] + public string ResponseFormat + { + get { return m_ResponseFormat; } + set { m_ResponseFormat = value; } + } + private string m_ResponseFormat; + + [IgnoreDataMember()] + [HttpQueryMemberAttribute(Name = "route_destination_id", EmitDefaultValue = false)] + public System.Nullable RouteDestinationId + { + get { return m_RouteDestinationId; } + set { m_RouteDestinationId = value; } + } + private System.Nullable m_RouteDestinationId; + + /// + /// If true will be redirected + /// + [IgnoreDataMember()] + [HttpQueryMemberAttribute(Name = "redirect", EmitDefaultValue = false)] + public System.Nullable Redirect { + get { return m_Redirect; } + set { m_Redirect = value; } + } + private System.Nullable m_Redirect; + + /// + /// Route Parameters to update. + /// (After a PUT there is no guarantee that the route_destination_id values are preserved! It may create copies resulting in new destination IDs, especially when dealing with multiple depots.) + /// + [DataMember(Name = "parameters", EmitDefaultValue = false)] + public RouteParameters Parameters { get; set; } + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/TerritoryQuery.cs b/Route4MeSDKLibrary/QueryTypes/TerritoryQuery.cs new file mode 100644 index 00000000..2e57c67e --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/TerritoryQuery.cs @@ -0,0 +1,40 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.QueryTypes +{ + public sealed class TerritoryQuery : GenericParameters + { + /// + /// Device Id + /// + [HttpQueryMemberAttribute(Name = "device_id", EmitDefaultValue = false)] + public string DeviceID + { + get { return m_DeviceID; } + set { m_DeviceID = value; } + } + private string m_DeviceID; + + /// + /// Territory Id + /// + [HttpQueryMemberAttribute(Name = "territory_id", EmitDefaultValue = false)] + public string TerritoryId + { + get { return m_TerritoryId; } + set { m_TerritoryId = value; } + } + private string m_TerritoryId; + + /// + /// Territory Id + /// + [HttpQueryMemberAttribute(Name = "addresses", EmitDefaultValue = false)] + public System.Nullable addresses + { + get { return m_addresses; } + set { m_addresses = value; } + } + private System.Nullable m_addresses; + } +} diff --git a/Route4MeSDKLibrary/QueryTypes/VehicleParameters.cs b/Route4MeSDKLibrary/QueryTypes/VehicleParameters.cs new file mode 100644 index 00000000..e72a5ffa --- /dev/null +++ b/Route4MeSDKLibrary/QueryTypes/VehicleParameters.cs @@ -0,0 +1,41 @@ +using System.Runtime.Serialization; + +namespace Route4MeSDK.QueryTypes +{ + public sealed class VehicleParameters : GenericParameters + { + /// + /// Limit per page, if you use 0 you will get all records + /// + [HttpQueryMemberAttribute(Name = "limit", EmitDefaultValue = false)] + public System.Nullable Limit + { + get { return m_Limit; } + set { m_Limit = value; } + } + private System.Nullable m_Limit; + + /// + /// Offset + /// + [HttpQueryMemberAttribute(Name = "offset", EmitDefaultValue = false)] + public System.Nullable Offset + { + get { return m_Offset; } + set { m_Offset = value; } + } + private System.Nullable m_Offset; + + /// + /// Vehicle ID + /// + [DataMember(Name = "vehicle_id", EmitDefaultValue = false)] + public string VehicleId + { + get { return m_VehicleId; } + set { m_VehicleId = value; } + } + private string m_VehicleId; + } +} + diff --git a/Route4MeSDKLibrary/Route4MeManager.cs b/Route4MeSDKLibrary/Route4MeManager.cs new file mode 100755 index 00000000..a270d5af --- /dev/null +++ b/Route4MeSDKLibrary/Route4MeManager.cs @@ -0,0 +1,2439 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using Route4MeSDKLibrary.DataTypes; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using System.Xml; + + +namespace Route4MeSDK +{ + /// + /// This class encapsulates the Route4Me REST API + /// 1. Create an instance of Route4MeManager with the api_key + /// 1. Shortcut methods: Use shortcuts methods (for example Route4MeManager.GetOptimization()) to access the most popular functionality. + /// See examples Route4MeExamples.GetOptimization(), Route4MeExamples.SingleDriverRoundTrip() + /// 2. Generic methods: Use generic methods (for example Route4MeManager.GetJsonObjectFromAPI() or Route4MeManager.GetStringResponseFromAPI()) + /// to access any availaible functionality. + /// See examples Route4MeExamples.GenericExample(), Route4MeExamples.SingleDriverRoundTripGeneric() + /// + public sealed class Route4MeManager + { + #region Fields + + private readonly string m_ApiKey; + private readonly TimeSpan m_DefaultTimeOut = new TimeSpan(TimeSpan.TicksPerMinute * 30); // Default timeout - 30 minutes + //private bool m_isTestMode = false; + + #endregion + + #region Methods + + #region Constructors + + public Route4MeManager(string apiKey) + { + m_ApiKey = apiKey; + } + + #endregion + + #region Route4Me Shortcut Methods + + #region Optimizations + + public DataObject RunOptimization(OptimizationParameters optimizationParameters, out string errorString) + { + var result = GetJsonObjectFromAPI(optimizationParameters, + R4MEInfrastructureSettings.ApiHost, + HttpMethodType.Post, + false, + out errorString); + + return result; + } + + public DataObject GetOptimization(OptimizationParameters optimizationParameters, out string errorString) + { + var result = GetJsonObjectFromAPI(optimizationParameters, + R4MEInfrastructureSettings.ApiHost, + HttpMethodType.Get, + out errorString); + + return result; + } + + /// + /// + [DataContract] + private sealed class DataObjectOptimizations + { + [DataMember(Name = "optimizations")] + public DataObject[] Optimizations { get; set; } + } + + public DataObject[] GetOptimizations(RouteParametersQuery queryParameters, out string errorString) + { + DataObjectOptimizations dataObjectOptimizations = GetJsonObjectFromAPI(queryParameters, + R4MEInfrastructureSettings.ApiHost, + HttpMethodType.Get, + out errorString); + DataObject[] result = null; + if (dataObjectOptimizations != null) + { + result = dataObjectOptimizations.Optimizations; + } + return result; + } + + public DataObject UpdateOptimization(OptimizationParameters optimizationParameters, out string errorString) + { + var result = GetJsonObjectFromAPI(optimizationParameters, + R4MEInfrastructureSettings.ApiHost, + HttpMethodType.Put, + false, + out errorString); + + return result; + } + + [DataContract] + private sealed class RemoveOptimizationResponse + { + [DataMember(Name = "status")] + public bool Status { get; set; } + [DataMember(Name = "removed")] + public bool Removed { get; set; } + } + + /// + /// Remove an existing optimization belonging to an user. + /// + /// Optimization Problem ID + /// out: Error as string + /// Result status true/false + public bool RemoveOptimization(string optimizationProblemID, out string errorString) + { + GenericParameters genericParameters = new GenericParameters(); + genericParameters.ParametersCollection.Add("optimization_problem_id", optimizationProblemID); + RemoveOptimizationResponse response = GetJsonObjectFromAPI(genericParameters, + R4MEInfrastructureSettings.ApiHost, + HttpMethodType.Delete, + out errorString); + if (response != null && response.Status && response.Removed) + { + return true; + } + else + { + if (errorString == "") + errorString = "Error removing optimization"; + return false; + } + } + + [DataContract] + private sealed class RemoveDestinationFromOptimizationResponse + { + [DataMember(Name = "deleted")] + public Boolean Deleted { get; set; } + + [DataMember(Name = "route_destination_id")] + public int RouteDestinationId { get; set; } + } + + public bool RemoveDestinationFromOptimization(string optimizationId, int destinationId, out string errorString) + { + GenericParameters genericParameters = new GenericParameters(); + genericParameters.ParametersCollection.Add("optimization_problem_id", optimizationId); + genericParameters.ParametersCollection.Add("route_destination_id", destinationId.ToString()); + RemoveDestinationFromOptimizationResponse response = GetJsonObjectFromAPI(genericParameters, + R4MEInfrastructureSettings.GetAddress, + HttpMethodType.Delete, + out errorString); + if (response != null && response.Deleted) + { + return true; + } + else + { + return false; + } + } + + #endregion + + #region Hybrid Optimization + public DataObject GetOHybridptimization(HybridOptimizationParameters hybridOptimizationParameters, out string errorString) + { + var result = GetJsonObjectFromAPI(hybridOptimizationParameters, + R4MEInfrastructureSettings.HybridOptimization, + HttpMethodType.Get, + out errorString); + + return result; + } + #endregion + + #region Routes + + public DataObjectRoute GetRoute(RouteParametersQuery routeParameters, out string errorString) + { + var result = GetJsonObjectFromAPI(routeParameters, + R4MEInfrastructureSettings.RouteHost, + HttpMethodType.Get, + out errorString); + + return result; + } + + public DataObjectRoute[] GetRoutes(RouteParametersQuery routeParameters, out string errorString) + { + var result = GetJsonObjectFromAPI(routeParameters, + R4MEInfrastructureSettings.RouteHost, + HttpMethodType.Get, + out errorString); + + return result; + } + + public string GetRouteId(string optimizationProblemId, out string errorString) + { + GenericParameters genericParameters = new GenericParameters(); + genericParameters.ParametersCollection.Add("optimization_problem_id", optimizationProblemId); + genericParameters.ParametersCollection.Add("wait_for_final_state", "1"); + DataObject response = GetJsonObjectFromAPI(genericParameters, + R4MEInfrastructureSettings.ApiHost, + HttpMethodType.Get, + out errorString); + if (response != null && response.Routes != null && response.Routes.Length > 0) + { + string routeId = response.Routes[0].RouteID; + return routeId; + } + return null; + } + + public DataObjectRoute UpdateRoute(RouteParametersQuery routeParameters, out string errorString) + { + var result = GetJsonObjectFromAPI(routeParameters, + R4MEInfrastructureSettings.RouteHost, + HttpMethodType.Put, + out errorString); + + return result; + } + + [DataContract] + private sealed class DuplicateRouteResponse + { + [DataMember(Name = "optimization_problem_id")] + public string OptimizationProblemId { get; set; } + + [DataMember(Name = "success")] + public Boolean Success { get; set; } + } + + public string DuplicateRoute(RouteParametersQuery queryParameters, out string errorString) + { + //if (queryParameters.ParametersCollection["to"] == null) + // queryParameters.ParametersCollection.Add("to", "none"); + // Redirect to page or return json for none + queryParameters.ParametersCollection["to"] = "none"; + DuplicateRouteResponse response = GetJsonObjectFromAPI(queryParameters, + R4MEInfrastructureSettings.DuplicateRoute, + HttpMethodType.Get, + out errorString); + string routeId = null; + if (response != null && response.Success) + { + string optimizationProblemId = response.OptimizationProblemId; + if (optimizationProblemId != null) + { + routeId = this.GetRouteId(optimizationProblemId, out errorString); + } + } + return routeId; + } + + [DataContract] + private sealed class DeleteRouteResponse + { + [DataMember(Name = "deleted")] + public Boolean Deleted { get; set; } + + [DataMember(Name = "errors")] + public List Errors { get; set; } + + [DataMember(Name = "route_id")] + public string routeId { get; set; } + + [DataMember(Name = "route_ids")] + public string[] routeIds { get; set; } + } + + public string[] DeleteRoutes(string[] routeIds, out string errorString) + { + string str_route_ids = ""; + foreach (string routeId in routeIds) + { + if (str_route_ids.Length > 0) + str_route_ids += ","; + str_route_ids += routeId; + } + GenericParameters genericParameters = new GenericParameters(); + genericParameters.ParametersCollection.Add("route_id", str_route_ids); + DeleteRouteResponse response = GetJsonObjectFromAPI(genericParameters, + R4MEInfrastructureSettings.RouteHost, + HttpMethodType.Delete, + out errorString); + string[] deletedRouteIds = null; + if (response != null) + { + deletedRouteIds = response.routeIds; + } + return deletedRouteIds; + } + + public void MergeRoutes(string[] routeIds, out string errorString) + { + string str_route_ids = ""; + foreach (string routeId in routeIds) + { + if (str_route_ids.Length > 0) + str_route_ids += ","; + str_route_ids += routeId; + } + GenericParameters genericParameters = new GenericParameters(); + genericParameters.ParametersCollection.Add("route_ids", str_route_ids); + DataObject result = GetJsonObjectFromAPI(genericParameters, + R4MEInfrastructureSettings.MergeRoutes, + HttpMethodType.Post, + out errorString); + } + + [DataContract()] + private sealed class ResequenceReoptimizeRouteResponse + { + [DataMember(Name = "status")] + public Boolean Status + { + get { return m_Status; } + set { m_Status = value; } + } + private Boolean m_Status; + } + + public bool ResequenceReoptimizeRoute(Dictionary roParames, out string errorString) + { + RouteParametersQuery request = new RouteParametersQuery + { + RouteId = roParames["route_id"], + DisableOptimization = roParames["disable_optimization"]=="1" ? true : false, + Optimize = roParames["optimize"] + }; + + ResequenceReoptimizeRouteResponse response = GetJsonObjectFromAPI(request, R4MEInfrastructureSettings.RouteReoptimize, HttpMethodType.Get, out errorString); + + if (response != null && response.Status) + { + return true; + } + else + { + return false; + } + } + + public bool RouteSharing(RouteParametersQuery roParames, string Email, out string errorString) + { + List> keyValues = new List>(); + + keyValues.Add(new KeyValuePair("recipient_email", Email)); + HttpContent httpContent = new FormUrlEncodedContent(keyValues); + + ResequenceReoptimizeRouteResponse response = GetJsonObjectFromAPI(roParames, R4MEInfrastructureSettings.RouteSharing, HttpMethodType.Post, httpContent, out errorString); + + if (response != null && response.Status) + { + return true; + } + else + { + return false; + } + } + + [DataContract()] + private sealed class UpdateRouteCustomDataRequest : GenericParameters + { + + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId + { + get { return m_RouteId; } + set { m_RouteId = value; } + } + + private string m_RouteId; + [HttpQueryMemberAttribute(Name = "route_destination_id", EmitDefaultValue = false)] + public System.Nullable RouteDestinationId + { + get { return m_RouteDestinationId; } + set { m_RouteDestinationId = value; } + } + + private System.Nullable m_RouteDestinationId; + + [DataMember(Name = "custom_fields", EmitDefaultValue = false)] + public Dictionary CustomFields + { + get { return m_CustomFields; } + set { m_CustomFields = value; } + } + private Dictionary m_CustomFields; + } + + public Address UpdateRouteCustomData(RouteParametersQuery routeParameters, Dictionary customData, out string errorString) + { + UpdateRouteCustomDataRequest request = new UpdateRouteCustomDataRequest + { + RouteId = routeParameters.RouteId, + RouteDestinationId = routeParameters.RouteDestinationId, + CustomFields = customData + }; + + var result = GetJsonObjectFromAPI
(request, R4MEInfrastructureSettings.GetAddress, HttpMethodType.Put, out errorString); + + return result; + } + + [DataContract()] + private sealed class UpdateRouteDestinationRequest : GenericParameters + { + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId + { + get { return m_RouteId; } + set { m_RouteId = value; } + } + + private string m_RouteId; + [HttpQueryMemberAttribute(Name = "route_destination_id", EmitDefaultValue = false)] + public System.Nullable RouteDestinationId + { + get { return m_RouteDestinationId; } + set { m_RouteDestinationId = value; } + } + private System.Nullable m_RouteDestinationId; + + [DataMember(Name = "alias", EmitDefaultValue = false)] + public string Alias { get; set; } + + [DataMember(Name = "first_name", EmitDefaultValue = false)] + public string FirstName { get; set; } + + [DataMember(Name = "last_name", EmitDefaultValue = false)] + public string LastName { get; set; } + + [DataMember(Name = "address", EmitDefaultValue = false)] + public string AddressString { get; set; } + + [DataMember(Name = "is_depot", EmitDefaultValue = false)] + public bool? IsDepot { get; set; } + + //the latitude of this address + [DataMember(Name = "lat", EmitDefaultValue = false)] + public double Latitude { get; set; } + + //the longitude of this address + [DataMember(Name = "lng", EmitDefaultValue = false)] + public double Longitude { get; set; } + + [DataMember(Name = "sequence_no", EmitDefaultValue = false)] + public int? SequenceNo { get; set; } + + //status flag to mark an address as visited (aka check in) + [DataMember(Name = "is_visited", EmitDefaultValue = false)] + public bool? IsVisited { get; set; } + + //status flag to mark an address as departed (aka check out) + [DataMember(Name = "is_departed", EmitDefaultValue = false)] + public bool? IsDeparted { get; set; } + + //the last known visited timestamp of this address + [DataMember(Name = "timestamp_last_visited", EmitDefaultValue = false)] + public uint? TimestampLastVisited { get; set; } + + //the last known departed timestamp of this address + [DataMember(Name = "timestamp_last_departed", EmitDefaultValue = false)] + public uint? TimestampLastDeparted { get; set; } + + //pass-through data about this route destination + //the data will be visible on the manifest, website, and mobile apps + [DataMember(Name = "customer_po", EmitDefaultValue = false)] + public object CustomerPo { get; set; } + + //pass-through data about this route destination + //the data will be visible on the manifest, website, and mobile apps + [DataMember(Name = "invoice_no", EmitDefaultValue = false)] + public object InvoiceNo { get; set; } + + //pass-through data about this route destination + //the data will be visible on the manifest, website, and mobile apps + [DataMember(Name = "reference_no", EmitDefaultValue = false)] + public object ReferenceNo { get; set; } + + //pass-through data about this route destination + //the data will be visible on the manifest, website, and mobile apps + [DataMember(Name = "order_no", EmitDefaultValue = false)] + public object OrderNo { get; set; } + + [DataMember(Name = "order_id", EmitDefaultValue = false)] + public int? OrderId { get; set; } + + [DataMember(Name = "weight", EmitDefaultValue = false)] + public object Weight { get; set; } + + [DataMember(Name = "cost", EmitDefaultValue = false)] + public object Cost { get; set; } + + [DataMember(Name = "revenue", EmitDefaultValue = false)] + public object Revenue { get; set; } + + //the cubic volume that this destination/order/line-item consumes/contains + //this is how much space it will take up on a vehicle + [DataMember(Name = "cube", EmitDefaultValue = false)] + public object Cube { get; set; } + + //the number of pieces/palllets that this destination/order/line-item consumes/contains on a vehicle + [DataMember(Name = "pieces", EmitDefaultValue = false)] + public object Pieces { get; set; } + + [DataMember(Name = "email", EmitDefaultValue = false)] + public string Email { get; set; } + + [DataMember(Name = "phone", EmitDefaultValue = false)] + public string Phone { get; set; } + + [DataMember(Name = "time_window_start", EmitDefaultValue = false)] + public int? TimeWindowStart { get; set; } + + [DataMember(Name = "time_window_end", EmitDefaultValue = false)] + public int? TimeWindowEnd { get; set; } + + //the expected amount of time that will be spent at this address by the driver/user + [DataMember(Name = "time", EmitDefaultValue = false)] + public int? Time { get; set; } + + [DataMember(Name = "notes", EmitDefaultValue = false)] + public AddressNote[] Notes { get; set; } + + //if present, the priority will sequence addresses in all the optimal routes so that + //higher priority addresses are general at the beginning of the route sequence + //1 is the highest priority, 100000 is the lowest + [DataMember(Name = "priority", EmitDefaultValue = false)] + public int? Priority { get; set; } + + //generate optimal routes and driving directions to this curbside lat + [DataMember(Name = "curbside_lat", EmitDefaultValue = false)] + public double? CurbsideLatitude { get; set; } + + //generate optimal routes and driving directions to the curbside lang + [DataMember(Name = "curbside_lng", EmitDefaultValue = false)] + public double? CurbsideLongitude { get; set; } + + [DataMember(Name = "time_window_start_2", EmitDefaultValue = false)] + public int? TimeWindowStart2 { get; set; } + + [DataMember(Name = "time_window_end_2", EmitDefaultValue = false)] + public int? TimeWindowEnd2 { get; set; } + + [DataMember(Name = "custom_fields", EmitDefaultValue = false)] + public Dictionary CustomFields + { + get { return m_CustomFields; } + set { m_CustomFields = value; } + } + private Dictionary m_CustomFields; + } + + public Address UpdateRouteDestination(Address addressParameters, out string errorString) + { + UpdateRouteDestinationRequest request = new UpdateRouteDestinationRequest + { + RouteId = addressParameters.RouteId, + RouteDestinationId = addressParameters.RouteDestinationId, + }; + + if (addressParameters.Alias != null) request.Alias = addressParameters.Alias; + if (addressParameters.FirstName != null) request.FirstName = addressParameters.FirstName; + if (addressParameters.LastName != null) request.LastName = addressParameters.LastName; + if (addressParameters.AddressString != null) request.AddressString = addressParameters.AddressString; + if (addressParameters.IsDepot != null) request.IsDepot = addressParameters.IsDepot; + if (addressParameters.Latitude != null) request.Latitude = addressParameters.Latitude; + if (addressParameters.Longitude != null) request.Longitude = addressParameters.Longitude; + + if (addressParameters.SequenceNo != null) request.SequenceNo = addressParameters.SequenceNo; + if (addressParameters.IsVisited != null) request.IsVisited = addressParameters.IsVisited; + if (addressParameters.IsDeparted != null) request.IsDeparted = addressParameters.IsDeparted; + if (addressParameters.TimestampLastVisited != null) request.TimestampLastVisited = addressParameters.TimestampLastVisited; + if (addressParameters.TimestampLastDeparted != null) request.TimestampLastDeparted = addressParameters.TimestampLastDeparted; + if (addressParameters.CustomerPo != null) request.CustomerPo = addressParameters.CustomerPo; + if (addressParameters.InvoiceNo != null) request.InvoiceNo = addressParameters.InvoiceNo; + if (addressParameters.ReferenceNo != null) request.ReferenceNo = addressParameters.ReferenceNo; + if (addressParameters.OrderNo != null) request.OrderNo = addressParameters.OrderNo; + if (addressParameters.OrderId != null) request.OrderId = addressParameters.OrderId; + if (addressParameters.Weight != null) request.Weight = addressParameters.Weight; + if (addressParameters.Cost != null) request.Cost = addressParameters.Cost; + if (addressParameters.Revenue != null) request.Revenue = addressParameters.Revenue; + if (addressParameters.Cube != null) request.Cube = addressParameters.Cube; + if (addressParameters.Pieces != null) request.Pieces = addressParameters.Pieces; + if (addressParameters.Phone != null) request.Phone = addressParameters.Phone.ToString(); + + if (addressParameters.TimeWindowStart != null) request.TimeWindowStart = addressParameters.TimeWindowStart; + if (addressParameters.TimeWindowEnd != null) request.TimeWindowEnd = addressParameters.TimeWindowEnd; + if (addressParameters.Notes != null) request.Notes = addressParameters.Notes; + if (addressParameters.Priority != null) request.Priority = addressParameters.Priority; + if (addressParameters.CurbsideLatitude != null) request.CurbsideLatitude = addressParameters.CurbsideLatitude; + if (addressParameters.CurbsideLongitude != null) request.CurbsideLongitude = addressParameters.CurbsideLongitude; + if (addressParameters.TimeWindowStart2 != null) request.TimeWindowStart2 = addressParameters.TimeWindowStart2; + if (addressParameters.TimeWindowEnd2 != null) request.TimeWindowEnd2 = addressParameters.TimeWindowEnd2; + if (addressParameters.CustomFields != null) request.CustomFields = addressParameters.CustomFields; + + var result = GetJsonObjectFromAPI
(request, R4MEInfrastructureSettings.GetAddress, HttpMethodType.Put, out errorString); + + return result; + } + + #endregion + + #region Tracking + + public DataObject GetLastLocation(GenericParameters parameters, out string errorString) + { + var result = GetJsonObjectFromAPI(parameters, + R4MEInfrastructureSettings.RouteHost, + HttpMethodType.Get, + false, + out errorString); + + return result; + } + + public string SetGPS(GPSParameters gpsParameters, out string errorString) + { + var result = GetJsonObjectFromAPI(gpsParameters, + R4MEInfrastructureSettings.SetGpsHost, + HttpMethodType.Get, + true, + out errorString); + + return result; + } + + [DataContract()] + private sealed class FindAssetRequest : GenericParameters + { + [HttpQueryMemberAttribute(Name = "tracking", EmitDefaultValue = false)] + public string Tracking + { + get { return m_Tracking; } + set { m_Tracking = value; } + } + + private string m_Tracking; + } + + public FindAssetResponse FindAsset(string tracking, out string errorString) + { + FindAssetRequest request = new FindAssetRequest { Tracking = tracking }; + + FindAssetResponse result = GetJsonObjectFromAPI(request, R4MEInfrastructureSettings.AssetTracking, HttpMethodType.Get, false, out errorString); + + return result; + } + + #endregion + + #region Users + + public User[] GetUsers(GenericParameters parameters, out string errorString) + { + var result = GetJsonObjectFromAPI(parameters, + R4MEInfrastructureSettings.GetUsersHost, + HttpMethodType.Get, + out errorString); + + return result; + } + + public MemberResponseV4 CreateUser(MemberParametersV4 memParams, out string errorString) + { + MemberResponseV4 response = GetJsonObjectFromAPI(memParams, R4MEInfrastructureSettings.GetUsersHost, HttpMethodType.Post, out errorString); + return response; + } + + [DataContract()] + public sealed class UserDeleteResponse + { + [DataMember(Name = "status")] + public bool Status + { + get { return m_Status; } + set { m_Status = value; } + } + private bool m_Status; + } + + public bool UserDelete(MemberParametersV4 memParams, out string errorString) + { + UserDeleteResponse response = GetJsonObjectFromAPI(memParams, R4MEInfrastructureSettings.GetUsersHost, HttpMethodType.Delete, out errorString); + + if (response == null) return false; + + if (response.Status) return true; else return false; + } + + public MemberResponseV4 GetUserById(MemberParametersV4 memParams, out string errorString) + { + MemberResponseV4 response = GetJsonObjectFromAPI(memParams, R4MEInfrastructureSettings.GetUsersHost, HttpMethodType.Get, out errorString); + return response; + } + + public MemberResponseV4 UserUpdate(MemberParametersV4 memParams, out string errorString) + { + MemberResponseV4 response = GetJsonObjectFromAPI(memParams, R4MEInfrastructureSettings.GetUsersHost, HttpMethodType.Put, out errorString); + return response; + } + + public MemberResponse UserAuthentication(MemberParameters memParams, out string errorString) + { + MemberParameters roParams = new MemberParameters(); + + var keyValues = new List>(); + keyValues.Add(new KeyValuePair("strEmail", memParams.StrEmail)); + keyValues.Add(new KeyValuePair("strPassword", memParams.StrPassword)); + keyValues.Add(new KeyValuePair("format", memParams.Format)); + + HttpContent httpContent = new FormUrlEncodedContent(keyValues); + + MemberResponse response = GetJsonObjectFromAPI(roParams, R4MEInfrastructureSettings.UserAuthentication, HttpMethodType.Post, httpContent, out errorString); + + return response; + } + + public MemberResponse UserRegistration(MemberParameters memParams, out string errorString) + { + MemberParameters roParams = new MemberParameters(); + roParams.Plan = memParams.Plan; + roParams.MemberType = memParams.MemberType; + + var keyValues = new List>(); + keyValues.Add(new KeyValuePair("strIndustry", memParams.StrIndustry)); + keyValues.Add(new KeyValuePair("strFirstName", memParams.StrFirstName)); + keyValues.Add(new KeyValuePair("strLastName", memParams.StrLastName)); + keyValues.Add(new KeyValuePair("strEmail", memParams.StrEmail)); + keyValues.Add(new KeyValuePair("format", memParams.Format)); + keyValues.Add(new KeyValuePair("chkTerms", memParams.ChkTerms==1 ? "1" : "0")); + keyValues.Add(new KeyValuePair("device_type", memParams.DeviceType)); + keyValues.Add(new KeyValuePair("strPassword_1", memParams.StrPassword_1)); + keyValues.Add(new KeyValuePair("strPassword_2", memParams.StrPassword_2)); + + HttpContent httpContent = new FormUrlEncodedContent(keyValues); + + MemberResponse response = GetJsonObjectFromAPI(roParams, R4MEInfrastructureSettings.UserRegistration, HttpMethodType.Post, httpContent, out errorString); + + return response; + } + + [DataContract()] + private sealed class ValidateSessionRequest : GenericParameters + { + + [HttpQueryMemberAttribute(Name = "session_guid", EmitDefaultValue = false)] + public string SessionGuid + { + get { return m_SessionGuid; } + set { m_SessionGuid = value; } + } + + private string m_SessionGuid; + [HttpQueryMemberAttribute(Name = "member_id", EmitDefaultValue = false)] + public System.Nullable MemberId + { + get { return m_MemberId; } + set { m_MemberId = value; } + } + + private System.Nullable m_MemberId; + [HttpQueryMemberAttribute(Name = "format", EmitDefaultValue = false)] + public string Format + { + get { return m_Format; } + set { m_Format = value; } + } + + private string m_Format; + } + + public MemberResponse ValidateSession(MemberParameters memParams, out string errorString) + { + ValidateSessionRequest request = new ValidateSessionRequest + { + SessionGuid = memParams.SessionGuid, + MemberId = memParams.MemberId, + Format = memParams.Format + }; + + MemberResponse result = GetJsonObjectFromAPI(request, R4MEInfrastructureSettings.ValidateSession, HttpMethodType.Get, false, out errorString); + + return result; + } + + public MemberConfigurationResponse CreateNewConfigurationKey(MemberConfigurationParameters confParams, out string errorString) + { + MemberConfigurationResponse response = GetJsonObjectFromAPI(confParams, R4MEInfrastructureSettings.UserConfiguration, HttpMethodType.Post, out errorString); + + return response; + } + + public MemberConfigurationResponse RemoveConfigurationKey(MemberConfigurationParameters confParams, out string errorString) + { + MemberConfigurationResponse response = GetJsonObjectFromAPI(confParams, R4MEInfrastructureSettings.UserConfiguration, HttpMethodType.Delete, out errorString); + + return response; + } + + [DataContract()] + private sealed class GetConfigurationDataRequest : GenericParameters + { + + [HttpQueryMemberAttribute(Name = "config_key", EmitDefaultValue = false)] + public string config_key + { + get { return m_config_key; } + set { m_config_key = value; } + } + + private string m_config_key; + } + + public MemberConfigurationDataRersponse GetConfigurationData(MemberConfigurationParameters confParams, out string errorString) + { + GetConfigurationDataRequest mParams = default(GetConfigurationDataRequest); + mParams = new GetConfigurationDataRequest(); + if ((confParams != null)) + { + mParams.config_key = confParams.config_key; + } + + MemberConfigurationDataRersponse response = GetJsonObjectFromAPI(mParams, R4MEInfrastructureSettings.UserConfiguration, HttpMethodType.Get, out errorString); + + return response; + } + + public MemberConfigurationResponse UpdateConfigurationKey(MemberConfigurationParameters confParams, out string errorString) + { + MemberConfigurationResponse response = GetJsonObjectFromAPI(confParams, R4MEInfrastructureSettings.UserConfiguration, HttpMethodType.Put, out errorString); + + return response; + } + + #endregion + + #region Address Notes + + public AddressNote[] GetAddressNotes(NoteParameters noteParameters, out string errorString) + { + AddressParameters addressParameters = new AddressParameters() + { + RouteId = noteParameters.RouteId, + RouteDestinationId = noteParameters.AddressId, + Notes = true + }; + Address address = this.GetAddress(addressParameters, out errorString); + if (address != null) + { + return address.Notes; + } + else + { + return null; + } + } + + [DataContract] + private sealed class AddAddressNoteResponse + { + [DataMember(Name = "status")] + public bool Status { get; set; } + + [DataMember(Name = "note")] + public AddressNote Note { get; set; } + } + + public AddressNote AddAddressNote(NoteParameters noteParameters, string noteContents, string attachmentFilePath, out string errorString) + { + var strUpdateType = "unclassified"; + if (noteParameters.ActivityType != null && noteParameters.ActivityType.Length > 0) + { + strUpdateType = noteParameters.ActivityType; + } + HttpContent httpContent = null; + FileStream attachmentFileStream = null; + StreamContent attachmentStreamContent = null; + if (attachmentFilePath != null) + { + attachmentFileStream = File.OpenRead(attachmentFilePath); + attachmentStreamContent = new StreamContent(attachmentFileStream); + MultipartFormDataContent multipartFormDataContent = new MultipartFormDataContent(); + multipartFormDataContent.Add(attachmentStreamContent, "strFilename", Path.GetFileName(attachmentFilePath)); + multipartFormDataContent.Add(new StringContent(strUpdateType), "strUpdateType"); + multipartFormDataContent.Add(new StringContent(noteContents), "strNoteContents"); + httpContent = multipartFormDataContent; + } + else + { + var keyValues = new List>(); + keyValues.Add(new KeyValuePair("strUpdateType", strUpdateType)); + keyValues.Add(new KeyValuePair("strNoteContents", noteContents)); + httpContent = new FormUrlEncodedContent(keyValues); + } + AddAddressNoteResponse response = GetJsonObjectFromAPI(noteParameters, + R4MEInfrastructureSettings.AddRouteNotesHost, + HttpMethodType.Post, + httpContent, + out errorString); + if (attachmentStreamContent != null) + { + attachmentStreamContent.Dispose(); + } + if (attachmentFileStream != null) + { + attachmentFileStream.Dispose(); + } + if (response != null) + { + if (response.Note != null) + { + return response.Note; + } + else + { + if (response.Status == false) + { + errorString = "Note not added"; + } + return null; + } + } + else + { + return null; + } + } + + public AddressNote AddAddressNote(NoteParameters noteParameters, string noteContents, out string errorString) + { + return this.AddAddressNote(noteParameters, noteContents, null, out errorString); + } + + #endregion + + #region Activities + + [DataContract] + private sealed class GetActivitiesResponse + { + [DataMember(Name = "results")] + public Activity[] Results { get; set; } + + [DataMember(Name = "total")] + public uint Total { get; set; } + } + + /// + /// Get Activity Feed + /// + /// Input parameters + /// Error string + /// List of Activity objects + public Activity[] GetActivityFeed(ActivityParameters activityParameters, out string errorString) + { + GetActivitiesResponse response = GetJsonObjectFromAPI(activityParameters, + R4MEInfrastructureSettings.ActivityFeedHost, + HttpMethodType.Get, + out errorString); + Activity[] result = null; + if (response != null) + { + result = response.Results; + } + return result; + } + + [DataContract] + private sealed class LogCustomActivityResponse + { + [DataMember(Name = "status")] + public bool Status { get; set; } + } + + /// + /// Create User Activity. Send custom message to Activity Stream. + /// + /// Input Activity object to add + /// Error string + /// True/False + public bool LogCustomActivity(Activity activity, out string errorString) + { + activity.PrepareForSerialization(); + LogCustomActivityResponse response = GetJsonObjectFromAPI(activity, + R4MEInfrastructureSettings.ActivityFeedHost, + HttpMethodType.Post, + out errorString); + if (response != null && response.Status) + { + return true; + } + else + { + return false; + } + } + + #endregion + + #region Destinations + + public Address GetAddress(AddressParameters addressParameters, out string errorString) + { + var result = GetJsonObjectFromAPI
(addressParameters, + R4MEInfrastructureSettings.GetAddress, + HttpMethodType.Get, + out errorString); + + return result; + } + + [DataContract] + private sealed class AddRouteDestinationRequest : GenericParameters + { + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId { get; set; } + + [DataMember(Name = "addresses", EmitDefaultValue = false)] + public Address[] Addresses { get; set; } + + /// + /// If true, an address will be inserted at optimal position of a route + /// + [DataMember(Name = "optimal_position", EmitDefaultValue = true)] + public bool OptimalPosition { get; set; } + } + + /// + /// Add address(es) into a route. + /// + /// Route ID + /// Valid array of Address objects. + /// If true, an address will be inserted at optimal position of a route + /// out: Error as string + /// IDs of added addresses + public int[] AddRouteDestinations(string routeId, Address[] addresses, bool optimalPosition, out string errorString) + { + AddRouteDestinationRequest request = new AddRouteDestinationRequest() + { + RouteId = routeId, + Addresses = addresses, + OptimalPosition = optimalPosition + }; + DataObject response = GetJsonObjectFromAPI(request, + R4MEInfrastructureSettings.RouteHost, + HttpMethodType.Put, + out errorString); + int[] destinationIds = null; + if (response != null && response.Addresses != null) + { + List arrDestinationIds = new List(); + foreach (Address addressNew in addresses) + { + int destinationId = 0; + foreach (Address addressResp in response.Addresses) + { + if (addressResp.AddressString == addressNew.AddressString + && addressResp.Latitude == addressNew.Latitude + && addressResp.Longitude == addressNew.Longitude + && addressResp.RouteDestinationId != null) + { + destinationId = (int)addressResp.RouteDestinationId; + } + } + arrDestinationIds.Add(destinationId); + } + destinationIds = arrDestinationIds.ToArray(); + } + return destinationIds; + } + + /// + /// Add address(es) into a route. + /// + /// Route ID + /// Valid array of Address objects. + /// out: Error as string + /// IDs of added addresses + public int[] AddRouteDestinations(string routeId, Address[] addresses, out string errorString) + { + return this.AddRouteDestinations(routeId, addresses, true, out errorString); + } + + + [DataContract] + private sealed class RemoveRouteDestinationRequest : GenericParameters + { + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId { get; set; } + + [HttpQueryMemberAttribute(Name = "route_destination_id", EmitDefaultValue = false)] + public int RouteDestinationId { get; set; } + } + + [DataContract] + private sealed class RemoveRouteDestinationResponse + { + [DataMember(Name = "deleted")] + public Boolean Deleted { get; set; } + + [DataMember(Name = "route_destination_id")] + public int RouteDestinationId { get; set; } + } + + public bool RemoveRouteDestination(string routeId, int destinationId, out string errorString) + { + RemoveRouteDestinationRequest request = new RemoveRouteDestinationRequest() + { + RouteId = routeId, + RouteDestinationId = destinationId + }; + RemoveRouteDestinationResponse response = GetJsonObjectFromAPI(request, + R4MEInfrastructureSettings.GetAddress, + HttpMethodType.Delete, + out errorString); + if (response != null && response.Deleted) + { + return true; + } + else + { + return false; + } + } + + + [DataContract] + private sealed class MoveDestinationToRouteResponse + { + [DataMember(Name = "success")] + public Boolean Success { get; set; } + + [DataMember(Name = "error")] + public string error { get; set; } + } + + public bool MoveDestinationToRoute(string toRouteId, int routeDestinationId, int afterDestinationId, out string errorString) + { + var keyValues = new List>(); + keyValues.Add(new KeyValuePair("to_route_id", toRouteId)); + keyValues.Add(new KeyValuePair("route_destination_id", Convert.ToString(routeDestinationId))); + keyValues.Add(new KeyValuePair("after_destination_id", Convert.ToString(afterDestinationId))); + HttpContent httpContent = new FormUrlEncodedContent(keyValues); + + MoveDestinationToRouteResponse response = GetJsonObjectFromAPI(new GenericParameters(), + R4MEInfrastructureSettings.MoveRouteDestination, + HttpMethodType.Post, + httpContent, + out errorString); + if (response != null) + { + if (!response.Success && response.error != null) + { + errorString = response.error; + } + return response.Success; + } + return false; + } + + [DataContract] + private sealed class MarkAddressDepartedRequest : GenericParameters + { + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId + { + get { return m_RouteId; } + set { m_RouteId = value; } + } + private string m_RouteId; + + [HttpQueryMemberAttribute(Name = "address_id", EmitDefaultValue = false)] + public System.Nullable AddressId + { + get { return m_AddressId; } + set { m_AddressId = value; } + } + private System.Nullable m_AddressId; + + [IgnoreDataMember()] + [HttpQueryMemberAttribute(Name = "is_departed", EmitDefaultValue = false)] + public bool IsDeparted + { + get { return m_IsDeparted; } + set { m_IsDeparted = value; } + } + private bool m_IsDeparted; + + [IgnoreDataMember()] + [HttpQueryMemberAttribute(Name = "is_visited", EmitDefaultValue = false)] + public bool IsVisited + { + get { return m_IsVisited; } + set { m_IsVisited = value; } + } + private bool m_IsVisited; + + [HttpQueryMemberAttribute(Name = "member_id", EmitDefaultValue = false)] + public System.Nullable MemberId + { + get { return m_MemberId; } + set { m_MemberId = value; } + } + private System.Nullable m_MemberId; + } + + public int MarkAddressVisited(AddressParameters aParams, out string errorString) + { + MarkAddressDepartedRequest request = new MarkAddressDepartedRequest + { + RouteId = aParams.RouteId, + AddressId = aParams.AddressId, + IsVisited = aParams.IsVisited, + MemberId = 1 + }; + + string response = GetJsonObjectFromAPI(request, R4MEInfrastructureSettings.MarkAddressVisited, HttpMethodType.Get, out errorString); + int iResponse = 0; + if (int.TryParse(response.ToString(), out iResponse)) iResponse = Convert.ToInt32(response); + return iResponse; + } + + [DataContract] + private sealed class MarkAddressDepartedResponse + { + [DataMember(Name = "status")] + public Boolean Status { get; set; } + + [DataMember(Name = "error")] + public string error { get; set; } + } + + public int MarkAddressDeparted(AddressParameters aParams, out string errorString) + { + MarkAddressDepartedRequest request = new MarkAddressDepartedRequest + { + RouteId = aParams.RouteId, + AddressId = aParams.AddressId, + IsDeparted = aParams.IsDeparted, + MemberId = 1 + }; + + MarkAddressDepartedResponse response = GetJsonObjectFromAPI(request, R4MEInfrastructureSettings.MarkAddressDeparted, HttpMethodType.Get, out errorString); + + if (response != null) + { + if (response.Status) return 1; else return 0; + } else return 0; + } + + [DataContract()] + private sealed class MarkAddressAsMarkedAsDepartedRequest : GenericParameters + { + + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId + { + get { return m_RouteId; } + set { m_RouteId = value; } + } + + private string m_RouteId; + [HttpQueryMemberAttribute(Name = "route_destination_id", EmitDefaultValue = false)] + public System.Nullable RouteDestinationId + { + get { return m_RouteDestinationId; } + set { m_RouteDestinationId = value; } + } + + private System.Nullable m_RouteDestinationId; + [IgnoreDataMember()] + [DataMember(Name = "is_departed")] + public bool IsDeparted + { + get { return m_IsDeparted; } + set { m_IsDeparted = value; } + } + + private bool m_IsDeparted; + [IgnoreDataMember()] + [DataMember(Name = "is_visited")] + public bool IsVisited + { + get { return m_IsVisited; } + set { m_IsVisited = value; } + } + private bool m_IsVisited; + } + + public Address MarkAddressAsMarkedAsVisited(AddressParameters aParams, out string errorString) + { + MarkAddressAsMarkedAsDepartedRequest request = new MarkAddressAsMarkedAsDepartedRequest + { + RouteId = aParams.RouteId, + RouteDestinationId = aParams.RouteDestinationId, + IsVisited = aParams.IsVisited + }; + + Address response = GetJsonObjectFromAPI
(request, R4MEInfrastructureSettings.GetAddress, HttpMethodType.Put, out errorString); + + return response; + } + + public Address MarkAddressAsMarkedAsDeparted(AddressParameters aParams, out string errorString) + { + MarkAddressAsMarkedAsDepartedRequest request = new MarkAddressAsMarkedAsDepartedRequest + { + RouteId = aParams.RouteId, + RouteDestinationId = aParams.RouteDestinationId, + IsDeparted = aParams.IsDeparted + }; + + Address response = GetJsonObjectFromAPI
(request, R4MEInfrastructureSettings.GetAddress, HttpMethodType.Put, out errorString); + + return response; + } + + #endregion + + #region Address Book + + [DataContract] + private sealed class GetAddressBookContactsResponse + { + [DataMember(Name = "results")] + public AddressBookContact[] Results { get; set; } + + [DataMember(Name = "total")] + public uint Total { get; set; } + } + + public AddressBookContact[] GetAddressBookContacts(AddressBookParameters addressBookParameters, out uint total, out string errorString) + { + total = 0; + var response = GetJsonObjectFromAPI(addressBookParameters, + R4MEInfrastructureSettings.AddressBook, + HttpMethodType.Get, + out errorString); + AddressBookContact[] result = null; + if (response != null) + { + result = response.Results; + total = response.Total; + } + return result; + } + + public AddressBookContact[] GetAddressBookLocation(AddressBookParameters addressBookParameters, out uint total, out string errorString) + { + total = 0; + + var response = GetJsonObjectFromAPI(addressBookParameters, R4MEInfrastructureSettings.AddressBook, HttpMethodType.Get, out errorString); + AddressBookContact[] result = null; + if (response != null) + { + result = response.Results; + total = response.Total; + } + return result; + } + + [DataContract()] + private sealed class SearchAddressBookLocationRequest : GenericParameters + { + [HttpQueryMemberAttribute(Name = "query", EmitDefaultValue = false)] + public string Query + { + get { return m_Query; } + set { m_Query = value; } + } + + private string m_Query; + [HttpQueryMemberAttribute(Name = "fields", EmitDefaultValue = false)] + public string Fields + { + get { return m_Fields; } + set { m_Fields = value; } + } + + private string m_Fields; + [HttpQueryMemberAttribute(Name = "offset", EmitDefaultValue = false)] + public System.Nullable Offset + { + get { return m_Offset; } + set { m_Offset = value; } + } + + private System.Nullable m_Offset; + [HttpQueryMemberAttribute(Name = "limit", EmitDefaultValue = false)] + public System.Nullable Limit + { + get { return m_Limit; } + set { m_Limit = value; } + } + + private System.Nullable m_Limit; + } + + [DataContract()] + private sealed class SearchAddressBookLocationResponse + { + [DataMember(Name = "results")] + public List Results + { + get { return m_Results; } + set { m_Results = value; } + } + + private List m_Results; + [DataMember(Name = "total")] + public uint Total + { + get { return m_Total; } + set { m_Total = value; } + } + + private uint m_Total; + [DataMember(Name = "fields")] + public string[] Fields + { + get { return m_Fields; } + set { m_Fields = value; } + } + private string[] m_Fields; + } + + public List SearchAddressBookLocation(AddressBookParameters addressBookParameters, out uint total, out string errorString) + { + total = 0; + + SearchAddressBookLocationRequest request = new SearchAddressBookLocationRequest + { + Query = addressBookParameters.Query, + Fields = addressBookParameters.Fields, + Offset = addressBookParameters.Offset >= 0 ? (int)addressBookParameters.Offset : 0, + Limit = addressBookParameters.Limit >= 0 ? (int)addressBookParameters.Limit : 0 + }; + + var response = GetJsonObjectFromAPI(request, R4MEInfrastructureSettings.AddressBook, HttpMethodType.Get, out errorString); + List result = null; + if (response != null) + { + result = response.Results; + total = response.Total; + } + return result; + } + + public AddressBookContact AddAddressBookContact(AddressBookContact contact, out string errorString) + { + contact.PrepareForSerialization(); + AddressBookContact result = GetJsonObjectFromAPI(contact, + R4MEInfrastructureSettings.AddressBook, + HttpMethodType.Post, + out errorString); + return result; + } + + + public AddressBookContact UpdateAddressBookContact(AddressBookContact contact, out string errorString) + { + contact.PrepareForSerialization(); + AddressBookContact result = GetJsonObjectFromAPI(contact, + R4MEInfrastructureSettings.AddressBook, + HttpMethodType.Put, + out errorString); + return result; + } + + + [DataContract] + private sealed class RemoveAddressBookContactsRequest : GenericParameters + { + [DataMember(Name = "address_ids", EmitDefaultValue = false)] + public string[] AddressIds { get; set; } + } + + [DataContract] + private sealed class RemoveAddressBookContactsResponse + { + [DataMember(Name = "status")] + public bool Status { get; set; } + } + + public bool RemoveAddressBookContacts(string[] addressIds, out string errorString) + { + RemoveAddressBookContactsRequest request = new RemoveAddressBookContactsRequest() + { + AddressIds = addressIds + }; + RemoveAddressBookContactsResponse response = GetJsonObjectFromAPI(request, + R4MEInfrastructureSettings.AddressBook, + HttpMethodType.Delete, + out errorString); + if (response != null && response.Status) + { + return true; + } + else + { + return false; + } + } + + #endregion + + #region Avoidance Zones + + /// + /// Create avoidance zone + /// + /// Parameters for request + /// out: Error as string + /// Avoidance zone Object + public AvoidanceZone AddAvoidanceZone(AvoidanceZoneParameters avoidanceZoneParameters, out string errorString) + { + AvoidanceZone avoidanceZone = GetJsonObjectFromAPI(avoidanceZoneParameters, + R4MEInfrastructureSettings.Avoidance, + HttpMethodType.Post, + out errorString); + return avoidanceZone; + } + + /// + /// Get avoidance zones + /// + /// Parameters for request + /// out: Error as string + /// Avoidance zone Object list + public AvoidanceZone[] GetAvoidanceZones(AvoidanceZoneQuery avoidanceZoneQuery, out string errorString) + { + AvoidanceZone[] avoidanceZones = GetJsonObjectFromAPI(avoidanceZoneQuery, + R4MEInfrastructureSettings.Avoidance, + HttpMethodType.Get, + out errorString); + return avoidanceZones; + } + + /// + /// Get avoidance zone by parameters (territory id, device id) + /// + /// Parameters for request + /// out: Error as string + /// Avoidance zone Object + public AvoidanceZone GetAvoidanceZone(AvoidanceZoneQuery avoidanceZoneQuery, out string errorString) + { + AvoidanceZone avoidanceZone = GetJsonObjectFromAPI(avoidanceZoneQuery, + R4MEInfrastructureSettings.Avoidance, + HttpMethodType.Get, + out errorString); + return avoidanceZone; + } + + /// + /// Update avoidance zone (by territory id, device id) + /// + /// Parameters for request + /// out: Error as string + /// Avoidance zone Object + public AvoidanceZone UpdateAvoidanceZone(AvoidanceZoneParameters avoidanceZoneParameters, out string errorString) + { + AvoidanceZone avoidanceZone = GetJsonObjectFromAPI(avoidanceZoneParameters, + R4MEInfrastructureSettings.Avoidance, + HttpMethodType.Put, + out errorString); + return avoidanceZone; + } + + /// + /// Delete avoidance zone (by territory id, device id) + /// + /// Parameters for request + /// out: Error as string + /// Result status true/false + public bool DeleteAvoidanceZone(AvoidanceZoneQuery avoidanceZoneQuery, out string errorString) + { + GetJsonObjectFromAPI(avoidanceZoneQuery, + R4MEInfrastructureSettings.Avoidance, + HttpMethodType.Delete, + out errorString); + return errorString != ""; + } + + #endregion + + #region Orders + + [DataContract] + private sealed class GetOrdersResponse + { + [DataMember(Name = "results")] + public Order[] Results { get; set; } + + [DataMember(Name = "total")] + public uint Total { get; set; } + } + + /// + /// Get Orders + /// + /// Parameters for request + /// out: Total number of orders + /// out: Error as string + /// Order object list + public Order[] GetOrders(OrderParameters ordersQuery, out uint total, out string errorString) + { + total = 0; + GetOrdersResponse response = GetJsonObjectFromAPI(ordersQuery, + R4MEInfrastructureSettings.Order, + HttpMethodType.Get, + out errorString); + Order[] result = null; + if (response != null) + { + result = response.Results; + total = response.Total; + } + return result; + } + + public Order[] GetOrderByID(OrderParameters orderQuery, out string errorString) + { + GetOrdersResponse response = GetJsonObjectFromAPI(orderQuery, R4MEInfrastructureSettings.Order, HttpMethodType.Get, out errorString); + + return response.Results; + } + + public Order[] SearchOrders(OrderParameters orderQuery, out string errorString) + { + GetOrdersResponse response = GetJsonObjectFromAPI(orderQuery, R4MEInfrastructureSettings.Order, HttpMethodType.Get, out errorString); + + Order[] result = null; + if (response != null) + { + result = response.Results; + } + return result; + } + + /// + /// Create Order + /// + /// Parameters for request + /// out: Error as string + /// Order object + public Order AddOrder(Order order, out string errorString) + { + order.PrepareForSerialization(); + Order resultOrder = GetJsonObjectFromAPI(order, + R4MEInfrastructureSettings.Order, + HttpMethodType.Post, + out errorString); + return resultOrder; + } + + /// + /// Update Order + /// + /// Parameters for request + /// out: Error as string + /// Order Object + public Order UpdateOrder(Order order, out string errorString) + { + order.PrepareForSerialization(); + Order resultOrder = GetJsonObjectFromAPI(order, + R4MEInfrastructureSettings.Order, + HttpMethodType.Put, + out errorString); + return resultOrder; + } + + [DataContract] + private sealed class RemoveOrdersRequest : GenericParameters + { + [DataMember(Name = "order_ids", EmitDefaultValue = false)] + public string[] OrderIds { get; set; } + } + + [DataContract] + private sealed class RemoveOrdersResponse + { + [DataMember(Name = "status")] + public bool Status { get; set; } + } + + /// + /// Remove Orders + /// + /// Order IDs + /// out: Error as string + /// Result status true/false + public bool RemoveOrders(string[] orderIds, out string errorString) + { + RemoveOrdersRequest request = new RemoveOrdersRequest() + { + OrderIds = orderIds + }; + RemoveOrdersResponse response = GetJsonObjectFromAPI(request, + R4MEInfrastructureSettings.Order, + HttpMethodType.Delete, + out errorString); + if (response != null && response.Status) + { + return true; + } + else + { + return false; + } + } + + [DataContract()] + private sealed class AddOrdersToRouteRequest : GenericParameters + { + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId + { + get { return m_RouteId; } + set { m_RouteId = value; } + } + + private string m_RouteId; + [HttpQueryMemberAttribute(Name = "redirect", EmitDefaultValue = false)] + public System.Nullable Redirect + { + get { return m_Redirect; } + set { m_Redirect = value; } + } + + private System.Nullable m_Redirect; + [DataMember(Name = "addresses", EmitDefaultValue = false)] + public Address[] Addresses + { + get { return m_Addresses; } + set { m_Addresses = value; } + } + + private Address[] m_Addresses; + [DataMember(Name = "parameters", EmitDefaultValue = false)] + public RouteParameters Parameters + { + get { return m_Parameters; } + set { m_Parameters = value; } + } + + private RouteParameters m_Parameters; + } + + public RouteResponse AddOrdersToRoute(RouteParametersQuery rQueryParams, Address[] addresses, RouteParameters rParams, out string errorString) + { + AddOrdersToRouteRequest request = new AddOrdersToRouteRequest + { + RouteId = rQueryParams.RouteId, + Redirect = rQueryParams.Redirect==true ? 1: 0, + Addresses = addresses, + Parameters = rParams + }; + + RouteResponse response = GetJsonObjectFromAPI(request, R4MEInfrastructureSettings.RouteHost, HttpMethodType.Put, false, out errorString); + + return response; + } + + [DataContract()] + private sealed class AddOrdersToOptimizationRequest : GenericParameters + { + [HttpQueryMemberAttribute(Name = "optimization_problem_id", EmitDefaultValue = false)] + public string OptimizationProblemId + { + get { return m_OptimizationProblemId; } + set { m_OptimizationProblemId = value; } + } + + private string m_OptimizationProblemId; + [HttpQueryMemberAttribute(Name = "redirect", EmitDefaultValue = false)] + public System.Nullable Redirect + { + get { return m_Redirect; } + set { m_Redirect = value; } + } + + private System.Nullable m_Redirect; + [DataMember(Name = "addresses", EmitDefaultValue = false)] + public Address[] Addresses + { + get { return m_Addresses; } + set { m_Addresses = value; } + } + + private Address[] m_Addresses; + [DataMember(Name = "parameters", EmitDefaultValue = false)] + public RouteParameters Parameters + { + get { return m_Parameters; } + set { m_Parameters = value; } + } + + private RouteParameters m_Parameters; + } + + public DataObject AddOrdersToOptimization(OptimizationParameters rQueryParams, Address[] addresses, RouteParameters rParams, out string errorString) + { + AddOrdersToOptimizationRequest request = new AddOrdersToOptimizationRequest + { + OptimizationProblemId = rQueryParams.OptimizationProblemID, + Redirect = rQueryParams.Redirect==true ? 1 : 0, + Addresses = addresses, + Parameters = rParams + }; + + DataObject response = GetJsonObjectFromAPI(request, R4MEInfrastructureSettings.ApiHost, HttpMethodType.Put, false, out errorString); + + return response; + } + + #endregion + + #region Geocoding + + [DataContract()] + private sealed class GeocodingRequest : GenericParameters + { + + [HttpQueryMemberAttribute(Name = "addresses", EmitDefaultValue = false)] + public string Addresses + { + get { return m_Addresses; } + set { m_Addresses = value; } + } + + private string m_Addresses; + [HttpQueryMemberAttribute(Name = "format", EmitDefaultValue = false)] + public string Format + { + get { return m_Format; } + set { m_Format = value; } + } + + private string m_Format; + } + + [DataContract()] + private sealed class RapidStreetResponse + { + [DataMember(Name = "zipcode")] + public string Zipcode + { + get { return m_Zipcode; } + set { m_Zipcode = value; } + } + + private string m_Zipcode; + [DataMember(Name = "street_name")] + public string StreetName + { + get { return m_StreetName; } + set { m_StreetName = value; } + } + private string m_StreetName; + } + + public string Geocoding(GeocodingParameters geoParams, out string errorString) + { + GeocodingRequest request = new GeocodingRequest + { + Addresses = geoParams.Addresses, + Format = geoParams.Format + }; + + string response = GetXmlObjectFromAPI(request, R4MEInfrastructureSettings.Geocoder, HttpMethodType.Post, (HttpContent)null, true, out errorString); + + return response.ToString(); + } + + public ArrayList RapidStreetData(GeocodingParameters geoParams, out string errorString) + { + GeocodingRequest request = new GeocodingRequest { + Addresses = geoParams.Addresses, + Format = geoParams.Format + }; + string url = R4MEInfrastructureSettings.RapidStreetData; + + ArrayList result = new ArrayList(); + + if (geoParams.Pk > 0) { + url = url + "/" + geoParams.Pk + "/"; + RapidStreetResponse response = GetJsonObjectFromAPI(request, url, HttpMethodType.Get, (HttpContent)null, false, out errorString); + Dictionary dresult = new Dictionary(); + if ((response != null)) { + dresult["zipcode"] = response.Zipcode; + dresult["street_name"] = response.StreetName; + result.Add(dresult); + } + } else { + if (geoParams.Offset > 0 | geoParams.Limit > 0) { + url = url + "/" + geoParams.Offset + "/" + geoParams.Limit + "/"; + } + RapidStreetResponse[] response = GetJsonObjectFromAPI(request, url, HttpMethodType.Get, (HttpContent)null, false, out errorString); + if ((response != null)) { + foreach (var resp1 in response) { + Dictionary dresult = new Dictionary(); + dresult["zipcode"] = resp1.Zipcode; + dresult["street_name"] = resp1.StreetName; + result.Add(dresult); + } + } + } + + return result; + } + + public ArrayList RapidStreetZipcode(GeocodingParameters geoParams, out string errorString) + { + GeocodingRequest request = new GeocodingRequest { + Addresses = geoParams.Addresses, + Format = geoParams.Format + }; + string url = R4MEInfrastructureSettings.RapidStreetZipcode; + + ArrayList result = new ArrayList(); + + if (geoParams.Zipcode != null) { + url = url + "/" + geoParams.Zipcode + "/"; + } else { + errorString = "Zipcode is not defined!..."; + return result; + } + if (geoParams.Offset > 0 | geoParams.Limit > 0) { + url = url + geoParams.Offset + "/" + geoParams.Limit + "/"; + } + + RapidStreetResponse[] response = GetJsonObjectFromAPI(request, url, HttpMethodType.Get, (HttpContent)null, false, out errorString); + if ((response != null)) { + foreach (var resp1 in response) { + Dictionary dresult = new Dictionary(); + dresult["zipcode"] = resp1.Zipcode; + dresult["street_name"] = resp1.StreetName; + result.Add(dresult); + } + } + + return result; + } + + public ArrayList RapidStreetService(GeocodingParameters geoParams, out string errorString) + { + GeocodingRequest request = new GeocodingRequest { + Addresses = geoParams.Addresses, + Format = geoParams.Format + }; + string url = R4MEInfrastructureSettings.RapidStreetService; + + ArrayList result = new ArrayList(); + + if (geoParams.Zipcode != null) { + url = url + "/" + geoParams.Zipcode + "/"; + } else { + errorString = "Zipcode is not defined!..."; + return result; + } + if (geoParams.Housenumber != null) { + url = url + geoParams.Housenumber + "/"; + } else { + errorString = "Housenumber is not defined!..."; + return result; + } + if (geoParams.Offset > 0 | geoParams.Limit > 0) { + url = url + geoParams.Offset + "/" + geoParams.Limit + "/"; + } + + RapidStreetResponse[] response = GetJsonObjectFromAPI(request, url, HttpMethodType.Get, (HttpContent)null, false, out errorString); + if ((response != null)) { + foreach (var resp1 in response) { + Dictionary dresult = new Dictionary(); + dresult["zipcode"] = resp1.Zipcode; + dresult["street_name"] = resp1.StreetName; + result.Add(dresult); + } + } + + return result; + } + + #endregion + + #region Vehicles + + /// + /// Get Vehicles + /// + /// Parameters for request + /// out: Total number of Vehicles + /// out: Error as string + /// Vehicle object list + public VehicleResponse[] GetVehicles(VehicleParameters vehParams, out string errorString) + { + VehicleResponse[] response = GetJsonObjectFromAPI(vehParams, R4MEInfrastructureSettings.ViewVehicles, HttpMethodType.Get, out errorString); + + return response; + } + + #endregion + + #region Territories + /// + /// Create territory + /// + /// Parameters for request + /// out: Error as string + /// Territory Object + public AvoidanceZone CreateTerritory(AvoidanceZoneParameters avoidanceZoneParameters, out string errorString) + { + AvoidanceZone avoidanceZone = GetJsonObjectFromAPI(avoidanceZoneParameters, R4MEInfrastructureSettings.Territory, HttpMethodType.Post, out errorString); + return avoidanceZone; + } + + /// + /// Get territories by parameters + /// + /// Parameters for request + /// out: Error as string + /// Territory zone Objects + public AvoidanceZone[] GetTerritories(AvoidanceZoneQuery avoidanceZoneQuery, out string errorString) + { + AvoidanceZone[] territories = GetJsonObjectFromAPI(avoidanceZoneQuery, R4MEInfrastructureSettings.Territory, HttpMethodType.Get, out errorString); + return territories; + } + + /// + /// Get territory by parameters (territory id, device id, addresses) + /// + /// Parameters for request + /// out: Error as string + /// Territory zone Object + public TerritoryZone GetTerritory(TerritoryQuery territoryQuery, out string errorString) + { + TerritoryZone territory = GetJsonObjectFromAPI(territoryQuery, R4MEInfrastructureSettings.Territory, HttpMethodType.Get, out errorString); + return territory; + } + + /// + /// Remove Territory (by territory id, device id) + /// + /// Parameters for request + /// out: Error as string + /// Result status true/false + public bool RemoveTerritory(AvoidanceZoneQuery territoryQuery, out string errorString) + { + GetJsonObjectFromAPI(territoryQuery, R4MEInfrastructureSettings.Territory, HttpMethodType.Delete, out errorString); + return !string.IsNullOrEmpty(errorString); + } + + /// + /// Update Territory (by territory id, device id) + /// + /// Parameters for request + /// out: Error as string + /// Territory Object + public AvoidanceZone UpdateTerritory(AvoidanceZoneParameters tereritoryParameters, out string errorString) + { + AvoidanceZone territory = GetJsonObjectFromAPI(tereritoryParameters, R4MEInfrastructureSettings.Territory, HttpMethodType.Put, out errorString); + return territory; + } + + #endregion + + #endregion + + #region Generic Methods + + public string GetStringResponseFromAPI(GenericParameters optimizationParameters, + string url, + HttpMethodType httpMethod, + out string errorMessage) + { + string result = GetJsonObjectFromAPI(optimizationParameters, + url, + httpMethod, + true, + out errorMessage); + + return result; + } + + public T GetJsonObjectFromAPI(GenericParameters optimizationParameters, + string url, + HttpMethodType httpMethod, + out string errorMessage) + where T : class + { + T result = GetJsonObjectFromAPI(optimizationParameters, + url, + httpMethod, + false, + out errorMessage); + + return result; + } + + public T GetJsonObjectFromAPI(GenericParameters optimizationParameters, + string url, + HttpMethodType httpMethod, + HttpContent httpContent, + out string errorMessage) + where T : class + { + T result = GetJsonObjectFromAPI(optimizationParameters, + url, + httpMethod, + httpContent, + false, + out errorMessage); + + return result; + } + + private T GetJsonObjectFromAPI(GenericParameters optimizationParameters, + string url, + HttpMethodType httpMethod, + bool isString, + out string errorMessage) + where T : class + { + T result = GetJsonObjectFromAPI(optimizationParameters, + url, + httpMethod, + (HttpContent)null, + isString, + out errorMessage); + + return result; + } + + private T GetJsonObjectFromAPI(GenericParameters optimizationParameters, + string url, + HttpMethodType httpMethod, + HttpContent httpContent, + bool isString, + out string errorMessage) + where T : class + { + T result = default(T); + errorMessage = string.Empty; + + try + { + using (HttpClient httpClient = CreateHttpClient(url)) + { + // Get the parameters + string parametersURI = optimizationParameters.Serialize(m_ApiKey); + + switch (httpMethod) + { + case HttpMethodType.Get: + { + var response = httpClient.GetStreamAsync(parametersURI); + response.Wait(); + + if (response.IsCompleted) + { + //var test = m_isTestMode ? response.Result.ReadString() : null; + //var test = response.Result.ReadString(); + result = isString ? response.Result.ReadString() as T : + response.Result.ReadObject(); + } + + break; + } + case HttpMethodType.Post: + case HttpMethodType.Put: + case HttpMethodType.Delete: + { + bool isPut = httpMethod == HttpMethodType.Put; + bool isDelete = httpMethod == HttpMethodType.Delete; + HttpContent content = null; + if (httpContent != null) + { + content = httpContent; + } + else + { + string jsonString = R4MeUtils.SerializeObjectToJson(optimizationParameters); + content = new StringContent(jsonString); + } + + Task response = null; + if (isPut) + { + response = httpClient.PutAsync(parametersURI, content); + } + else if(isDelete) + { + HttpRequestMessage request = new HttpRequestMessage + { + Content = content, + Method = HttpMethod.Delete, + RequestUri = new Uri(parametersURI, UriKind.Relative) + }; + response = httpClient.SendAsync(request); + } + else + { + response = httpClient.PostAsync(parametersURI, content); + } + + // Wait for response + response.Wait(); + + // Check if successful + if (response.IsCompleted && + response.Result.IsSuccessStatusCode && + response.Result.Content is StreamContent) + { + var streamTask = ((StreamContent)response.Result.Content).ReadAsStreamAsync(); + streamTask.Wait(); + + if (streamTask.IsCompleted) + { + //var test = m_isTestMode ? streamTask.Result.ReadString() : null; + //var test = streamTask.Result.ReadString(); + result = isString ? streamTask.Result.ReadString() as T : + streamTask.Result.ReadObject(); + } + } + else + { + var streamTask = ((StreamContent)response.Result.Content).ReadAsStreamAsync(); + streamTask.Wait(); + ErrorResponse errorResponse = null; + try + { + errorResponse = streamTask.Result.ReadObject(); + } + catch// (Exception e) + { + errorResponse = default(ErrorResponse); + } + if (errorResponse != null && errorResponse.Errors != null && errorResponse.Errors.Count > 0) + { + foreach (String error in errorResponse.Errors) + { + if (errorMessage.Length > 0) + errorMessage += "; "; + errorMessage += error; + } + } + else + { + var responseStream = response.Result.Content.ReadAsStringAsync(); + responseStream.Wait(); + String responseString = responseStream.Result; + if (responseString != null) + errorMessage = "Response: " + responseString; + } + } + + break; + } + } + } + } + catch (Exception e) + { + errorMessage = e is AggregateException ? e.InnerException.Message : e.Message; + result = default(T); + } + + return result; + } + + private string GetXmlObjectFromAPI(GenericParameters optimizationParameters, string url, HttpMethodType httpMethod__1, HttpContent httpContent, bool isString, out string errorMessage) where T : class + { + string result = string.Empty; + errorMessage = string.Empty; + + try + { + using (HttpClient httpClient = CreateHttpClient(url)) + { + // Get the parameters + string parametersURI = optimizationParameters.Serialize(m_ApiKey); + + switch (httpMethod__1) + { + case HttpMethodType.Get: + if (true) + { + var response = httpClient.GetStreamAsync(parametersURI); + response.Wait(); + + if (response.IsCompleted) + { + //var test = m_isTestMode ? response.Result.ReadString() : null; + result = isString ? response.Result.ReadString() as String : response.Result.ReadObject(); // Oleg T -> String + } + + break; // TODO: might not be correct. Was : Exit Select + } + break; + case HttpMethodType.Post: + break; + case HttpMethodType.Put: + break; + case HttpMethodType.Delete: + if (true) + { + bool isPut = httpMethod__1 == HttpMethodType.Put; + bool isDelete = httpMethod__1 == HttpMethodType.Delete; + HttpContent content = null; + if (httpContent != null) + { + content = httpContent; + } + else + { + string jsonString = R4MeUtils.SerializeObjectToJson(optimizationParameters); + content = new StringContent(jsonString); + } + + Task response = null; + if (isPut) + { + response = httpClient.PutAsync(parametersURI, content); + } + else if (isDelete) + { + HttpRequestMessage request = new HttpRequestMessage + { + Content = content, + Method = HttpMethod.Delete, + RequestUri = new Uri(parametersURI, UriKind.Relative) + }; + response = httpClient.SendAsync(request); + } + else + { + response = httpClient.PostAsync(parametersURI, content); + } + + // Wait for response + response.Wait(); + + // Check if successful + if (response.IsCompleted && response.Result.IsSuccessStatusCode && response.Result.Content is StreamContent) + { + var streamTask = ((StreamContent)response.Result.Content).ReadAsStreamAsync(); + streamTask.Wait(); + + if (streamTask.IsCompleted) + { + //var test = m_isTestMode ? streamTask.Result.ReadString() : null; + //var test = streamTask.Result.ReadString(); + result = streamTask.Result.ReadString(); + //result = If(isString, TryCast(streamTask.Result.ReadString(), XmlDocument), streamTask.Result.ReadObject(Of XmlDocument)()) + } + } + else + { + var streamTask = ((StreamContent)response.Result.Content).ReadAsStreamAsync(); + streamTask.Wait(); + ErrorResponse errorResponse = null; + try + { + errorResponse = streamTask.Result.ReadObject(); + } + catch + { + // (Exception e) + errorResponse = null; + } + if (errorResponse != null && errorResponse.Errors != null && errorResponse.Errors.Count > 0) + { + foreach (String error in errorResponse.Errors) + { + if (errorMessage.Length > 0) + { + errorMessage += "; "; + } + errorMessage += error; + } + } + else + { + var responseStream = response.Result.Content.ReadAsStringAsync(); + responseStream.Wait(); + String responseString = responseStream.Result; + if (responseString != null) + { + errorMessage = "Response: " + responseString; + } + } + } + + break; // TODO: might not be correct. Was : Exit Select + } + break; + } + } + } + catch (Exception e) + { + errorMessage = e is AggregateException ? e.InnerException.Message : e.Message; + result = null; + } + + return result; + } + + private HttpClient CreateHttpClient(string url) + { + HttpClient result = new HttpClient() { BaseAddress = new Uri(url) }; + + result.Timeout = m_DefaultTimeOut; + result.DefaultRequestHeaders.Accept.Clear(); + result.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + + return result; + } + + #endregion + + #endregion + } +} diff --git a/Route4MeSDKLibrary/Route4MeSDKLibrary.csproj b/Route4MeSDKLibrary/Route4MeSDKLibrary.csproj new file mode 100755 index 00000000..f66fdd32 --- /dev/null +++ b/Route4MeSDKLibrary/Route4MeSDKLibrary.csproj @@ -0,0 +1,111 @@ + + + + + Debug + AnyCPU + {37E5D3FC-BBF7-4BD8-98E6-A58DC9138D98} + Library + Properties + Route4MeSDKLibrary + Route4MeSDKLibrary + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Route4MeSDKLibrary/Types.cs b/Route4MeSDKLibrary/Types.cs new file mode 100755 index 00000000..1aa8264c --- /dev/null +++ b/Route4MeSDKLibrary/Types.cs @@ -0,0 +1,11 @@ + +namespace Route4MeSDK +{ + public enum HttpMethodType + { + Get, + Put, + Post, + Delete + } +} diff --git a/Route4MeSDKLibrary/Utils.cs b/Route4MeSDKLibrary/Utils.cs new file mode 100755 index 00000000..7340b67c --- /dev/null +++ b/Route4MeSDKLibrary/Utils.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Reflection; +using System.Runtime.Serialization.Json; +using System.Text; + +namespace Route4MeSDK +{ + /// + /// Route4Me C# SDK helper methods + /// + public static class R4MeUtils + { + /// + /// Reads JSON object for a stream + /// Any DataContractJsonSerializer can be thrown + /// + public static T ReadObject(this Stream stream) + { + var settings = new DataContractJsonSerializerSettings() + { + UseSimpleDictionaryFormat = true + }; + var parser = new DataContractJsonSerializer(typeof(T), settings); + + return (T)parser.ReadObject(stream); + } + + /// + /// Reads a stream to a string + /// + public static string ReadString(this Stream stream) + { + StreamReader reader = new StreamReader(stream); + + string result = reader.ReadToEnd(); + + return result; + } + + /// + /// Serialized an object to a string as JSON + /// Any DataContractJsonSerializer can be thrown + /// + public static string SerializeObjectToJson(object obj) + { + var settings = new DataContractJsonSerializerSettings() + { + UseSimpleDictionaryFormat = true + }; + var writer = new DataContractJsonSerializer(obj.GetType(), settings); + string result = null; + + using (var memoryStream = new MemoryStream()) + { + if (obj == null) return result; + writer.WriteObject(memoryStream, obj); + + result = Encoding.UTF8.GetString(memoryStream.ToArray()); + } + + return result; + } + + /// + /// Returns the DescriptionAttribute of a enum value + /// + public static string Description(this Enum enumValue) + { + FieldInfo field = enumValue.GetType().GetField(enumValue.ToString()); + + var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; + + string result = attribute == null ? enumValue.ToString() : attribute.Description; + + return result; + } + + /// + /// IEnumerable extension method, performs 'action' for each IEnumerable item + /// source value can be null + /// + public static void ForEach(this IEnumerable source, Action action) + { + if (source == null) + { + return; + } + + foreach (var item in source) + action(item); + } + + /// + /// Convert DateTime to Unix epoch time + /// + public static long ConvertToUnixTimestamp(DateTime date) + { + DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + if (date < origin) date = new DateTime(1970, 1, 1, date.Hour, date.Minute, date.Second); + TimeSpan diff = date - origin; + return (long)Math.Floor(diff.TotalSeconds); + } + + /// + /// Convert DateTime from Unix epoch time + /// + public static DateTime ConvertFromUnixTimestamp(long timestamp) + { + DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + return origin.AddSeconds(timestamp); + } + } +} diff --git a/Route4MeSDKLibrary/bin/Debug/Route4MeSDKLibrary.dll b/Route4MeSDKLibrary/bin/Debug/Route4MeSDKLibrary.dll new file mode 100644 index 00000000..1014e3c6 Binary files /dev/null and b/Route4MeSDKLibrary/bin/Debug/Route4MeSDKLibrary.dll differ diff --git a/Route4MeSDKLibrary/bin/Debug/Route4MeSDKLibrary.pdb b/Route4MeSDKLibrary/bin/Debug/Route4MeSDKLibrary.pdb new file mode 100644 index 00000000..03b71c80 Binary files /dev/null and b/Route4MeSDKLibrary/bin/Debug/Route4MeSDKLibrary.pdb differ diff --git a/Route4MeSDKLibrary/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/Route4MeSDKLibrary/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 00000000..c37f1258 Binary files /dev/null and b/Route4MeSDKLibrary/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.csproj.FileListAbsolute.txt b/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.csproj.FileListAbsolute.txt new file mode 100644 index 00000000..46b640ea --- /dev/null +++ b/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.csproj.FileListAbsolute.txt @@ -0,0 +1,10 @@ +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKLibrary\bin\Debug\Route4MeSDKLibrary.dll +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKLibrary\bin\Debug\Route4MeSDKLibrary.pdb +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKLibrary\obj\Debug\Route4MeSDKLibrary.dll +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKLibrary\obj\Debug\Route4MeSDKLibrary.pdb +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKLibrary\obj\Debug\Route4MeSDKLibrary.csprojResolveAssemblyReference.cache +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKLibrary\bin\Debug\Route4MeSDKLibrary.dll +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKLibrary\bin\Debug\Route4MeSDKLibrary.pdb +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKLibrary\obj\Debug\Route4MeSDKLibrary.csprojResolveAssemblyReference.cache +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKLibrary\obj\Debug\Route4MeSDKLibrary.dll +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKLibrary\obj\Debug\Route4MeSDKLibrary.pdb diff --git a/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.csprojResolveAssemblyReference.cache b/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.csprojResolveAssemblyReference.cache new file mode 100644 index 00000000..714a1d80 Binary files /dev/null and b/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.csprojResolveAssemblyReference.cache differ diff --git a/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.dll b/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.dll new file mode 100644 index 00000000..1014e3c6 Binary files /dev/null and b/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.dll differ diff --git a/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.pdb b/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.pdb new file mode 100644 index 00000000..03b71c80 Binary files /dev/null and b/Route4MeSDKLibrary/obj/Debug/Route4MeSDKLibrary.pdb differ diff --git a/Route4MeSDKLibrary/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/Route4MeSDKLibrary/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs new file mode 100644 index 00000000..e69de29b diff --git a/Route4MeSDKLibrary/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/Route4MeSDKLibrary/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs new file mode 100644 index 00000000..e69de29b diff --git a/Route4MeSDKLibrary/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/Route4MeSDKLibrary/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs new file mode 100644 index 00000000..e69de29b diff --git a/Route4MeSDKTest/App.config b/Route4MeSDKTest/App.config new file mode 100755 index 00000000..cb1b9af5 --- /dev/null +++ b/Route4MeSDKTest/App.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/GetActivities.cs b/Route4MeSDKTest/Examples/Activities/GetActivities.cs new file mode 100644 index 00000000..1ddb3a28 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/GetActivities.cs @@ -0,0 +1,44 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void GetActivities(string routeId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters() + { + RouteId = routeId, + Limit = 10, + Offset = 0 + }; + + // Run the query + string errorString; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("GetActivities executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + activities.ForEach(activity => + { + Console.WriteLine("Activity ID: {0}", activity.ActivityId); + }); + Console.WriteLine(""); + } + else + { + Console.WriteLine("GetActivities error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Activities/GetRouteTeamActivities.cs b/Route4MeSDKTest/Examples/Activities/GetRouteTeamActivities.cs new file mode 100644 index 00000000..28bdd766 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/GetRouteTeamActivities.cs @@ -0,0 +1,50 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Team Activities on a Route + /// + public void GetRouteTeamActivities() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + string routeId = "06B655F27E0D6A74BD37F6F9758E4D2E"; + + ActivityParameters activityParameters = new ActivityParameters + { + RouteId = routeId, + Team = "true" + }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("GetRouteTeamActivities executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("GetRouteTeamActivities error: {0}", errorString); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/Activities/LogCustomActivity.cs b/Route4MeSDKTest/Examples/Activities/LogCustomActivity.cs new file mode 100644 index 00000000..906721ea --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/LogCustomActivity.cs @@ -0,0 +1,46 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Create User Activity + /// + /// Activity message + /// Route identifier + /// True/False + public bool LogCustomActivity(string message, string routeId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + Activity activity = new Activity() + { + ActivityType = "user_message", + ActivityMessage = message, + RouteId = routeId + }; + + // Run the query + string errorString; + bool added = route4Me.LogCustomActivity(activity, out errorString); + + Console.WriteLine(""); + + if (added) + { + Console.WriteLine("LogCustomActivity executed successfully"); + return added; + } + else + { + Console.WriteLine("LogCustomActivity error: {0}", errorString); + return added; + } + } + } +} + diff --git a/Route4MeSDKTest/Examples/Activities/SearcAreaUpdated.cs b/Route4MeSDKTest/Examples/Activities/SearcAreaUpdated.cs new file mode 100644 index 00000000..d5aa702e --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearcAreaUpdated.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Area Updated + /// + public void SearchAreaUpdated() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "area-updated" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchAreaUpdated executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchAreaUpdated error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchAreaAdded.cs b/Route4MeSDKTest/Examples/Activities/SearchAreaAdded.cs new file mode 100644 index 00000000..602aa987 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchAreaAdded.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Search Area Added + /// + public void SearchAreaAdded() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "area-added" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchAreaAdded executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchAreaAdded error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchAreaRemoved.cs b/Route4MeSDKTest/Examples/Activities/SearchAreaRemoved.cs new file mode 100644 index 00000000..e8aad0bd --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchAreaRemoved.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Search Area Removed + /// + public void SearchAreaRemoved() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "area-removed" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchAreaRemoved executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchAreaRemoved error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchDestinationDeleted.cs b/Route4MeSDKTest/Examples/Activities/SearchDestinationDeleted.cs new file mode 100644 index 00000000..ff1c18c9 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchDestinationDeleted.cs @@ -0,0 +1,48 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Destination Deleted + /// + public void SearchDestinationDeleted() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters + { + ActivityType = "delete-destination", + RouteId = "5C15E83A4BE005BCD1537955D28D51D7" + }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchDestinationDeleted executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchDestinationDeleted error: {0}", errorString); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/Activities/SearchDestinationInseted.cs b/Route4MeSDKTest/Examples/Activities/SearchDestinationInseted.cs new file mode 100644 index 00000000..a44905be --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchDestinationInseted.cs @@ -0,0 +1,48 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Destination Inserted + /// + public void SearchDestinationInserted() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters + { + ActivityType = "insert-destination", + RouteId = "87B8873BAEA4E09942C68E2C92A9C4B7" + }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchDestinationInserted executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchDestinationInserted error: {0}", errorString); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/Activities/SearchDestinationMarkedAsDeparted.cs b/Route4MeSDKTest/Examples/Activities/SearchDestinationMarkedAsDeparted.cs new file mode 100644 index 00000000..b9b0fb3d --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchDestinationMarkedAsDeparted.cs @@ -0,0 +1,48 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Destination Marked as Departed + /// + public void SearchDestinationMarkedAsDeparted() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters + { + ActivityType = "mark-destination-departed", + RouteId = "03CEF546324F727239ABA69EFF3766E1" + }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchDestinationMarkedAsDeparted executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchDestinationMarkedAsDeparted error: {0}", errorString); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/Activities/SearchDestinationOutSequence.cs b/Route4MeSDKTest/Examples/Activities/SearchDestinationOutSequence.cs new file mode 100644 index 00000000..07f2a6af --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchDestinationOutSequence.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Search Destination Out of Sequense + /// + public void SearchDestinationOutSequence() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "destination-out-sequence" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchDestinationOutSequence executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchDestinationOutSequence error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchDestinationUpdated.cs b/Route4MeSDKTest/Examples/Activities/SearchDestinationUpdated.cs new file mode 100644 index 00000000..701e6099 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchDestinationUpdated.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Destination Updated + /// + public void SearchDestinationUpdated() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "update-destinations" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchDestinationUpdated executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchDestinationUpdated error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchDriverArrivedEarly.cs b/Route4MeSDKTest/Examples/Activities/SearchDriverArrivedEarly.cs new file mode 100644 index 00000000..f99cdc75 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchDriverArrivedEarly.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Driver Arrived Early + /// + public void SearchDriverArrivedEarly() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "driver-arrived-early" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchDriverArrivedEarly executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchDriverArrivedEarly error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchDriverArrivedLate.cs b/Route4MeSDKTest/Examples/Activities/SearchDriverArrivedLate.cs new file mode 100644 index 00000000..1252904f --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchDriverArrivedLate.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Driver Arrived Late + /// + public void SearchDriverArrivedLate() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "driver-arrived-late" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchDriverArrivedLate executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchDriverArrivedLate error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchDriverArrivedOnTime.cs b/Route4MeSDKTest/Examples/Activities/SearchDriverArrivedOnTime.cs new file mode 100644 index 00000000..ecbc1d6d --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchDriverArrivedOnTime.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Driver Arrived On Time + /// + public void SearchDriverArrivedOnTime() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "driver-arrived-on-time" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchDriverArrivedOnTime executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchDriverArrivedOnTime error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchGeofenceEntered.cs b/Route4MeSDKTest/Examples/Activities/SearchGeofenceEntered.cs new file mode 100644 index 00000000..adaad174 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchGeofenceEntered.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Geofence Entered + /// + public void SearchGeofenceEntered() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "geofence-entered" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchGeofenceEntered executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchGeofenceEntered error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchGeofenceLeft.cs b/Route4MeSDKTest/Examples/Activities/SearchGeofenceLeft.cs new file mode 100644 index 00000000..8a46ddac --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchGeofenceLeft.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Geofence Left + /// + public void SearchGeofenceLeft() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "geofence-left" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchGeofenceLeft executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchGeofenceLeft error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchInsertDestinationAll.cs b/Route4MeSDKTest/Examples/Activities/SearchInsertDestinationAll.cs new file mode 100644 index 00000000..e4778c93 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchInsertDestinationAll.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Insert Destination All + /// + public void SearchInsertDestinationAll() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "insert-destination" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchInsertDestinationAll executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchInsertDestinationAll error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchMarkDestinationDepartedAll.cs b/Route4MeSDKTest/Examples/Activities/SearchMarkDestinationDepartedAll.cs new file mode 100644 index 00000000..bc74aac0 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchMarkDestinationDepartedAll.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Mark Destination As Departed All + /// + public void SearchMarkDestinationDepartedAll() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "mark-destination-departed" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchMarkDestinationDepartedAll executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchMarkDestinationDepartedAll error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchMarkDestinationVisited.cs b/Route4MeSDKTest/Examples/Activities/SearchMarkDestinationVisited.cs new file mode 100644 index 00000000..ac1da722 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchMarkDestinationVisited.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Mark Destination as Visited + /// + public void SearchMarkDestinationVisited() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "mark-destination-visited" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchMarkDestinationVisited executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchMarkDestinationVisited error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchMemberCreated.cs b/Route4MeSDKTest/Examples/Activities/SearchMemberCreated.cs new file mode 100644 index 00000000..1d01982f --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchMemberCreated.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Member Created + /// + public void SearchMemberCreated() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "member-created" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchMemberCreated executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchMemberCreated error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchMemberDeleted.cs b/Route4MeSDKTest/Examples/Activities/SearchMemberDeleted.cs new file mode 100644 index 00000000..c94c8b4d --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchMemberDeleted.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Member Deleted + /// + public void SearchMemberDeleted() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "member-deleted" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchMemberDeleted executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchMemberDeleted error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchMemberModified.cs b/Route4MeSDKTest/Examples/Activities/SearchMemberModified.cs new file mode 100644 index 00000000..21712462 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchMemberModified.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Search Member Modified + /// + public void SearchMemberModified() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "member-modified" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchMemberModified executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchMemberModified error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchMoveDestination.cs b/Route4MeSDKTest/Examples/Activities/SearchMoveDestination.cs new file mode 100644 index 00000000..9d84f298 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchMoveDestination.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Move Destination + /// + public void SearchMoveDestination() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "move-destination" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchMoveDestination executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchMoveDestination error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchNoteInserted.cs b/Route4MeSDKTest/Examples/Activities/SearchNoteInserted.cs new file mode 100644 index 00000000..b2eeb42d --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchNoteInserted.cs @@ -0,0 +1,47 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Note Inserted + /// + public void SearchNoteInserted() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters + { + ActivityType = "note-insert", + RouteId = "C3E7FD2F8775526674AE5FD83E25B88A" + }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchNoteInserted executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchNoteInserted error: {0}", errorString); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/Activities/SearchNoteInsertedAll.cs b/Route4MeSDKTest/Examples/Activities/SearchNoteInsertedAll.cs new file mode 100644 index 00000000..274ad740 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchNoteInsertedAll.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Search Area Added + /// + public void SearchNoteInsertedAll() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "note-insert" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchNoteInsertedAll executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchNoteInsertedAll error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchRouteDeleted.cs b/Route4MeSDKTest/Examples/Activities/SearchRouteDeleted.cs new file mode 100644 index 00000000..f4571e4b --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchRouteDeleted.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Route Deleted + /// + public void SearchRouteDeleted() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "route-delete" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchRouteDeleted executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchRouteDeleted error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchRouteOptimized.cs b/Route4MeSDKTest/Examples/Activities/SearchRouteOptimized.cs new file mode 100644 index 00000000..b0a00fcc --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchRouteOptimized.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Route Optimized + /// + public void SearchRouteOptimized() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters { ActivityType = "route-optimized" }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchRouteOptimized executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchRouteOptimized error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Activities/SearchRouteOwnerChanged.cs b/Route4MeSDKTest/Examples/Activities/SearchRouteOwnerChanged.cs new file mode 100644 index 00000000..525a2a06 --- /dev/null +++ b/Route4MeSDKTest/Examples/Activities/SearchRouteOwnerChanged.cs @@ -0,0 +1,47 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Activities Route Owner Changed + /// + public void SearchRouteOwnerChanged() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + ActivityParameters activityParameters = new ActivityParameters + { + ActivityType = "route-owner-changed", + RouteId = "5C15E83A4BE005BCD1537955D28D51D7" + }; + + // Run the query + string errorString = ""; + Activity[] activities = route4Me.GetActivityFeed(activityParameters, out errorString); + + Console.WriteLine(""); + + if (activities != null) + { + Console.WriteLine("SearchRouteOwnerChanged executed successfully, {0} activities returned", activities.Length); + Console.WriteLine(""); + + foreach (Activity Activity in activities) + { + Console.WriteLine("Activity ID: {0}", Activity.ActivityId); + } + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchRouteOwnerChanged error: {0}", errorString); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/AddressBook/AddAddressBookContact.cs b/Route4MeSDKTest/Examples/AddressBook/AddAddressBookContact.cs new file mode 100644 index 00000000..bab4ac0a --- /dev/null +++ b/Route4MeSDKTest/Examples/AddressBook/AddAddressBookContact.cs @@ -0,0 +1,44 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public AddressBookContact AddAddressBookContact() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AddressBookContact contact = new AddressBookContact() + { + first_name = "Test FirstName " + (new Random()).Next().ToString(), + address_1 = "Test Address1 " + (new Random()).Next().ToString(), + cached_lat = 38.024654, + cached_lng = -77.338814 + }; + + // Run the query + string errorString; + AddressBookContact resultContact = route4Me.AddAddressBookContact(contact, out errorString); + + Console.WriteLine(""); + + if (resultContact != null) + { + Console.WriteLine("AddAddressBookContact executed successfully"); + + Console.WriteLine("AddressId: {0}", resultContact.address_id); + + return resultContact; + } + else + { + Console.WriteLine("AddAddressBookContact error: {0}", errorString); + + return null; + } + } + } +} diff --git a/Route4MeSDKTest/Examples/AddressBook/GetAddressBookContacts.cs b/Route4MeSDKTest/Examples/AddressBook/GetAddressBookContacts.cs new file mode 100644 index 00000000..58971774 --- /dev/null +++ b/Route4MeSDKTest/Examples/AddressBook/GetAddressBookContacts.cs @@ -0,0 +1,39 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void GetAddressBookContacts() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AddressBookParameters addressBookParameters = new AddressBookParameters() + { + Limit = 10, + Offset = 0 + }; + + // Run the query + uint total; + string errorString; + AddressBookContact[] contacts = route4Me.GetAddressBookContacts(addressBookParameters, out total, out errorString); + + Console.WriteLine(""); + + if (contacts != null) + { + Console.WriteLine("GetAddressBookContacts executed successfully, {0} contacts returned, total = {1}", contacts.Length, total); + Console.WriteLine(""); + + } + else + { + Console.WriteLine("GetAddressBookContacts error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/AddressBook/GetAddressbookLocation.cs b/Route4MeSDKTest/Examples/AddressBook/GetAddressbookLocation.cs new file mode 100644 index 00000000..c557fb18 --- /dev/null +++ b/Route4MeSDKTest/Examples/AddressBook/GetAddressbookLocation.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Address Book Location + /// + public void GetAddressbookLocation() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AddressBookParameters addressBookParameters = new AddressBookParameters + { + Query = "david", + Offset = 0, + Limit = 20 + }; + + // Run the query + uint total = 0; + string errorString = ""; + AddressBookContact[] contacts = route4Me.GetAddressBookLocation(addressBookParameters, out total, out errorString); + + Console.WriteLine(""); + + if (contacts != null) + { + Console.WriteLine("GetAddressbookLocation executed successfully, {0} contacts returned, total = {1}", contacts.Length, total); + + Console.WriteLine(""); + } + else + { + Console.WriteLine("GetAddressbookLocation error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/AddressBook/GetSpecifiedFieldsSearchText.cs b/Route4MeSDKTest/Examples/AddressBook/GetSpecifiedFieldsSearchText.cs new file mode 100644 index 00000000..67e91c12 --- /dev/null +++ b/Route4MeSDKTest/Examples/AddressBook/GetSpecifiedFieldsSearchText.cs @@ -0,0 +1,45 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Search for Specified Text, Show Specified Fields + /// + public void GetSpecifiedFieldsSearchText() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AddressBookParameters addressBookParameters = new AddressBookParameters + { + Query = "david", + Fields = "first_name,address_email", + Offset = 0, + Limit = 20 + }; + + // Run the query + uint total = 0; + string errorString = ""; + List contacts = route4Me.SearchAddressBookLocation(addressBookParameters, out total, out errorString); + + Console.WriteLine(""); + + if (contacts != null) + { + Console.WriteLine("GetSpecifiedFieldsSearchText executed successfully, {0} contacts returned, total = {1}", contacts.Count, total); + + Console.WriteLine(""); + } + else + { + Console.WriteLine("GetSpecifiedFieldsSearchText error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/AddressBook/RemoveAddressBookContacts.cs b/Route4MeSDKTest/Examples/AddressBook/RemoveAddressBookContacts.cs new file mode 100644 index 00000000..5a01355f --- /dev/null +++ b/Route4MeSDKTest/Examples/AddressBook/RemoveAddressBookContacts.cs @@ -0,0 +1,31 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void RemoveAddressBookContacts(string[] addressIds) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + string errorString; + bool removed = route4Me.RemoveAddressBookContacts(addressIds, out errorString); + + Console.WriteLine(""); + + if (removed) + { + Console.WriteLine("RemoveAddressBookContacts executed successfully, {0} contacts deleted", addressIds.Length); + } + else + { + Console.WriteLine("RemoveAddressBookContacts error: {0}", errorString); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/AddressBook/SearchLocationsByIDs.cs b/Route4MeSDKTest/Examples/AddressBook/SearchLocationsByIDs.cs new file mode 100644 index 00000000..a53a191a --- /dev/null +++ b/Route4MeSDKTest/Examples/AddressBook/SearchLocationsByIDs.cs @@ -0,0 +1,39 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Search Locations By IDs + /// + public void SearchLocationsByIDs() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AddressBookParameters addressBookParameters = new AddressBookParameters { AddressId = "2640129,4621569" }; + + // Run the query + uint total = 0; + string errorString = ""; + AddressBookContact[] contacts = route4Me.GetAddressBookLocation(addressBookParameters, out total, out errorString); + + Console.WriteLine(""); + + if (contacts != null) + { + Console.WriteLine("SearchLocationsByIDs executed successfully, {0} contacts returned, total = {1}", contacts.Length, total); + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchLocationsByIDs error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/AddressBook/SearchRoutedLocations.cs b/Route4MeSDKTest/Examples/AddressBook/SearchRoutedLocations.cs new file mode 100644 index 00000000..e76db632 --- /dev/null +++ b/Route4MeSDKTest/Examples/AddressBook/SearchRoutedLocations.cs @@ -0,0 +1,44 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Search Routed Locations + /// + public void SearchRoutedLocations() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AddressBookParameters addressBookParameters = new AddressBookParameters + { + Display = "routed", + Offset = 0, + Limit = 20 + }; + + // Run the query + uint total = 0; + string errorString = ""; + AddressBookContact[] contacts = route4Me.GetAddressBookLocation(addressBookParameters, out total, out errorString); + + Console.WriteLine(""); + + if (contacts != null) + { + Console.WriteLine("SearchRoutedLocations executed successfully, {0} contacts returned, total = {1}", contacts.Length, total); + + Console.WriteLine(""); + } + else + { + Console.WriteLine("SearchRoutedLocations error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/AddressBook/UpdateAddressBookContact.cs b/Route4MeSDKTest/Examples/AddressBook/UpdateAddressBookContact.cs new file mode 100644 index 00000000..a1f3810b --- /dev/null +++ b/Route4MeSDKTest/Examples/AddressBook/UpdateAddressBookContact.cs @@ -0,0 +1,30 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void UpdateAddressBookContact(AddressBookContact contact) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + string errorString; + AddressBookContact updatedContact = route4Me.UpdateAddressBookContact(contact, out errorString); + + Console.WriteLine(""); + + if (updatedContact != null) + { + Console.WriteLine("UpdateAddressBookContact executed successfully"); + } + else + { + Console.WriteLine("UpdateAddressBookContact error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Addresses/AddDestinationToOptimization.cs b/Route4MeSDKTest/Examples/Addresses/AddDestinationToOptimization.cs new file mode 100644 index 00000000..bb195cca --- /dev/null +++ b/Route4MeSDKTest/Examples/Addresses/AddDestinationToOptimization.cs @@ -0,0 +1,54 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public DataObject AddDestinationToOptimization(string optimizationProblemID, bool andReOptimize) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Prepare the address that we are going to add to an existing route optimization + Address[] addresses = new Address[] + { + new Address() { AddressString = "717 5th Ave New York, NY 10021", + Alias = "Giorgio Armani", + Latitude = 40.7669692, + Longitude = -73.9693864, + Time = 0 + } + }; + + //Optionally change any route parameters, such as maximum route duration, maximum cubic constraints, etc. + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + OptimizationProblemID = optimizationProblemID, + Addresses = addresses, + ReOptimize = andReOptimize + }; + + // Execute the optimization to re-optimize and rebalance all the routes in this optimization + string errorString; + DataObject dataObject = route4Me.UpdateOptimization(optimizationParameters, out errorString); + + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("AddDestinationToOptimization executed successfully"); + + Console.WriteLine("Optimization Problem ID: {0}", dataObject.OptimizationProblemId); + Console.WriteLine("State: {0}", dataObject.State); + } + else + { + Console.WriteLine("AddDestinationToOptimization error: {0}", errorString); + } + + return dataObject; + } + } +} diff --git a/Route4MeSDKTest/Examples/Addresses/AddRouteDestinations.cs b/Route4MeSDKTest/Examples/Addresses/AddRouteDestinations.cs new file mode 100644 index 00000000..9b54e71e --- /dev/null +++ b/Route4MeSDKTest/Examples/Addresses/AddRouteDestinations.cs @@ -0,0 +1,54 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public int[] AddRouteDestinations(string routeId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Prepare the addresses + Address[] addresses = new Address[] + { + #region Addresses + + new Address() { AddressString = "146 Bill Johnson Rd NE Milledgeville GA 31061", + Latitude = 33.143526, + Longitude = -83.240354, + Time = 0 }, + + new Address() { AddressString = "222 Blake Cir Milledgeville GA 31061", + Latitude = 33.177852, + Longitude = -83.263535, + Time = 0 } + + #endregion + }; + + // Run the query + bool optimalPosition = true; + string errorString; + int[] destinationIds = route4Me.AddRouteDestinations(routeId, addresses, optimalPosition, out errorString); + + Console.WriteLine(""); + + if (destinationIds != null) + { + Console.WriteLine("AddRouteDestinations executed successfully"); + + Console.WriteLine("Destination IDs: {0}", string.Join(" ", destinationIds)); + } + else + { + Console.WriteLine("AddRouteDestinations error: {0}", errorString); + } + + return destinationIds; + + } + } +} diff --git a/Route4MeSDKTest/Examples/Addresses/GetAddress.cs b/Route4MeSDKTest/Examples/Addresses/GetAddress.cs new file mode 100644 index 00000000..2a5b670f --- /dev/null +++ b/Route4MeSDKTest/Examples/Addresses/GetAddress.cs @@ -0,0 +1,40 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void GetAddress(string routeId, int routeDestinationId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AddressParameters addressParameters = new AddressParameters() + { + RouteId = routeId, + RouteDestinationId = routeDestinationId, + Notes = true + }; + + // Run the query + string errorString; + Address dataObject = route4Me.GetAddress(addressParameters, out errorString); + + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("GetAddress executed successfully"); + Console.WriteLine("RouteId: {0}; RouteDestinationId: {1}", dataObject.RouteId, dataObject.RouteDestinationId); + Console.WriteLine(""); + } + else + { + Console.WriteLine("GetAddress error: {0}", errorString); + Console.WriteLine(""); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Addresses/MarkAddressAsMarkedAsDeparted.cs b/Route4MeSDKTest/Examples/Addresses/MarkAddressAsMarkedAsDeparted.cs new file mode 100644 index 00000000..f0906187 --- /dev/null +++ b/Route4MeSDKTest/Examples/Addresses/MarkAddressAsMarkedAsDeparted.cs @@ -0,0 +1,41 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Mark Address as Marked as Departed + /// + /// status + public void MarkAddressAsMarkedAsDeparted(AddressParameters aParams) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + + string errorString = ""; + Address resultAddress = route4Me.MarkAddressAsMarkedAsDeparted(aParams, out errorString); + + Console.WriteLine(""); + + if (resultAddress != null) + { + Console.WriteLine("MarkAddressAsMarkedAsDeparted executed successfully"); + + Console.WriteLine("Marked Address ID: {0}", resultAddress.RouteDestinationId); + + } + else + { + Console.WriteLine("MarkAddressAsMarkedAsDeparted error: {0}", errorString); + + } + + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Addresses/MarkAddressAsMarkedAsVisited.cs b/Route4MeSDKTest/Examples/Addresses/MarkAddressAsMarkedAsVisited.cs new file mode 100644 index 00000000..c6907aff --- /dev/null +++ b/Route4MeSDKTest/Examples/Addresses/MarkAddressAsMarkedAsVisited.cs @@ -0,0 +1,41 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Mark Address as Marked as Visited + /// + /// status + public void MarkAddressAsMarkedAsVisited(AddressParameters aParams) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + + string errorString = ""; + Address resultAddress = route4Me.MarkAddressAsMarkedAsVisited(aParams, out errorString); + + Console.WriteLine(""); + + if (resultAddress != null) + { + Console.WriteLine("MarkAddressAsMarkedAsVisited executed successfully"); + + Console.WriteLine("Marked Address ID: {0}", resultAddress.RouteDestinationId); + + } + else + { + Console.WriteLine("MarkAddressAsMarkedAsVisited error: {0}", errorString); + + } + + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Addresses/MarkAddressDeparted.cs b/Route4MeSDKTest/Examples/Addresses/MarkAddressDeparted.cs new file mode 100644 index 00000000..0f4165a1 --- /dev/null +++ b/Route4MeSDKTest/Examples/Addresses/MarkAddressDeparted.cs @@ -0,0 +1,45 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Mark Address as Departed + /// + /// status + public void MarkAddressDeparted(AddressParameters aParams) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + + { + string errorString = ""; + int result = route4Me.MarkAddressVisited(aParams, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + if (result == 1) + { + Console.WriteLine("MarkAddressDeparted executed successfully"); + } + else + { + Console.WriteLine("MarkAddressDeparted error: {0}", errorString); + } + } + else + { + Console.WriteLine("MarkAddressVisited error: {0}", errorString); + } + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Addresses/MarkAddressVisited.cs b/Route4MeSDKTest/Examples/Addresses/MarkAddressVisited.cs new file mode 100644 index 00000000..e52afa8e --- /dev/null +++ b/Route4MeSDKTest/Examples/Addresses/MarkAddressVisited.cs @@ -0,0 +1,45 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Mark Address as Visited + /// + /// status + public void MarkAddressVisited(AddressParameters aParams) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + + { + string errorString = ""; + int result = route4Me.MarkAddressVisited(aParams, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + if (result==1) + { + Console.WriteLine("MarkAddressVisited executed successfully"); + } + else + { + Console.WriteLine("MarkAddressVisited error: {0}", errorString); + } + } + else + { + Console.WriteLine("MarkAddressVisited error: {0}", errorString); + } + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Addresses/MoveDestinationToRoute.cs b/Route4MeSDKTest/Examples/Addresses/MoveDestinationToRoute.cs new file mode 100644 index 00000000..a5c7707c --- /dev/null +++ b/Route4MeSDKTest/Examples/Addresses/MoveDestinationToRoute.cs @@ -0,0 +1,33 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void MoveDestinationToRoute(string toRouteId, int routeDestinationId, int afterDestinationId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + string errorString; + bool success = route4Me.MoveDestinationToRoute(toRouteId, routeDestinationId, afterDestinationId, out errorString); + + Console.WriteLine(""); + + if (success) + { + Console.WriteLine("MoveDestinationToRoute executed successfully"); + + Console.WriteLine("Destination {0} moved to Route {1} after Destination {2}", routeDestinationId, toRouteId, afterDestinationId); + } + else + { + Console.WriteLine("MoveDestinationToRoute error: {0}", errorString); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/Addresses/RemoveDestinationFromOptimization.cs b/Route4MeSDKTest/Examples/Addresses/RemoveDestinationFromOptimization.cs new file mode 100644 index 00000000..0ebf255a --- /dev/null +++ b/Route4MeSDKTest/Examples/Addresses/RemoveDestinationFromOptimization.cs @@ -0,0 +1,32 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void RemoveDestinationFromOptimization(string optimizationId, int destinationId, bool andReOptimize) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + string errorString; + bool removed = route4Me.RemoveDestinationFromOptimization(optimizationId, destinationId, out errorString); + + Console.WriteLine(""); + + if (removed) + { + Console.WriteLine("RemoveAddressFromOptimization executed successfully"); + + Console.WriteLine("Optimization Problem ID: {0}, Destination ID: {1}", optimizationId, destinationId); + } + else + { + Console.WriteLine("RemoveAddressFromOptimization error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Addresses/RemoveRouteDestination.cs b/Route4MeSDKTest/Examples/Addresses/RemoveRouteDestination.cs new file mode 100644 index 00000000..29750435 --- /dev/null +++ b/Route4MeSDKTest/Examples/Addresses/RemoveRouteDestination.cs @@ -0,0 +1,33 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void RemoveRouteDestination(string routeId, int destinationId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + string errorString; + bool deleted = route4Me.RemoveRouteDestination(routeId, destinationId, out errorString); + + Console.WriteLine(""); + + if (deleted) + { + Console.WriteLine("RemoveRouteDestination executed successfully"); + + Console.WriteLine("Destination ID: {0}", destinationId); + } + else + { + Console.WriteLine("RemoveRouteDestination error: {0}", errorString); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/Addresses/ResequenceRouteDestinations.cs b/Route4MeSDKTest/Examples/Addresses/ResequenceRouteDestinations.cs new file mode 100644 index 00000000..60049edb --- /dev/null +++ b/Route4MeSDKTest/Examples/Addresses/ResequenceRouteDestinations.cs @@ -0,0 +1,79 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void ResequenceRouteDestinations(DataObjectRoute route) + { + if (route.Addresses == null && route.Addresses.Length < 3) + { + Console.WriteLine("ResequenceRouteDestinations error {0}", "route.Addresses == null && route.Addresses.Length < 3. Number of addresses should be >= 3"); + return; + } + + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Switch 2 addresses after departure address: + + AddressesOrderInfo addressesOrderInfo = new AddressesOrderInfo(); + addressesOrderInfo.RouteId = route.RouteID; + addressesOrderInfo.Addresses = new AddressInfo[0]; + for (int i = 0; i < route.Addresses.Length; i++) + { + Address address = route.Addresses[i]; + AddressInfo addressInfo = new AddressInfo(); + addressInfo.DestinationId = address.RouteDestinationId.Value; + addressInfo.SequenceNo = i; + if (i == 1) + addressInfo.SequenceNo = 2; + else if (i == 2) + addressInfo.SequenceNo = 1; + addressInfo.IsDepot = (addressInfo.SequenceNo == 0); + List addressesList = new List(addressesOrderInfo.Addresses); + addressesList.Add(addressInfo); + addressesOrderInfo.Addresses = addressesList.ToArray(); + } + + // Run the query + string errorString1 = ""; + DataObjectRoute route1 = route4Me.GetJsonObjectFromAPI(addressesOrderInfo, + R4MEInfrastructureSettings.RouteHost, + HttpMethodType.Put, + out errorString1); + + // Output the result + PrintExampleOptimizationResult("ResequenceRouteDestinations, switch 2 addresses.", route1, errorString1); + Console.WriteLine(""); + } + + [DataContract] + private class AddressInfo : GenericParameters + { + [DataMember(Name = "route_destination_id")] + public int DestinationId { get; set; } + + [DataMember(Name = "sequence_no")] + public int SequenceNo { get; set; } + + [DataMember(Name = "is_depot")] + public bool IsDepot { get; set; } + } + + [DataContract] + private class AddressesOrderInfo : GenericParameters + { + [HttpQueryMemberAttribute(Name = "route_id", EmitDefaultValue = false)] + public string RouteId { get; set; } + + [DataMember(Name = "addresses")] + public AddressInfo[] Addresses { get; set; } + } + + } +} diff --git a/Route4MeSDKTest/Examples/AvoidanceZones/AddAvoidanceZone.cs b/Route4MeSDKTest/Examples/AvoidanceZones/AddAvoidanceZone.cs new file mode 100644 index 00000000..c981ea39 --- /dev/null +++ b/Route4MeSDKTest/Examples/AvoidanceZones/AddAvoidanceZone.cs @@ -0,0 +1,52 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Add Avoidance Zone + /// + /// Id of added territory + public string AddAvoidanceZone() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AvoidanceZoneParameters avoidanceZoneParameters = new AvoidanceZoneParameters() + { + TerritoryName = "Test Territory", + TerritoryColor = "ff0000", + Territory = new Territory() + { + Type = TerritoryType.Circle.Description(), + Data = new string[] { "37.569752822786455,-77.47833251953125", + "5000"} + } + }; + + // Run the query + string errorString; + AvoidanceZone avoidanceZone = route4Me.AddAvoidanceZone(avoidanceZoneParameters, out errorString); + + Console.WriteLine(""); + + if (avoidanceZone != null) + { + Console.WriteLine("AddAvoidanceZone executed successfully"); + + Console.WriteLine("Territory ID: {0}", avoidanceZone.TerritoryId); + + return avoidanceZone.TerritoryId; + } + else + { + Console.WriteLine("AddAvoidanceZone error: {0}", errorString); + + return null; + } + } + } +} diff --git a/Route4MeSDKTest/Examples/AvoidanceZones/AddPolygonAvoidanceZone.cs b/Route4MeSDKTest/Examples/AvoidanceZones/AddPolygonAvoidanceZone.cs new file mode 100644 index 00000000..dc5a7a2f --- /dev/null +++ b/Route4MeSDKTest/Examples/AvoidanceZones/AddPolygonAvoidanceZone.cs @@ -0,0 +1,61 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Add Polygon Avoidance Zone + /// + /// Id of added territory + public string AddPolygonAvoidanceZone() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AvoidanceZoneParameters avoidanceZoneParameters = new AvoidanceZoneParameters + { + TerritoryName = "Test Territory", + TerritoryColor = "ff0000", + Territory = new Territory + { + Type = TerritoryType.Poly.Description(), + Data = new string[] { + "37.569752822786455,-77.47833251953125", + "37.75886716305343,-77.68974800109863", + "37.74763966054455,-77.6917221069336", + "37.74655084306813,-77.68863220214844", + "37.7502255383101,-77.68125076293945", + "37.74797991274437,-77.67498512268066", + "37.73327960206065,-77.6411678314209", + "37.74430510679532,-77.63172645568848", + "37.76641925847049,-77.66846199035645" + } + } + }; + + // Run the query + string errorString; + AvoidanceZone avoidanceZone = route4Me.AddAvoidanceZone(avoidanceZoneParameters, out errorString); + + Console.WriteLine(""); + + if (avoidanceZone != null) + { + Console.WriteLine("AddPolygonAvoidanceZone executed successfully"); + + Console.WriteLine("Territory ID: {0}", avoidanceZone.TerritoryId); + + return avoidanceZone.TerritoryId; + } + else + { + Console.WriteLine("AddPolygonAvoidanceZone error: {0}", errorString); + + return null; + } + } + } +} diff --git a/Route4MeSDKTest/Examples/AvoidanceZones/AddRectAvoidanceZone.cs b/Route4MeSDKTest/Examples/AvoidanceZones/AddRectAvoidanceZone.cs new file mode 100644 index 00000000..3b3f8da4 --- /dev/null +++ b/Route4MeSDKTest/Examples/AvoidanceZones/AddRectAvoidanceZone.cs @@ -0,0 +1,54 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Add Rectangular Avoidance Zone + /// + /// Id of added territory + public string AddRectAvoidanceZone() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AvoidanceZoneParameters avoidanceZoneParameters = new AvoidanceZoneParameters + { + TerritoryName = "Test Territory", + TerritoryColor = "ff0000", + Territory = new Territory + { + Type = TerritoryType.Rect.Description(), + Data = new string[] { + "43.51668853502909,-109.3798828125", + "46.98025235521883,-101.865234375" + } + } + }; + + // Run the query + string errorString; + AvoidanceZone avoidanceZone = route4Me.AddAvoidanceZone(avoidanceZoneParameters, out errorString); + + Console.WriteLine(""); + + if (avoidanceZone != null) + { + Console.WriteLine("AddRectAvoidanceZone executed successfully"); + + Console.WriteLine("Territory ID: {0}", avoidanceZone.TerritoryId); + + return avoidanceZone.TerritoryId; + } + else + { + Console.WriteLine("AddRectAvoidanceZone error: {0}", errorString); + + return null; + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/AvoidanceZones/DeleteAvoidanceZone.cs b/Route4MeSDKTest/Examples/AvoidanceZones/DeleteAvoidanceZone.cs new file mode 100644 index 00000000..933589fd --- /dev/null +++ b/Route4MeSDKTest/Examples/AvoidanceZones/DeleteAvoidanceZone.cs @@ -0,0 +1,41 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Delete Avoidance Zone + /// + /// Avoidance Zone Id + public void DeleteAvoidanceZone(string territoryId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AvoidanceZoneQuery avoidanceZoneQuery = new AvoidanceZoneQuery() + { + TerritoryId = territoryId + }; + + // Run the query + string errorString; + route4Me.DeleteAvoidanceZone(avoidanceZoneQuery, out errorString); + + Console.WriteLine(""); + + if (errorString == "") + { + Console.WriteLine("DeleteAvoidanceZone executed successfully"); + + Console.WriteLine("Territory ID: {0}", territoryId); + } + else + { + Console.WriteLine("DeleteAvoidanceZone error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/AvoidanceZones/GetAvoidanceZone.cs b/Route4MeSDKTest/Examples/AvoidanceZones/GetAvoidanceZone.cs new file mode 100644 index 00000000..b2ad1be1 --- /dev/null +++ b/Route4MeSDKTest/Examples/AvoidanceZones/GetAvoidanceZone.cs @@ -0,0 +1,41 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Avoidance Zone + /// + /// Avoidance Zone Id + public void GetAvoidanceZone(string territoryId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AvoidanceZoneQuery avoidanceZoneQuery = new AvoidanceZoneQuery() + { + TerritoryId = territoryId + }; + + // Run the query + string errorString; + AvoidanceZone avoidanceZone = route4Me.GetAvoidanceZone(avoidanceZoneQuery, out errorString); + + Console.WriteLine(""); + + if (avoidanceZone != null) + { + Console.WriteLine("GetAvoidanceZone executed successfully"); + + Console.WriteLine("Territory ID: {0}", avoidanceZone.TerritoryId); + } + else + { + Console.WriteLine("GetAvoidanceZone error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/AvoidanceZones/GetAvoidanceZones.cs b/Route4MeSDKTest/Examples/AvoidanceZones/GetAvoidanceZones.cs new file mode 100644 index 00000000..467a0217 --- /dev/null +++ b/Route4MeSDKTest/Examples/AvoidanceZones/GetAvoidanceZones.cs @@ -0,0 +1,38 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Avoidance Zone list + /// + public void GetAvoidanceZones() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AvoidanceZoneQuery avoidanceZoneQuery = new AvoidanceZoneQuery() + { + + }; + + // Run the query + string errorString; + AvoidanceZone[] avoidanceZones = route4Me.GetAvoidanceZones(avoidanceZoneQuery, out errorString); + + Console.WriteLine(""); + + if (avoidanceZones != null) + { + Console.WriteLine("GetAvoidanceZones executed successfully, {0} zones returned", avoidanceZones.Length); + } + else + { + Console.WriteLine("GetAvoidanceZones error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/AvoidanceZones/UpdateAvoidanceZone.cs b/Route4MeSDKTest/Examples/AvoidanceZones/UpdateAvoidanceZone.cs new file mode 100644 index 00000000..df688582 --- /dev/null +++ b/Route4MeSDKTest/Examples/AvoidanceZones/UpdateAvoidanceZone.cs @@ -0,0 +1,49 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Update Avoidance Zone + /// + /// Avoidance Zone Id + public void UpdateAvoidanceZone(string territoryId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AvoidanceZoneParameters avoidanceZoneParameters = new AvoidanceZoneParameters() + { + TerritoryId = territoryId, + TerritoryName = "Test Territory Updated", + TerritoryColor = "ff00ff", + Territory = new Territory() + { + Type = TerritoryType.Circle.Description(), + Data = new string[] { "38.41322259056806,-78.501953234", + "3000"} + } + }; + + // Run the query + string errorString; + AvoidanceZone avoidanceZone = route4Me.UpdateAvoidanceZone(avoidanceZoneParameters, out errorString); + + Console.WriteLine(""); + + if (avoidanceZone != null) + { + Console.WriteLine("UpdateAvoidanceZone executed successfully"); + + Console.WriteLine("Territory ID: {0}", avoidanceZone.TerritoryId); + } + else + { + Console.WriteLine("UpdateAvoidanceZone error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Databases/GenerateSqlDatabase.cs b/Route4MeSDKTest/Examples/Databases/GenerateSqlDatabase.cs new file mode 100644 index 00000000..5b4929a4 --- /dev/null +++ b/Route4MeSDKTest/Examples/Databases/GenerateSqlDatabase.cs @@ -0,0 +1,84 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Text; +using System.IO; +using System.Data; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Generating of the SQL server database tables from the SQL script text files. + /// + public void GenerateSqlDatabase(DB_Type db_type) + { + cDatabase sqlDB = new cDatabase(db_type); + + try + { + string sAddressbookSqlCom = ""; + string sOrdersSqlCom = ""; + string sDictionaryDDLSqlCom = ""; + string sDictionaryDMLSqlCom = ""; + + switch (db_type) + { + case DB_Type.MySQL: + sAddressbookSqlCom = File.ReadAllText(@"Data/SQL/MySQL/addressbook_v4.sql"); + sOrdersSqlCom = File.ReadAllText(@"Data/SQL/MySQL/orders.sql"); + sDictionaryDDLSqlCom = File.ReadAllText(@"Data/SQL/MySQL/csv_to_api_dictionary_DDL.sql"); + sDictionaryDMLSqlCom = File.ReadAllText(@"Data/SQL/MySQL/csv_to_api_dictionary_DML.sql"); + break; + case DB_Type.MSSQL: + sAddressbookSqlCom = File.ReadAllText(@"Data/SQL/MSSQL/addressbook_v4.sql"); + sOrdersSqlCom = File.ReadAllText(@"Data/SQL/MSSQL/orders.sql"); + sDictionaryDDLSqlCom = File.ReadAllText(@"Data/SQL/MSSQL/csv_to_api_dictionary_DDL.sql"); + sDictionaryDMLSqlCom = File.ReadAllText(@"Data/SQL/MSSQL/csv_to_api_dictionary_DML.sql"); + break; + case DB_Type.PostgreSQL: + sAddressbookSqlCom = File.ReadAllText(@"Data/SQL/PostgreSQL/addressbook_v4.sql"); + sOrdersSqlCom = File.ReadAllText(@"Data/SQL/PostgreSQL/orders.sql"); + sDictionaryDDLSqlCom = File.ReadAllText(@"Data/SQL/PostgreSQL/csv_to_api_dictionary_DDL.sql"); + sDictionaryDMLSqlCom = File.ReadAllText(@"Data/SQL/PostgreSQL/csv_to_api_dictionary_DML.sql"); + break; + case DB_Type.SQLite: + + break; + case DB_Type.MS_Access: + + break; + } + + sqlDB.OpenConnection(); + + Console.WriteLine("Connection opened"); + + int iResult = sqlDB.ExecuteMulticoomandSql(sAddressbookSqlCom); + if (iResult > 0) Console.WriteLine(":) The SQL table 'addressbook_v4' created successfuly!!!"); else Console.WriteLine(":( Creating of the SQL table 'addressbook_v4' failed..."); + + iResult = sqlDB.ExecuteMulticoomandSql(sOrdersSqlCom); + if (iResult > 0) Console.WriteLine(":) The SQL table 'orders' created successfuly!!!"); else Console.WriteLine(":( Creating of the SQL table 'orders' failed..."); + + iResult = sqlDB.ExecuteMulticoomandSql(sDictionaryDDLSqlCom); + if (iResult > 0) + { + Console.WriteLine(":) The SQL table 'csv_to_api_dictionary' created successfuly!!!"); + + iResult = sqlDB.ExecuteMulticoomandSql(sDictionaryDMLSqlCom); + if (iResult > 0) Console.WriteLine(":) The data was inserted into SQL table 'csv_to_api_dictionary' successfuly!!!"); else Console.WriteLine(":( Inserting of the data in the SQL table 'csv_to_api_dictionary' failed..."); + } + else Console.WriteLine(":( Creating of the SQL table 'csv_to_api_dictionary' failed..."); + + } + catch (Exception ex) { Console.WriteLine("Generating of the SQL tables failed!.. "+ex.Message); } + finally + { + sqlDB.CloseConnection(); + } + + } + } +} + diff --git a/Route4MeSDKTest/Examples/Databases/MakeAddressbookCSVsample.cs b/Route4MeSDKTest/Examples/Databases/MakeAddressbookCSVsample.cs new file mode 100644 index 00000000..7281b137 --- /dev/null +++ b/Route4MeSDKTest/Examples/Databases/MakeAddressbookCSVsample.cs @@ -0,0 +1,38 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Text; +using System.IO; +using System.Data; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Exporting a SQL server database table to the local CSV file. + /// + public void MakeAddressbookCSVsample(DB_Type db_type) + { + cDatabase sqlDB = new cDatabase(db_type); + + try + { + sqlDB.OpenConnection(); + + Console.WriteLine("Connection opened"); + + sqlDB.Table2Csv(@"Data/CSV/addressbook v4.csv", "addressbook_v4", true); + Console.WriteLine("The file addressbook v4.csv was created."); + + } + catch (Exception ex) { Console.WriteLine("Making of a addressbook csv file failed!.. "+ex.Message); } + finally + { + sqlDB.CloseConnection(); + } + + } + } +} + diff --git a/Route4MeSDKTest/Examples/Databases/README.md b/Route4MeSDKTest/Examples/Databases/README.md new file mode 100644 index 00000000..6270d8ee --- /dev/null +++ b/Route4MeSDKTest/Examples/Databases/README.md @@ -0,0 +1,19 @@ +## Export/import the Route4Me account data to/from SQL database + +In this folder you can find the examples of the export/import processes from/to the Route4Me data to/from SQL database. + +These examples use cDatabase class (see link here). You can use this class with all the SQL database engine types: MsSql, MySql, PostgreSql, Oracle, SQLite. You can use it with MS Access too. + +You can see the sample files (the address book locations and orders in the CSV and JSON formats) for examples and testing in this folder. + +In above mentioned folder you can find SQL script files for generating server side tables: +- addressbook_v4.sql - for the address book locations table; +- orders.sql - for the orders table; +- csv_to_api_dictionary.sql - for mapping sql table fields with the local file fileds. + +In this folder you can find the examples: +- UploadCsvToAddressbookV4.cs (see link here) - for uploading the exported CSV file from the Route4Me address book locations to the SQL server table **addressbook_v4**. If in the CSV table row is definded address_id field value and there is a row in the table **addressbook_v4** with same address_id, row will be updated, otherwise row will be inserted in the table **addressbook_v4**. +- UploadCsvToOrders.cs (see link here) - for uploading the exported CSV file from the Route4Me orders to the SQL server table **orders**. If in the CSV table row is definded order_id field value and there is a row in the table **orders** with the same order_id, row will be updated, otherwise a row will be inserted in the table **orders**. +- MakeAddressbookCSVsample.cs (see link here) - for exporting SQL table **addressbook_v4** to the local csv file, which you can upload to your Route4Me address book locations. +- UploadAddressbookJSONtoSQL.cs (see link here) - for uploading a downloaded JSON file from the Route4Me address book locations to the SQL table **addressbook_v4** - algorithm will define whether to insert or to update data as it's described above. +- UploadOrdersJSONtoSQL.cs (see link here) - for uploading a downloaded JSON file from the Route4Me orders to the SQL table **orders** - algorithm will define whether to insert or to update data as it's described above. diff --git a/Route4MeSDKTest/Examples/Databases/TestExample.cs b/Route4MeSDKTest/Examples/Databases/TestExample.cs new file mode 100644 index 00000000..70c58697 --- /dev/null +++ b/Route4MeSDKTest/Examples/Databases/TestExample.cs @@ -0,0 +1,42 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Text; +using System.IO; +using System.Data; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Preparing csv file for addressbook data uploading. + /// + public void TestExample() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + cDadtabase mysqlDB = new cDadtabase(); + + try + { + mysqlDB.OpenConnection(); + + Console.WriteLine("Connection opened"); + string sCom = "SELECT * FROM addressbook_v4 INTO OUTFILE 'addressbook_v4.txt';"; + + mysqlDB.ExecuteNon(sCom); + + } + catch (Exception ex) { Console.WriteLine("Making of a addressbook csv file failured!.."); } + finally + { + mysqlDB.CloseConnection(); + } + + } + } +} + + diff --git a/Route4MeSDKTest/Examples/Databases/UploadAddressbookJSONtoSQL.cs b/Route4MeSDKTest/Examples/Databases/UploadAddressbookJSONtoSQL.cs new file mode 100644 index 00000000..dde2a2d8 --- /dev/null +++ b/Route4MeSDKTest/Examples/Databases/UploadAddressbookJSONtoSQL.cs @@ -0,0 +1,38 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Text; +using System.IO; +using System.Data; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Uploading JSON addressbook file to the SQL server's database table. + /// + public void UploadAddressbookJSONtoSQL(DB_Type db_type) + { + cDatabase sqlDB = new cDatabase(db_type); + + try + { + sqlDB.OpenConnection(); + + Console.WriteLine("Connection opened"); + + sqlDB.Json2Table(@"Data/JSON/Addressbook Get Contacts RESPONSE.json", "addressbook_v4", "id", R4M_DataType.Addressbook); + + Console.WriteLine("The file 'Addressbook Get Contacts RESPONSE.json' was uploaded to the SQL server."); + } + catch (Exception ex) { Console.WriteLine("Uploading of the JSON file to the SQL server failed!.."); } + finally + { + sqlDB.CloseConnection(); + } + + + } + } +} diff --git a/Route4MeSDKTest/Examples/Databases/UploadCsvToAddressbookV4.cs b/Route4MeSDKTest/Examples/Databases/UploadCsvToAddressbookV4.cs new file mode 100644 index 00000000..8379bc5d --- /dev/null +++ b/Route4MeSDKTest/Examples/Databases/UploadCsvToAddressbookV4.cs @@ -0,0 +1,39 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Text; +using System.IO; +using System.Data; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Uploading CSV file to the SQL server's database table. + /// + public void UploadCsvToAddressbookV4(DB_Type db_type) + { + cDatabase sqlDB = new cDatabase(db_type); + + try + { + sqlDB.OpenConnection(); + + Console.WriteLine("Connection opened"); + + sqlDB.Csv2Table(@"Data/CSV/Route4Me Address Book 03-09-2017.csv", "addressbook_v4", "id", 33, true); + + Console.WriteLine("The file orders.csv was uploaded to the SQL server."); + } + catch (Exception ex) { Console.WriteLine("Uploading of the CSV file to the SQL server failed!.."); } + finally + { + sqlDB.CloseConnection(); + } + + + } + } +} + diff --git a/Route4MeSDKTest/Examples/Databases/UploadCsvToOrders.cs b/Route4MeSDKTest/Examples/Databases/UploadCsvToOrders.cs new file mode 100644 index 00000000..10ec3d91 --- /dev/null +++ b/Route4MeSDKTest/Examples/Databases/UploadCsvToOrders.cs @@ -0,0 +1,37 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Text; +using System.IO; +using System.Data; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Uploading CSV file to the SQL server database table. + /// + public void UploadCsvToOrders(DB_Type db_type) + { + cDatabase sqlDB = new cDatabase(db_type); + + try + { + sqlDB.OpenConnection(); + + Console.WriteLine("Connection opened"); + + sqlDB.Csv2Table(@"Data/CSV/orders 1000 with order id.csv", "orders", "order_id", 10, true); + + Console.WriteLine("The orders CSV file was uploaded to the SQL server."); + } + catch (Exception ex) { Console.WriteLine("Uploading of the CSV file to the SQL server failed!.."); } + finally + { + sqlDB.CloseConnection(); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/Databases/UploadOrdersJSONtoSQL.cs b/Route4MeSDKTest/Examples/Databases/UploadOrdersJSONtoSQL.cs new file mode 100644 index 00000000..1111da50 --- /dev/null +++ b/Route4MeSDKTest/Examples/Databases/UploadOrdersJSONtoSQL.cs @@ -0,0 +1,38 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Text; +using System.IO; +using System.Data; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Uploading JSON orders file to the SQL server's database table. + /// + public void UploadOrdersJSONtoSQL(DB_Type db_type) + { + cDatabase sqlDB = new cDatabase(db_type); + + try + { + sqlDB.OpenConnection(); + + Console.WriteLine("Connection opened"); + + sqlDB.Json2Table(@"Data/JSON/get orders RESPONSE.json", "orders", "id", R4M_DataType.Order); + + Console.WriteLine("The JSON file was uploaded to the SQL server."); + } + catch (Exception ex) { Console.WriteLine("Uploading of the JSON file to the SQL server failed!.."); } + finally + { + sqlDB.CloseConnection(); + } + } + + + } +} diff --git a/Route4MeSDKTest/Examples/ExamplesInfrastructure.cs b/Route4MeSDKTest/Examples/ExamplesInfrastructure.cs new file mode 100755 index 00000000..060f8ff3 --- /dev/null +++ b/Route4MeSDKTest/Examples/ExamplesInfrastructure.cs @@ -0,0 +1,53 @@ +using Route4MeSDK.DataTypes; +using System; + +namespace Route4MeSDK.Examples +{ + /// + /// Helper functions used by some of the examples. + /// + public sealed partial class Route4MeExamples + { + + //your api key + public const string c_ApiKey = "11111111111111111111111111111111"; + + private void PrintExampleOptimizationResult(string exampleName, DataObject dataObject, string errorString) + { + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("{0} executed successfully", exampleName); + Console.WriteLine(""); + + Console.WriteLine("Optimization Problem ID: {0}", dataObject.OptimizationProblemId); + Console.WriteLine("State: {0}", dataObject.State); + + dataObject.UserErrors.ForEach(error => Console.WriteLine("UserError : '{0}'", error)); + + Console.WriteLine(""); + + // Sort addresses by sequence order + Address[] addressesSorted = dataObject.Addresses.Clone() as Address[]; + Array.Sort(addressesSorted, delegate(Address address1, Address address2) + { + int result = (address1.SequenceNo != null ? address1.SequenceNo.Value : -1) - (address2.SequenceNo != null ? address2.SequenceNo.Value : -1); + if (result == 0) + result = (address1.IsDepot != null && address1.IsDepot.Value ? 0 : 1) - (address2.IsDepot != null && address2.IsDepot.Value ? 0 : 1); + return result; + }); + + addressesSorted.ForEach(address => + { + Console.WriteLine("Address: {0}", address.AddressString); + Console.WriteLine("Route ID: {0}", address.RouteId); + }); + } + else + { + Console.WriteLine("{0} error {1}", exampleName, errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/GenericExample.cs b/Route4MeSDKTest/Examples/GenericExample.cs new file mode 100755 index 00000000..8a69d151 --- /dev/null +++ b/Route4MeSDKTest/Examples/GenericExample.cs @@ -0,0 +1,88 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// This example demonstares how to use the API in a generic way, not bounded to the proposed Route4MeManager shortcucts + /// For the same functionality using shortcuts check the Route4MeExamples.GenericExampleShortcut() + /// + public void GenericExample() + { + const string uri = R4MEInfrastructureSettings.MainHost + "/api.v4/route.php"; + + //the api key of the account + //the api key must have hierarchical ownership of the route being viewed (api key can't view routes of others) + const string myApiKey = "11111111111111111111111111111111"; + + Route4MeManager route4Me = new Route4MeManager(myApiKey); + + GenericParameters genericParameters = new GenericParameters(); + + //number of records per page + genericParameters.ParametersCollection.Add("limit", "10"); + + //the page offset starting at zero + genericParameters.ParametersCollection.Add("Offset", "5"); + + string errorMessage; + DataObjectRoute[] dataObjects = route4Me.GetJsonObjectFromAPI(genericParameters, + uri, + HttpMethodType.Get, + out errorMessage); + + Console.WriteLine(""); + + if (dataObjects != null) + { + Console.WriteLine("GenericExample executed successfully, {0} routes returned", dataObjects.Length); + Console.WriteLine(""); + + dataObjects.ForEach(dataObject => + { + Console.WriteLine("Optimization Problem ID: {0}", dataObject.OptimizationProblemId); + Console.WriteLine("RouteID: {0}", dataObject.RouteID); + Console.WriteLine(""); + }); + } + else + { + Console.WriteLine("GenericExample error {0}", errorMessage); + } + } + + public void GenericExampleShortcut() + { + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + RouteParametersQuery routeQueryParameters = new RouteParametersQuery() + { + Limit = 10, + Offset = 5 + }; + + string errorMessage; + DataObjectRoute[] dataObjects = route4Me.GetRoutes(routeQueryParameters, out errorMessage); + + if (dataObjects != null) + { + Console.WriteLine("GenericExampleShortcut executed successfully, {0} routes returned", dataObjects.Length); + Console.WriteLine(""); + + dataObjects.ForEach(dataObject => + { + Console.WriteLine("Optimization Problem ID: {0}", dataObject.OptimizationProblemId); + Console.WriteLine("RouteID: {0}", dataObject.RouteID); + Console.WriteLine(""); + }); + } + else + { + Console.WriteLine("GenericExampleShortcut error {0}", errorMessage); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Geocoding/GeocodingForward.cs b/Route4MeSDKTest/Examples/Geocoding/GeocodingForward.cs new file mode 100644 index 00000000..73cf6532 --- /dev/null +++ b/Route4MeSDKTest/Examples/Geocoding/GeocodingForward.cs @@ -0,0 +1,34 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Forward Geocoding + /// + /// xml object + public void GeocodingForward(GeocodingParameters geoParams) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + //Run the query + string errorString = ""; + string result = route4Me.Geocoding(geoParams, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("GeocodingForward executed successfully"); + } + else + { + Console.WriteLine("GeocodingForward error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Geocoding/RapidStreetDataAll.cs b/Route4MeSDKTest/Examples/Geocoding/RapidStreetDataAll.cs new file mode 100644 index 00000000..923b254e --- /dev/null +++ b/Route4MeSDKTest/Examples/Geocoding/RapidStreetDataAll.cs @@ -0,0 +1,40 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Rapid Street Data All + /// + public void RapidStreetDataAll() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + GeocodingParameters geoParams = new GeocodingParameters(); + // Run the query + string errorString = ""; + ArrayList result = route4Me.RapidStreetData(geoParams, out errorString); + + Console.WriteLine(""); + + if (result != null) { + Console.WriteLine("RapidStreetDataAll executed successfully"); + foreach (Dictionary res1 in result) + { + + Console.WriteLine("Zipcode: " + res1["zipcode"]); + Console.WriteLine("Street name: " + res1["street_name"]); + Console.WriteLine("---------------------------"); + } + } else { + Console.WriteLine("RapidStreetDataAll error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Geocoding/RapidStreetDataLimited.cs b/Route4MeSDKTest/Examples/Geocoding/RapidStreetDataLimited.cs new file mode 100644 index 00000000..f5fa335c --- /dev/null +++ b/Route4MeSDKTest/Examples/Geocoding/RapidStreetDataLimited.cs @@ -0,0 +1,47 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Rapid Street Data Limited + /// + public void RapidStreetDataLimited() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + GeocodingParameters geoParams = new GeocodingParameters() + { + Offset = 10, + Limit = 10 + }; + // Run the query + string errorString = ""; + ArrayList result = route4Me.RapidStreetData(geoParams, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("RapidStreetDataLimited executed successfully"); + foreach (Dictionary res1 in result) + { + + Console.WriteLine("Zipcode: " + res1["zipcode"]); + Console.WriteLine("Street name: " + res1["street_name"]); + Console.WriteLine("---------------------------"); + } + } + else + { + Console.WriteLine("RapidStreetDataLimited error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Geocoding/RapidStreetDataSingle.cs b/Route4MeSDKTest/Examples/Geocoding/RapidStreetDataSingle.cs new file mode 100644 index 00000000..76f63933 --- /dev/null +++ b/Route4MeSDKTest/Examples/Geocoding/RapidStreetDataSingle.cs @@ -0,0 +1,47 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Rapid Street Data Single + /// + public void RapidStreetDataSingle() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + GeocodingParameters geoParams = new GeocodingParameters() + { + Pk =4 + }; + // Run the query + string errorString = ""; + ArrayList result = route4Me.RapidStreetData(geoParams, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("RapidStreetDataSingle executed successfully"); + foreach (Dictionary res1 in result) + { + + Console.WriteLine("Zipcode: " + res1["zipcode"]); + Console.WriteLine("Street name: " + res1["street_name"]); + Console.WriteLine("---------------------------"); + } + } + else + { + Console.WriteLine("RapidStreetDataSingle error: {0}", errorString); + } + } + } +} + diff --git a/Route4MeSDKTest/Examples/Geocoding/RapidStreetServiceAll.cs b/Route4MeSDKTest/Examples/Geocoding/RapidStreetServiceAll.cs new file mode 100644 index 00000000..c6a7d695 --- /dev/null +++ b/Route4MeSDKTest/Examples/Geocoding/RapidStreetServiceAll.cs @@ -0,0 +1,47 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Rapid Street Service All + /// + public void RapidStreetServiceAll() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + GeocodingParameters geoParams = new GeocodingParameters() + { + Zipcode = "00601", + Housenumber = "17" + }; + // Run the query + string errorString = ""; + ArrayList result = route4Me.RapidStreetService(geoParams, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("RapidStreetServiceAll executed successfully"); + foreach (Dictionary res1 in result) + { + + Console.WriteLine("Zipcode: " + res1["zipcode"]); + Console.WriteLine("Street name: " + res1["street_name"]); + Console.WriteLine("---------------------------"); + } + } + else + { + Console.WriteLine("RapidStreetServiceAll error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Geocoding/RapidStreetServiceLimited.cs b/Route4MeSDKTest/Examples/Geocoding/RapidStreetServiceLimited.cs new file mode 100644 index 00000000..2de9062c --- /dev/null +++ b/Route4MeSDKTest/Examples/Geocoding/RapidStreetServiceLimited.cs @@ -0,0 +1,49 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Rapid Street Service Limited + /// + public void RapidStreetServiceLimited() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + GeocodingParameters geoParams = new GeocodingParameters() + { + Zipcode = "00601", + Housenumber = "17", + Offset = 1, + Limit = 10 + }; + // Run the query + string errorString = ""; + ArrayList result = route4Me.RapidStreetService(geoParams, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("RapidStreetServiceLimited executed successfully"); + foreach (Dictionary res1 in result) + { + + Console.WriteLine("Zipcode: " + res1["zipcode"]); + Console.WriteLine("Street name: " + res1["street_name"]); + Console.WriteLine("---------------------------"); + } + } + else + { + Console.WriteLine("RapidStreetServiceLimited error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Geocoding/RapidStreetZipcodeAll.cs b/Route4MeSDKTest/Examples/Geocoding/RapidStreetZipcodeAll.cs new file mode 100644 index 00000000..90fbc22f --- /dev/null +++ b/Route4MeSDKTest/Examples/Geocoding/RapidStreetZipcodeAll.cs @@ -0,0 +1,46 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Rapid Street Zipcode All + /// + public void RapidStreetZipcodeAll() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + GeocodingParameters geoParams = new GeocodingParameters() + { + Zipcode = "00601" + }; + // Run the query + string errorString = ""; + ArrayList result = route4Me.RapidStreetZipcode(geoParams, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("RapidStreetZipcodeAll executed successfully"); + foreach (Dictionary res1 in result) + { + + Console.WriteLine("Zipcode: " + res1["zipcode"]); + Console.WriteLine("Street name: " + res1["street_name"]); + Console.WriteLine("---------------------------"); + } + } + else + { + Console.WriteLine("RapidStreetZipcodeAll error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Geocoding/RapidStreetZipcodeLimited.cs b/Route4MeSDKTest/Examples/Geocoding/RapidStreetZipcodeLimited.cs new file mode 100644 index 00000000..3435f462 --- /dev/null +++ b/Route4MeSDKTest/Examples/Geocoding/RapidStreetZipcodeLimited.cs @@ -0,0 +1,49 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Rapid Street Zipcode Limited + /// + public void RapidStreetZipcodeLimited() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + GeocodingParameters geoParams = new GeocodingParameters() + { + Zipcode = "00601", + Offset = 1, + Limit = 10 + }; + // Run the query + string errorString = ""; + ArrayList result = route4Me.RapidStreetZipcode(geoParams, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("RapidStreetZipcodeLimited executed successfully"); + foreach (Dictionary res1 in result) + { + + Console.WriteLine("Zipcode: " + res1["zipcode"]); + Console.WriteLine("Street name: " + res1["street_name"]); + Console.WriteLine("---------------------------"); + } + } + else + { + Console.WriteLine("RapidStreetZipcodeLimited error: {0}", errorString); + } + } + } +} + diff --git a/Route4MeSDKTest/Examples/Geocoding/ReverseGeocoding.cs b/Route4MeSDKTest/Examples/Geocoding/ReverseGeocoding.cs new file mode 100644 index 00000000..5966d9f2 --- /dev/null +++ b/Route4MeSDKTest/Examples/Geocoding/ReverseGeocoding.cs @@ -0,0 +1,35 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Reverse Geocoding + /// + /// xml object + public void ReverseGeocoding() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + GeocodingParameters geoParams = new GeocodingParameters { Addresses = "42.35863,-71.05670" }; + // Run the query + string errorString = ""; + string result = route4Me.Geocoding(geoParams, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("ReverseGeocoding executed successfully"); + } + else + { + Console.WriteLine("ReverseGeocoding error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/MemberConfiguration/AddNewConfigurationKey.cs b/Route4MeSDKTest/Examples/MemberConfiguration/AddNewConfigurationKey.cs new file mode 100644 index 00000000..a31e4dbe --- /dev/null +++ b/Route4MeSDKTest/Examples/MemberConfiguration/AddNewConfigurationKey.cs @@ -0,0 +1,42 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Create New Configuration Key + /// + public void AddNewConfigurationKey() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberConfigurationParameters @params = new MemberConfigurationParameters + { + config_key = "destination_icon_uri", + config_value = "value" + }; + + // Run the query + string errorString = ""; + MemberConfigurationResponse result = route4Me.CreateNewConfigurationKey(@params, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("AddNewConfigurationKey executed successfully"); + Console.WriteLine("Result: " + result.result); + Console.WriteLine("Affected: " + result.affected); + Console.WriteLine("---------------------------"); + } + else + { + Console.WriteLine("AddNewConfigurationKey error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/MemberConfiguration/GetAllConfigurationData.cs b/Route4MeSDKTest/Examples/MemberConfiguration/GetAllConfigurationData.cs new file mode 100644 index 00000000..3840cc57 --- /dev/null +++ b/Route4MeSDKTest/Examples/MemberConfiguration/GetAllConfigurationData.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get All Configuration Data + /// + public void GetAllConfigurationData() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberConfigurationParameters @params = new MemberConfigurationParameters(); + + // Run the query + string errorString = ""; + MemberConfigurationDataRersponse result = route4Me.GetConfigurationData(@params, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("GetAllConfigurationData executed successfully"); + Console.WriteLine("Result: " + result.result); + foreach (MemberConfigurationData mc_data in result.data) + { + Console.WriteLine("member_id= " + mc_data.member_id); + Console.WriteLine("config_key= " + mc_data.config_key); + Console.WriteLine("config_value= " + mc_data.config_value); + Console.WriteLine("---------------------------"); + } + } + else + { + Console.WriteLine("GetAllConfigurationData error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/MemberConfiguration/GetSpecificConfigurationKeyData.cs b/Route4MeSDKTest/Examples/MemberConfiguration/GetSpecificConfigurationKeyData.cs new file mode 100644 index 00000000..0bb91193 --- /dev/null +++ b/Route4MeSDKTest/Examples/MemberConfiguration/GetSpecificConfigurationKeyData.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Specific Configuration Key Value (v4) + /// + public void GetSpecificConfigurationKeyData() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberConfigurationParameters @params = new MemberConfigurationParameters { config_key = "destination_icon_uri" }; + + // Run the query + string errorString = ""; + MemberConfigurationDataRersponse result = route4Me.GetConfigurationData(@params, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("GetSpecificConfigurationKeyData executed successfully"); + Console.WriteLine("Result: " + result.result); + foreach (MemberConfigurationData mc_data in result.data) + { + Console.WriteLine("member_id= " + mc_data.member_id); + Console.WriteLine("config_key= " + mc_data.config_key); + Console.WriteLine("config_value= " + mc_data.config_value); + Console.WriteLine("---------------------------"); + } + } + else + { + Console.WriteLine("GetSpecificConfigurationKeyData error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/MemberConfiguration/RemoveConfigurationKey.cs b/Route4MeSDKTest/Examples/MemberConfiguration/RemoveConfigurationKey.cs new file mode 100644 index 00000000..203cdd68 --- /dev/null +++ b/Route4MeSDKTest/Examples/MemberConfiguration/RemoveConfigurationKey.cs @@ -0,0 +1,39 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Remove a Configuration Key + /// + public void RemoveConfigurationKey() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberConfigurationParameters @params = new MemberConfigurationParameters { config_key = "My height" }; + + // Run the query + string errorString = ""; + MemberConfigurationResponse result = route4Me.RemoveConfigurationKey(@params, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("RemoveConfigurationKey executed successfully"); + Console.WriteLine("Result: " + result.result); + Console.WriteLine("Affected: " + result.affected); + Console.WriteLine("---------------------------"); + } + else + { + Console.WriteLine("UserRegistration error: {0}", errorString); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/MemberConfiguration/UpdateConfigurationKey.cs b/Route4MeSDKTest/Examples/MemberConfiguration/UpdateConfigurationKey.cs new file mode 100644 index 00000000..2699a8e5 --- /dev/null +++ b/Route4MeSDKTest/Examples/MemberConfiguration/UpdateConfigurationKey.cs @@ -0,0 +1,42 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Update a Configuration Key Value + /// + public void UpdateConfigurationKey() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberConfigurationParameters @params = new MemberConfigurationParameters + { + config_key = "destination_icon_uri", + config_value = "444" + }; + + // Run the query + string errorString = ""; + MemberConfigurationResponse result = route4Me.UpdateConfigurationKey(@params, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("UpdateConfigurationKey executed successfully"); + Console.WriteLine("Result: " + result.result); + Console.WriteLine("Affected: " + result.affected); + Console.WriteLine("---------------------------"); + } + else + { + Console.WriteLine("UpdateConfigurationKey error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Notes/AddAddressNote.cs b/Route4MeSDKTest/Examples/Notes/AddAddressNote.cs new file mode 100644 index 00000000..92fc5c99 --- /dev/null +++ b/Route4MeSDKTest/Examples/Notes/AddAddressNote.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void AddAddressNote(string routeId, int addressId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + NoteParameters noteParameters = new NoteParameters() + { + RouteId = routeId, + AddressId = addressId, + Latitude = 33.132675170898, + Longitude = -83.244743347168, + DeviceType = DeviceType.Web.Description(), + ActivityType = StatusUpdateType.DropOff.Description() + }; + + // Run the query + string errorString; + string contents = "Test Note Contents " + DateTime.Now.ToString(); + AddressNote note = route4Me.AddAddressNote(noteParameters, contents, out errorString); + + Console.WriteLine(""); + + if (note != null) + { + Console.WriteLine("AddAddressNote executed successfully"); + + Console.WriteLine("Note ID: {0}", note.NoteId); + } + else + { + Console.WriteLine("AddAddressNote error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Notes/AddAddressNoteWithFile.cs b/Route4MeSDKTest/Examples/Notes/AddAddressNoteWithFile.cs new file mode 100644 index 00000000..0a609cd9 --- /dev/null +++ b/Route4MeSDKTest/Examples/Notes/AddAddressNoteWithFile.cs @@ -0,0 +1,60 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.CodeDom.Compiler; +using System.IO; +using System.Reflection; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void AddAddressNoteWithFile(string routeId, int addressId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + NoteParameters noteParameters = new NoteParameters() + { + RouteId = routeId, + AddressId = addressId, + Latitude = 33.132675170898, + Longitude = -83.244743347168, + DeviceType = DeviceType.Web.Description(), + ActivityType = StatusUpdateType.DropOff.Description() + }; + + string tempFilePath = null; + using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Route4MeSDKTest.Resources.test.png")) + { + var tempFiles = new TempFileCollection(); + { + tempFilePath = tempFiles.AddExtension("png"); + System.Console.WriteLine(tempFilePath); + using (Stream fileStream = File.OpenWrite(tempFilePath)) + { + stream.CopyTo(fileStream); + } + } + } + + // Run the query + string errorString; + string contents = "Test Note Contents with Attachment " + DateTime.Now.ToString(); + AddressNote note = route4Me.AddAddressNote(noteParameters, contents, tempFilePath, out errorString); + + Console.WriteLine(""); + + if (note != null) + { + Console.WriteLine("AddAddressNoteWithFile executed successfully"); + + Console.WriteLine("Note ID: {0}", note.NoteId); + } + else + { + Console.WriteLine("AddAddressNoteWithFile error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Notes/GetAddressNotes.cs b/Route4MeSDKTest/Examples/Notes/GetAddressNotes.cs new file mode 100644 index 00000000..73f88be6 --- /dev/null +++ b/Route4MeSDKTest/Examples/Notes/GetAddressNotes.cs @@ -0,0 +1,38 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void GetAddressNotes(string routeId, int routeDestinationId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + NoteParameters noteParameters = new NoteParameters() + { + RouteId = routeId, + AddressId = routeDestinationId + }; + + // Run the query + string errorString; + AddressNote[] notes = route4Me.GetAddressNotes(noteParameters, out errorString); + + Console.WriteLine(""); + + if (notes != null) + { + Console.WriteLine("GetAddressNotes executed successfully, {0} notes returned", notes.Length); + Console.WriteLine(""); + } + else + { + Console.WriteLine("GetAddressNotes error: {0}", errorString); + Console.WriteLine(""); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Optimizations/GetOptimization.cs b/Route4MeSDKTest/Examples/Optimizations/GetOptimization.cs new file mode 100644 index 00000000..7e4ad4ef --- /dev/null +++ b/Route4MeSDKTest/Examples/Optimizations/GetOptimization.cs @@ -0,0 +1,38 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void GetOptimization(string optimizationProblemID) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + OptimizationProblemID = optimizationProblemID + }; + + // Run the query + string errorString; + DataObject dataObject = route4Me.GetOptimization(optimizationParameters, out errorString); + + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("GetOptimization executed successfully"); + + Console.WriteLine("Optimization Problem ID: {0}", dataObject.OptimizationProblemId); + Console.WriteLine("State: {0}", dataObject.State); + } + else + { + Console.WriteLine("GetOptimization error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Optimizations/GetOptimizations.cs b/Route4MeSDKTest/Examples/Optimizations/GetOptimizations.cs new file mode 100644 index 00000000..d21a4ce4 --- /dev/null +++ b/Route4MeSDKTest/Examples/Optimizations/GetOptimizations.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void GetOptimizations() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + RouteParametersQuery queryParameters = new RouteParametersQuery() + { + Limit = 10, + Offset = 5 + }; + + // Run the query + string errorString; + DataObject[] dataObjects = route4Me.GetOptimizations(queryParameters, out errorString); + + Console.WriteLine(""); + + if (dataObjects != null) + { + Console.WriteLine("GetOptimizations executed successfully, {0} optimizations returned", dataObjects.Length); + Console.WriteLine(""); + + dataObjects.ForEach(optimization => + { + Console.WriteLine("Optimization Problem ID: {0}", optimization.OptimizationProblemId); + Console.WriteLine(""); + }); + } + else + { + Console.WriteLine("GetOptimizations error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Optimizations/HybridOptimizationFrom1000Addresses.cs b/Route4MeSDKTest/Examples/Optimizations/HybridOptimizationFrom1000Addresses.cs new file mode 100644 index 00000000..b76225e7 --- /dev/null +++ b/Route4MeSDKTest/Examples/Optimizations/HybridOptimizationFrom1000Addresses.cs @@ -0,0 +1,295 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Threading; +using System.IO; +using System.Collections.Generic; +using CsvHelper; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void HybridOptimizationFrom1000Addresses() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager("BD48828717021141485A701453273458"); + + #region ======= Add scheduled address book locations to an user account ================================ + string sAddressFile = @"Data/addresses_1000.csv"; + Schedule sched0 = new Schedule("daily",false); + //var csv = new CsvReader(File.OpenText("file.csv")); + + using (TextReader reader = File.OpenText(sAddressFile)) + { + var csv = new CsvReader(reader); + //int iCount = 0; + while (csv.Read()) + { + var lng = csv.GetField(0); + var lat = csv.GetField(1); + var alias = csv.GetField(2); + var address1 = csv.GetField(3); + var city = csv.GetField(4); + var state = csv.GetField(5); + var zip = csv.GetField(6); + var phone = csv.GetField(7); + //var sched_date = csv.GetField(8); + var sched_mode = csv.GetField(8); + var sched_enabled = csv.GetField(9); + var sched_every = csv.GetField(10); + var sched_weekdays = csv.GetField(11); + var sched_monthly_mode = csv.GetField(12); + var sched_monthly_dates = csv.GetField(13); + var sched_annually_usenth = csv.GetField(14); + var sched_annually_months = csv.GetField(15); + var sched_nth_n = csv.GetField(16); + var sched_nth_what = csv.GetField(17); + + string sAddress = ""; + + if (address1 != null) sAddress += address1.ToString().Trim(); + if (city != null) sAddress += ", "+city.ToString().Trim(); + if (state != null) sAddress += ", " + state.ToString().Trim(); + if (zip != null) sAddress += ", " + zip.ToString().Trim(); + + if (sAddress == "") continue; + + AddressBookContact newLocation = new AddressBookContact(); + + if (lng != null) newLocation.cached_lng = Convert.ToDouble(lng); + if (lat != null) newLocation.cached_lat = Convert.ToDouble(lat); + if (alias != null) newLocation.address_alias = alias.ToString().Trim(); + newLocation.address_1 = sAddress; + if (phone != null) newLocation.address_phone_number = phone.ToString().Trim(); + + //newLocation.schedule = new Schedule[]{}; + if (!sched0.ValidateScheduleMode(sched_mode)) continue; + + bool blNth = false; + if (sched0.ValidateScheduleMonthlyMode(sched_monthly_mode)) + { + if (sched_monthly_mode == "nth") blNth = true; + } + if (sched0.ValidateScheduleUseNth(sched_annually_usenth)) + { + if (sched_annually_usenth.ToString().ToLower()=="true") blNth = true; + } + + Schedule schedule = new Schedule(sched_mode.ToString(), blNth); + + DateTime dt = DateTime.Now; + //if (schedule.ValidateScheduleMode(sched_mode)) + //{ + schedule.mode = sched_mode.ToString(); + if (schedule.ValidateScheduleEnabled(sched_enabled)) + { + schedule.enabled = Convert.ToBoolean(sched_enabled); + if (schedule.ValidateScheduleEvery(sched_every)) + { + int iEvery = Convert.ToInt32(sched_every); + switch (schedule.mode) + { + case "daily": + schedule.daily.every = iEvery; + break; + case "weekly": + if (schedule.ValidateScheduleWeekdays(sched_weekdays)) + { + schedule.weekly.every = iEvery; + string[] arWeekdays = sched_weekdays.Split(','); + List lsWeekdays = new List(); + for (int i = 0; i < arWeekdays.Length; i++) + { + lsWeekdays.Add(Convert.ToInt32(arWeekdays[i])); + } + schedule.weekly.weekdays = lsWeekdays.ToArray(); + } + break; + case "monthly": + if (schedule.ValidateScheduleMonthlyMode(sched_monthly_mode)) + { + schedule.monthly.every = iEvery; + schedule.monthly.mode = sched_monthly_mode.ToString(); + switch (schedule.monthly.mode) + { + case "dates": + if (schedule.ValidateScheduleMonthDays(sched_monthly_dates)) + { + string[] arMonthdays = sched_monthly_dates.Split(','); + List lsMonthdays = new List(); + for (int i = 0; i < arMonthdays.Length; i++) + { + lsMonthdays.Add(Convert.ToInt32(arMonthdays[i])); + } + schedule.monthly.dates = lsMonthdays.ToArray(); + } + break; + case "nth": + if (schedule.ValidateScheduleNthN(sched_nth_n)) schedule.monthly.nth.n = Convert.ToInt32(sched_nth_n); + if (schedule.ValidateScheduleNthWhat(sched_nth_what)) schedule.monthly.nth.what = Convert.ToInt32(sched_nth_what); + break; + } + } + break; + case "annually": + if (schedule.ValidateScheduleUseNth(sched_annually_usenth)) + { + schedule.annually.every = iEvery; + schedule.annually.use_nth = Convert.ToBoolean(sched_annually_usenth); + if (schedule.annually.use_nth) + { + if (schedule.ValidateScheduleNthN(sched_nth_n)) schedule.annually.nth.n = Convert.ToInt32(sched_nth_n); + if (schedule.ValidateScheduleNthWhat(sched_nth_what)) schedule.annually.nth.what = Convert.ToInt32(sched_nth_what); + } + else + { + if (schedule.ValidateScheduleYearMonths(sched_annually_months)) + { + string[] arYearmonths = sched_annually_months.Split(','); + List lsMonths = new List(); + for (int i = 0; i < arYearmonths.Length; i++) + { + lsMonths.Add(Convert.ToInt32(arYearmonths[i])); + } + schedule.annually.months = lsMonths.ToArray(); + } + } + } + break; + } + } + + } + newLocation.schedule = (new List() { schedule }).ToArray(); + //} + + string errorString; + AddressBookContact resultContact = route4Me.AddAddressBookContact(newLocation, out errorString); + + showResult(resultContact, errorString); + + Thread.Sleep(1000); + + //iCount++; + //if (iCount == 60) break; + } + + }; + + #endregion + + Thread.Sleep(2000); + + #region ======= Get Hybrid Optimization ================================ + string[] ScheduledDays = new string[] { "2017-03-06", "2017-03-07", "2017-03-08", "2017-03-09", "2017-03-10" }; + + Address[] Depots = new Address[] { + new Address { + AddressString = "2017 Ambler Ave, Abilene, TX, 79603-2239", + IsDepot = true, + Latitude = 32.474395, + Longitude = -99.7447021, + CurbsideLatitude = 32.474395, + CurbsideLongitude = -99.7447021 + }, + new Address { + AddressString = "807 Ridge Rd, Alamo, TX, 78516-9596", + IsDepot = true, + Latitude = 26.170834, + Longitude = -98.116201, + CurbsideLatitude = 26.170834, + CurbsideLongitude = -98.116201 + }, + new Address { + AddressString = "1430 W Amarillo Blvd, Amarillo, TX, 79107-5505", + IsDepot = true, + Latitude = 35.221969, + Longitude = -101.835288, + CurbsideLatitude = 35.221969, + CurbsideLongitude = -101.835288 + }, + new Address { + AddressString = "3611 Ne 24Th Ave, Amarillo, TX, 79107-7242", + IsDepot = true, + Latitude = 35.236626, + Longitude = -101.795117, + CurbsideLatitude = 35.236626, + CurbsideLongitude = -101.795117 + }, + new Address { + AddressString = "1525 New York Ave, Arlington, TX, 76010-4723", + IsDepot = true, + Latitude = 32.720524, + Longitude = -97.080195, + CurbsideLatitude = 32.720524, + CurbsideLongitude = -97.080195 + } + }; + + string errorString1; + string errorString2; + + foreach (string ScheduledDay in ScheduledDays) + { + HybridOptimizationParameters hparams = new HybridOptimizationParameters() + { + target_date_string = ScheduledDay, + timezone_offset_minutes = -240 + }; + + DataObject resultOptimization = route4Me.GetOHybridptimization(hparams, out errorString1); + + string HybridOptimizationId = ""; + + if (resultOptimization != null) + { + HybridOptimizationId = resultOptimization.OptimizationProblemId; + Console.WriteLine("Hybrid optimization generating executed successfully"); + + Console.WriteLine("Generated hybrid optimization ID: {0}", HybridOptimizationId); + } + else + { + Console.WriteLine("Hybrid optimization generating error: {0}", errorString1); + continue; + } + + //============== Reoptimization ================================= + RouteParameters rParams = new RouteParameters(); + rParams.AlgorithmType = AlgorithmType.CVRP_TW_SD; + + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + OptimizationProblemID = HybridOptimizationId, + ReOptimize = true, + Parameters = rParams, + Addresses = new Address[] { Depots[Array.IndexOf(ScheduledDays, ScheduledDay)] } + }; + + DataObject finalOptimization = route4Me.UpdateOptimization(optimizationParameters, out errorString2); + + Console.WriteLine(""); + + if (finalOptimization != null) + { + Console.WriteLine("ReOptimization executed successfully"); + + Console.WriteLine("Optimization Problem ID: {0}", finalOptimization.OptimizationProblemId); + Console.WriteLine("State: {0}", finalOptimization.State); + } + else + { + Console.WriteLine("ReOptimization error: {0}", errorString2); + } + + Thread.Sleep(5000); + //================================================================= + } + + #endregion + } + + + } +} diff --git a/Route4MeSDKTest/Examples/Optimizations/HybridOptimizationFrom1000Orders.cs b/Route4MeSDKTest/Examples/Optimizations/HybridOptimizationFrom1000Orders.cs new file mode 100644 index 00000000..ed876fb3 --- /dev/null +++ b/Route4MeSDKTest/Examples/Optimizations/HybridOptimizationFrom1000Orders.cs @@ -0,0 +1,224 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Threading; +using System.IO; +using System.Collections.Generic; +using CsvHelper; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void HybridOptimizationFrom1000Orders() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager("BD48828717021141485A701453273458"); + + #region ======= Add scheduled address book locations to an user account ================================ + string sAddressFile = @"Data/orders_1000.csv"; + + using (TextReader reader = File.OpenText(sAddressFile)) + { + var csv = new CsvReader(reader); + //int iCount = 0; + while (csv.Read()) + { + var lng = csv.GetField(0); + var lat = csv.GetField(1); + var alias = csv.GetField(2); + var address1 = csv.GetField(3); + var city = csv.GetField(4); + var state = csv.GetField(5); + var zip = csv.GetField(6); + var phone = csv.GetField(7); + var sched_date = csv.GetField(8); + + string sAddress = ""; + + if (address1 != null) sAddress += address1.ToString().Trim(); + if (city != null) sAddress += ", " + city.ToString().Trim(); + if (state != null) sAddress += ", " + state.ToString().Trim(); + if (zip != null) sAddress += ", " + zip.ToString().Trim(); + + if (sAddress == "") continue; + + Order newOrder = new Order(); + + if (lng != null) newOrder.cached_lat = Convert.ToDouble(lng); + if (lat != null) newOrder.cached_lng = Convert.ToDouble(lat); + if (alias != null) newOrder.address_alias = alias.ToString().Trim(); + newOrder.address_1 = sAddress; + if (phone != null) newOrder.EXT_FIELD_phone = phone.ToString().Trim(); + + DateTime dt = DateTime.Now; + + if (sched_date!=null) + { + if (DateTime.TryParse(sched_date.ToString(), out dt)) + { + dt = Convert.ToDateTime(sched_date); + newOrder.day_scheduled_for_YYMMDD = dt.ToString("yyyy-MM-dd"); + } + } + + string errorString; + + Order resultOrder = route4Me.AddOrder(newOrder, out errorString); + showResult(resultOrder, errorString); + + Thread.Sleep(1000); + //iCount++; + //if (iCount == 60) break; + } + + }; + + #endregion + + Thread.Sleep(2000); + + #region ======= Get Hybrid Optimization ================================ + string[] ScheduledDays = new string[] { "2017-03-06", "2017-03-07", "2017-03-08", "2017-03-09", "2017-03-10" }; + + Address[] Depots = new Address[] { + new Address { + AddressString = "2017 Ambler Ave, Abilene, TX, 79603-2239", + IsDepot = true, + Latitude = 32.474395, + Longitude = -99.7447021, + CurbsideLatitude = 32.474395, + CurbsideLongitude = -99.7447021 + }, + new Address { + AddressString = "807 Ridge Rd, Alamo, TX, 78516-9596", + IsDepot = true, + Latitude = 26.170834, + Longitude = -98.116201, + CurbsideLatitude = 26.170834, + CurbsideLongitude = -98.116201 + }, + new Address { + AddressString = "1430 W Amarillo Blvd, Amarillo, TX, 79107-5505", + IsDepot = true, + Latitude = 35.221969, + Longitude = -101.835288, + CurbsideLatitude = 35.221969, + CurbsideLongitude = -101.835288 + }, + new Address { + AddressString = "3611 Ne 24Th Ave, Amarillo, TX, 79107-7242", + IsDepot = true, + Latitude = 35.236626, + Longitude = -101.795117, + CurbsideLatitude = 35.236626, + CurbsideLongitude = -101.795117 + }, + new Address { + AddressString = "1525 New York Ave, Arlington, TX, 76010-4723", + IsDepot = true, + Latitude = 32.720524, + Longitude = -97.080195, + CurbsideLatitude = 32.720524, + CurbsideLongitude = -97.080195 + } + }; + + string errorString1; + string errorString2; + + foreach (string ScheduledDay in ScheduledDays) + { + HybridOptimizationParameters hparams = new HybridOptimizationParameters() + { + target_date_string = ScheduledDay, + timezone_offset_minutes = 480 + }; + + DataObject resultOptimization = route4Me.GetOHybridptimization(hparams, out errorString1); + + string HybridOptimizationId = ""; + + if (resultOptimization != null) + { + HybridOptimizationId = resultOptimization.OptimizationProblemId; + Console.WriteLine("Hybrid optimization generating executed successfully"); + + Console.WriteLine("Generated hybrid optimization ID: {0}", HybridOptimizationId); + } + else + { + Console.WriteLine("Hybrid optimization generating error: {0}", errorString1); + continue; + } + + //============== Reoptimization ================================= + RouteParameters rParams = new RouteParameters(); + rParams.AlgorithmType = AlgorithmType.CVRP_TW_SD; + + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + OptimizationProblemID = HybridOptimizationId, + ReOptimize = true, + Parameters = rParams, + Addresses = new Address[] { Depots[Array.IndexOf(ScheduledDays, ScheduledDay)] } + }; + + DataObject finalOptimization = route4Me.UpdateOptimization(optimizationParameters, out errorString2); + + Console.WriteLine(""); + + if (finalOptimization != null) + { + Console.WriteLine("ReOptimization executed successfully"); + + Console.WriteLine("Optimization Problem ID: {0}", finalOptimization.OptimizationProblemId); + Console.WriteLine("State: {0}", finalOptimization.State); + } + else + { + Console.WriteLine("ReOptimization error: {0}", errorString2); + } + + Thread.Sleep(5000); + //================================================================= + } + + #endregion + } + + private void showResult(object result, string errorString) + { + if (result == null) + { + Console.WriteLine("AddAddressBookContact error: {0}", errorString); return; + } + + string addressId = ""; + string sAddressbookType = "Route4MeSDK.DataTypes.AddressBookContact"; + if (result.GetType().ToString() == sAddressbookType) + { + AddressBookContact contact = (AddressBookContact)result; + addressId = contact.address_id.ToString(); + } + else + { + Order order = (Order)result; + addressId = order.order_id.ToString(); + } + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("AddAddressBookContact executed successfully"); + + Console.WriteLine("AddressId: {0}", addressId); + } + else + { + Console.WriteLine("AddAddressBookContact error: {0}", errorString); + } + } + + } +} diff --git a/Route4MeSDKTest/Examples/Optimizations/ReOptimization.cs b/Route4MeSDKTest/Examples/Optimizations/ReOptimization.cs new file mode 100755 index 00000000..f6b0e5c6 --- /dev/null +++ b/Route4MeSDKTest/Examples/Optimizations/ReOptimization.cs @@ -0,0 +1,39 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void ReOptimization(string optimizationProblemID) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + OptimizationProblemID = optimizationProblemID, + ReOptimize = true + }; + + // Run the query + string errorString; + DataObject dataObject = route4Me.UpdateOptimization(optimizationParameters, out errorString); + + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("ReOptimization executed successfully"); + + Console.WriteLine("Optimization Problem ID: {0}", dataObject.OptimizationProblemId); + Console.WriteLine("State: {0}", dataObject.State); + } + else + { + Console.WriteLine("ReOptimization error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Optimizations/RemoveOptimization.cs b/Route4MeSDKTest/Examples/Optimizations/RemoveOptimization.cs new file mode 100644 index 00000000..41977fac --- /dev/null +++ b/Route4MeSDKTest/Examples/Optimizations/RemoveOptimization.cs @@ -0,0 +1,32 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void RemoveOptimization(string optimizationProblemID) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + string errorString; + bool removed = route4Me.RemoveOptimization(optimizationProblemID, out errorString); + + Console.WriteLine(""); + + if (removed) + { + Console.WriteLine("RemoveOptimization executed successfully"); + + Console.WriteLine("Optimization Problem ID: {0}", optimizationProblemID); + } + else + { + Console.WriteLine("RemoveOptimization error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Orders/AddOrder.cs b/Route4MeSDKTest/Examples/Orders/AddOrder.cs new file mode 100644 index 00000000..23e3a1a8 --- /dev/null +++ b/Route4MeSDKTest/Examples/Orders/AddOrder.cs @@ -0,0 +1,49 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Add Order + /// + /// Added Order + public Order AddOrder() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + Order order = new Order() + { + address_1 = "Test Address1 " + (new Random()).Next().ToString(), + address_alias = "Test AddressAlias " + (new Random()).Next().ToString(), + cached_lat = 37.773972, + cached_lng = -122.431297 + }; + + // Run the query + string errorString; + Order resultOrder = route4Me.AddOrder(order, out errorString); + + Console.WriteLine(""); + + if (resultOrder != null) + { + Console.WriteLine("AddOrder executed successfully"); + + Console.WriteLine("Order ID: {0}", resultOrder.order_id); + + return resultOrder; + } + else + { + Console.WriteLine("AddOrder error: {0}", errorString); + + return null; + } + } + } +} + diff --git a/Route4MeSDKTest/Examples/Orders/AddOrdersToOptimization.cs b/Route4MeSDKTest/Examples/Orders/AddOrdersToOptimization.cs new file mode 100644 index 00000000..59b85d7b --- /dev/null +++ b/Route4MeSDKTest/Examples/Orders/AddOrdersToOptimization.cs @@ -0,0 +1,123 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Add Orders to an Optimization Problem object + /// + /// Optimization Problem object + public void AddOrdersToOptimization() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + OptimizationParameters rQueryParams = new OptimizationParameters() + { + OptimizationProblemID = "7988378F70C533283BAD5024E6E37201", + Redirect = false + }; + + Address[] addresses = new Address[] { + new Address { + AddressString = "273 Canal St, New York, NY 10013, USA", + Latitude = 40.7191558, + Longitude = -74.0011966, + Alias = "", + CurbsideLatitude = 40.7191558, + CurbsideLongitude = -74.0011966, + IsDepot = true + }, + new Address { + AddressString = "106 Liberty St, New York, NY 10006, USA", + Alias = "BK Restaurant #: 2446", + Latitude = 40.709637, + Longitude = -74.011912, + CurbsideLatitude = 40.709637, + CurbsideLongitude = -74.011912, + Email = "", + Phone = "(917) 338-1887", + FirstName = "", + LastName = "", + CustomFields = new Dictionary { {"icon", null} }, + Time = 0, + TimeWindowStart = 1472544000, + TimeWindowEnd = 1472544300, + OrderId = 7205705 + }, + new Address { + AddressString = "325 Broadway, New York, NY 10007, USA", + Alias = "BK Restaurant #: 20333", + Latitude = 40.71615, + Longitude = -74.00505, + CurbsideLatitude = 40.71615, + CurbsideLongitude = -74.00505, + Email = "", + Phone = "(212) 227-7535", + FirstName = "", + LastName = "", + CustomFields = new Dictionary { {"icon", null} }, + Time = 0, + TimeWindowStart = 1472545000, + TimeWindowEnd = 1472545300, + OrderId = 7205704 + }, + new Address { + AddressString = "106 Fulton St, Farmingdale, NY 11735, USA", + Alias = "BK Restaurant #: 17871", + Latitude = 40.73073, + Longitude = -73.459283, + CurbsideLatitude = 40.73073, + CurbsideLongitude = -73.459283, + Email = "", + Phone = "(212) 566-5132", + FirstName = "", + LastName = "", + CustomFields = new Dictionary { {"icon", null} }, + Time = 0, + TimeWindowStart = 1472546000, + TimeWindowEnd = 1472546300, + OrderId = 7205703 + } + }; + + RouteParameters rParams = new RouteParameters() + { + RouteName = "Wednesday 15th of June 2016 07:01 PM (+03:00)", + RouteDate = 1465948800, + RouteTime = 14400, + Optimize = "Time", + RouteType = "single", + AlgorithmType = AlgorithmType.TSP, + RT = false, + LockLast = false, + MemberId = "1", + VehicleId = "", + DisableOptimization = false + }; + + // Run the query + + string errorString = ""; + DataObject dataObject = route4Me.AddOrdersToOptimization(rQueryParams, addresses, rParams, out errorString); + + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("AddOrdersToOptimization executed successfully"); + + Console.WriteLine("Optmization Problem ID: {0}", dataObject.OptimizationProblemId); + } + else + { + Console.WriteLine("AddOrdersToOptimization error: {0}", errorString); + } + + } + } +} diff --git a/Route4MeSDKTest/Examples/Orders/AddOrdersToRoute.cs b/Route4MeSDKTest/Examples/Orders/AddOrdersToRoute.cs new file mode 100644 index 00000000..788c679c --- /dev/null +++ b/Route4MeSDKTest/Examples/Orders/AddOrdersToRoute.cs @@ -0,0 +1,104 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Add Orders to a Route + /// + /// Route object + public void AddOrdersToRoute() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + RouteParametersQuery rQueryParams = new RouteParametersQuery() + { + RouteId = "F0C842829D8799067F9BF7A495076335", + Redirect = false + }; + + Address[] addresses = new Address[] { + new Address { + AddressString = "273 Canal St, New York, NY 10013, USA", + Latitude = 40.7191558, + Longitude = -74.0011966, + Alias = "", + CurbsideLatitude = 40.7191558, + CurbsideLongitude = -74.0011966 + }, + new Address { + AddressString = "106 Liberty St, New York, NY 10006, USA", + Alias = "BK Restaurant #: 2446", + Latitude = 40.709637, + Longitude = -74.011912, + CurbsideLatitude = 40.709637, + CurbsideLongitude = -74.011912, + Email = "", + Phone = "(917) 338-1887", + FirstName = "", + LastName = "", + CustomFields = new Dictionary { { + "icon", + null + } }, + Time = 0, + OrderId = 7205705 + }, + new Address { + AddressString = "106 Fulton St, Farmingdale, NY 11735, USA", + Alias = "BK Restaurant #: 17871", + Latitude = 40.73073, + Longitude = -73.459283, + CurbsideLatitude = 40.73073, + CurbsideLongitude = -73.459283, + Email = "", + Phone = "(212) 566-5132", + FirstName = "", + LastName = "", + CustomFields = new Dictionary { { + "icon", + null + } }, + Time = 0, + OrderId = 7205703 + } + }; + + RouteParameters rParams = new RouteParameters() + { + RouteName = "Wednesday 15th of June 2016 07:01 PM (+03:00)", + RouteDate = 1465948800, + RouteTime = 14400, + Optimize = "Time", + RouteType = "single", + AlgorithmType = AlgorithmType.TSP, + RT = false, + LockLast = false, + MemberId = "1", + VehicleId = "", + DisableOptimization = false + }; + + string errorString; + RouteResponse result = route4Me.AddOrdersToRoute(rQueryParams, addresses, rParams, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("AddOrdersToRoute executed successfully"); + + Console.WriteLine("Route ID: {0}", result.RouteID); + } + else + { + Console.WriteLine("AddOrdersToRoute error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Orders/GetOrderByID.cs b/Route4MeSDKTest/Examples/Orders/GetOrderByID.cs new file mode 100644 index 00000000..53deb175 --- /dev/null +++ b/Route4MeSDKTest/Examples/Orders/GetOrderByID.cs @@ -0,0 +1,37 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Order details by order_id + /// + public void GetOrderByID(string orderIds) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + OrderParameters orderParameters = new OrderParameters() + { + OrderId = orderIds + }; + + string errorString; + Order[] orders = route4Me.GetOrderByID(orderParameters, out errorString); + + Console.WriteLine(""); + + if (orders != null) + { + Console.WriteLine("GetOrderByID executed successfully, orders total = {0}", orders.Length); + } + else + { + Console.WriteLine("GetOrderByID error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Orders/GetOrderByInsertedDate.cs b/Route4MeSDKTest/Examples/Orders/GetOrderByInsertedDate.cs new file mode 100644 index 00000000..a98931ab --- /dev/null +++ b/Route4MeSDKTest/Examples/Orders/GetOrderByInsertedDate.cs @@ -0,0 +1,34 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Orders by Inserted Date + /// + public void GetOrderByInsertedDate(string InsertedDate) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + OrderParameters oParams = new OrderParameters { DayAddedYYMMDD = InsertedDate }; + + string errorString = ""; + Order[] orders = route4Me.SearchOrders(oParams, out errorString); + + Console.WriteLine(""); + + if (orders != null) + { + Console.WriteLine("GetOrderByInsertedDate executed successfully, orders searched total = {0}", orders.Length); + } + else + { + Console.WriteLine("GetOrderByInsertedDate error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Orders/GetOrderByScheduledDate.cs b/Route4MeSDKTest/Examples/Orders/GetOrderByScheduledDate.cs new file mode 100644 index 00000000..4b08dd27 --- /dev/null +++ b/Route4MeSDKTest/Examples/Orders/GetOrderByScheduledDate.cs @@ -0,0 +1,34 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Orders by Scheduled Date + /// + public void GetOrderByScheduledDate(string ScheduleddDate) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + OrderParameters oParams = new OrderParameters { ScheduledForYYMMDD = ScheduleddDate }; + + string errorString = ""; + Order[] orders = route4Me.SearchOrders(oParams, out errorString); + + Console.WriteLine(""); + + if (orders != null) + { + Console.WriteLine("GetOrderByScheduledDate executed successfully, orders searched total = {0}", orders.Length); + } + else + { + Console.WriteLine("GetOrderByScheduledDate error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Orders/GetOrders.cs b/Route4MeSDKTest/Examples/Orders/GetOrders.cs new file mode 100644 index 00000000..6691202c --- /dev/null +++ b/Route4MeSDKTest/Examples/Orders/GetOrders.cs @@ -0,0 +1,38 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Orders + /// + public void GetOrders() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + OrderParameters orderParameters = new OrderParameters() + { + Limit = 10 + }; + + uint total; + string errorString; + Order[] orders = route4Me.GetOrders(orderParameters, out total, out errorString); + + Console.WriteLine(""); + + if (orders != null) + { + Console.WriteLine("GetOrders executed successfully, {0} orders returned, total = {1}", orders.Length, total); + } + else + { + Console.WriteLine("GetOrders error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Orders/GetOrdersByCustomFields.cs b/Route4MeSDKTest/Examples/Orders/GetOrdersByCustomFields.cs new file mode 100644 index 00000000..3c4b24f0 --- /dev/null +++ b/Route4MeSDKTest/Examples/Orders/GetOrdersByCustomFields.cs @@ -0,0 +1,39 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Show Orders using chosen fields' values + /// + public void GetOrdersByCustomFields(string CustomFields) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + OrderParameters oParams = new OrderParameters() + { + Fields = CustomFields, + Offset = 0, + Limit = 20 + }; + + string errorString = ""; + Order[] orders = route4Me.SearchOrders(oParams, out errorString); + + Console.WriteLine(""); + + if (orders != null) + { + Console.WriteLine("GetOrdersByCustomFields executed successfully, orders searched total = {0}", orders.Length); + } + else + { + Console.WriteLine("GetOrdersByCustomFields error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Orders/GetOrdersBySpecifiedText.cs b/Route4MeSDKTest/Examples/Orders/GetOrdersBySpecifiedText.cs new file mode 100644 index 00000000..f805ecaf --- /dev/null +++ b/Route4MeSDKTest/Examples/Orders/GetOrdersBySpecifiedText.cs @@ -0,0 +1,39 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Orders be containing specified text in any text field + /// + public void GetOrdersBySpecifiedText(string query) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + OrderParameters oParams = new OrderParameters() + { + Query = query, + Offset = 0, + Limit = 20 + }; + + string errorString = ""; + Order[] orders = route4Me.SearchOrders(oParams, out errorString); + + Console.WriteLine(""); + + if (orders != null) + { + Console.WriteLine("GetOrdersByCustomFields executed successfully, orders searched total = {0}", orders.Length); + } + else + { + Console.WriteLine("GetOrdersByCustomFields error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Orders/RemoveOrders.cs b/Route4MeSDKTest/Examples/Orders/RemoveOrders.cs new file mode 100644 index 00000000..860368d3 --- /dev/null +++ b/Route4MeSDKTest/Examples/Orders/RemoveOrders.cs @@ -0,0 +1,34 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Remove Orders + /// + /// Order Ids + public void RemoveOrders(string[] orderIds) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + string errorString; + bool removed = route4Me.RemoveOrders(orderIds, out errorString); + + Console.WriteLine(""); + + if (removed) + { + Console.WriteLine("RemoveOrders executed successfully, {0} orders removed", orderIds.Length); + } + else + { + Console.WriteLine("RemoveOrders error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Orders/UpdateOrder.cs b/Route4MeSDKTest/Examples/Orders/UpdateOrder.cs new file mode 100644 index 00000000..9f9401db --- /dev/null +++ b/Route4MeSDKTest/Examples/Orders/UpdateOrder.cs @@ -0,0 +1,34 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Update Order + /// + /// Order with updated attributes + public void UpdateOrder(Order order) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + string errorString; + Order updatedOrder = route4Me.UpdateOrder(order, out errorString); + + Console.WriteLine(""); + + if (updatedOrder != null) + { + Console.WriteLine("UpdateOrder executed successfully"); + } + else + { + Console.WriteLine("UpdateOrder error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/RouteExamples/MultipleDepotMultipleDriver.cs b/Route4MeSDKTest/Examples/RouteExamples/MultipleDepotMultipleDriver.cs new file mode 100755 index 00000000..174ab38d --- /dev/null +++ b/Route4MeSDKTest/Examples/RouteExamples/MultipleDepotMultipleDriver.cs @@ -0,0 +1,187 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public DataObject MultipleDepotMultipleDriver() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Prepare the addresses + Address[] addresses = new Address[] + { + #region Addresses + + new Address() { AddressString = "3634 W Market St, Fairlawn, OH 44333", + //all possible originating locations are depots, should be marked as true + //stylistically we recommend all depots should be at the top of the destinations list + IsDepot = true, + Latitude = 41.135762259364, + Longitude = -81.629313826561, + + //the number of seconds at destination + Time = 300, + + //together these two specify the time window of a destination + //seconds offset relative to the route start time for the open availability of a destination + TimeWindowStart = 28800, + + //seconds offset relative to the route end time for the open availability of a destination + TimeWindowEnd = 29465}, + + new Address() { AddressString = "1218 Ruth Ave, Cuyahoga Falls, OH 44221", + Latitude = 41.135762259364, + Longitude = -81.629313826561, + Time = 300, + TimeWindowStart = 29465, + TimeWindowEnd = 30529}, + + new Address() { AddressString = "512 Florida Pl, Barberton, OH 44203", + Latitude = 41.003671512008, + Longitude = -81.598461046815, + Time = 300, + TimeWindowStart = 30529, + TimeWindowEnd = 33779}, + + new Address() { AddressString = "512 Florida Pl, Barberton, OH 44203", + Latitude = 41.003671512008, + Longitude = -81.598461046815, + Time = 100, + TimeWindowStart = 33779, + TimeWindowEnd = 33944}, + + new Address() { AddressString = "3495 Purdue St, Cuyahoga Falls, OH 44221", + Latitude = 41.162971496582, + Longitude = -81.479049682617, + Time = 300, + TimeWindowStart = 33944, + TimeWindowEnd = 34801}, + + new Address() { AddressString = "1659 Hibbard Dr, Stow, OH 44224", + Latitude = 41.194505989552, + Longitude = -81.443351581693, + Time = 300, + TimeWindowStart = 34801, + TimeWindowEnd = 36366}, + + new Address() { AddressString = "2705 N River Rd, Stow, OH 44224", + Latitude = 41.145240783691, + Longitude = -81.410247802734, + Time = 300, + TimeWindowStart = 36366, + TimeWindowEnd = 39173}, + + new Address() { AddressString = "10159 Bissell Dr, Twinsburg, OH 44087", + Latitude = 41.340042114258, + Longitude = -81.421226501465, + Time = 300, + TimeWindowStart = 39173, + TimeWindowEnd = 41617}, + + new Address() { AddressString = "367 Cathy Dr, Munroe Falls, OH 44262", + Latitude = 41.148578643799, + Longitude = -81.429229736328, + Time = 300, + TimeWindowStart = 41617, + TimeWindowEnd = 43660}, + + new Address() { AddressString = "367 Cathy Dr, Munroe Falls, OH 44262", + Latitude = 41.148578643799, + Longitude = -81.429229736328, + Time = 300, + TimeWindowStart = 43660, + TimeWindowEnd = 46392}, + + new Address() { AddressString = "512 Florida Pl, Barberton, OH 44203", + Latitude = 41.003671512008, + Longitude = -81.598461046815, + Time = 300, + TimeWindowStart = 46392, + TimeWindowEnd = 48389}, + + new Address() { AddressString = "559 W Aurora Rd, Northfield, OH 44067", + Latitude = 41.315116882324, + Longitude = -81.558746337891, + Time = 50, + TimeWindowStart = 48389, + TimeWindowEnd = 48449}, + + new Address() { AddressString = "3933 Klein Ave, Stow, OH 44224", + Latitude = 41.169467926025, + Longitude = -81.429420471191, + Time = 300, + TimeWindowStart = 48449, + TimeWindowEnd = 50152}, + + new Address() { AddressString = "2148 8th St, Cuyahoga Falls, OH 44221", + Latitude = 41.136692047119, + Longitude = -81.493492126465, + Time = 300, + TimeWindowStart = 50152, + TimeWindowEnd = 51982}, + + new Address() { AddressString = "3731 Osage St, Stow, OH 44224", + Latitude = 41.161357879639, + Longitude = -81.42293548584, + Time = 100, + TimeWindowStart = 51982, + TimeWindowEnd = 52180}, + + new Address() { AddressString = "3731 Osage St, Stow, OH 44224", + Latitude = 41.161357879639, + Longitude = -81.42293548584, + Time = 300, + TimeWindowStart = 52180, + TimeWindowEnd = 54379} + + #endregion + }; + + // Set parameters + RouteParameters parameters = new RouteParameters() + { + //specify capacitated vehicle routing with time windows and multiple depots, with multiple drivers + AlgorithmType = AlgorithmType.CVRP_TW_MD, + + //set an arbitrary route name + //this value shows up in the website, and all the connected mobile device + RouteName = "Multiple Depot, Multiple Driver", + + //the route start date in UTC, unix timestamp seconds (Tomorrow) + RouteDate = R4MeUtils.ConvertToUnixTimestamp(DateTime.UtcNow.Date.AddDays(1)), + //the time in UTC when a route is starting (7AM) + RouteTime = 60 * 60 * 7, + + //the maximum duration of a route + RouteMaxDuration = 86400, + VehicleCapacity = "1", + VehicleMaxDistanceMI = "10000", + + Optimize = Optimize.Distance.Description(), + DistanceUnit = DistanceUnit.MI.Description(), + DeviceType = DeviceType.Web.Description(), + TravelMode = TravelMode.Driving.Description(), + Metric = Metric.Geodesic + }; + + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + Addresses = addresses, + Parameters = parameters + }; + + // Run the query + string errorString; + DataObject dataObject = route4Me.RunOptimization(optimizationParameters, out errorString); + + // Output the result + PrintExampleOptimizationResult("MultipleDepotMultipleDriver", dataObject, errorString); + + return dataObject; + } + } +} diff --git a/Route4MeSDKTest/Examples/RouteExamples/MultipleDepotMultipleDriverTimeWindow.cs b/Route4MeSDKTest/Examples/RouteExamples/MultipleDepotMultipleDriverTimeWindow.cs new file mode 100755 index 00000000..620b208b --- /dev/null +++ b/Route4MeSDKTest/Examples/RouteExamples/MultipleDepotMultipleDriverTimeWindow.cs @@ -0,0 +1,699 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public DataObject MultipleDepotMultipleDriverTimeWindow() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Prepare the addresses + Address[] addresses = new Address[] + { + #region Addresses + + new Address() { AddressString = "455 S 4th St, Louisville, KY 40202", + IsDepot = true, + Latitude = 38.251698, + Longitude = -85.757308, + Time = 300, + TimeWindowStart = 28800, + TimeWindowEnd = 30477 }, + + new Address() { AddressString = "1604 PARKRIDGE PKWY, Louisville, KY, 40214", + Latitude = 38.141598, + Longitude = -85.793846, + Time = 300, + TimeWindowStart = 30477, + TimeWindowEnd = 33406 }, + + new Address() { AddressString = "1407 א53MCCOY, Louisville, KY, 40215", + Latitude = 38.202496, + Longitude = -85.786514, + Time = 300, + TimeWindowStart = 33406, + TimeWindowEnd = 36228 }, + new Address() { + AddressString = "4805 BELLEVUE AVE, Louisville, KY, 40215", + Latitude = 38.178844, + Longitude = -85.774864, + Time = 300, + TimeWindowStart = 36228, + TimeWindowEnd = 37518 }, + + new Address() { AddressString = "730 CECIL AVENUE, Louisville, KY, 40211", + Latitude = 38.248684, + Longitude = -85.821121, + Time = 300, + TimeWindowStart = 37518, + TimeWindowEnd = 39550 }, + + new Address() { AddressString = "650 SOUTH 29TH ST UNIT 315, Louisville, KY, 40211", + Latitude = 38.251923, + Longitude = -85.800034, + Time = 300, + TimeWindowStart = 39550, + TimeWindowEnd = 41348 }, + + new Address() { AddressString = "4629 HILLSIDE DRIVE, Louisville, KY, 40216", + Latitude = 38.176067, + Longitude = -85.824638, + Time = 300, + TimeWindowStart = 41348, + TimeWindowEnd = 42261 }, + + new Address() { AddressString = "4738 BELLEVUE AVE, Louisville, KY, 40215", + Latitude = 38.179806, + Longitude = -85.775558, + Time = 300, + TimeWindowStart = 42261, + TimeWindowEnd = 45195 }, + + new Address() { AddressString = "318 SO. 39TH STREET, Louisville, KY, 40212", + Latitude = 38.259335, + Longitude = -85.815094, + Time = 300, + TimeWindowStart = 45195, + TimeWindowEnd = 46549 }, + + new Address() { AddressString = "1324 BLUEGRASS AVE, Louisville, KY, 40215", + Latitude = 38.179253, + Longitude = -85.785118, + Time = 300, + TimeWindowStart = 46549, + TimeWindowEnd = 47353 }, + + new Address() { AddressString = "7305 ROYAL WOODS DR, Louisville, KY, 40214", + Latitude = 38.162472, + Longitude = -85.792854, + Time = 300, + TimeWindowStart = 47353, + TimeWindowEnd = 50924 }, + + new Address() { AddressString = "1661 W HILL ST, Louisville, KY, 40210", + Latitude = 38.229584, + Longitude = -85.783966, + Time = 300, + TimeWindowStart = 50924, + TimeWindowEnd = 51392 }, + + new Address() { AddressString = "3222 KINGSWOOD WAY, Louisville, KY, 40216", + Latitude = 38.210606, + Longitude = -85.822594, + Time = 300, + TimeWindowStart = 51392, + TimeWindowEnd = 52451 }, + + new Address() { AddressString = "1922 PALATKA RD, Louisville, KY, 40214", + Latitude = 38.153767, + Longitude = -85.796783, + Time = 300, + TimeWindowStart = 52451, + TimeWindowEnd = 55631 }, + + new Address() { AddressString = "1314 SOUTH 26TH STREET, Louisville, KY, 40210", + Latitude = 38.235847, + Longitude = -85.796852, + Time = 300, + TimeWindowStart = 55631, + TimeWindowEnd = 58516 }, + + new Address() { AddressString = "2135 MCCLOSKEY AVENUE, Louisville, KY, 40210", + Latitude = 38.218662, + Longitude = -85.789032, + Time = 300, + TimeWindowStart = 58516, + TimeWindowEnd = 61080 }, + + new Address() { AddressString = "1409 PHYLLIS AVE, Louisville, KY, 40215", + Latitude = 38.206154, + Longitude = -85.781387, + Time = 100, + TimeWindowStart = 61080, + TimeWindowEnd = 61504 }, + + new Address() { AddressString = "4504 SUNFLOWER AVE, Louisville, KY, 40216", + Latitude = 38.187511, + Longitude = -85.839149, + Time = 300, + TimeWindowStart = 61504, + TimeWindowEnd = 62061 }, + + new Address() { AddressString = "2512 GREENWOOD AVE, Louisville, KY, 40210", + Latitude = 38.241405, + Longitude = -85.795059, + Time = 300, + TimeWindowStart = 62061, + TimeWindowEnd = 65012 }, + + new Address() { AddressString = "5500 WILKE FARM AVE, Louisville, KY, 40216", + Latitude = 38.166065, + Longitude = -85.863319, + Time = 300, + TimeWindowStart = 65012, + TimeWindowEnd = 67541 }, + + new Address() { AddressString = "3640 LENTZ AVE, Louisville, KY, 40215", + Latitude = 38.193283, + Longitude = -85.786201, + Time = 300, + TimeWindowStart = 67541, + TimeWindowEnd = 69120 }, + + new Address() { AddressString = "1020 BLUEGRASS AVE, Louisville, KY, 40215", + Latitude = 38.17952, + Longitude = -85.780037, + Time = 300, + TimeWindowStart = 69120, + TimeWindowEnd = 70572 }, + + new Address() { AddressString = "123 NORTH 40TH ST, Louisville, KY, 40212", + Latitude = 38.26498, + Longitude = -85.814156, + Time = 300, + TimeWindowStart = 70572, + TimeWindowEnd = 73177 }, + + new Address() { AddressString = "7315 ST ANDREWS WOODS CIRCLE UNIT 104, Louisville, KY, 40214", + Latitude = 38.151072, + Longitude = -85.802867, + Time = 300, + TimeWindowStart = 73177, + TimeWindowEnd = 75231 }, + + new Address() { AddressString = "3210 POPLAR VIEW DR, Louisville, KY, 40216", + Latitude = 38.182594, + Longitude = -85.849937, + Time = 300, + TimeWindowStart = 75231, + TimeWindowEnd = 77663 }, + + new Address() { AddressString = "4519 LOUANE WAY, Louisville, KY, 40216", + Latitude = 38.1754, + Longitude = -85.811447, + Time = 300, + TimeWindowStart = 77663, + TimeWindowEnd = 79796 }, + + new Address() { AddressString = "6812 MANSLICK RD, Louisville, KY, 40214", + Latitude = 38.161839, + Longitude = -85.798279, + Time = 300, + TimeWindowStart = 79796, + TimeWindowEnd = 80813 }, + + new Address() { AddressString = "1524 HUNTOON AVENUE, Louisville, KY, 40215", + Latitude = 38.172031, + Longitude = -85.788353, + Time = 300, + TimeWindowStart = 80813, + TimeWindowEnd = 83956 }, + + new Address() { AddressString = "1307 LARCHMONT AVE, Louisville, KY, 40215", + Latitude = 38.209663, + Longitude = -85.779816, + Time = 300, + TimeWindowStart = 83956, + TimeWindowEnd = 84365 }, + + new Address() { AddressString = "434 N 26TH STREET #2, Louisville, KY, 40212", + Latitude = 38.26844, + Longitude = -85.791962, + Time = 300, + TimeWindowStart = 84365, + TimeWindowEnd = 85367 }, + + new Address() { AddressString = "678 WESTLAWN ST, Louisville, KY, 40211", + Latitude = 38.250397, + Longitude = -85.80629, + Time = 300, + TimeWindowStart = 85367, + TimeWindowEnd = 86400 }, + + new Address() { AddressString = "2308 W BROADWAY, Louisville, KY, 40211", + Latitude = 38.248882, + Longitude = -85.790421, + Time = 300, + TimeWindowStart = 86400, + TimeWindowEnd = 88703}, + + new Address() { AddressString = "2332 WOODLAND AVE, Louisville, KY, 40210", + Latitude = 38.233579, + Longitude = -85.794257, + Time = 300, + TimeWindowStart = 88703, + TimeWindowEnd = 89320 }, + + new Address() { AddressString = "1706 WEST ST. CATHERINE, Louisville, KY, 40210", + Latitude = 38.239697, + Longitude = -85.783928, + Time = 300, + TimeWindowStart = 89320, + TimeWindowEnd = 90054 }, + + new Address() { AddressString = "1699 WATHEN LN, Louisville, KY, 40216", + Latitude = 38.216465, + Longitude = -85.792397, + Time = 300, + TimeWindowStart = 90054, + TimeWindowEnd = 91150 }, + + new Address() { AddressString = "2416 SUNSHINE WAY, Louisville, KY, 40216", + Latitude = 38.186245, + Longitude = -85.831787, + Time = 300, + TimeWindowStart = 91150, + TimeWindowEnd = 91915 }, + + new Address() { AddressString = "6925 MANSLICK RD, Louisville, KY, 40214", + Latitude = 38.158466, + Longitude = -85.798355, + Time = 300, + TimeWindowStart = 91915, + TimeWindowEnd = 93407 }, + + new Address() { AddressString = "2707 7TH ST, Louisville, KY, 40215", + Latitude = 38.212438, + Longitude = -85.785082, + Time = 300, + TimeWindowStart = 93407, + TimeWindowEnd = 95992 }, + + new Address() { AddressString = "2014 KENDALL LN, Louisville, KY, 40216", + Latitude = 38.179394, + Longitude = -85.826668, + Time = 300, + TimeWindowStart = 95992, + TimeWindowEnd = 99307 }, + + new Address() { AddressString = "612 N 39TH ST, Louisville, KY, 40212", + Latitude = 38.273354, + Longitude = -85.812012, + Time = 300, + TimeWindowStart = 99307, + TimeWindowEnd = 102906 }, + + new Address() { AddressString = "2215 ROWAN ST, Louisville, KY, 40212", + Latitude = 38.261703, + Longitude = -85.786781, + Time = 300, + TimeWindowStart = 102906, + TimeWindowEnd = 106021 }, + + new Address() { AddressString = "1826 W. KENTUCKY ST, Louisville, KY, 40210", + Latitude = 38.241611, + Longitude = -85.78653, + Time = 300, + TimeWindowStart = 106021, + TimeWindowEnd = 107276 }, + + new Address() { AddressString = "1810 GREGG AVE, Louisville, KY, 40210", + Latitude = 38.224716, + Longitude = -85.796211, + Time = 300, + TimeWindowStart = 107276, + TimeWindowEnd = 107948 }, + + new Address() { AddressString = "4103 BURRRELL DRIVE, Louisville, KY, 40216", + Latitude = 38.191753, + Longitude = -85.825836, + Time = 300, + TimeWindowStart = 107948, + TimeWindowEnd = 108414 }, + + new Address() { AddressString = "359 SOUTHWESTERN PKWY, Louisville, KY, 40212", + Latitude = 38.259903, + Longitude = -85.823463, + Time = 200, + TimeWindowStart = 108414, + TimeWindowEnd = 108685 }, + + new Address() { AddressString = "2407 W CHESTNUT ST, Louisville, KY, 40211", + Latitude = 38.252781, + Longitude = -85.792109, + Time = 300, + TimeWindowStart = 108685, + TimeWindowEnd = 110109 }, + + new Address() { AddressString = "225 S 22ND ST, Louisville, KY, 40212", + Latitude = 38.257616, + Longitude = -85.786658, + Time = 300, + TimeWindowStart = 110109, + TimeWindowEnd = 111375 }, + + new Address() { AddressString = "1404 MCCOY AVE, Louisville, KY, 40215", + Latitude = 38.202122, + Longitude = -85.786072, + Time = 300, + TimeWindowStart = 111375, + TimeWindowEnd = 112120 }, + + new Address() { AddressString = "117 FOUNT LANDING CT, Louisville, KY, 40212", + Latitude = 38.270061, + Longitude = -85.799438, + Time = 300, + TimeWindowStart = 112120, + TimeWindowEnd = 114095 }, + + new Address() { AddressString = "5504 SHOREWOOD DRIVE, Louisville, KY, 40214", + Latitude = 38.145851, + Longitude = -85.7798, + Time = 300, + TimeWindowStart = 114095, + TimeWindowEnd = 115743 }, + + new Address() { AddressString = "1406 CENTRAL AVE, Louisville, KY, 40208", + Latitude = 38.211025, + Longitude = -85.780251, + Time = 300, + TimeWindowStart = 115743, + TimeWindowEnd = 117716 }, + + new Address() { AddressString = "901 W WHITNEY AVE, Louisville, KY, 40215", + Latitude = 38.194115, + Longitude = -85.77494, + Time = 300, + TimeWindowStart = 117716, + TimeWindowEnd = 119078 }, + + new Address() { AddressString = "2109 SCHAFFNER AVE, Louisville, KY, 40210", + Latitude = 38.219699, + Longitude = -85.779363, + Time = 300, + TimeWindowStart = 119078, + TimeWindowEnd = 121147 }, + + new Address() { AddressString = "2906 DIXIE HWY, Louisville, KY, 40216", + Latitude = 38.209278, + Longitude = -85.798653, + Time = 300, + TimeWindowStart = 121147, + TimeWindowEnd = 124281 }, + + new Address() { AddressString = "814 WWHITNEY AVE, Louisville, KY, 40215", + Latitude = 38.193596, + Longitude = -85.773521, + Time = 300, + TimeWindowStart = 124281, + TimeWindowEnd = 124675 }, + + new Address() { AddressString = "1610 ALGONQUIN PWKY, Louisville, KY, 40210", + Latitude = 38.222153, + Longitude = -85.784187, + Time = 300, + TimeWindowStart = 124675, + TimeWindowEnd = 127148 }, + + new Address() { AddressString = "3524 WHEELER AVE, Louisville, KY, 40215", + Latitude = 38.195293, + Longitude = -85.788643, + Time = 300, + TimeWindowStart = 127148, + TimeWindowEnd = 130667 }, + + new Address() { AddressString = "5009 NEW CUT RD, Louisville, KY, 40214", + Latitude = 38.165905, + Longitude = -85.779701, + Time = 300, + TimeWindowStart = 130667, + TimeWindowEnd = 131980 }, + + new Address() { AddressString = "3122 ELLIOTT AVE, Louisville, KY, 40211", + Latitude = 38.251213, + Longitude = -85.804199, + Time = 300, + TimeWindowStart = 131980, + TimeWindowEnd = 134402 }, + + new Address() { AddressString = "911 GAGEL AVE, Louisville, KY, 40216", + Latitude = 38.173512, + Longitude = -85.807854, + Time = 300, + TimeWindowStart = 134402, + TimeWindowEnd = 136787 }, + + new Address() { AddressString = "4020 GARLAND AVE #lOOA, Louisville, KY, 40211", + Latitude = 38.246181, + Longitude = -85.818901, + Time = 300, + TimeWindowStart = 136787, + TimeWindowEnd = 138073 }, + + new Address() { AddressString = "5231 MT HOLYOKE DR, Louisville, KY, 40216", + Latitude = 38.169369, + Longitude = -85.85704, + Time = 300, + TimeWindowStart = 138073, + TimeWindowEnd = 141407 }, + + new Address() { AddressString = "1339 28TH S #2, Louisville, KY, 40211", + Latitude = 38.235275, + Longitude = -85.800156, + Time = 300, + TimeWindowStart = 141407, + TimeWindowEnd = 143561 }, + + new Address() { AddressString = "836 S 36TH ST, Louisville, KY, 40211", + Latitude = 38.24651, + Longitude = -85.811234, + Time = 300, + TimeWindowStart = 143561, + TimeWindowEnd = 145941 }, + + new Address() { AddressString = "2132 DUNCAN STREET, Louisville, KY, 40212", + Latitude = 38.262135, + Longitude = -85.785172, + Time = 300, + TimeWindowStart = 145941, + TimeWindowEnd = 148296 }, + + new Address() { AddressString = "3529 WHEELER AVE, Louisville, KY, 40215", + Latitude = 38.195057, + Longitude = -85.787949, + Time = 300, + TimeWindowStart = 148296, + TimeWindowEnd = 150177 }, + + new Address() { AddressString = "2829 DE MEL #11, Louisville, KY, 40214", + Latitude = 38.171662, + Longitude = -85.807271, + Time = 300, + TimeWindowStart = 150177, + TimeWindowEnd = 150981 }, + + new Address() { AddressString = "1325 EARL AVENUE, Louisville, KY, 40215", + Latitude = 38.204556, + Longitude = -85.781555, + Time = 300, + TimeWindowStart = 150981, + TimeWindowEnd = 151854 }, + + new Address() { AddressString = "3632 MANSLICK RD #10, Louisville, KY, 40215", + Latitude = 38.193542, + Longitude = -85.801147, + Time = 300, + TimeWindowStart = 151854, + TimeWindowEnd = 152613 }, + + new Address() { AddressString = "637 S 41ST ST, Louisville, KY, 40211", + Latitude = 38.253632, + Longitude = -85.81897, + Time = 300, + TimeWindowStart = 152613, + TimeWindowEnd = 156131 }, + + new Address() { AddressString = "3420 VIRGINIA AVENUE, Louisville, KY, 40211", + Latitude = 38.238693, + Longitude = -85.811386, + Time = 300, + TimeWindowStart = 156131, + TimeWindowEnd = 157212 }, + + new Address() { AddressString = "3501 MALIBU CT APT 6, Louisville, KY, 40216", + Latitude = 38.166481, + Longitude = -85.825928, + Time = 300, + TimeWindowStart = 157212, + TimeWindowEnd = 158655 }, + + new Address() { AddressString = "4912 DIXIE HWY, Louisville, KY, 40216", + Latitude = 38.170728, + Longitude = -85.826817, + Time = 300, + TimeWindowStart = 158655, + TimeWindowEnd = 159145 }, + + new Address() { AddressString = "7720 DINGLEDELL RD, Louisville, KY, 40214", + Latitude = 38.162472, + Longitude = -85.792854, + Time = 300, + TimeWindowStart = 159145, + TimeWindowEnd = 161831 }, + + new Address() { AddressString = "2123 RATCLIFFE AVE, Louisville, KY, 40210", + Latitude = 38.21978, + Longitude = -85.797615, + Time = 300, + TimeWindowStart = 161831, + TimeWindowEnd = 163705 }, + + new Address() { + AddressString = "1321 OAKWOOD AVE, Louisville, KY, 40215", + Latitude = 38.17704, + Longitude = -85.783829, + Time = 300, + TimeWindowStart = 163705, + TimeWindowEnd = 164953 }, + + new Address() { AddressString = "2223 WEST KENTUCKY STREET, Louisville, KY, 40210", + Latitude = 38.242516, + Longitude = -85.790695, + Time = 300, + TimeWindowStart = 164953, + TimeWindowEnd = 166189 }, + + new Address() { AddressString = "8025 GLIMMER WAY #3308, Louisville, KY, 40214", + Latitude = 38.131981, + Longitude = -85.77935, + Time = 300, + TimeWindowStart = 166189, + TimeWindowEnd = 166640 }, + + new Address() { AddressString = "1155 S 28TH ST, Louisville, KY, 40211", + Latitude = 38.238621, + Longitude = -85.799911, + Time = 300, + TimeWindowStart = 166640, + TimeWindowEnd = 168147 }, + + new Address() { AddressString = "840 IROQUOIS AVE, Louisville, KY, 40214", + Latitude = 38.166355, + Longitude = -85.779396, + Time = 300, + TimeWindowStart = 168147, + TimeWindowEnd = 170385 + }, + + new Address() { AddressString = "5573 BRUCE AVE, Louisville, KY, 40214", + Latitude = 38.145222, + Longitude = -85.779205, + Time = 300, + TimeWindowStart = 170385, + TimeWindowEnd = 171096 }, + + new Address() { AddressString = "1727 GALLAGHER, Louisville, KY, 40210", + Latitude = 38.239334, + Longitude = -85.784882, + Time = 300, + TimeWindowStart = 171096, + TimeWindowEnd = 171951 }, + + new Address() { AddressString = "1309 CATALPA ST APT 204, Louisville, KY, 40211", + Latitude = 38.236524, + Longitude = -85.801619, + Time = 300, + TimeWindowStart = 171951, + TimeWindowEnd = 172393 }, + + new Address() { AddressString = "1330 ALGONQUIN PKWY, Louisville, KY, 40208", + Latitude = 38.219846, + Longitude = -85.777344, + Time = 300, + TimeWindowStart = 172393, + TimeWindowEnd = 175337 }, + + new Address() { AddressString = "823 SUTCLIFFE, Louisville, KY, 40211", + Latitude = 38.246956, + Longitude = -85.811569, + Time = 300, + TimeWindowStart = 175337, + TimeWindowEnd = 176867 }, + + new Address() { AddressString = "4405 CHURCHMAN AVENUE #2, Louisville, KY, 40215", + Latitude = 38.177768, + Longitude = -85.792545, + Time = 300, + TimeWindowStart = 176867, + TimeWindowEnd = 178051 }, + + new Address() { AddressString = "3211 DUMESNIL ST #1, Louisville, KY, 40211", + Latitude = 38.237789, + Longitude = -85.807968, + Time = 300, + TimeWindowStart = 178051, + TimeWindowEnd = 179083 }, + + new Address() { AddressString = "3904 WEWOKA AVE, Louisville, KY, 40212", + Latitude = 38.270367, + Longitude = -85.813118, + Time = 300, + TimeWindowStart = 179083, + TimeWindowEnd = 181543 }, + + new Address() { AddressString = "660 SO. 42ND STREET, Louisville, KY, 40211", + Latitude = 38.252865, + Longitude = -85.822624, + Time = 300, + TimeWindowStart = 181543, + TimeWindowEnd = 184193 }, + + new Address() { AddressString = "3619 LENTZ AVE, Louisville, KY, 40215", + Latitude = 38.193249, + Longitude = -85.785492, + Time = 300, + TimeWindowStart = 184193, + TimeWindowEnd = 185853 }, + + new Address() { AddressString = "4305 STOLTZ CT, Louisville, KY, 40215", + Latitude = 38.178707, + Longitude = -85.787292, + Time = 300, + TimeWindowStart = 185853, + TimeWindowEnd = 187252 } + + #endregion + }; + + // Set parameters + RouteParameters parameters = new RouteParameters() + { + AlgorithmType = AlgorithmType.CVRP_TW_MD, + RouteName = "Multiple Depot, Multiple Driver, Time Window", + StoreRoute = false, + + RouteDate = R4MeUtils.ConvertToUnixTimestamp(DateTime.UtcNow.Date.AddDays(1)), + RouteTime = 60 * 60 * 7, + RT = true, + RouteMaxDuration = 86400*3, + VehicleCapacity = "99", + VehicleMaxDistanceMI = "99999", + + Optimize = Optimize.Time.Description(), + DistanceUnit = DistanceUnit.MI.Description(), + DeviceType = DeviceType.Web.Description(), + TravelMode = TravelMode.Driving.Description(), + Metric = Metric.Geodesic + }; + + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + Addresses = addresses, + Parameters = parameters + }; + + // Run the query + string errorString; + DataObject dataObject = route4Me.RunOptimization(optimizationParameters, out errorString); + + // Output the result + PrintExampleOptimizationResult("MultipleDepotMultipleDriverTimeWindow", dataObject, errorString); + + return dataObject; + } + } +} diff --git a/Route4MeSDKTest/Examples/RouteExamples/MultipleDepotMultipleDriverWith24StopsTimeWindow.cs b/Route4MeSDKTest/Examples/RouteExamples/MultipleDepotMultipleDriverWith24StopsTimeWindow.cs new file mode 100755 index 00000000..f1eba393 --- /dev/null +++ b/Route4MeSDKTest/Examples/RouteExamples/MultipleDepotMultipleDriverWith24StopsTimeWindow.cs @@ -0,0 +1,227 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public DataObject MultipleDepotMultipleDriverWith24StopsTimeWindow() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Prepare the addresses + Address[] addresses = new Address[] + { + #region Addresses + + new Address() { AddressString = "3634 W Market St, Fairlawn, OH 44333", + IsDepot = true, + Latitude = 41.135762259364, + Longitude = -81.629313826561, + Time = 300, + TimeWindowStart = 28800, + TimeWindowEnd = 29465 }, + + new Address() { AddressString = "1218 Ruth Ave, Cuyahoga Falls, OH 44221", + Latitude = 41.143505096435, + Longitude = -81.46549987793, + Time = 300, + TimeWindowStart = 29465, + TimeWindowEnd = 30529 }, + + new Address() { AddressString = "512 Florida Pl, Barberton, OH 44203", + Latitude = 41.003671512008, + Longitude = -81.598461046815, + Time = 300, + TimeWindowStart = 30529, + TimeWindowEnd = 33479 }, + + new Address() { AddressString = "512 Florida Pl, Barberton, OH 44203", + Latitude = 41.003671512008, + Longitude = -81.598461046815, + Time = 300, + TimeWindowStart = 33479, + TimeWindowEnd = 33944 }, + + new Address() { AddressString = "3495 Purdue St, Cuyahoga Falls, OH 44221", + Latitude = 41.162971496582, + Longitude = -81.479049682617, + Time = 300, + TimeWindowStart = 33944, + TimeWindowEnd = 34801 }, + + new Address() { AddressString = "1659 Hibbard Dr, Stow, OH 44224", + Latitude = 41.194505989552, + Longitude = -81.443351581693, + Time = 300, + TimeWindowStart = 34801, + TimeWindowEnd = 36366 }, + + new Address() { AddressString = "2705 N River Rd, Stow, OH 44224", + Latitude = 41.145240783691, + Longitude = -81.410247802734, + Time = 300, + TimeWindowStart = 36366, + TimeWindowEnd = 39173 }, + + new Address() { AddressString = "10159 Bissell Dr, Twinsburg, OH 44087", + Latitude = 41.340042114258, + Longitude = -81.421226501465, + Time = 300, + TimeWindowStart = 39173, + TimeWindowEnd = 41617 }, + + new Address() { AddressString = "367 Cathy Dr, Munroe Falls, OH 44262", + Latitude = 41.148578643799, + Longitude = -81.429229736328, + Time = 300, + TimeWindowStart = 41617, + TimeWindowEnd = 43660 }, + + new Address() { AddressString = "367 Cathy Dr, Munroe Falls, OH 44262", + Latitude = 41.148579, + Longitude = -81.42923, + Time = 300, + TimeWindowStart = 43660, + TimeWindowEnd = 46392 }, + + new Address() { AddressString = "512 Florida Pl, Barberton, OH 44203", + Latitude = 41.003671512008, + Longitude = -81.598461046815, + Time = 300, + TimeWindowStart = 46392, + TimeWindowEnd = 48089 }, + + new Address() { AddressString = "559 W Aurora Rd, Northfield, OH 44067", + Latitude = 41.315116882324, + Longitude = -81.558746337891, + Time = 300, + TimeWindowStart = 48089, + TimeWindowEnd = 48449 }, + + new Address() { AddressString = "3933 Klein Ave, Stow, OH 44224", + Latitude = 41.169467926025, + Longitude = -81.429420471191, + Time = 300, + TimeWindowStart = 48449, + TimeWindowEnd = 50152 }, + + new Address() { AddressString = "2148 8th St, Cuyahoga Falls, OH 44221", + Latitude = 41.136692047119, + Longitude = -81.493492126465, + Time = 300, + TimeWindowStart = 50152, + TimeWindowEnd = 51682 }, + + new Address() { AddressString = "3731 Osage St, Stow, OH 44224", + Latitude = 41.161357879639, + Longitude = -81.42293548584, + Time = 300, + TimeWindowStart = 51682, + TimeWindowEnd = 54379 }, + + new Address() { AddressString = "3862 Klein Ave, Stow, OH 44224", + Latitude = 41.167895123363, + Longitude = -81.429973393679, + Time = 300, + TimeWindowStart = 54379, + TimeWindowEnd = 54879 }, + + new Address() { AddressString = "138 Northwood Ln, Tallmadge, OH 44278", + Latitude = 41.085464134812, + Longitude = -81.447411775589, + Time = 300, + TimeWindowStart = 54879, + TimeWindowEnd = 56613 }, + + new Address() { AddressString = "3401 Saratoga Blvd, Stow, OH 44224", + Latitude = 41.148849487305, + Longitude = -81.407363891602, + Time = 300, + TimeWindowStart = 56613, + TimeWindowEnd = 57052 }, + + new Address() { AddressString = "5169 Brockton Dr, Stow, OH 44224", + Latitude = 41.195003509521, + Longitude = -81.392700195312, + Time = 300, + TimeWindowStart = 57052, + TimeWindowEnd = 59004 }, + + new Address() { AddressString = "5169 Brockton Dr, Stow, OH 44224", + Latitude = 41.195003509521, + Longitude = -81.392700195312, + Time = 300, + TimeWindowStart = 59004, + TimeWindowEnd = 60027 }, + + new Address() { AddressString = "458 Aintree Dr, Munroe Falls, OH 44262", + Latitude = 41.1266746521, + Longitude = -81.445808410645, + Time = 300, + TimeWindowStart = 60027, + TimeWindowEnd = 60375 }, + + new Address() { AddressString = "512 Florida Pl, Barberton, OH 44203", + Latitude = 41.003671512008, + Longitude = -81.598461046815, + Time = 300, + TimeWindowStart = 60375, + TimeWindowEnd = 63891 }, + + new Address() { AddressString = "2299 Tyre Dr, Hudson, OH 44236", + Latitude = 41.250511169434, + Longitude = -81.420433044434, + Time = 300, + TimeWindowStart = 63891, + TimeWindowEnd = 65277 }, + + new Address() { AddressString = "2148 8th St, Cuyahoga Falls, OH 44221", + Latitude = 41.136692047119, + Longitude = -81.493492126465, + Time = 300, + TimeWindowStart = 65277, + TimeWindowEnd = 68545 } + + #endregion + }; + + // Set parameters + RouteParameters parameters = new RouteParameters() + { + AlgorithmType = AlgorithmType.CVRP_TW_MD, + RouteName = "Multiple Depot, Multiple Driver with 24 Stops, Time Window", + StoreRoute = false, + + RouteDate = R4MeUtils.ConvertToUnixTimestamp(DateTime.UtcNow.Date.AddDays(1)), + RouteTime = 60 * 60 * 7, + RouteMaxDuration = 86400, + VehicleCapacity = "1", + VehicleMaxDistanceMI = "10000", + + Optimize = Optimize.Distance.Description(), + DistanceUnit = DistanceUnit.MI.Description(), + DeviceType = DeviceType.Web.Description(), + TravelMode = TravelMode.Driving.Description(), + Metric = Metric.Geodesic + }; + + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + Addresses = addresses, + Parameters = parameters + }; + + // Run the query + string errorString; + DataObject dataObject = route4Me.RunOptimization(optimizationParameters, out errorString); + + // Output the result + PrintExampleOptimizationResult("MultipleDepotMultipleDriverWith24StopsTimeWindow", dataObject, errorString); + + return dataObject; + } + } +} diff --git a/Route4MeSDKTest/Examples/RouteExamples/SingleDepotMultipleDriverNoTimeWindow.cs b/Route4MeSDKTest/Examples/RouteExamples/SingleDepotMultipleDriverNoTimeWindow.cs new file mode 100644 index 00000000..cc8ec44f --- /dev/null +++ b/Route4MeSDKTest/Examples/RouteExamples/SingleDepotMultipleDriverNoTimeWindow.cs @@ -0,0 +1,1811 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public DataObject SingleDepotMultipleDriverNoTimeWindow() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Prepare the addresses + Address[] addresses = new Address[] + { + #region Addresses + + new Address() { AddressString = "40 Mercer st, New York, NY", + IsDepot = true, + Latitude = 40.7213583, + Longitude = -74.0013082, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "new york, ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Manhatten Island NYC", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "503 W139 St, NY,NY", + Latitude = 40.7109062, + Longitude = -74.0091848, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "203 grand st, new york, ny", + Latitude = 40.7188990, + Longitude = -73.9967320, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "119 Church Street", + Latitude = 40.7137757, + Longitude = -74.0088238, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "new york ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "broadway street, new york", + Latitude = 40.7191551, + Longitude = -74.0020849, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Ground Zero, Vesey-Liberty-Church-West Streets New York NY 10038", + Latitude = 40.7233126, + Longitude = -74.0116602, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "226 ilyssa way staten lsland ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "185 franklin st.", + Latitude = 40.7192099, + Longitude = -74.0097670, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "new york city,", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "11 e. broaway 11038", + Latitude = 40.7132060, + Longitude = -73.9974019, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Brooklyn Bridge, NY", + Latitude = 40.7053804, + Longitude = -73.9962503, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "World Trade Center Site, NY", + Latitude = 40.7114980, + Longitude = -74.0122990, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York Stock Exchange, NY", + Latitude = 40.7074242, + Longitude = -74.0116342, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Wall Street, NY", + Latitude = 40.7079825, + Longitude = -74.0079781, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Trinity Church, NY", + Latitude = 40.7081426, + Longitude = -74.0120511, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "World Financial Center, NY", + Latitude = 40.7104750, + Longitude = -74.0154930, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Federal Hall, NY", + Latitude = 40.7073034, + Longitude = -74.0102734, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Flatiron Building, NY", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "South Street Seaport, NY", + Latitude = 40.7069210, + Longitude = -74.0036380, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Rockefeller Center, NY", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "FAO Schwarz, NY", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Woolworth Building, NY", + Latitude = 40.7123903, + Longitude = -74.0083309, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Met Life Building, NY", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "SOHO/Tribeca, NY", + Latitude = 40.7185650, + Longitude = -74.0120170, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Macy’s, NY", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "City Hall, NY, NY", + Latitude = 40.7127047, + Longitude = -74.0058663, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Macy&acirc;€™s, NY", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "1452 potter blvd bayshore ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "55 Church St. New York, NY", + Latitude = 40.7112320, + Longitude = -74.0102680, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "55 Church St, New York, NY", + Latitude = 40.7112320, + Longitude = -74.0102680, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "79 woodlawn dr revena ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "135 main st revena ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "250 greenwich st, new york, ny", + Latitude = 40.7131590, + Longitude = -74.0118890, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "79 grand, new york, ny", + Latitude = 40.7216958, + Longitude = -74.0024352, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "World trade center\n", + Latitude = 40.7116260, + Longitude = -74.0107140, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "World trade centern", + Latitude = 40.7132910, + Longitude = -74.0118350, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "391 broadway new york", + Latitude = 40.7183693, + Longitude = -74.0027800, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Fletcher street", + Latitude = 40.7063954, + Longitude = -74.0056353, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "2 Plum LanenPlainview New York", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "50 Kennedy drivenPlainview New York", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "7 Crestwood DrivenPlainview New York", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "85 west street nyc", + Latitude = 40.7096460, + Longitude = -74.0146140, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York, New York", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "89 Reade St, New York City, New York 10013", + Latitude = 40.7142970, + Longitude = -74.0059660, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "100 white st", + Latitude = 40.7172477, + Longitude = -74.0014351, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "100 white st\n33040", + Latitude = 40.7172477, + Longitude = -74.0014351, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Canal st and mulberry", + Latitude = 40.7170880, + Longitude = -73.9986025, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "91-83 111st st\nRichmond hills ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "122-09 liberty avenOzone park ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "80-16 101 avenOzone park ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "6302 woodhaven blvdnRego park ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "39-02 64th stnWoodside ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York City, NY,", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Pine st", + Latitude = 40.7069754, + Longitude = -74.0089557, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Wall st", + Latitude = 40.7079825, + Longitude = -74.0079781, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "32 avenue of the Americas, NY, NY", + Latitude = 40.7201140, + Longitude = -74.0050920, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "260 west broadway, NY, NY", + Latitude = 40.7206210, + Longitude = -74.0055670, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Long island, ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "27 Carley ave\nHuntington ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "17 west neck RdnHuntington ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "206 washington st", + Latitude = 40.7131577, + Longitude = -74.0126091, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Cipriani new york", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Byshnell Basin. NY", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "89 Reade St, New York, New York 10013", + Latitude = 40.7142970, + Longitude = -74.0059660, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "250 Greenwich St, New York, New York 10007", + Latitude = 40.7133000, + Longitude = -74.0120000, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "64 Bowery, New York, New York 10013", + Latitude = 40.7165540, + Longitude = -73.9962700, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "142-156 Mulberry St, New York, New York 10013", + Latitude = 40.7192764, + Longitude = -73.9973096, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "80 Spring St, New York, New York 10012", + Latitude = 40.7226590, + Longitude = -73.9981820, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "182 Duane street ny", + Latitude = 40.7170879, + Longitude = -74.0101210, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "182 Duane St, New York, New York 10013", + Latitude = 40.7170879, + Longitude = -74.0101210, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "462 broome street nyc", + Latitude = 40.7225800, + Longitude = -74.0008980, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "117 mercer street nyc", + Latitude = 40.7239679, + Longitude = -73.9991585, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Lucca antiques\n182 Duane St, New York, New York 10013", + Latitude = 40.7167516, + Longitude = -74.0087482, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Room and board\n105 Wooster street nyc", + Latitude = 40.7229097, + Longitude = -74.0021852, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Lucca antiquesn182 Duane St, New York, New York 10013", + Latitude = 40.7167516, + Longitude = -74.0087482, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Room and boardn105 Wooster street nyc", + Latitude = 40.7229097, + Longitude = -74.0021852, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Lucca antiques 182 Duane st new York ny", + Latitude = 40.7170879, + Longitude = -74.0101210, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Property\n14 Wooster street nyc", + Latitude = 40.7229097, + Longitude = -74.0021852, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "101 Crosby street nyc", + Latitude = 40.7235730, + Longitude = -73.9969540, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Room and board \n105 Wooster street nyc", + Latitude = 40.7229097, + Longitude = -74.0021852, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Propertyn14 Wooster street nyc", + Latitude = 40.7229097, + Longitude = -74.0021852, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Room and board n105 Wooster street nyc", + Latitude = 40.7229097, + Longitude = -74.0021852, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Mecox gardens\n926 Lexington nyc", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "25 sybil's crossing Kent lakes, ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "10149 ASHDALE LANE\t67\t67393253\t\t\tSANTEE\tCA\t92071\t\t280501691\t67393253\tIFI\t280501691\t05-JUN-10\t67393253", + Latitude = 40.7143000, + Longitude = -74.0067000, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "193 Lakebridge Dr, Kings Paark, NY", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "219 west creek", + Latitude = 40.7198564, + Longitude = -74.0121098, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "14 North Moore Street\nNew York, ny", + Latitude = 40.7196970, + Longitude = -74.0066100, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "14 North Moore StreetnNew York, ny", + Latitude = 40.7196970, + Longitude = -74.0066100, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "14 North Moore Street New York, ny", + Latitude = 40.7196970, + Longitude = -74.0066100, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "30-38 Fulton St, New York, New York 10038", + Latitude = 40.7077737, + Longitude = -74.0043299, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "73 Spring Street Ny NY", + Latitude = 40.7225378, + Longitude = -73.9976742, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "119 Mercer Street Ny NY", + Latitude = 40.7241390, + Longitude = -73.9993110, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "525 Broadway Ny NY", + Latitude = 40.7230410, + Longitude = -73.9991650, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Church St", + Latitude = 40.7154338, + Longitude = -74.0075430, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "135 union stnWatertown ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "21101 coffeen stnWatertown ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "215 Washington stnWatertown ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "619 mill stnWatertown ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "3 canel st, new York, ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "new york city new york", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "50 grand street", + Latitude = 40.7225780, + Longitude = -74.0038019, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Orient ferry, li ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Hilton hotel river head li ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "116 park pl", + Latitude = 40.7140565, + Longitude = -74.0110155, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "long islans new york", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "1 prospect pointe niagra falls ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York City\tNY", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "pink berry ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York City\t NY", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "10108", + Latitude = 40.7143000, + Longitude = -74.0067000, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Ann st", + Latitude = 40.7105937, + Longitude = -74.0073715, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Hok 620 ave of Americas new York ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Som 14 wall st nyc", + Latitude = 40.7076179, + Longitude = -74.0107630, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York ,ny", + Latitude = 40.7142691, + Longitude = -74.0059729, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "52 prince st. 10012", + Latitude = 40.7235840, + Longitude = -73.9961170, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "451 broadway 10013", + Latitude = 40.7205177, + Longitude = -74.0009557, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Dover street", + Latitude = 40.7087886, + Longitude = -74.0008644, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Murray st", + Latitude = 40.7148929, + Longitude = -74.0113349, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "85 West St, New York, New York", + Latitude = 40.7096460, + Longitude = -74.0146140, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + //125left + new Address() { AddressString = "NYC", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "64 trinity place, ny, ny", + Latitude = 40.7081649, + Longitude = -74.0127168, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "150 broadway ny ny", + Latitude = 40.7091850, + Longitude = -74.0100330, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Pinegrove Dude Ranch 31 cherrytown Rd Kerhinkson Ny", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Front street", + Latitude = 40.7063990, + Longitude = -74.0045493, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "234 canal St new York, NY 10013", + Latitude = 40.7177010, + Longitude = -73.9999570, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "72 spring street, new york ny 10012", + Latitude = 40.7225093, + Longitude = -73.9976540, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "150 spring street, new york, ny 10012", + Latitude = 40.7242393, + Longitude = -74.0014922, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "580 broadway street, new york, ny 10012", + Latitude = 40.7244210, + Longitude = -73.9970260, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "42 trinity place, new york, ny 10007", + Latitude = 40.7074000, + Longitude = -74.0135510, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "baco ny", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Micro Tel Inn Alburn New York", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "20 Cedar Close", + Latitude = 40.7068734, + Longitude = -74.0078613, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "South street", + Latitude = 40.7080184, + Longitude = -73.9999414, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "47 Lafayette street", + Latitude = 40.7159204, + Longitude = -74.0027332, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Newyork", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Ground Zero, NY", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "GROUND ZERO NY", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "33400 SE Harrison", + Latitude = 40.7188400, + Longitude = -74.0103330, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "new york, new york", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "8 Greene St, New York, 10013", + Latitude = 40.7206160, + Longitude = -74.0027600, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "226 w 44st new york city", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "s street seaport 11 fulton st new york city", + Latitude = 40.7069150, + Longitude = -74.0033215, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "30 Rockefeller Plaza w 49th St New York City", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "30 Rockefeller Plaza 50th St New York City", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "S. Street Seaport 11 Fulton St. New York City", + Latitude = 40.7069150, + Longitude = -74.0033215, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "30 rockefeller plaza w 49th st, new york city", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "30 rockefeller plaza 50th st, new york city", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "11 fulton st, new york city", + Latitude = 40.7069150, + Longitude = -74.0033215, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "new york city ny", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Big apple", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Ny", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York new York", + Latitude = 40.7143528, + Longitude = -74.0059731, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "83-85 Chambers St, New York, New York 10007", + Latitude = 40.7148130, + Longitude = -74.0068890, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York", + Latitude = 40.7145502, + Longitude = -74.0071249, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "102 North End Ave NY, NY", + Latitude = 40.7147980, + Longitude = -74.0159690, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "57 Thompson St, New York, New York 10012", + Latitude = 40.7241400, + Longitude = -74.0035860, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "new york city", + Latitude = 40.7145500, + Longitude = -74.0071250, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "nyc, ny", + Latitude = 40.7145502, + Longitude = -74.0071249, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York NY", + Latitude = 40.7145500, + Longitude = -74.0071250, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "285 West Broadway New York, NY 10013", + Latitude = 40.7208750, + Longitude = -74.0046310, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "100 avenue of the americas New York, NY 10013", + Latitude = 40.7233120, + Longitude = -74.0043950, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "270 Lafeyette st New York, NY 10012", + Latitude = 40.7238790, + Longitude = -73.9965270, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "560 Broadway New York, NY 10012", + Latitude = 40.7238540, + Longitude = -73.9974980, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "42 Wooster St New York, NY 10013", + Latitude = 40.7223860, + Longitude = -74.0024220, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "42 Wooster StreetNew York, NY 10013-2230", + Latitude = 40.7223633, + Longitude = -74.0026240, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "504 Broadway, New York, NY 10012", + Latitude = 40.7221444, + Longitude = -73.9992714, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "426 Broome Street, New York, NY 10013", + Latitude = 40.7213295, + Longitude = -73.9987121, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "City hall, nyc", + Latitude = 40.7122066, + Longitude = -74.0055026, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "South street seaport, nyc", + Latitude = 40.7069501, + Longitude = -74.0030848, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Ground zero, nyc", + Latitude = 40.7116410, + Longitude = -74.0122530, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Ground zero", + Latitude = 40.7116410, + Longitude = -74.0122530, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Mulberry and canal, NYC", + Latitude = 40.7170900, + Longitude = -73.9985900, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "World Trade Center, NYC", + Latitude = 40.7116670, + Longitude = -74.0125000, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "South Street Seaport", + Latitude = 40.7069501, + Longitude = -74.0030848, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Wall Street and Nassau Street, NYC", + Latitude = 40.7071400, + Longitude = -74.0106900, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Trinity Church, NYC", + Latitude = 40.7081269, + Longitude = -74.0125691, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Federal Hall National Memorial", + Latitude = 40.7069515, + Longitude = -74.0101638, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Little Italy, NYC", + Latitude = 40.7196920, + Longitude = -73.9977650, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York, NY", + Latitude = 40.7145500, + Longitude = -74.0071250, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York City, NY,", + Latitude = 40.7145500, + Longitude = -74.0071250, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "new york,ny", + Latitude = 40.7145500, + Longitude = -74.0071300, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Odeon cinema", + Latitude = 40.7168300, + Longitude = -74.0080300, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York City", + Latitude = 40.7145500, + Longitude = -74.0071300, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "52 broadway, ny,ny 1004", + Latitude = 40.7065000, + Longitude = -74.0123000, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "52 broadway, ny,ny 10004", + Latitude = 40.7065000, + Longitude = -74.0123000, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "22 beaver st, ny,ny 10004", + Latitude = 40.7048200, + Longitude = -74.0121800, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "54 pine st,ny,ny 10005", + Latitude = 40.7068600, + Longitude = -74.0084900, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "114 liberty st, ny,ny 10006", + Latitude = 40.7097700, + Longitude = -74.0122000, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "215 canal st,ny,ny 10013", + Latitude = 40.7174700, + Longitude = -73.9989500, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "new york city ny", + Latitude = 40.7145500, + Longitude = -74.0071300, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "World Trade Center, New York, NY", + Latitude = 40.7116700, + Longitude = -74.0125000, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Chinatown, New York, NY", + Latitude = 40.7159600, + Longitude = -73.9974100, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "101 murray street new york, ny", + Latitude = 40.7152600, + Longitude = -74.0125100, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "nyc", + Latitude = 40.7145500, + Longitude = -74.0071200, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "510 broadway new york", + Latitude = 40.7223400, + Longitude = -73.9990160, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "nyc", + Latitude = 40.7145502, + Longitude = -74.0071249, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Little Italy", + Latitude = 40.7196920, + Longitude = -73.9977647, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "463 Broadway, New York, NY", + Latitude = 40.7210590, + Longitude = -74.0006880, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "222 West Broadway, New York, NY", + Latitude = 40.7193520, + Longitude = -74.0064170, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "270 Lafayette street new York new york", + Latitude = 40.7238790, + Longitude = -73.9965270, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "New York, NY USA", + Latitude = 40.7145500, + Longitude = -74.0071250, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "97 Kenmare Street, New York, NY 10012", + Latitude = 40.7214370, + Longitude = -73.9969110, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "19 Beekman St, New York, New York 10038", + Latitude = 40.7107540, + Longitude = -74.0062870, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Soho", + Latitude = 40.7241404, + Longitude = -74.0020213, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Bergen, New York", + Latitude = 40.7145500, + Longitude = -74.0071250, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "478 Broadway, NY, NY", + Latitude = 40.7213360, + Longitude = -73.9997710, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "555 broadway, ny, ny", + Latitude = 40.7238830, + Longitude = -73.9982960, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "375 West Broadway, NY, NY", + Latitude = 40.7235000, + Longitude = -74.0026020, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "35 howard st, NY, NY", + Latitude = 40.7195240, + Longitude = -74.0010300, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Pier 17 NYC", + Latitude = 40.7063660, + Longitude = -74.0026890, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "120 Liberty St NYC", + Latitude = 40.7097740, + Longitude = -74.0124510, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "80 White Street, NY, NY", + Latitude = 40.7178340, + Longitude = -74.0020520, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Manhattan, NY", + Latitude = 40.7144300, + Longitude = -74.0061000, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "22 read st, ny", + Latitude = 40.7142010, + Longitude = -74.0044910, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "130 Mulberry St, New York, NY 10013-5547", + Latitude = 40.7182880, + Longitude = -73.9977110, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "new york city, ny", + Latitude = 40.7145500, + Longitude = -74.0071250, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "10038", + Latitude = 40.7092119, + Longitude = -74.0033631, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "11 Wall St, New York, NY 10005-1905", + Latitude = 40.7072900, + Longitude = -74.0112010, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "89 Reade St, New York, New York 10007", + Latitude = 40.7134560, + Longitude = -74.0034990, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "265 Canal St, New York, NY 10013-6010", + Latitude = 40.7188850, + Longitude = -74.0009000, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "39 Broadway, New York, NY 10006-3003", + Latitude = 40.7133450, + Longitude = -73.9961320, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "25 beaver street new york ny", + Latitude = 40.7051110, + Longitude = -74.0120070, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "100 church street new york ny", + Latitude = 40.7130430, + Longitude = -74.0096370, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "69 Mercer St, New York, NY 10012-4440", + Latitude = 40.7226490, + Longitude = -74.0006100, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "111 Worth St, New York, NY 10013-4008", + Latitude = 40.7159210, + Longitude = -74.0034100, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "240-248 Broadway, New York, New York 10038", + Latitude = 40.7127690, + Longitude = -74.0076810, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "12 Maiden Ln, New York, NY 10038-4002", + Latitude = 40.7094460, + Longitude = -74.0095760, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "291 Broadway, New York, NY 10007-1814", + Latitude = 40.7150000, + Longitude = -74.0061340, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "55 Liberty St, New York, NY 10005-1003", + Latitude = 40.7088430, + Longitude = -74.0093840, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "Brooklyn Bridge, NY", + Latitude = 40.7063440, + Longitude = -73.9974390, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "wall street", + Latitude = 40.7063889, + Longitude = -74.0094444, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "south street seaport, ny", + Latitude = 40.7069501, + Longitude = -74.0030848, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "little italy, ny", + Latitude = 40.7196920, + Longitude = -73.9977647, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "47 Pine St, New York, NY 10005-1513", + Latitude = 40.7067340, + Longitude = -74.0089280, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "22 cortlandt street new york ny", + Latitude = 40.7100820, + Longitude = -74.0102510, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "105 reade street new york ny", + Latitude = 40.7156330, + Longitude = -74.0085220, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "2 lafayette street new york ny", + Latitude = 40.7140310, + Longitude = -74.0038910, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "53 crosby street new york ny", + Latitude = 40.7219770, + Longitude = -73.9982450, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "2 Lafayette St, New York, NY 10007-1307", + Latitude = 40.7140310, + Longitude = -74.0038910, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "105 Reade St, New York, NY 10013-3840", + Latitude = 40.7156330, + Longitude = -74.0085220, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "chinatown, ny", + Latitude = 40.7159556, + Longitude = -73.9974133, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "250 Broadway, New York, NY 10007-2516", + Latitude = 40.7130180, + Longitude = -74.0074700, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "156 William St, New York, NY 10038-2609", + Latitude = 40.7097970, + Longitude = -74.0055770, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "100 Church St, New York, NY 10007-2601", + Latitude = 40.7130430, + Longitude = -74.0096370, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null }, + + new Address() { AddressString = "33 Beaver St, New York, NY 10004-2736", + Latitude = 40.7050980, + Longitude = -74.0117200, + Time = 0, + TimeWindowStart = null, + TimeWindowEnd = null } + + #endregion + }; + + // Set parameters + RouteParameters parameters = new RouteParameters() + { + AlgorithmType = AlgorithmType.CVRP_TW_MD, + RouteName = "Single Depot, Multiple Driver, No Time Window", + StoreRoute = false, + + RouteDate = R4MeUtils.ConvertToUnixTimestamp(DateTime.UtcNow.Date.AddDays(1)), + RouteTime = 60 * 60 * 7, + RT = true, + RouteMaxDuration = 86400, + VehicleCapacity = "20", + VehicleMaxDistanceMI = "99999", + Parts = 4, + + Optimize = Optimize.Time.Description(), + DistanceUnit = DistanceUnit.MI.Description(), + DeviceType = DeviceType.Web.Description(), + TravelMode = TravelMode.Driving.Description(), + Metric = Metric.Geodesic + }; + + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + Addresses = addresses, + Parameters = parameters + }; + + // Run the query + string errorString; + DataObject dataObject = route4Me.RunOptimization(optimizationParameters, out errorString); + + // Output the result + PrintExampleOptimizationResult("SingleDepotMultipleDriverNoTimeWindow", dataObject, errorString); + + return dataObject; + } + } +} diff --git a/Route4MeSDKTest/Examples/RouteExamples/SingleDriverMultipleTimeWindows.cs b/Route4MeSDKTest/Examples/RouteExamples/SingleDriverMultipleTimeWindows.cs new file mode 100644 index 00000000..8dc796d3 --- /dev/null +++ b/Route4MeSDKTest/Examples/RouteExamples/SingleDriverMultipleTimeWindows.cs @@ -0,0 +1,186 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public DataObject SingleDriverMultipleTimeWindows() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Prepare the addresses + Address[] addresses = new Address[] + { + #region Addresses + + new Address() { AddressString = "3634 W Market St, Fairlawn, OH 44333", + //all possible originating locations are depots, should be marked as true + //stylistically we recommend all depots should be at the top of the destinations list + IsDepot = true, + Latitude = 41.135762259364, + Longitude = -81.629313826561, + + TimeWindowStart = null, + TimeWindowEnd = null, + TimeWindowStart2 = null, + TimeWindowEnd2 = null, + Time = null + }, + + new Address() { AddressString = "1218 Ruth Ave, Cuyahoga Falls, OH 44221", + Latitude = 41.135762259364, + Longitude = -81.629313826561, + + //together these two specify the time window of a destination + //seconds offset relative to the route start time for the open availability of a destination + TimeWindowStart = 6 * 3600 + 00 * 60, + //seconds offset relative to the route end time for the open availability of a destination + TimeWindowEnd = 6 * 3600 + 30 * 60, + + // Second 'TimeWindowStart' + TimeWindowStart2 = 7 * 3600 + 00 * 60, + // Second 'TimeWindowEnd' + TimeWindowEnd2 = 7 * 3600 + 20 * 60, + + //the number of seconds at destination + Time = 300 + }, + + new Address() { AddressString = "512 Florida Pl, Barberton, OH 44203", + Latitude = 41.003671512008, + Longitude = -81.598461046815, + TimeWindowStart = 7 * 3600 + 30 * 60, + TimeWindowEnd = 7 * 3600 + 40 * 60, + TimeWindowStart2 = 8 * 3600 + 00 * 60, + TimeWindowEnd2 = 8 * 3600 + 10 * 60, + Time = 300 + }, + + new Address() { AddressString = "512 Florida Pl, Barberton, OH 44203", + Latitude = 41.003671512008, + Longitude = -81.598461046815, + TimeWindowStart = 8 * 3600 + 30 * 60, + TimeWindowEnd = 8 * 3600 + 40 * 60, + TimeWindowStart2 = 8 * 3600 + 50 * 60, + TimeWindowEnd2 = 9 * 3600 + 00 * 60, + Time = 100 + }, + + new Address() { AddressString = "3495 Purdue St, Cuyahoga Falls, OH 44221", + Latitude = 41.162971496582, + Longitude = -81.479049682617, + TimeWindowStart = 9 * 3600 + 00 * 60, + TimeWindowEnd = 9 * 3600 + 15 * 60, + TimeWindowStart2 = 9 * 3600 + 30 * 60, + TimeWindowEnd2 = 9 * 3600 + 45 * 60, + Time = 300 + }, + + new Address() { AddressString = "1659 Hibbard Dr, Stow, OH 44224", + Latitude = 41.194505989552, + Longitude = -81.443351581693, + TimeWindowStart = 10 * 3600 + 00 * 60, + TimeWindowEnd = 10 * 3600 + 15 * 60, + TimeWindowStart2 = 10 * 3600 + 30 * 60, + TimeWindowEnd2 = 10 * 3600 + 45 * 60, + Time = 300 + }, + + new Address() { AddressString = "2705 N River Rd, Stow, OH 44224", + Latitude = 41.145240783691, + Longitude = -81.410247802734, + TimeWindowStart = 11 * 3600 + 00 * 60, + TimeWindowEnd = 11 * 3600 + 15 * 60, + TimeWindowStart2 = 11 * 3600 + 30 * 60, + TimeWindowEnd2 = 11 * 3600 + 45 * 60, + Time = 300 + }, + + new Address() { AddressString = "10159 Bissell Dr, Twinsburg, OH 44087", + Latitude = 41.340042114258, + Longitude = -81.421226501465, + TimeWindowStart = 12 * 3600 + 00 * 60, + TimeWindowEnd = 12 * 3600 + 15 * 60, + TimeWindowStart2 = 12 * 3600 + 30 * 60, + TimeWindowEnd2 = 12 * 3600 + 45 * 60, + Time = 300 + }, + + new Address() { AddressString = "367 Cathy Dr, Munroe Falls, OH 44262", + Latitude = 41.148578643799, + Longitude = -81.429229736328, + TimeWindowStart = 13 * 3600 + 00 * 60, + TimeWindowEnd = 13 * 3600 + 15 * 60, + TimeWindowStart2 = 13 * 3600 + 30 * 60, + TimeWindowEnd2 = 13 * 3600 + 45 * 60, + Time = 300 + }, + + new Address() { AddressString = "367 Cathy Dr, Munroe Falls, OH 44262", + Latitude = 41.148578643799, + Longitude = -81.429229736328, + TimeWindowStart = 14 * 3600 + 00 * 60, + TimeWindowEnd = 14 * 3600 + 15 * 60, + TimeWindowStart2 = 14 * 3600 + 30 * 60, + TimeWindowEnd2 = 14 * 3600 + 45 * 60, + Time = 300 + }, + + new Address() { AddressString = "512 Florida Pl, Barberton, OH 44203", + Latitude = 41.003671512008, + Longitude = -81.598461046815, + TimeWindowStart = 15 * 3600 + 00 * 60, + TimeWindowEnd = 15 * 3600 + 15 * 60, + TimeWindowStart2 = 15 * 3600 + 30 * 60, + TimeWindowEnd2 = 15 * 3600 + 45 * 60, + Time = 300 + }, + + new Address() { AddressString = "559 W Aurora Rd, Northfield, OH 44067", + Latitude = 41.315116882324, + Longitude = -81.558746337891, + TimeWindowStart = 16 * 3600 + 00 * 60, + TimeWindowEnd = 16 * 3600 + 15 * 60, + TimeWindowStart2 = 16 * 3600 + 30 * 60, + TimeWindowEnd2 = 17 * 3600 + 00 * 60, + Time = 50 + } + + #endregion + }; + + // Set parameters + RouteParameters parameters = new RouteParameters() + { + AlgorithmType = AlgorithmType.TSP, + StoreRoute = false, + RouteName = "Single Driver Multiple TimeWindows 12 Stops", + + RouteDate = R4MeUtils.ConvertToUnixTimestamp(DateTime.UtcNow.Date.AddDays(1)), + RouteTime = 5 * 3600 + 30 * 60, + Optimize = Optimize.Distance.Description(), + DistanceUnit = DistanceUnit.MI.Description(), + DeviceType = DeviceType.Web.Description() + }; + + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + Addresses = addresses, + Parameters = parameters + }; + + // Run the query + string errorString; + DataObject dataObject = route4Me.RunOptimization(optimizationParameters, out errorString); + + // Output the result + PrintExampleOptimizationResult("SingleDriverMultipleTimeWindows", dataObject, errorString); + + return dataObject; + } + } +} diff --git a/Route4MeSDKTest/Examples/RouteExamples/SingleDriverRoundTrip.cs b/Route4MeSDKTest/Examples/RouteExamples/SingleDriverRoundTrip.cs new file mode 100755 index 00000000..86874bbd --- /dev/null +++ b/Route4MeSDKTest/Examples/RouteExamples/SingleDriverRoundTrip.cs @@ -0,0 +1,112 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public DataObject SingleDriverRoundTrip() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Prepare the addresses + Address[] addresses = new Address[] + { + #region Addresses + + new Address() { AddressString = "754 5th Ave New York, NY 10019", + Alias = "Bergdorf Goodman", + IsDepot = true, + Latitude = 40.7636197, + Longitude = -73.9744388, + Time = 0 }, + + new Address() { AddressString = "717 5th Ave New York, NY 10022", + Alias = "Giorgio Armani", + Latitude = 40.7669692, + Longitude = -73.9693864, + Time = 0 }, + + new Address() { AddressString = "888 Madison Ave New York, NY 10014", + Alias = "Ralph Lauren Women's and Home", + Latitude = 40.7715154, + Longitude = -73.9669241, + Time = 0 }, + + new Address() { AddressString = "1011 Madison Ave New York, NY 10075", + Alias = "Yigal Azrou'l", + Latitude = 40.7772129, + Longitude = -73.9669, + Time = 0 }, + + new Address() { AddressString = "440 Columbus Ave New York, NY 10024", + Alias = "Frank Stella Clothier", + Latitude = 40.7808364, + Longitude = -73.9732729, + Time = 0 }, + + new Address() { AddressString = "324 Columbus Ave #1 New York, NY 10023", + Alias = "Liana", + Latitude = 40.7803123, + Longitude = -73.9793079, + Time = 0 }, + + new Address() { AddressString = "110 W End Ave New York, NY 10023", + Alias = "Toga Bike Shop", + Latitude = 40.7753077, + Longitude = -73.9861529, + Time = 0 }, + + new Address() { AddressString = "555 W 57th St New York, NY 10019", + Alias = "BMW of Manhattan", + Latitude = 40.7718005, + Longitude = -73.9897716, + Time = 0 }, + + new Address() { AddressString = "57 W 57th St New York, NY 10019", + Alias = "Verizon Wireless", + Latitude = 40.7558695, + Longitude = -73.9862019, + Time = 0 }, + + #endregion + }; + + // Set parameters + RouteParameters parameters = new RouteParameters() + { + AlgorithmType = AlgorithmType.TSP, + StoreRoute = false, + RouteName = "Single Driver Round Trip", + + RouteDate = R4MeUtils.ConvertToUnixTimestamp(DateTime.UtcNow.Date.AddDays(1)), + RouteTime = 60 * 60 * 7, + RouteMaxDuration = 86400, + VehicleCapacity = "1", + VehicleMaxDistanceMI = "10000", + + Optimize = Optimize.Distance.Description(), + DistanceUnit = DistanceUnit.MI.Description(), + DeviceType = DeviceType.Web.Description(), + TravelMode = TravelMode.Driving.Description(), + }; + + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + Addresses = addresses, + Parameters = parameters + }; + + // Run the query + string errorString; + DataObject dataObject = route4Me.RunOptimization(optimizationParameters, out errorString); + + // Output the result + PrintExampleOptimizationResult("SingleDriverRoundTrip", dataObject, errorString); + + return dataObject; + } + } +} diff --git a/Route4MeSDKTest/Examples/RouteExamples/SingleDriverRoundTripGeneric.cs b/Route4MeSDKTest/Examples/RouteExamples/SingleDriverRoundTripGeneric.cs new file mode 100755 index 00000000..f104d842 --- /dev/null +++ b/Route4MeSDKTest/Examples/RouteExamples/SingleDriverRoundTripGeneric.cs @@ -0,0 +1,181 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Runtime.Serialization; + +namespace Route4MeSDK.Examples +{ + /// + /// This example demonstares how to use the API in a generic way, not bounded to the proposed Route4MeManager shortcucts + /// For the same functionality using shortcuts check the Route4MeExamples.SingleDriverRoundTrip() + /// + public sealed partial class Route4MeExamples + { + #region Types + + // Inherit from GenericParameters and add any JSON serializable content + // Marked with attribute [DataMember] + [DataContract] + private class MyAddressAndParametersHolder : GenericParameters + { + [DataMember] + public Address[] addresses { get; set; } // Using the defined class "Address", can use user-defined class instead + + [DataMember] + public RouteParameters parameters { get; set; } // Using the defined "RouteParameters", can use user-defined class instead + } + + // Generic class for returned JSON holder + [DataContract] + private class MyDataObjectGeneric + { + [DataMember(Name = "optimization_problem_id")] + public string OptimizationProblemId { get; set; } + + [DataMember(Name = "state")] + public int MyState { get; set; } + + [DataMember(Name = "addresses")] + public Address[] Addresses { get; set; } // Using the defined class "Address", can use user-defined class instead + + [DataMember(Name = "parameters")] + public RouteParameters Parameters { get; set; } // Using the defined "RouteParameters", can use user-defined class instead + } + + #endregion + + #region Methods + + public string SingleDriverRoundTripGeneric() + { + const string uri = R4MEInfrastructureSettings.MainHost + "/api.v4/optimization_problem.php"; + const string myApiKey = "11111111111111111111111111111111"; + + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(myApiKey); + + // Prepare the addresses + // Using the defined class, can use user-defined class instead + Address[] addresses = new Address[] + { + #region Addresses + + new Address() { AddressString = "754 5th Ave New York, NY 10019", + Alias = "Bergdorf Goodman", + IsDepot = true, + Latitude = 40.7636197, + Longitude = -73.9744388, + Time = 0 }, + + new Address() { AddressString = "717 5th Ave New York, NY 10022", + Alias = "Giorgio Armani", + Latitude = 40.7669692, + Longitude = -73.9693864, + Time = 0 }, + + new Address() { AddressString = "888 Madison Ave New York, NY 10014", + Alias = "Ralph Lauren Women's and Home", + Latitude = 40.7715154, + Longitude = -73.9669241, + Time = 0 }, + + new Address() { AddressString = "1011 Madison Ave New York, NY 10075", + Alias = "Yigal Azrou'l", + Latitude = 40.7772129, + Longitude = -73.9669, + Time = 0 }, + + new Address() { AddressString = "440 Columbus Ave New York, NY 10024", + Alias = "Frank Stella Clothier", + Latitude = 40.7808364, + Longitude = -73.9732729, + Time = 0 }, + + new Address() { AddressString = "324 Columbus Ave #1 New York, NY 10023", + Alias = "Liana", + Latitude = 40.7803123, + Longitude = -73.9793079, + Time = 0 }, + + new Address() { AddressString = "110 W End Ave New York, NY 10023", + Alias = "Toga Bike Shop", + Latitude = 40.7753077, + Longitude = -73.9861529, + Time = 0 }, + + new Address() { AddressString = "555 W 57th St New York, NY 10019", + Alias = "BMW of Manhattan", + Latitude = 40.7718005, + Longitude = -73.9897716, + Time = 0 }, + + new Address() { AddressString = "57 W 57th St New York, NY 10019", + Alias = "Verizon Wireless", + Latitude = 40.7558695, + Longitude = -73.9862019, + Time = 0 }, + + #endregion + }; + + // Set parameters + // Using the defined class, can use user-defined class instead + RouteParameters parameters = new RouteParameters() + { + AlgorithmType = AlgorithmType.TSP, + StoreRoute = false, + RouteName = "Single Driver Round Trip", + + RouteDate = R4MeUtils.ConvertToUnixTimestamp(DateTime.UtcNow.Date.AddDays(1)), + RouteTime = 60 * 60 * 7, + RouteMaxDuration = 86400, + VehicleCapacity = "1", + VehicleMaxDistanceMI = "10000", + + Optimize = Optimize.Distance.Description(), + DistanceUnit = DistanceUnit.MI.Description(), + DeviceType = DeviceType.Web.Description(), + TravelMode = TravelMode.Driving.Description(), + }; + + MyAddressAndParametersHolder myParameters = new MyAddressAndParametersHolder() + { + addresses = addresses, + parameters = parameters + }; + + // Run the query + string errorString; + MyDataObjectGeneric dataObject = route4Me.GetJsonObjectFromAPI(myParameters, + uri, + HttpMethodType.Post, + out errorString); + + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("SingleDriverRoundTripGeneric executed successfully"); + Console.WriteLine(""); + + Console.WriteLine("Optimization Problem ID: {0}", dataObject.OptimizationProblemId); + Console.WriteLine("State: {0}", dataObject.MyState); + Console.WriteLine(""); + + dataObject.Addresses.ForEach(address => + { + Console.WriteLine("Address: {0}", address.AddressString); + Console.WriteLine("Route ID: {0}", address.RouteId); + }); + return dataObject.OptimizationProblemId; + } + else + { + Console.WriteLine("SingleDriverRoundTripGeneric error {0}", errorString); + return null; + } + } + + #endregion + } +} diff --git a/Route4MeSDKTest/Examples/RouteExamples/SingleDriverRoute10Stops.cs b/Route4MeSDKTest/Examples/RouteExamples/SingleDriverRoute10Stops.cs new file mode 100755 index 00000000..e62cd982 --- /dev/null +++ b/Route4MeSDKTest/Examples/RouteExamples/SingleDriverRoute10Stops.cs @@ -0,0 +1,116 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public DataObject SingleDriverRoute10Stops() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Prepare the addresses + Address[] addresses = new Address[] + { + #region Addresses + + new Address() { AddressString = "151 Arbor Way Milledgeville GA 31061", + //indicate that this is a departure stop + //single depot routes can only have one departure depot + IsDepot = true, + + //required coordinates for every departure and stop on the route + Latitude = 33.132675170898, + Longitude = -83.244743347168, + + //the expected time on site, in seconds. this value is incorporated into the optimization engine + //it also adjusts the estimated and dynamic eta's for a route + Time = 0, + + + //input as many custom fields as needed, custom data is passed through to mobile devices and to the manifest + CustomFields = new Dictionary() {{"color", "red"}, {"size", "huge"}} + }, + + new Address() { AddressString = "230 Arbor Way Milledgeville GA 31061", + Latitude = 33.129695892334, + Longitude = -83.24577331543, + Time = 0 }, + + new Address() { AddressString = "148 Bass Rd NE Milledgeville GA 31061", + Latitude = 33.143497, + Longitude = -83.224487, + Time = 0 }, + + new Address() { AddressString = "117 Bill Johnson Rd NE Milledgeville GA 31061", + Latitude = 33.141784667969, + Longitude = -83.237518310547, + Time = 0 }, + + new Address() { AddressString = "119 Bill Johnson Rd NE Milledgeville GA 31061", + Latitude = 33.141086578369, + Longitude = -83.238258361816, + Time = 0 }, + + new Address() { AddressString = "131 Bill Johnson Rd NE Milledgeville GA 31061", + Latitude = 33.142036437988, + Longitude = -83.238845825195, + Time = 0 }, + + new Address() { AddressString = "138 Bill Johnson Rd NE Milledgeville GA 31061", + Latitude = 33.14307, + Longitude = -83.239334, + Time = 0 }, + + new Address() { AddressString = "139 Bill Johnson Rd NE Milledgeville GA 31061", + Latitude = 33.142734527588, + Longitude = -83.237442016602, + Time = 0 }, + + new Address() { AddressString = "145 Bill Johnson Rd NE Milledgeville GA 31061", + Latitude = 33.143871307373, + Longitude = -83.237342834473, + Time = 0 }, + + new Address() { AddressString = "221 Blake Cir Milledgeville GA 31061", + Latitude = 33.081462860107, + Longitude = -83.208511352539, + Time = 0 } + + #endregion + }; + + // Set parameters + RouteParameters parameters = new RouteParameters() + { + AlgorithmType = AlgorithmType.TSP, + StoreRoute = false, + RouteName = "Single Driver Route 10 Stops", + + RouteDate = R4MeUtils.ConvertToUnixTimestamp(DateTime.UtcNow.Date.AddDays(1)), + RouteTime = 60 * 60 * 7, + Optimize = Optimize.Distance.Description(), + DistanceUnit = DistanceUnit.MI.Description(), + DeviceType = DeviceType.Web.Description() + }; + + OptimizationParameters optimizationParameters = new OptimizationParameters() + { + Addresses = addresses, + Parameters = parameters + }; + + // Run the query + string errorString; + DataObject dataObject = route4Me.RunOptimization(optimizationParameters, out errorString); + + // Output the result + PrintExampleOptimizationResult("SingleDriverRoute10Stops", dataObject, errorString); + + return dataObject; + } + } +} diff --git a/Route4MeSDKTest/Examples/Routes/DeleteRoutes.cs b/Route4MeSDKTest/Examples/Routes/DeleteRoutes.cs new file mode 100644 index 00000000..5ca86b73 --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/DeleteRoutes.cs @@ -0,0 +1,31 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void DeleteRoutes(string[] routeIds) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + string errorString; + string[] deletedRouteIds = route4Me.DeleteRoutes(routeIds, out errorString); + + Console.WriteLine(""); + + if (deletedRouteIds != null) + { + Console.WriteLine("DeleteRoutes executed successfully, {0} routes deleted", deletedRouteIds.Length); + Console.WriteLine(""); + } + else + { + Console.WriteLine("DeleteRoutes error {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Routes/DuplicateRoute.cs b/Route4MeSDKTest/Examples/Routes/DuplicateRoute.cs new file mode 100644 index 00000000..793351f4 --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/DuplicateRoute.cs @@ -0,0 +1,38 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public string DuplicateRoute(string routeId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + RouteParametersQuery routeParameters = new RouteParametersQuery() + { + RouteId = routeId + }; + + // Run the query + string errorString; + string duplicatedRouteId = route4Me.DuplicateRoute(routeParameters, out errorString); + + Console.WriteLine(""); + + if (duplicatedRouteId != null) + { + Console.WriteLine("DuplicateRoute executed successfully, duplicated route ID: {0}", duplicatedRouteId); + Console.WriteLine(""); + } + else + { + Console.WriteLine("DuplicateRoute error {0}", errorString); + } + + return duplicatedRouteId; + } + } +} diff --git a/Route4MeSDKTest/Examples/Routes/GetRoute.cs b/Route4MeSDKTest/Examples/Routes/GetRoute.cs new file mode 100755 index 00000000..9e7def30 --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/GetRoute.cs @@ -0,0 +1,61 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void GetRoute(string routeId, bool getRouteDirections, bool getRoutePathPoints) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + RouteParametersQuery routeParameters = new RouteParametersQuery() + { + RouteId = routeId + }; + + if (getRouteDirections) + { + routeParameters.Directions = true; + } + + if (getRoutePathPoints) + { + routeParameters.RoutePathOutput = RoutePathOutput.Points.ToString(); + } + + // Run the query + string errorString; + DataObjectRoute dataObject = route4Me.GetRoute(routeParameters, out errorString); + + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("GetRoute executed successfully"); + + Console.WriteLine("Route ID: {0}", dataObject.RouteID); + Console.WriteLine("State: {0}", dataObject.State); + /*foreach (Address a in dataObject.Addresses) + { + Console.WriteLine("addr: {0}, {1}, {2}, {3}, {4}", a.RouteDestinationId, a.Latitude, a.Longitude, a.Alias, a.AddressString); + }*/ + if (dataObject.Directions != null) + { + Console.WriteLine("Directions: lenth = {0}", dataObject.Directions.Length); + } + if (dataObject.Path != null) + { + Console.WriteLine("Path: lenth = {0}", dataObject.Path.Length); + } + } + else + { + Console.WriteLine("GetRoute error: {0}", errorString); + } + } + } +} + diff --git a/Route4MeSDKTest/Examples/Routes/GetRoutes.cs b/Route4MeSDKTest/Examples/Routes/GetRoutes.cs new file mode 100644 index 00000000..4dceef2e --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/GetRoutes.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void GetRoutes() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + RouteParametersQuery routeParameters = new RouteParametersQuery() + { + Limit = 10, + Offset = 5 + }; + + // Run the query + string errorString; + DataObjectRoute[] dataObjects = route4Me.GetRoutes(routeParameters, out errorString); + + Console.WriteLine(""); + + if (dataObjects != null) + { + Console.WriteLine("GetRoutes executed successfully, {0} routes returned", dataObjects.Length); + Console.WriteLine(""); + + dataObjects.ForEach(dataObject => + { + Console.WriteLine("RouteID: {0}", dataObject.RouteID); + Console.WriteLine(""); + }); + } + else + { + Console.WriteLine("GetRoutes error {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Routes/MergeRoutes.cs b/Route4MeSDKTest/Examples/Routes/MergeRoutes.cs new file mode 100644 index 00000000..3b15cec3 --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/MergeRoutes.cs @@ -0,0 +1,31 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void MergeRoutes(string[] routeIds) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Run the query + string errorString; + route4Me.MergeRoutes(routeIds, out errorString); + + Console.WriteLine(""); + + if (errorString == "") + { + Console.WriteLine("MergeRoutes executed successfully, {0} routes merged", routeIds.Length); + Console.WriteLine(""); + } + else + { + Console.WriteLine("MergeRoutes error {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Routes/ReoptimizeRoute.cs b/Route4MeSDKTest/Examples/Routes/ReoptimizeRoute.cs new file mode 100644 index 00000000..fd37f0b2 --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/ReoptimizeRoute.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + /// + /// Update Route Parameters + /// + public sealed partial class Route4MeExamples + { + public void ReoptimizeRoute(string routeId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + RouteParametersQuery routeParameters = new RouteParametersQuery() + { + RouteId = routeId, + ReOptimize = true + }; + + // Run the query + string errorString; + DataObjectRoute dataObject = route4Me.UpdateRoute(routeParameters, out errorString); + + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("ReoptimizeRoute executed successfully"); + + Console.WriteLine("Route ID: {0}", dataObject.RouteID); + Console.WriteLine("State: {0}", dataObject.State); + } + else + { + Console.WriteLine("ReoptimizeRoute error: {0}", errorString); + } + } + } +} + diff --git a/Route4MeSDKTest/Examples/Routes/ResequenceReoptimizeRoute.cs b/Route4MeSDKTest/Examples/Routes/ResequenceReoptimizeRoute.cs new file mode 100644 index 00000000..de1e8d96 --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/ResequenceReoptimizeRoute.cs @@ -0,0 +1,41 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + /// + /// Resequence/Reoprimize All Route Destinations + /// + public sealed partial class Route4MeExamples + { + public void ResequenceReoptimizeRoute(string routeId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + Dictionary roParameters = new Dictionary() + { + {"route_id","CA902292134DBC134EAF8363426BD247"}, + {"disable_optimization","0"}, + {"optimize","Distance"}, + }; + + // Run the query + string errorString; + bool result = route4Me.ResequenceReoptimizeRoute(roParameters, out errorString); + + Console.WriteLine(""); + + if (result) + { + Console.WriteLine("ResequenceReoptimizeRoute executed successfully"); + } + else + { + Console.WriteLine("ResequenceReoptimizeRoute error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Routes/RouteSharing.cs b/Route4MeSDKTest/Examples/Routes/RouteSharing.cs new file mode 100644 index 00000000..3826352f --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/RouteSharing.cs @@ -0,0 +1,39 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void RouteSharing(string routeId, string Email) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Example refers to the process of sharing a route by email + + // Run the query + RouteParametersQuery parameters = new RouteParametersQuery() + { + RouteId = routeId, + ResponseFormat = "json" + }; + + string errorString; + bool result = route4Me.RouteSharing(parameters, Email, out errorString); + + Console.WriteLine(""); + + if (result) + { + Console.WriteLine("RouteSharing executed successfully"); + } + else + { + Console.WriteLine("RouteSharing error {0}", errorString); + } + } + } +} + diff --git a/Route4MeSDKTest/Examples/Routes/SearchRoutesForText.cs b/Route4MeSDKTest/Examples/Routes/SearchRoutesForText.cs new file mode 100644 index 00000000..27ecbe50 --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/SearchRoutesForText.cs @@ -0,0 +1,44 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void SearchRoutesForText(string query) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Example refers to the process of searching for the specified text throughout all routes belonging to the user's account. + + RouteParametersQuery routeParameters = new RouteParametersQuery() + { + Query = query + }; + + // Run the query + string errorString; + DataObjectRoute[] dataObjects = route4Me.GetRoutes(routeParameters, out errorString); + + Console.WriteLine(""); + + if (dataObjects != null) + { + Console.WriteLine("SearchRoutesForText executed successfully, {0} routes returned", dataObjects.Length); + Console.WriteLine(""); + + dataObjects.ForEach(dataObject => + { + Console.WriteLine("RouteID: {0}", dataObject.RouteID); + Console.WriteLine(""); + }); + } + else + { + Console.WriteLine("SearchRoutesForText error {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Routes/UpdateRoute.cs b/Route4MeSDKTest/Examples/Routes/UpdateRoute.cs new file mode 100644 index 00000000..51b47053 --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/UpdateRoute.cs @@ -0,0 +1,48 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + /// + /// Update Route Parameters + /// + public sealed partial class Route4MeExamples + { + public void UpdateRoute(string routeId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + RouteParameters parametersNew = new RouteParameters() + { + RouteName = "New name of the route" + }; + + RouteParametersQuery routeParameters = new RouteParametersQuery() + { + RouteId = routeId, + Parameters = parametersNew + }; + + // Run the query + string errorString; + DataObjectRoute dataObject = route4Me.UpdateRoute(routeParameters, out errorString); + + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("UpdateRoute executed successfully"); + + Console.WriteLine("Route ID: {0}", dataObject.RouteID); + Console.WriteLine("State: {0}", dataObject.State); + } + else + { + Console.WriteLine("UpdateRoute error: {0}", errorString); + } + } + } +} + diff --git a/Route4MeSDKTest/Examples/Routes/UpdateRouteCustomData.cs b/Route4MeSDKTest/Examples/Routes/UpdateRouteCustomData.cs new file mode 100644 index 00000000..465953b0 --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/UpdateRouteCustomData.cs @@ -0,0 +1,41 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void UpdateRouteCustomData(string routeId, int routeDestionationId, Dictionary CustomData) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // The example refers to the process of updating a route by sending custom data of an address with HTTP PUT method. + + // Run the query + RouteParametersQuery parameters = new RouteParametersQuery() + { + RouteId = routeId, + RouteDestinationId = routeDestionationId + }; + + string errorString; + Address result = route4Me.UpdateRouteCustomData(parameters, CustomData, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("UpdateRouteCustomData executed successfully"); + Console.WriteLine("Route ID: {0}", result.RouteId); + Console.WriteLine("Route Destination ID: {0}", result.RouteDestinationId); + } + else + { + Console.WriteLine("UpdateRouteCustomData error {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Routes/UpdateRouteDestination.cs b/Route4MeSDKTest/Examples/Routes/UpdateRouteDestination.cs new file mode 100644 index 00000000..f7e166e3 --- /dev/null +++ b/Route4MeSDKTest/Examples/Routes/UpdateRouteDestination.cs @@ -0,0 +1,76 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void UpdateRouteDestination() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager("11111111111111111111111111111111"); + + // The example refers to the process of updating many parameters simultaneously of the route destination by sending the HTTP parameters. + + string routeId = "824CA521E3A8DE9F1C684C8BAE90CF07"; + int routeDestionationId = 217393034; + + Dictionary CustomData = new Dictionary(); + CustomData.Add("BatchId", "e7c672b1-a356-4a97-803e-97db88fdcf99"); + CustomData.Add("CustomerNumber", "2718500"); + CustomData.Add("DeliveryId", "2c71f6d9-c1aa-4672-a682-3e9f12badac9"); + CustomData.Add("DeliveryInvoices", "\u000d\u000a\u000d\u000a\u000d\u000a \u000d\u000a 999999\u000d\u000a \u000d\u000a 1790908\u000d\u000a \u000d\u000a false\u000d\u000a false\u000d\u000a true\u000d\u000a false\u000d\u000a false\u000d\u000a \u000d\u000a"); + CustomData.Add("DeliveryNotes", ""); + CustomData.Add("RouteId", "20191"); + + // Run the query + RouteParametersQuery routeParameters = new RouteParametersQuery() + { + RouteId = routeId + }; + + string errorString; + DataObjectRoute dataObject = route4Me.GetRoute(routeParameters, out errorString); + + foreach (Address oAddress in dataObject.Addresses) + { + if (oAddress.RouteDestinationId == routeDestionationId) + { + RouteParametersQuery routeParams = new RouteParametersQuery() + { + RouteId = routeId, + RouteDestinationId = oAddress.ContactId + }; + oAddress.Alias = "Steele's - MONTICELLO"; + oAddress.Cost = 5; + oAddress.InvoiceNo = 945825; + // etc fill the necessary address parameters + oAddress.CustomFields = CustomData; + + errorString = ""; + Address address = route4Me.UpdateRouteDestination(oAddress, out errorString); + + Console.WriteLine(""); + + if (address != null) + { + Console.WriteLine("UpdateRouteDestination executed successfully"); + Console.WriteLine("Alias {0}", address.Alias); + Console.WriteLine("Cost {0}", address.Cost); + Console.WriteLine("InvoiceNo {0}", address.InvoiceNo); + foreach (KeyValuePair kvpair in address.CustomFields) + { + Console.WriteLine(kvpair.Key + ": " + kvpair.Value); + } + } + else + { + Console.WriteLine("UpdateRouteDestination error {0}", errorString); + } + } + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Territories/CreatePolygonTerritory.cs b/Route4MeSDKTest/Examples/Territories/CreatePolygonTerritory.cs new file mode 100644 index 00000000..f54480b8 --- /dev/null +++ b/Route4MeSDKTest/Examples/Territories/CreatePolygonTerritory.cs @@ -0,0 +1,56 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Create Territory with Polygon Shape + /// + public void CreatePolygonTerritory() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AvoidanceZoneParameters territoryParameters = new AvoidanceZoneParameters + { + TerritoryName = "Test Territory", + TerritoryColor = "ff0000", + Territory = new Territory + { + Type = TerritoryType.Poly.Description(), + Data = new string[] { + "37.569752822786455,-77.47833251953125", + "37.75886716305343,-77.68974800109863", + "37.74763966054455,-77.6917221069336", + "37.74655084306813,-77.68863220214844", + "37.7502255383101,-77.68125076293945", + "37.74797991274437,-77.67498512268066", + "37.73327960206065,-77.6411678314209", + "37.74430510679532,-77.63172645568848", + "37.76641925847049,-77.66846199035645" + } + } + }; + + // Run the query + string errorString = ""; + AvoidanceZone territory = route4Me.CreateTerritory(territoryParameters, out errorString); + + Console.WriteLine(""); + + if (territory != null) + { + Console.WriteLine("CreatePolygonTerritory executed successfully"); + + Console.WriteLine("Territory ID: {0}", territory.TerritoryId); + } + else + { + Console.WriteLine("CreatePolygonTerritory error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Territories/CreateRectTerritory.cs b/Route4MeSDKTest/Examples/Territories/CreateRectTerritory.cs new file mode 100644 index 00000000..e1899b91 --- /dev/null +++ b/Route4MeSDKTest/Examples/Territories/CreateRectTerritory.cs @@ -0,0 +1,48 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Create Territory with Rectangular Shape + /// + public void CreateRectTerritory() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AvoidanceZoneParameters territoryParameters = new AvoidanceZoneParameters + { + TerritoryName = "Test Territory", + TerritoryColor = "ff0000", + Territory = new Territory + { + Type = TerritoryType.Rect.Description(), + Data = new string[] { + "43.51668853502909,-109.3798828125", + "46.98025235521883,-101.865234375" + } + } + }; + + // Run the query + string errorString = ""; + AvoidanceZone territory = route4Me.CreateTerritory(territoryParameters, out errorString); + + Console.WriteLine(""); + + if (territory != null) + { + Console.WriteLine("CreateRectTerritory executed successfully"); + Console.WriteLine("Territory ID: {0}", territory.TerritoryId); + } + else + { + Console.WriteLine("CreateRectTerritory error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Territories/CreateTerritory.cs b/Route4MeSDKTest/Examples/Territories/CreateTerritory.cs new file mode 100644 index 00000000..27719c0b --- /dev/null +++ b/Route4MeSDKTest/Examples/Territories/CreateTerritory.cs @@ -0,0 +1,49 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Create Territory with Circular Shape + /// + public void CreateTerritory() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AvoidanceZoneParameters territoryParameters = new AvoidanceZoneParameters + { + TerritoryName = "Test Territory", + TerritoryColor = "ff0000", + Territory = new Territory + { + Type = TerritoryType.Circle.Description(), + Data = new string[] { + "37.569752822786455,-77.47833251953125", + "5000" + } + } + }; + + // Run the query + string errorString = ""; + AvoidanceZone territory = route4Me.CreateTerritory(territoryParameters, out errorString); + + Console.WriteLine(""); + + if (territory != null) + { + Console.WriteLine("CreateTerritory executed successfully"); + + Console.WriteLine("Territory ID: {0}", territory.TerritoryId); + } + else + { + Console.WriteLine("CreateTerritory error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Territories/GetTerritories.cs b/Route4MeSDKTest/Examples/Territories/GetTerritories.cs new file mode 100644 index 00000000..09acc7f9 --- /dev/null +++ b/Route4MeSDKTest/Examples/Territories/GetTerritories.cs @@ -0,0 +1,37 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Territories + /// + public void GetTerritories() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + AvoidanceZoneQuery territoryQuery = new AvoidanceZoneQuery(); + + // Run the query + string errorString = ""; + AvoidanceZone[] territories = route4Me.GetTerritories(territoryQuery, out errorString); + + Console.WriteLine(""); + + if (territories != null) + { + Console.WriteLine("GetTerritories executed successfully"); + + Console.WriteLine("GetAvoidanceZones executed successfully, {0} territories returned", territories.Length); + } + else + { + Console.WriteLine("GetTerritories error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Territories/GetTerritory.cs b/Route4MeSDKTest/Examples/Territories/GetTerritory.cs new file mode 100644 index 00000000..1cf1453c --- /dev/null +++ b/Route4MeSDKTest/Examples/Territories/GetTerritory.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Territory + /// + public void GetTerritory() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + string territoryId = "596A2A44FE9FB19EEB9C3C072BF2D0BE"; + + TerritoryQuery territoryQuery1 = new TerritoryQuery + { + TerritoryId = territoryId, + addresses = 1 + }; + + // Run the query + string errorString = ""; + TerritoryZone territory = route4Me.GetTerritory(territoryQuery1, out errorString); + + Console.WriteLine(""); + + if (territory != null) + { + Console.WriteLine("GetTerritory executed successfully"); + + Console.WriteLine("Territory ID: {0}", territory.TerritoryId); + } + else + { + Console.WriteLine("GetTerritory error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Territories/RemoveTerritory.cs b/Route4MeSDKTest/Examples/Territories/RemoveTerritory.cs new file mode 100644 index 00000000..3276e2ab --- /dev/null +++ b/Route4MeSDKTest/Examples/Territories/RemoveTerritory.cs @@ -0,0 +1,39 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Remove Territory + /// + public void RemoveTerritory() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + string territoryId = "12ABBFA3B5E4FB007BB0ED73291576C2"; + + AvoidanceZoneQuery territoryQuery = new AvoidanceZoneQuery { TerritoryId = territoryId }; + + // Run the query + string errorString = ""; + route4Me.RemoveTerritory(territoryQuery, out errorString); + + Console.WriteLine(""); + + if (string.IsNullOrEmpty(errorString)) + { + Console.WriteLine("RemoveTerritory executed successfully"); + + Console.WriteLine("Territory ID: {0}", territoryId); + } + else + { + Console.WriteLine("RemoveTerritory error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Territories/UpdateTerritory.cs b/Route4MeSDKTest/Examples/Territories/UpdateTerritory.cs new file mode 100644 index 00000000..fc8e0750 --- /dev/null +++ b/Route4MeSDKTest/Examples/Territories/UpdateTerritory.cs @@ -0,0 +1,51 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Update Territory + /// + public void UpdateTerritory() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + string territoryId = "1CEFEC7568D900FB781C21603780775E"; + + AvoidanceZoneParameters territoryParameters = new AvoidanceZoneParameters + { + TerritoryId = territoryId, + TerritoryName = "Test Territory Updated", + TerritoryColor = "ff0000", + Territory = new Territory + { + Type = TerritoryType.Circle.Description(), + Data = new string[] { + "37.569752822786455,-77.47833251953125", + "6000" + } + } + }; + + // Run the query + string errorString = ""; + AvoidanceZone territory = route4Me.UpdateTerritory(territoryParameters, out errorString); + + Console.WriteLine(""); + + if (territory != null) + { + Console.WriteLine("UpdateTerritory executed successfully"); + Console.WriteLine("Territory ID: {0}", territory.TerritoryId); + } + else + { + Console.WriteLine("UpdateTerritory error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Tracking/FindAsset.cs b/Route4MeSDKTest/Examples/Tracking/FindAsset.cs new file mode 100644 index 00000000..c0af6b04 --- /dev/null +++ b/Route4MeSDKTest/Examples/Tracking/FindAsset.cs @@ -0,0 +1,54 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Find Asset (Asset tracking) + /// + public void FindAsset() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + string tracking = "Q7G9P1L9"; + // Run the query + string errorString = ""; + FindAssetResponse result = route4Me.FindAsset(tracking, out errorString); + DateTime nDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("FindAsset executed successfully"); + Console.WriteLine("tracking_number: " + result.TrackingNumber); + foreach (FindAssetResponseLocations loc1 in result.Locations) + { + Console.WriteLine("lat: " + loc1.Latitude); + Console.WriteLine("lng: " + loc1.Longitude); + Console.WriteLine("icon: " + loc1.Icon); + } + + foreach (KeyValuePair kvp in result.CustomData) + { + Console.WriteLine(kvp.Key + ": " + kvp.Value); + } + + foreach (FindAssetResponseArrival arriv1 in result.Arrival) + { + Console.WriteLine("from_unix_timestamp: " + nDateTime.AddSeconds(arriv1.FromUnixTimestamp>=0 ? (double)arriv1.FromUnixTimestamp : 0)); + Console.WriteLine("to_unix_timestamp: " + nDateTime.AddSeconds(arriv1.ToUnixTimestamp>=0 ? (double)arriv1.ToUnixTimestamp : 0)); + } + Console.WriteLine("delivered: " + result.Delivered); + Console.WriteLine("---------------------------"); + } + else + { + Console.WriteLine("FindAsset error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Tracking/GetDeviceHistoryTimeRange.cs b/Route4MeSDKTest/Examples/Tracking/GetDeviceHistoryTimeRange.cs new file mode 100644 index 00000000..674a0722 --- /dev/null +++ b/Route4MeSDKTest/Examples/Tracking/GetDeviceHistoryTimeRange.cs @@ -0,0 +1,75 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; +using System.Collections.Generic; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get Device History from Time Range + /// + public void GetDeviceHistoryTimeRange(string routeId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + int uStartTime = 0; + int uEndTime = 0; + uStartTime = (int)(new DateTime(2016, 10, 20, 0, 0, 0) - (new DateTime(1970, 1, 1, 0, 0, 0))).TotalSeconds; + uEndTime = (int)(new DateTime(2016, 10, 26, 23, 59, 59) - (new DateTime(1970, 1, 1, 0, 0, 0))).TotalSeconds; + + GPSParameters gpsParameters = new GPSParameters + { + Format = "csv", + RouteId = routeId, + time_period = "custom", + start_date = uStartTime, + end_date = uEndTime + }; + + string errorString = ""; + string response = route4Me.SetGPS(gpsParameters, out errorString); + + if (!string.IsNullOrEmpty(errorString)) + { + Console.WriteLine("SetGps error: {0}", errorString); + return; + } + + Console.WriteLine("SetGps response: {0}", response); + + GenericParameters genericParameters = new GenericParameters(); + genericParameters.ParametersCollection.Add("route_id", routeId); + genericParameters.ParametersCollection.Add("device_tracking_history", "1"); + + var dataObject = route4Me.GetLastLocation(genericParameters, out errorString); + + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("GetDeviceHistoryTimeRange executed successfully"); + Console.WriteLine(""); + + Console.WriteLine("Optimization Problem ID: {0}", dataObject.OptimizationProblemId); + Console.WriteLine("State: {0}", dataObject.State); + Console.WriteLine(""); + foreach (TrackingHistory th in dataObject.TrackingHistory) + { + Console.WriteLine("Speed: {0}", th.Speed); + Console.WriteLine("Longitude: {0}", th.Longitude); + Console.WriteLine("Latitude: {0}", th.Latitude); + Console.WriteLine("Time Stamp: {0}", th.TimeStampFriendly); + Console.WriteLine(""); + } + } + else + { + Console.WriteLine("GetDeviceHistoryTimeRange error: {0}", errorString); + } + } + } +} + diff --git a/Route4MeSDKTest/Examples/Tracking/SetGPSPosition.cs b/Route4MeSDKTest/Examples/Tracking/SetGPSPosition.cs new file mode 100755 index 00000000..b2a10ab7 --- /dev/null +++ b/Route4MeSDKTest/Examples/Tracking/SetGPSPosition.cs @@ -0,0 +1,44 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void SetGPSPosition(string routeId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Create the gps parametes + GPSParameters gpsParameters = new GPSParameters() + { + Format = Format.Csv.Description(), + RouteId = routeId, + Latitude = 33.14384, + Longitude = -83.22466, + Course = 1, + Speed = 120, + DeviceType = DeviceType.IPhone.Description(), + MemberId = 1, + DeviceGuid = "TEST_GPS", + DeviceTimestamp = "2014-06-14 17:43:35" + }; + + string errorString; + string response = route4Me.SetGPS(gpsParameters, out errorString); + + Console.WriteLine(""); + + if (string.IsNullOrEmpty(errorString)) + { + Console.WriteLine("SetGps response: {0}", response); + } + else + { + Console.WriteLine("SetGps error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Tracking/TrackDeviceLastLocationHistory.cs b/Route4MeSDKTest/Examples/Tracking/TrackDeviceLastLocationHistory.cs new file mode 100755 index 00000000..cbf42570 --- /dev/null +++ b/Route4MeSDKTest/Examples/Tracking/TrackDeviceLastLocationHistory.cs @@ -0,0 +1,72 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void TrackDeviceLastLocationHistory(string routeId) + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + // Create the gps parametes + GPSParameters gpsParameters = new GPSParameters() + { + Format = Format.Csv.Description(), + RouteId = routeId, + Latitude = 33.14384, + Longitude = -83.22466, + Course = 1, + Speed = 120, + DeviceType = DeviceType.IPhone.Description(), + MemberId = 1, + DeviceGuid = "TEST_GPS", + DeviceTimestamp = "2014-06-14 17:43:35" + }; + + string errorString; + string response = route4Me.SetGPS(gpsParameters, out errorString); + + if (!string.IsNullOrEmpty(errorString)) + { + Console.WriteLine("SetGps error: {0}", errorString); + return; + } + + Console.WriteLine("SetGps response: {0}", response); + + GenericParameters genericParameters = new GenericParameters(); + genericParameters.ParametersCollection.Add("route_id", routeId); + genericParameters.ParametersCollection.Add("device_tracking_history", "1"); + + var dataObject = route4Me.GetLastLocation(genericParameters, out errorString); + + Console.WriteLine(""); + + if (dataObject != null) + { + Console.WriteLine("TrackDeviceLastLocationHistory executed successfully"); + Console.WriteLine(""); + + Console.WriteLine("Optimization Problem ID: {0}", dataObject.OptimizationProblemId); + Console.WriteLine("State: {0}", dataObject.State); + Console.WriteLine(""); + + dataObject.TrackingHistory.ForEach(th => + { + Console.WriteLine("Speed: {0}", th.Speed); + Console.WriteLine("Longitude: {0}", th.Longitude); + Console.WriteLine("Latitude: {0}", th.Latitude); + Console.WriteLine("Time Stamp: {0}", th.TimeStampFriendly); + Console.WriteLine(""); + }); + } + else + { + Console.WriteLine("TrackDeviceLastLocationHistory error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Users/CreateUser.cs b/Route4MeSDKTest/Examples/Users/CreateUser.cs new file mode 100644 index 00000000..6a8db001 --- /dev/null +++ b/Route4MeSDKTest/Examples/Users/CreateUser.cs @@ -0,0 +1,54 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// User Registration (v4) + /// + public void CreateUser() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberParametersV4 @params = new MemberParametersV4 + { + HIDE_ROUTED_ADDRESSES = false, + member_phone = "571-259-5939", + member_zipcode = "22102", + member_email = "skrynkovskyy+newdispatcher@gmail.com", + HIDE_VISITED_ADDRESSES = false, + READONLY_USER = false, + member_type = "SUB_ACCOUNT_DISPATCHER", + date_of_birth = "2010", + member_first_name = "Clay", + member_password = "123456", + HIDE_NONFUTURE_ROUTES = false, + member_last_name = "Abraham", + SHOW_ALL_VEHICLES = false, + SHOW_ALL_DRIVERS = false + }; + + // Run the query + string errorString = ""; + MemberResponseV4 result = route4Me.CreateUser(@params, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("UserRegistration executed successfully"); + Console.WriteLine("User: " + result.member_first_name + " " + result.member_last_name); + Console.WriteLine("member_id: " + result.member_id); + Console.WriteLine("---------------------------"); + } + else + { + Console.WriteLine("UserRegistration error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Users/DeleteUser.cs b/Route4MeSDKTest/Examples/Users/DeleteUser.cs new file mode 100644 index 00000000..c6469468 --- /dev/null +++ b/Route4MeSDKTest/Examples/Users/DeleteUser.cs @@ -0,0 +1,36 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Remove User + /// + public void DeleteUser() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberParametersV4 @params = new MemberParametersV4 { member_id = 147824 }; + + // Run the query + string errorString = ""; + bool result = route4Me.UserDelete(@params, out errorString); + + Console.WriteLine(""); + + if (result) + { + Console.WriteLine("DeleteUser executed successfully"); + Console.WriteLine("---------------------------"); + } + else + { + Console.WriteLine("DeleteUser error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Users/GetUserById.cs b/Route4MeSDKTest/Examples/Users/GetUserById.cs new file mode 100644 index 00000000..62a2f65b --- /dev/null +++ b/Route4MeSDKTest/Examples/Users/GetUserById.cs @@ -0,0 +1,38 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Get User By ID + /// + public void GetUserById() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberParametersV4 @params = new MemberParametersV4 { member_id = 45844 }; + + // Run the query + string errorString = ""; + MemberResponseV4 result = route4Me.GetUserById(@params, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("GetUserById executed successfully"); + Console.WriteLine("User: " + result.member_first_name + " " + result.member_last_name); + Console.WriteLine("member_id: " + result.member_id); + Console.WriteLine("---------------------------"); + } + else + { + Console.WriteLine("GetUserById error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Users/GetUsers.cs b/Route4MeSDKTest/Examples/Users/GetUsers.cs new file mode 100644 index 00000000..4f85bd31 --- /dev/null +++ b/Route4MeSDKTest/Examples/Users/GetUsers.cs @@ -0,0 +1,40 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + public void GetUsers() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + GenericParameters parameters = new GenericParameters() + { + }; + + // Run the query + string errorString; + User[] dataObjects = route4Me.GetUsers(parameters, out errorString); + + Console.WriteLine(""); + + if (dataObjects != null) + { + Console.WriteLine("GetUsers executed successfully, {0} users returned", dataObjects.Length); + Console.WriteLine(""); + + //dataObjects.ForEach(user => + //{ + // Console.WriteLine("User ID: {0}", user.MemberId); + //}); + } + else + { + Console.WriteLine("GetUsers error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Users/UpdateUser.cs b/Route4MeSDKTest/Examples/Users/UpdateUser.cs new file mode 100644 index 00000000..de3ef326 --- /dev/null +++ b/Route4MeSDKTest/Examples/Users/UpdateUser.cs @@ -0,0 +1,42 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Update an User + /// + public void UpdateUser() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberParametersV4 @params = new MemberParametersV4 + { + member_id = 220461, + member_phone = "571-259-5939" + }; + + // Run the query + string errorString = ""; + MemberResponseV4 result = route4Me.UserUpdate(@params, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("UpdateUser executed successfully"); + Console.WriteLine("status: " + result.member_first_name + " " + result.member_last_name); + Console.WriteLine("member_id: " + result.member_id); + Console.WriteLine("---------------------------"); + } + else + { + Console.WriteLine("UpdateUser error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Users/UserAuthentication.cs b/Route4MeSDKTest/Examples/Users/UserAuthentication.cs new file mode 100644 index 00000000..2d55e45d --- /dev/null +++ b/Route4MeSDKTest/Examples/Users/UserAuthentication.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// User Authetntication + /// + public void UserAuthentication() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberParameters @params = new MemberParameters + { + StrEmail = "demo333@yahoo.com", + StrPassword = "1111111", + Format = "json" + }; + // Run the query + string errorString = ""; + MemberResponse result = route4Me.UserAuthentication(@params, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("UserAuthentication executed successfully"); + Console.WriteLine("status: " + result.Status); + Console.WriteLine("api_key: " + result.ApiKey); + Console.WriteLine("member_id: " + result.MemberId); + Console.WriteLine("---------------------------"); + } + else + { + Console.WriteLine("UserAuthentication error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Examples/Users/UserRegistration.cs b/Route4MeSDKTest/Examples/Users/UserRegistration.cs new file mode 100644 index 00000000..d2def71c --- /dev/null +++ b/Route4MeSDKTest/Examples/Users/UserRegistration.cs @@ -0,0 +1,51 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// User Registration + /// + public void UserRegistration() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberParameters @params = new MemberParameters + { + StrEmail = "thewelco@gmail.com", + StrPassword_1 = "11111111", + StrPassword_2 = "11111111", + StrFirstName = "Olman", + StrLastName = "Progman", + StrIndustry = "Transportation", + Format = "json", + ChkTerms = 1, + DeviceType = "web", + Plan = "free", + MemberType = 5 + }; + // Run the query + string errorString = ""; + MemberResponse result = route4Me.UserRegistration(@params, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("UserRegistration executed successfully"); + Console.WriteLine("status: " + result.Status); + Console.WriteLine("api_key: " + result.ApiKey); + Console.WriteLine("member_id: " + result.MemberId); + Console.WriteLine("---------------------------"); + } + else + { + Console.WriteLine("UserRegistration error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Users/ValidateSession.cs b/Route4MeSDKTest/Examples/Users/ValidateSession.cs new file mode 100644 index 00000000..2b6ad6c3 --- /dev/null +++ b/Route4MeSDKTest/Examples/Users/ValidateSession.cs @@ -0,0 +1,43 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// Validate Session + /// + public void ValidateSession() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + MemberParameters @params = new MemberParameters + { + SessionGuid = "ad9001f33ed6875b5f0e75bce52cbc34", + MemberId = 1, + Format = "json" + }; + // Run the query + string errorString = ""; + MemberResponse result = route4Me.ValidateSession(@params, out errorString); + + Console.WriteLine(""); + + if (result != null) + { + Console.WriteLine("ValidateSession executed successfully"); + Console.WriteLine("status: " + result.Status); + Console.WriteLine("api_key: " + result.ApiKey); + Console.WriteLine("member_id: " + result.MemberId); + Console.WriteLine("---------------------------"); + } + else + { + Console.WriteLine("ValidateSession error: {0}", errorString); + } + } + } +} diff --git a/Route4MeSDKTest/Examples/Vehicles/GetVehicles.cs b/Route4MeSDKTest/Examples/Vehicles/GetVehicles.cs new file mode 100644 index 00000000..b4208061 --- /dev/null +++ b/Route4MeSDKTest/Examples/Vehicles/GetVehicles.cs @@ -0,0 +1,47 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using System; + +namespace Route4MeSDK.Examples +{ + public sealed partial class Route4MeExamples + { + /// + /// GEt Vehicles List + /// + public void GetVehicles() + { + // Create the manager with the api key + Route4MeManager route4Me = new Route4MeManager(c_ApiKey); + + VehicleParameters vehicleParameters = new VehicleParameters + { + Limit = 10, + Offset = 0 + }; + + // Run the query + string errorString = ""; + VehicleResponse[] vehicles = route4Me.GetVehicles(vehicleParameters, out errorString); + + Console.WriteLine(""); + + if (vehicles != null) + { + Console.WriteLine("GetVehicles executed successfully, {0} vehicles returned", vehicles.Length); + Console.WriteLine(""); + + foreach (VehicleResponse vehicle in vehicles) + { + Console.WriteLine("Vehicle ID: {0}", vehicle.VehicleId); + } + + Console.WriteLine(""); + } + else + { + Console.WriteLine("GetVehicles error: {0}", errorString); + } + } + } +} \ No newline at end of file diff --git a/Route4MeSDKTest/Program.cs b/Route4MeSDKTest/Program.cs new file mode 100755 index 00000000..2e1d0ce1 --- /dev/null +++ b/Route4MeSDKTest/Program.cs @@ -0,0 +1,272 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.Examples; +using System; +using System.Collections.Generic; +using NUnit.Framework; + +namespace Route4MeSDKTest +{ + [TestFixture] + public class DumbTest + { + [Test] + public void TestNothing() + { + Assert.That(true, Is.True); + } + } + + internal sealed class Program + { + static void Main(string[] args) + { + + shortTest.TestRun(); + return; + + Route4MeExamples examples = new Route4MeExamples(); + + DataObject dataObject = null; + + DataObject dataObject1 = examples.SingleDriverRoute10Stops(); + dataObject = dataObject1; + DataObjectRoute routeSingleDriverRoute10Stops = (dataObject != null && dataObject.Routes != null && dataObject.Routes.Length > 0) ? dataObject.Routes[0] : null; + string routeId_SingleDriverRoute10Stops = (routeSingleDriverRoute10Stops != null) ? routeSingleDriverRoute10Stops.RouteID : null; + + if (routeSingleDriverRoute10Stops != null) + examples.ResequenceRouteDestinations(routeSingleDriverRoute10Stops); + else + System.Console.WriteLine("ResequenceRouteDestinations not called. routeSingleDriverRoute10Stops == null."); + + if (routeSingleDriverRoute10Stops != null) + examples.ResequenceReoptimizeRoute(routeId_SingleDriverRoute10Stops); + else + System.Console.WriteLine("ResequenceReoptimizeRoute not called. routeSingleDriverRoute10Stops == null."); + + int[] destinationIds = examples.AddRouteDestinations(routeId_SingleDriverRoute10Stops); + if (destinationIds != null && destinationIds.Length > 0) + { + examples.RemoveRouteDestination(routeId_SingleDriverRoute10Stops, destinationIds[0]); + } + + DataObject dataObject2 = examples.SingleDriverRoundTrip(); + dataObject = dataObject2; + string routeId_SingleDriverRoundTrip = (dataObject != null && dataObject.Routes != null && dataObject.Routes.Length > 0) ? dataObject.Routes[0].RouteID : null; + + string routeIdToMoveTo = routeId_SingleDriverRoundTrip; + int routeDestinationIdToMove = (dataObject1 != null && dataObject1.Routes != null && dataObject1.Routes.Length > 0 && dataObject1.Routes[0].Addresses.Length > 1 && dataObject1.Routes[0].Addresses[1].RouteDestinationId != null) ? dataObject1.Routes[0].Addresses[1].RouteDestinationId.Value : 0; + int afterDestinationIdToMoveAfter = (dataObject2 != null && dataObject2.Routes != null && dataObject2.Routes.Length > 0 && dataObject2.Routes[0].Addresses.Length > 1 && dataObject2.Routes[0].Addresses[0].RouteDestinationId != null) ? dataObject2.Routes[0].Addresses[0].RouteDestinationId.Value : 0; + if (routeIdToMoveTo != null && routeDestinationIdToMove != 0 && afterDestinationIdToMoveAfter != 0) + { + examples.MoveDestinationToRoute(routeIdToMoveTo, routeDestinationIdToMove, afterDestinationIdToMoveAfter); + } + else + { + System.Console.WriteLine("MoveDestinationToRoute not called. routeDestinationId = {0}, afterDestinationId = {1}.", routeDestinationIdToMove, afterDestinationIdToMoveAfter); + } + + string optimizationProblemID = examples.SingleDriverRoundTripGeneric(); + + dataObject = examples.MultipleDepotMultipleDriver(); + string routeId_MultipleDepotMultipleDriver = (dataObject != null && dataObject.Routes != null && dataObject.Routes.Length > 0) ? dataObject.Routes[0].RouteID : null; + + dataObject = examples.MultipleDepotMultipleDriverTimeWindow(); + string routeId_MultipleDepotMultipleDriverTimeWindow = (dataObject != null && dataObject.Routes != null && dataObject.Routes.Length > 0) ? dataObject.Routes[0].RouteID : null; + + dataObject = examples.SingleDepotMultipleDriverNoTimeWindow(); + string routeId_SingleDepotMultipleDriverNoTimeWindow = (dataObject != null && dataObject.Routes != null && dataObject.Routes.Length > 0) ? dataObject.Routes[0].RouteID : null; + + dataObject = examples.MultipleDepotMultipleDriverWith24StopsTimeWindow(); + string routeId_MultipleDepotMultipleDriverWith24StopsTimeWindow = (dataObject != null && dataObject.Routes != null && dataObject.Routes.Length > 0) ? dataObject.Routes[0].RouteID : null; + + dataObject = examples.SingleDriverMultipleTimeWindows(); + string routeId_SingleDriverMultipleTimeWindows = (dataObject != null && dataObject.Routes != null && dataObject.Routes.Length > 0) ? dataObject.Routes[0].RouteID : null; + + if (optimizationProblemID != null) + examples.GetOptimization(optimizationProblemID); + else + System.Console.WriteLine("GetOptimization not called. optimizationProblemID == null."); + + examples.GetOptimizations(); + + if (optimizationProblemID != null) + { + dataObject = examples.AddDestinationToOptimization(optimizationProblemID, true); + } + else + { + System.Console.WriteLine("AddDestinationToOptimization not called. optimizationProblemID == null."); + dataObject = null; + } + + if (optimizationProblemID != null) + { + Address destinationToRemove = (dataObject != null && dataObject.Addresses.Length > 0) ? dataObject.Addresses[dataObject.Addresses.Length - 1] : null; + if (destinationToRemove != null) + examples.RemoveDestinationFromOptimization(optimizationProblemID, destinationToRemove.RouteDestinationId.Value, false); + else + System.Console.WriteLine("RemoveDestinationFromOptimization not called. destinationToRemove == null."); + } + else + System.Console.WriteLine("RemoveDestinationFromOptimization not called. optimizationProblemID == null."); + + if (optimizationProblemID != null) + examples.ReOptimization(optimizationProblemID); + else + System.Console.WriteLine("ReOptimization not called. optimizationProblemID == null."); + + if (routeId_SingleDriverRoute10Stops != null) + { + examples.UpdateRoute(routeId_SingleDriverRoute10Stops); + examples.ReoptimizeRoute(routeId_SingleDriverRoute10Stops); + bool getRouteDirections = true; + bool getRoutePathPoints = true; + examples.GetRoute(routeId_SingleDriverRoute10Stops, getRouteDirections, getRoutePathPoints); + } + else + { + System.Console.WriteLine("UpdateRoute, ReoptimizeRoute, GetRoute not called. routeId_SingleDriverRoute10Stops == null."); + } + + examples.GetRoutes(); + examples.GetUsers(); + + if (routeId_SingleDriverRoute10Stops != null) + examples.LogCustomActivity("Test User Activity " + DateTime.Now.ToString(), routeId_SingleDriverRoute10Stops); + else + System.Console.WriteLine("LogCustomActivity not called. routeId_SingleDriverRoute10Stops == null."); + + if (routeId_SingleDriverRoute10Stops != null) + examples.GetActivities(routeId_SingleDriverRoute10Stops); + else + System.Console.WriteLine("GetActivities not called. routeId_SingleDriverRoute10Stops == null."); + + if (routeIdToMoveTo != null && routeDestinationIdToMove != 0) + { + examples.GetAddress(routeIdToMoveTo, routeDestinationIdToMove); + + examples.AddAddressNote(routeIdToMoveTo, routeDestinationIdToMove); + examples.AddAddressNoteWithFile(routeIdToMoveTo, routeDestinationIdToMove); + examples.GetAddressNotes(routeIdToMoveTo, routeDestinationIdToMove); + } + else + { + System.Console.WriteLine("AddAddressNote, GetAddress, GetAddressNotes not called. routeIdToMoveTo == null || routeDestinationIdToMove == 0."); + } + + string routeId_DuplicateRoute = null; + if (routeId_SingleDriverRoute10Stops != null) + routeId_DuplicateRoute = examples.DuplicateRoute(routeId_SingleDriverRoute10Stops); + else + System.Console.WriteLine("DuplicateRoute not called. routeId_SingleDriverRoute10Stops == null."); + + //disabled by default, not necessary for optimization tests + //not all accounts are capable of storing gps data + /*if (routeId_SingleDriverRoute10Stops != null) + { + examples.SetGPSPosition(routeId_SingleDriverRoute10Stops); + examples.TrackDeviceLastLocationHistory(routeId_SingleDriverRoute10Stops); + } + else + { + System.Console.WriteLine("SetGPSPosition, TrackDeviceLastLocationHistory not called. routeId_SingleDriverRoute10Stops == null."); + }*/ + + List routeIdsToDelete = new List(); + if (routeId_SingleDriverRoute10Stops != null) + routeIdsToDelete.Add(routeId_SingleDriverRoute10Stops); + if (routeId_SingleDriverRoundTrip != null) + routeIdsToDelete.Add(routeId_SingleDriverRoundTrip); + if (routeId_DuplicateRoute != null) + routeIdsToDelete.Add(routeId_DuplicateRoute); + if (routeId_MultipleDepotMultipleDriver != null) + routeIdsToDelete.Add(routeId_MultipleDepotMultipleDriver); + if (routeId_MultipleDepotMultipleDriverTimeWindow != null) + routeIdsToDelete.Add(routeId_MultipleDepotMultipleDriverTimeWindow); + if (routeId_SingleDepotMultipleDriverNoTimeWindow != null) + routeIdsToDelete.Add(routeId_SingleDepotMultipleDriverNoTimeWindow); + if (routeId_MultipleDepotMultipleDriverWith24StopsTimeWindow != null) + routeIdsToDelete.Add(routeId_MultipleDepotMultipleDriverWith24StopsTimeWindow); + if (routeId_SingleDriverMultipleTimeWindows != null) + routeIdsToDelete.Add(routeId_SingleDriverMultipleTimeWindows); + + if (routeIdsToDelete.Count > 0) + examples.DeleteRoutes(routeIdsToDelete.ToArray()); + else + System.Console.WriteLine("routeIdsToDelete.Count == 0. DeleteRoutes not called."); + + // Remove optimization + if (optimizationProblemID != null) + examples.RemoveOptimization(optimizationProblemID); + else + System.Console.WriteLine("RemoveOptimization not called. optimizationProblemID == null."); + + + // Address Book + AddressBookContact contact1 = examples.AddAddressBookContact(); + AddressBookContact contact2 = examples.AddAddressBookContact(); + examples.GetAddressBookContacts(); + if (contact1 != null) + { + contact1.last_name = "Updated " + (new Random()).Next().ToString(); + examples.UpdateAddressBookContact(contact1); + } + else + { + System.Console.WriteLine("contact1 == null. UpdateAddressBookContact not called."); + } + List addressIdsToRemove = new List(); + if (contact1 != null) + addressIdsToRemove.Add(contact1.address_id.ToString()); + if (contact2 != null) + addressIdsToRemove.Add(contact2.address_id.ToString()); + examples.RemoveAddressBookContacts(addressIdsToRemove.ToArray()); + + + // Avoidance Zones + string territoryId = examples.AddAvoidanceZone(); + examples.GetAvoidanceZones(); + if (territoryId != null) + examples.GetAvoidanceZone(territoryId); + else + System.Console.WriteLine("GetAvoidanceZone not called. territoryId == null."); + if (territoryId != null) + examples.UpdateAvoidanceZone(territoryId); + else + System.Console.WriteLine("UpdateAvoidanceZone not called. territoryId == null."); + if (territoryId != null) + examples.DeleteAvoidanceZone(territoryId); + else + System.Console.WriteLine("DeleteAvoidanceZone not called. territoryId == null."); + + + // Orders + Order order1 = examples.AddOrder(); + Order order2 = examples.AddOrder(); + examples.GetOrders(); + if (order1 != null) + { + order1.EXT_FIELD_last_name = "Updated " + (new Random()).Next().ToString(); + examples.UpdateOrder(order1); + } + else + { + System.Console.WriteLine("order1 == null. UpdateOrder not called."); + } + List orderIdsToRemove = new List(); + if (order1 != null) + orderIdsToRemove.Add(order1.order_id.ToString()); + if (order2 != null) + orderIdsToRemove.Add(order2.order_id.ToString()); + examples.RemoveOrders(orderIdsToRemove.ToArray()); + + + examples.GenericExample(); + examples.GenericExampleShortcut(); + + System.Console.WriteLine(""); + System.Console.WriteLine("Press any key"); + System.Console.ReadKey(); + } + } +} diff --git a/Route4MeSDKTest/Properties/AssemblyInfo.cs b/Route4MeSDKTest/Properties/AssemblyInfo.cs new file mode 100755 index 00000000..fc73e996 --- /dev/null +++ b/Route4MeSDKTest/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Route4MeSDKTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Route4MeSDKTest")] +[assembly: AssemblyCopyright("Copyright © 2009-2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("350e78e6-383e-4e4d-916d-f947d0dcf93a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Route4MeSDKTest/Properties/Resources.Designer.cs b/Route4MeSDKTest/Properties/Resources.Designer.cs new file mode 100644 index 00000000..1da9f715 --- /dev/null +++ b/Route4MeSDKTest/Properties/Resources.Designer.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18408 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Route4MeSDKTest.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Route4MeSDKTest.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap test { + get { + object obj = ResourceManager.GetObject("test", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Route4MeSDKTest/Properties/Resources.resx b/Route4MeSDKTest/Properties/Resources.resx new file mode 100644 index 00000000..3ac88b8c --- /dev/null +++ b/Route4MeSDKTest/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\test.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Route4MeSDKTest/Resources/test.png b/Route4MeSDKTest/Resources/test.png new file mode 100644 index 00000000..5da5984b Binary files /dev/null and b/Route4MeSDKTest/Resources/test.png differ diff --git a/Route4MeSDKTest/Route4MeSDKTest.csproj b/Route4MeSDKTest/Route4MeSDKTest.csproj new file mode 100644 index 00000000..674bd6d1 --- /dev/null +++ b/Route4MeSDKTest/Route4MeSDKTest.csproj @@ -0,0 +1,254 @@ + + + + + Debug + AnyCPU + {DBA0AA41-4223-4404-B3E6-4948FE147A40} + Exe + Properties + Route4MeSDKTest + Route4MeSDKTest + v4.5 + 512 + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\CsvHelper.2.16.3.0\lib\net45\CsvHelper.dll + True + + + + + + + + ..\packages\NUnit.3.6.0\lib\net45\nunit.framework.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + + + + + {37E5D3FC-BBF7-4BD8-98E6-A58DC9138D98} + Route4MeSDKLibrary + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + + + False + Microsoft .NET Framework 4.5 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + + + \ No newline at end of file diff --git a/Route4MeSDKTest/Route4MeSDKTest.csproj.user b/Route4MeSDKTest/Route4MeSDKTest.csproj.user new file mode 100644 index 00000000..18182982 --- /dev/null +++ b/Route4MeSDKTest/Route4MeSDKTest.csproj.user @@ -0,0 +1,13 @@ + + + + publish\ + + + + + + en-US + false + + \ No newline at end of file diff --git a/Route4MeSDKTest/bin/Debug/CsvHelper.dll b/Route4MeSDKTest/bin/Debug/CsvHelper.dll new file mode 100644 index 00000000..0645170a Binary files /dev/null and b/Route4MeSDKTest/bin/Debug/CsvHelper.dll differ diff --git a/Route4MeSDKTest/bin/Debug/CsvHelper.xml b/Route4MeSDKTest/bin/Debug/CsvHelper.xml new file mode 100644 index 00000000..d987af92 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/CsvHelper.xml @@ -0,0 +1,3991 @@ + + + + CsvHelper + + + + + Represents errors that occur due to bad data. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The message that describes the error. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that + is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Creates CsvHelper classes. + + + + + Creates an . + + The text reader to use for the csv parser. + The configuration to use for the csv parser. + The created parser. + + + + Creates an . + + The text reader to use for the csv parser. + The created parser. + + + + Creates an . + + The text reader to use for the csv reader. + The configuration to use for the reader. + The created reader. + + + + Creates an . + + The text reader to use for the csv reader. + The created reader. + + + + Creates an . + + The parser used to create the reader. + The created reader. + + + + Creates an . + + The text writer to use for the csv writer. + The configuration to use for the writer. + The created writer. + + + + Creates an . + + The text writer to use for the csv writer. + The created writer. + + + + Represents errors that occur in CsvHelper. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The message that describes the error. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that + is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Represents an error caused because a field is missing + in the header while reading a CSV file. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The message that describes the error. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that + is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Parses a CSV file. + + + + + Gets the configuration. + + + + + Gets the field count. + + + + + Gets the character position that the parser is currently on. + + + + + Gets the byte position that the parser is currently on. + + + + + Gets the row of the CSV file that the parser is currently on. + This is the logical CSV row. + + + + + Gets the row of the CSV file that the parser is currently on. + This is the actual file row. + + + + + Gets the raw row for the current record that was parsed. + + + + + Creates a new parser using the given . + + The with the CSV file data. + + + + Creates a new parser using the given + and . + + The with the CSV file data. + The configuration. + + + + Reads a record from the CSV file. + + A of fields for the record read. + If there are no more records, null is returned. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + 2 + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + True if the instance needs to be disposed of. + + + + Checks if the instance has been disposed of. + + + + + + Adds the field to the current record. + + The record position to add the field to. + The field to add. + + + + Appends the current buffer data to the field. + + The field to append the current buffer to. + The start position in the buffer that the . + The length. + + + + Updates the byte position using the data from the reader buffer. + + The field start position. + The length. + + + + Reads the next line. + + The line separated into fields. + + + + Gets the current character from the buffer while + advancing the buffer if it ran out. + + The char that gets the read char set to. + The start position of the current field. + The start position of the raw field. + The field. + A value indicating if the previous char read was a delimiter. + The position in the record we are currently at. + The length of the field in the buffer. + A value indicating if the row is current a comment row. + A value indicating if this call is a peek. If true and the end of the record was found + no record handling will be done. + A value indicating if read a char was read. True if a char was read, otherwise false. + + + + Reads the Excel seperator and sets it to the delimiter. + + + + + Represents errors that occur while parsing a CSV file. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The message that describes the error. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that + is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Reads data that was parsed from . + + + + + Gets the configuration. + + + + + Gets the parser. + + + + + Gets the field headers. + + + + + Get the current record; + + + + + Gets the current row. + + + + + Creates a new CSV reader using the given and + as the default parser. + + The reader. + + + + Creates a new CSV reader using the given and + and as the default parser. + + The reader. + The configuration. + + + + Creates a new CSV reader using the given . + + The used to parse the CSV file. + + + + Reads the header field without reading the first row. + + True if there are more records, otherwise false. + + + + Advances the reader to the next record. + If HasHeaderRecord is true (true by default), the first record of + the CSV file will be automatically read in as the header record + and the second record will be returned. + + True if there are more records, otherwise false. + + + + Gets the raw field at position (column) index. + + The zero based index of the field. + The raw field. + + + + Gets the raw field at position (column) name. + + The named index of the field. + The raw field. + + + + Gets the raw field at position (column) name. + + The named index of the field. + The zero based index of the field. + The raw field. + + + + Gets the raw field at position (column) index. + + The zero based index of the field. + The raw field. + + + + Gets the raw field at position (column) name. + + The named index of the field. + The raw field. + + + + Gets the raw field at position (column) name and the index + instance of that field. The index is used when there are + multiple columns with the same header name. + + The named index of the field. + The zero based index of the instance of the field. + The raw field. + + + + Gets the field converted to using + the specified . + + The index of the field. + The used to convert the field to . + The field converted to . + + + + Gets the field converted to using + the specified . + + The named index of the field. + The used to convert the field to . + The field converted to . + + + + Gets the field converted to using + the specified . + + The named index of the field. + The zero based index of the instance of the field. + The used to convert the field to . + The field converted to . + + + + Gets the field converted to using + the specified . + + The type of the field. + The index of the field. + The field converted to . + + + + Gets the field converted to using + the specified . + + The type of the field. + The named index of the field. + The field converted to . + + + + Gets the field converted to using + the specified . + + The type of the field. + The named index of the field. + The zero based index of the instance of the field. + The field converted to . + + + + Gets the field converted to using + the specified . + + The type of the field. + The index of the field. + The used to convert the field to . + The field converted to . + + + + Gets the field converted to using + the specified . + + The type of the field. + The named index of the field. + The used to convert the field to . + The field converted to . + + + + Gets the field converted to using + the specified . + + The type of the field. + The named index of the field. + The zero based index of the instance of the field. + The used to convert the field to . + The field converted to . + + + + Gets the field converted to T at position (column) index. + + The of the field. + The zero based index of the field. + The field converted to T. + + + + Gets the field converted to T at position (column) name. + + The of the field. + The named index of the field. + The field converted to T. + + + + Gets the field converted to T at position + (column) name and the index instance of that field. The index + is used when there are multiple columns with the same header name. + + + The named index of the field. + The zero based index of the instance of the field. + + + + + Gets the field converted to T at position (column) index using + the given . + + The of the field. + The zero based index of the field. + The used to convert the field to T. + The field converted to T. + + + + Gets the field converted to T at position (column) name using + the given . + + The of the field. + The named index of the field. + The used to convert the field to T. + The field converted to T. + + + + Gets the field converted to T at position + (column) name and the index instance of that field. The index + is used when there are multiple columns with the same header name. + + + The named index of the field. + The zero based index of the instance of the field. + The used to convert the field to T. + The field converted to T. + + + + Gets the field converted to T at position (column) index using + the given . + + The of the field. + The used to convert the field to T. + The zero based index of the field. + The field converted to T. + + + + Gets the field converted to T at position (column) name using + the given . + + The of the field. + The used to convert the field to T. + The named index of the field. + The field converted to T. + + + + Gets the field converted to T at position + (column) name and the index instance of that field. The index + is used when there are multiple columns with the same header name. + + The of the field. + The used to convert the field to T. + The named index of the field. + The zero based index of the instance of the field. + The field converted to T. + + + + Gets the field converted to T at position (column) index. + + The of the field. + The zero based index of the field. + The field converted to type T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) name. + + The of the field. + The named index of the field. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position + (column) name and the index instance of that field. The index + is used when there are multiple columns with the same header name. + + + The named index of the field. + The zero based index of the instance of the field. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) index + using the specified . + + The of the field. + The zero based index of the field. + The used to convert the field to T. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) name + using the specified . + + The of the field. + The named index of the field. + The used to convert the field to T. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) name + using the specified . + + The of the field. + The named index of the field. + The zero based index of the instance of the field. + The used to convert the field to T. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) index + using the specified . + + The of the field. + The used to convert the field to T. + The zero based index of the field. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) name + using the specified . + + The of the field. + The used to convert the field to T. + The named index of the field. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) name + using the specified . + + The of the field. + The used to convert the field to T. + The named index of the field. + The zero based index of the instance of the field. + The field converted to T. + A value indicating if the get was successful. + + + + Determines whether the current record is empty. + A record is considered empty if all fields are empty. + + + true if [is record empty]; otherwise, false. + + + + + Gets the record converted into T. + + The of the record. + The record converted to T. + + + + Gets the record. + + The of the record. + The record. + + + + Gets all the records in the CSV file and + converts each to T. The Read method + should not be used when using this. + + The of the record. + An of records. + + + + Gets all the records in the CSV file and + converts each to T. The Read method + should not be used when using this. + + The of the record. + An of records. + + + + Clears the record cache for the given type. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + + + + Clears the record cache for the given type. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + The type to invalidate. + + + + Clears the record cache for all types. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + 2 + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + True if the instance needs to be disposed of. + + + + Checks if the instance has been disposed of. + + + + + + Checks if the reader has been read yet. + + + + + + Determines whether the current record is empty. + A record is considered empty if all fields are empty. + + True to check if the record + has been read, otherwise false. + + true if [is record empty]; otherwise, false. + + + + + Gets a function to test for an empty string. + Will check when making its decision. + + The function to test for an empty string. + + + + Gets the index of the field at name if found. + + The name of the field to get the index for. + The index of the field if there are multiple fields with the same name. + A value indicating if the call was initiated from a TryGet. + The index of the field if found, otherwise -1. + Thrown if there is no header record. + Thrown if there isn't a field with name. + + + + Gets the index of the field at name if found. + + The possible names of the field to get the index for. + The index of the field if there are multiple fields with the same name. + A value indicating if the call was initiated from a TryGet. + The index of the field if found, otherwise -1. + Thrown if there is no header record. + Thrown if there isn't a field with name. + + + + Parses the named indexes from the header record. + + + + + Checks if the current record should be skipped or not. + + true if the current record should be skipped, false otherwise. + + + + Creates the record for the given type. + + The type of record to create. + The created record. + + + + Creates the record for the given type. + + The type of record to create. + The created record. + + + + Gets the function delegate used to populate + a custom class object with data from the reader. + + The of object that is created + and populated. + The function delegate. + + + + Gets the function delegate used to populate + a custom class object with data from the reader. + + The of object that is created + and populated. + The function delegate. + + + + Creates the read record func for the given type if it + doesn't already exist. + + Type of the record. + + + + Creates the function for an object. + + The type of object to create the function for. + + + + Creates the function for a primitive. + + The type of the primitive to create the function for. + + + + Creates the property bindings for the given . + + The mapping to create the bindings for. + The type of record. + The bindings that will be added to from the mapping. + + + + Adds a for each property for it's field. + + The properties to add bindings for. + The bindings that will be added to from the properties. + + + + Determines if the property for the + can be read. + + The property map. + A value indicating of the property can be read. True if it can, otherwise false. + + + + Determines if the property for the + can be read. + + The reference map. + A value indicating of the property can be read. True if it can, otherwise false. + + + + Creates a dynamic object from the current record. + + The dynamic object. + + + + Represents errors that occur while reading a CSV file. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The message that describes the error. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that + is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Defines methods used to serialize data into a CSV file. + + + + + Gets the configuration. + + + + + Creates a new serializer using the given . + + The to write the CSV file data to. + + + + Creates a new serializer using the given + and . + + The to write the CSV file data to. + The configuration. + + + + Writes a record to the CSV file. + + The record to write. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + 2 + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + True if the instance needs to be disposed of. + + + + Checks if the instance has been disposed of. + + + + + + Used to write CSV files. + + + + + Gets the configuration. + + + + + Creates a new CSV writer using the given , + a default and + as the default serializer. + + The writer used to write the CSV file. + + + + Creates a new CSV writer using the given + and and + as the default serializer. + + The use to write the CSV file. + The configuration. + + + + Creates a new CSV writer using the given . + + The serializer. + + + + Writes the field to the CSV file. The field + may get quotes added to it. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The field to write. + + + + Writes the field to the CSV file. This will + ignore any need to quote and ignore the + + and just quote based on the shouldQuote + parameter. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The field to write. + True to quote the field, otherwise false. + + + + Writes the field to the CSV file. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The type of the field. + The field to write. + + + + Writes the field to the CSV file. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The type of the field. + The field to write. + The converter used to convert the field into a string. + + + + Writes the field to the CSV file + using the given . + When all fields are written for a record, + must be called + to complete writing of the current record. + + The type of the field. + The type of the converter. + The field to write. + + + + Writes the field to the CSV file. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The type of the field. + The field to write. + + + + Writes the field to the CSV file. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The type of the field. + The field to write. + The converter used to convert the field into a string. + + + + Ends writing of the current record + and starts a new record. This is used + when manually writing records with WriteField. + + + + + Write the Excel seperator record. + + + + + Writes the header record from the given properties. + + The type of the record. + + + + Writes the header record from the given properties. + + The type of the record. + + + + Writes the record to the CSV file. + + The type of the record. + The record to write. + + + + Writes the record to the CSV file. + + The type of the record. + The record to write. + + + + Writes the list of records to the CSV file. + + The list of records to write. + + + + Clears the record cache for the given type. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + The record type. + + + + Clears the record cache for the given type. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + The record type. + + + + Clears the record cache for all types. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + + + + Adds the properties from the mapping. This will recursively + traverse the mapping tree and add all properties for + reference maps. + + The properties to be added to. + The mapping where the properties are added from. + + + + Creates a property expression for the given property on the record. + This will recursively traverse the mapping to find the property + and create a safe property accessor for each level as it goes. + + The current property expression. + The mapping to look for the property to map on. + The property map to look for on the mapping. + An Expression to access the given property. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + 2 + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + True if the instance needs to be disposed of. + + + + Checks if the instance has been disposed of. + + + + + + Gets the action delegate used to write the custom + class object to the writer. + + The type of the custom class being written. + The action delegate. + + + + Gets the action delegate used to write the custom + class object to the writer. + + The type of the custom class being written. + The action delegate. + + + + Creates the write record action for the given type if it + doesn't already exist. + + The type of the custom class being written. + + + + Creates the action for an object. + + The type of object to create the action for. + + + + Creates the action for a primitive. + + The type of primitive to create the action for. + + + + Combines the delegates into a single multicast delegate. + This is needed because Silverlight doesn't have the + Delegate.Combine( params Delegate[] ) overload. + + The delegates to combine. + A multicast delegate combined from the given delegates. + + + + Checks if the property can be written. + + The property map that we are checking. + A value indicating if the property can be written. + True if the property can be written, otherwise false. + + + + Represents errors that occur while writing a CSV file. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The message that describes the error. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that + is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Common exception tasks. + + + + + Adds CsvHelper specific information to . + + The exception to add the info to. + The parser. + The type of object that was being created in the . + The named indexes in the . + The current index of the . + The current record of the . + + + + Gets CsvHelper information to be added to an exception. + + The parser. + The type of object that was being created in the . + The named indexes in the . + The current index of the . + The current record of the . + The CsvHelper information. + + + + Defines methods used to create + CsvHelper classes. + + + + + Creates an . + + The text reader to use for the csv parser. + The configuration to use for the csv parser. + The created parser. + + + + Creates an . + + The text reader to use for the csv parser. + The created parser. + + + + Creates an . + + The text reader to use for the csv reader. + The configuration to use for the reader. + The created reader. + + + + Creates an . + + The text reader to use for the csv reader. + The created reader. + + + + Creates an . + + The parser used to create the reader. + The created reader. + + + + Creates an . + + The text writer to use for the csv writer. + The configuration to use for the writer. + The created writer. + + + + Creates an . + + The text writer to use for the csv writer. + The created writer. + + + + Defines methods used the parse a CSV file. + + + + + Gets the configuration. + + + + + Gets the field count. + + + + + Gets the character position that the parser is currently on. + + + + + Gets the byte position that the parser is currently on. + + + + + Gets the row of the CSV file that the parser is currently on. + + + + + Gets the raw row for the current record that was parsed. + + + + + Reads a record from the CSV file. + + A of fields for the record read. + + + + Defines methods used to read parsed data + from a CSV file. + + + + + Gets or sets the configuration. + + + + + Gets the parser. + + + + + Gets the field headers. + + + + + Reads the header field without reading the first row. + + True if there are more records, otherwise false. + + + + Advances the reader to the next record. If the header hasn't been read + yet, it'll automatically be read along with the first record. + + True if there are more records, otherwise false. + + + + Defines methods used to read parsed data + from a CSV file row. + + + + + Get the current record; + + + + + Gets the current row. + + + + + Gets the raw field at position (column) index. + + The zero based index of the field. + The raw field. + + + + Gets the raw field at position (column) name. + + The named index of the field. + The raw field. + + + + Gets the raw field at position (column) name. + + The named index of the field. + The zero based index of the field. + The raw field. + + + + Gets the raw field at position (column) index. + + The zero based index of the field. + The raw field. + + + + Gets the raw field at position (column) name. + + The named index of the field. + The raw field. + + + + Gets the raw field at position (column) name and the index + instance of that field. The index is used when there are + multiple columns with the same header name. + + The named index of the field. + The zero based index of the instance of the field. + The raw field. + + + + Gets the field converted to using + the specified . + + The type of the field. + The index of the field. + The field converted to . + + + + Gets the field converted to using + the specified . + + The type of the field. + The named index of the field. + The field converted to . + + + + Gets the field converted to using + the specified . + + The type of the field. + The named index of the field. + The zero based index of the instance of the field. + The field converted to . + + + + Gets the field converted to using + the specified . + + The type of the field. + The index of the field. + The used to convert the field to . + The field converted to . + + + + Gets the field converted to using + the specified . + + The type of the field. + The named index of the field. + The used to convert the field to . + The field converted to . + + + + Gets the field converted to using + the specified . + + The type of the field. + The named index of the field. + The zero based index of the instance of the field. + The used to convert the field to . + The field converted to . + + + + Gets the field converted to T at position (column) index. + + The of the field. + The zero based index of the field. + The field converted to T. + + + + Gets the field converted to T at position (column) name. + + The of the field. + The named index of the field. + The field converted to T. + + + + Gets the field converted to T at position + (column) name and the index instance of that field. The index + is used when there are multiple columns with the same header name. + + + The named index of the field. + The zero based index of the instance of the field. + + + + + Gets the field converted to T at position (column) index using + the given . + + The of the field. + The zero based index of the field. + The used to convert the field to T. + The field converted to T. + + + + Gets the field converted to T at position (column) name using + the given . + + The of the field. + The named index of the field. + The used to convert the field to T. + The field converted to T. + + + + Gets the field converted to T at position + (column) name and the index instance of that field. The index + is used when there are multiple columns with the same header name. + + The of the field. + The named index of the field. + The zero based index of the instance of the field. + The used to convert the field to T. + The field converted to T. + + + + Gets the field converted to T at position (column) index using + the given . + + The of the field. + The used to convert the field to T. + The zero based index of the field. + The field converted to T. + + + + Gets the field converted to T at position (column) name using + the given . + + The of the field. + The used to convert the field to T. + The named index of the field. + The field converted to T. + + + + Gets the field converted to T at position + (column) name and the index instance of that field. The index + is used when there are multiple columns with the same header name. + + The of the field. + The used to convert the field to T. + The named index of the field. + The zero based index of the instance of the field. + The field converted to T. + + + + Gets the field converted to T at position (column) index. + + The of the field. + The zero based index of the field. + The field converted to type T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) name. + + The of the field. + The named index of the field. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position + (column) name and the index instance of that field. The index + is used when there are multiple columns with the same header name. + + + The named index of the field. + The zero based index of the instance of the field. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) index + using the specified . + + The of the field. + The zero based index of the field. + The used to convert the field to T. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) name + using the specified . + + The of the field. + The named index of the field. + The used to convert the field to T. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) name + using the specified . + + The of the field. + The named index of the field. + The zero based index of the instance of the field. + The used to convert the field to T. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) index + using the specified . + + The of the field. + The used to convert the field to T. + The zero based index of the field. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) name + using the specified . + + The of the field. + The used to convert the field to T. + The named index of the field. + The field converted to T. + A value indicating if the get was successful. + + + + Gets the field converted to T at position (column) name + using the specified . + + The of the field. + The used to convert the field to T. + The named index of the field. + The zero based index of the instance of the field. + The field converted to T. + A value indicating if the get was successful. + + + + Determines whether the current record is empty. + A record is considered empty if all fields are empty. + + + true if [is record empty]; otherwise, false. + + + + + Gets the record converted into T. + + The of the record. + The record converted to T. + + + + Gets the record. + + The of the record. + The record. + + + + Gets all the records in the CSV file and + converts each to T. The Read method + should not be used when using this. + + The of the record. + An of records. + + + + Gets all the records in the CSV file and + converts each to T. The Read method + should not be used when using this. + + The of the record. + An of records. + + + + Clears the record cache for the given type. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + + + + Clears the record cache for the given type. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + The type to invalidate. + + + + Clears the record cache for all types. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + + + + Defines methods used to serialize data into a CSV file. + + + + + Gets the configuration. + + + + + Writes a record to the CSV file. + + The record to write. + + + + Defines methods used to write to a CSV file. + + + + + Gets or sets the configuration. + + + + + Writes the field to the CSV file. The field + may get quotes added to it. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The field to write. + + + + Writes the field to the CSV file. This will + ignore any need to quote and ignore the + + and just quote based on the shouldQuote + parameter. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The field to write. + True to quote the field, otherwise false. + + + + Writes the field to the CSV file. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The type of the field. + The field to write. + + + + Writes the field to the CSV file. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The type of the field. + The field to write. + The converter used to convert the field into a string. + + + + Writes the field to the CSV file + using the given . + When all fields are written for a record, + must be called + to complete writing of the current record. + + The type of the field. + The type of the converter. + The field to write. + + + + Writes the field to the CSV file. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The type of the field. + The field to write. + + + + Writes the field to the CSV file. + When all fields are written for a record, + must be called + to complete writing of the current record. + + The type of the field. + The field to write. + The converter used to convert the field into a string. + + + + Ends writing of the current record + and starts a new record. This is used + when manually writing records with + + + + + Write the Excel seperator record. + + + + + Writes the header record from the given properties. + + The type of the record. + + + + Writes the header record from the given properties. + + The type of the record. + + + + Writes the record to the CSV file. + + The type of the record. + The record to write. + + + + Writes the record to the CSV file. + + The type of the record. + The record to write. + + + + Writes the list of records to the CSV file. + + The list of records to write. + + + + Clears the record cache for the given type. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + The record type. + + + + Clears the record cache for the given type. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + The record type. + + + + Clears the record cache for all types. After is called the + first time, code is dynamically generated based on the , + compiled, and stored for the given type T. If the + changes, needs to be called to update the + record cache. + + + + + Common reflection tasks. + + + + + Creates an instance of type T. + + The type of instance to create. + The constructor arguments. + A new instance of type T. + + + + Creates an instance of the specified type. + + The type of instance to create. + The constructor arguments. + A new instance of the specified type. + + + + Gets the first attribute of type T on property. + + Type of attribute to get. + The to get the attribute from. + True to search inheritance tree, otherwise false. + The first attribute of type T, otherwise null. + + + + Gets the attributes of type T on property. + + Type of attribute to get. + The to get the attribute from. + True to search inheritance tree, otherwise false. + The attributes of type T. + + + + Gets the constructor from the give . + + The of the object that will be constructed. + The constructor . + A constructor . + Not a constructor expression.;expression + + + + Gets the property from the expression. + + The type of the model. + The expression. + The for the expression. + + + + Gets the member expression. + + The type of the model. + + The expression. + + + + + Common string tasks. + + + + + Tests is a string is null or whitespace. + + The string to test. + True if the string is null or whitespace, otherwise false. + + + + Maps class properties to CSV fields. + + + + + Called to create the mappings. + + + + + Gets the constructor expression. + + + + + The class property mappings. + + + + + The class property reference mappings. + + + + + Allow only internal creation of CsvClassMap. + + + + + Gets the property map for the given property expression. + + The type of the class the property belongs to. + The property expression. + The CsvPropertyMap for the given expression. + + + + Auto maps all properties for the given type. If a property + is mapped again it will override the existing map. + + A value indicating if references should be ignored when auto mapping. + True to ignore references, otherwise false. + A value indicating if headers of reference properties should + get prefixed by the parent property name. + True to prefix, otherwise false. + + + + Get the largest index for the + properties and references. + + The max index. + + + + Resets the indexes based on the given start index. + + The index start. + The last index + 1. + + + + Auto maps the given map and checks for circular references as it goes. + + The map to auto map. + A value indicating if references should be ignored when auto mapping. + True to ignore references, otherwise false. + A value indicating if headers of reference properties should + get prefixed by the parent property name. + True to prefix, otherwise false. + The list of parents for the map. + + + + Checks for circular references. + + The type to check for. + The list of parents to check against. + A value indicating if a circular reference was found. + True if a circular reference was found, otherwise false. + + + + Collection that holds CsvClassMaps for record types. + + + + + Gets the for the specified record type. + + + The . + + The record type. + The for the specified record type. + + + + Finds the for the specified record type. + + The record type. + The for the specified record type. + + + + Adds the specified map for it's record type. If a map + already exists for the record type, the specified + map will replace it. + + The map. + + + + Removes the class map. + + The class map type. + + + + Removes all maps. + + + + + Goes up the inheritance tree to find the type instance of CsvClassMap{}. + + The type to traverse. + The type that is CsvClassMap{}. + + + + Maps class properties to CSV fields. + + The of class to map. + + + + Constructs the row object using the given expression. + + The expression. + + + + Maps a property to a CSV field. + + The property to map. + The property mapping. + + + + Maps a property to another class map. + + The type of the class map. + The expression. + Constructor arguments used to create the reference map. + The reference mapping for the property. + + + + Maps a property to another class map. + + The type. + The expression. + Constructor arguments used to create the reference map. + The reference mapping for the property + + + + Configuration used for reading and writing CSV data. + + + + + The configured s. + + + + + Gets or sets the property binding flags. + This determines what properties on the custom + class are used. Default is Public | Instance. + + + + + Gets or sets a value indicating if the + CSV file has a header record. + Default is true. + + + + + Gets or sets a value indicating the if the CSV + file contains the Excel "sep=delimeter" config + option in the first row. + + + + + Gets or sets a value indicating if an exception will be + thrown if a field defined in a mapping is missing. + True to throw an exception, otherwise false. + Default is true. + + + + + Gets or sets a value indicating whether changes in the column + count should be detected. If true, a + will be thrown if a different column count is detected. + + + true if [detect column count changes]; otherwise, false. + + + + + Gets or sets a value indicating whether matching header + column names is case sensitive. True for case sensitive + matching, otherwise false. Default is true. + + + + + Gets or sets a value indicating whether matcher header + column names will ignore white space. True to ignore + white space, otherwise false. Default is false. + + + + + Gets or sets a value indicating whether references + should be ignored when auto mapping. True to ignore + references, otherwise false. Default is false. + + + + + Gets or sets a value indicating whether headers + should be trimmed. True to trim headers, + otherwise false. Default is false. + + + + + Gets or sets a value indicating whether fields + should be trimmed. True to trim fields, + otherwise false. Default is false. + + + + + Gets or sets the delimiter used to separate fields. + Default is ','; + + + + + Gets or sets the character used to quote fields. + Default is '"'. + + + + + Gets a string representation of the currently configured Quote character. + + + The new quote string. + + + + + Gets a string representation of two of the currently configured Quote characters. + + + The new double quote string. + + + + + Gets an array characters that require + the field to be quoted. + + + + + Gets or sets the character used to denote + a line that is commented out. Default is '#'. + + + + + Gets or sets a value indicating if comments are allowed. + True to allow commented out lines, otherwise false. + + + + + Gets or sets the size of the buffer + used for reading and writing CSV files. + Default is 2048. + + + + + Gets or sets a value indicating whether all fields are quoted when writing, + or just ones that have to be. and + cannot be true at the same time. Turning one + on will turn the other off. + + + true if all fields should be quoted; otherwise, false. + + + + + Gets or sets a value indicating whether no fields are quoted when writing. + and cannot be true + at the same time. Turning one on will turn the other off. + + + true if [quote no fields]; otherwise, false. + + + + + Gets or sets a value indicating whether the number of bytes should + be counted while parsing. Default is false. This will slow down parsing + because it needs to get the byte count of every char for the given encoding. + The needs to be set correctly for this to be accurate. + + + + + Gets or sets the encoding used when counting bytes. + + + + + Gets or sets the culture info used to read an write CSV files. + + + + + Gets or sets a value indicating whether empty rows should be skipped when reading. + A record is considered empty if all fields are empty. + + + true if [skip empty rows]; otherwise, false. + + + + + Gets or sets the callback that will be called to + determine whether to skip the given record or not. + This overrides the setting. + + + + + Gets or sets a value indicating if quotes should be + ingored when parsing and treated like any other character. + + + + + Gets or sets a value indicating if private + get and set property accessors should be + ignored when reading and writing. + True to ignore, otherwise false. Default is false. + + + + + Gets or sets a value indicating if blank lines + should be ignored when reading. + True to ignore, otherwise false. Default is true. + + + + + Gets or sets a value indicating if an Excel specific + format should be used when writing fields containing + numeric values. e.g. 00001 -> ="00001" + + + + + Gets or sets a value indicating if headers of reference + properties should get prefixed by the parent property name + when automapping. + True to prefix, otherwise false. Default is false. + + + + + Gets or sets a value indicating if an exception should + be thrown when bad field data is detected. + True to throw, otherwise false. Default is false. + + + + + Gets or sets a method that gets called when bad + data is detected. + + + + + Gets or sets a value indicating whether + exceptions that occur duruing reading + should be ignored. True to ignore exceptions, + otherwise false. Default is false. + This is only applicable when during + . + + + + + Gets or sets the callback that is called when a reading + exception occurs. This will only happen when + is true, and when + calling . + + + + + Gets or sets a value indicating that during writing if a new + object should be created when a reference property is null. + True to create a new object and use it's defaults for the + fields, or false to leave the fields empty for all the + reference property's properties. + + + + + Use a to configure mappings. + When using a class map, no properties are mapped by default. + Only properties specified in the mapping are used. + + The type of mapping class to use. + + + + Use a to configure mappings. + When using a class map, no properties are mapped by default. + Only properties specified in the mapping are used. + + The type of mapping class to use. + + + + Registers the class map. + + The class map to register. + + + + Unregisters the class map. + + The map type to unregister. + + + + Unregisters the class map. + + The map type to unregister. + + + + Unregisters all class maps. + + + + + Generates a for the type. + + The type to generate the map for. + The generate map. + + + + Generates a for the type. + + The type to generate for the map. + The generate map. + + + + Creates a new CsvConfiguration. + + + + + Builds the values for the RequiredQuoteChars property. + + + + + Represents configuration errors that occur. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The message that describes the error. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that + is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Mapping info for a property to a CSV field. + + + + + Gets the property map data. + + + + + Creates a new instance using the specified property. + + + + + When reading, is used to get the field + at the index of the name if there was a + header specified. It will look for the + first name match in the order listed. + When writing, sets the name of the + field in the header record. + The first name will be used. + + The possible names of the CSV field. + + + + When reading, is used to get the + index of the name used when there + are multiple names that are the same. + + The index of the name. + + + + When reading, is used to get the field at + the given index. When writing, the fields + will be written in the order of the field + indexes. + + The index of the CSV field. + + + + Ignore the property when reading and writing. + + + + + Ignore the property when reading and writing. + + True to ignore, otherwise false. + + + + The default value that will be used when reading when + the CSV field is empty. + + The default value. + + + + Specifies the to use + when converting the property to and from a CSV field. + + The TypeConverter to use. + + + + Specifies the to use + when converting the property to and from a CSV field. + + The of the + to use. + + + + Specifies an expression to be used to convert data in the + row to the property. + + The type of the property that will be set. + The convert expression. + + + + The used when type converting. + This will override the global + setting. + + The culture info. + + + + The to use when type converting. + This is used when doing any conversions. + + The date time style. + + + + The to use when type converting. + This is used when doing any number conversions. + + + + + + The string format to be used when type converting. + + The format. + + + + The string values used to represent a boolean when converting. + + A value indicating whether true values or false values are being set. + The string boolean values. + + + + The string values used to represent a boolean when converting. + + A value indicating whether true values or false values are being set. + A value indication if the current values should be cleared before adding the new ones. + The string boolean values. + + + + A collection that holds 's. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The comparer to use when sorting the property maps. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Adds an item to the . + + The object to add to the . + The is read-only. + + + + + Adds a range of items to the . + + The collection to add. + + + + Removes all items from the . + + The is read-only. + + + + + Determines whether the contains a specific value. + + + true if is found in the ; otherwise, false. + + The object to locate in the . + + + + + Copies the elements of the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing.The zero-based index in at which copying begins. is null. is less than 0.The number of elements in the source is greater than the available space from to the end of the destination . + + + + Removes the first occurrence of a specific object from the . + + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + The object to remove from the . + The is read-only. + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + + Gets a value indicating whether the is read-only. + + + true if the is read-only; otherwise, false. + + + + + Determines the index of a specific item in the . + + + The index of if found in the list; otherwise, -1. + + The object to locate in the . + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + is not a valid index in the . + The is read-only. + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + is not a valid index in the . + The is read-only. + + + + + Gets or sets the element at the specified index. + + + The element at the specified index. + + The zero-based index of the element to get or set. + is not a valid index in the . + The property is set and the is read-only. + + + + + Used to compare s. + The order is by field index ascending. Any + fields that don't have an index are pushed + to the bottom. + + + + + Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other. + + + Value + Condition + Less than zero + is less than . + Zero + equals . + Greater than zero + is greater than . + + The first object to compare. + The second object to compare. + Neither nor implements the interface. + -or- + and are of different types and neither one can handle comparisons with the other. + 2 + + + + Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other. + + + Value + Condition + Less than zero + is less than . + Zero + equals . + Greater than zero + is greater than . + + The first object to compare. + The second object to compare. + + + + + The configured data for the property map. + + + + + Gets the that the data + is associated with. + + + + + Gets the list of column names. + + + + + Gets or sets the index of the name. + This is used if there are multiple + columns with the same names. + + + + + Gets or sets a value indicating if the name was + explicitly set. True if it was explicity set, + otherwise false. + + + + + Gets or sets the column index. + + + + + Gets or sets a value indicating if the index was + explicitly set. True if it was explicitly set, + otherwise false. + + + + + Gets or sets the type converter. + + + + + Gets or sets the type converter options. + + + + + Gets or sets a value indicating whether the field should be ignored. + + + + + Gets or sets the default value used when a CSV field is empty. + + + + + Gets or sets a value indicating whether this instance is default value set. + the default value was explicitly set. True if it was + explicitly set, otherwise false. + + + + + Gets or sets the expression used to convert data in the + row to the property. + + + + + Initializes a new instance of the class. + + The property. + + + + A collection that holds property names. + + + + + Gets the name at the given index. If a prefix is set, + it will be prepended to the name. + + + + + + + Gets the prefix to use for each name. + + + + + Gets the raw list of names without + the prefix being prepended. + + + + + Gets the count. + + + + + Adds the given name to the collection. + + The name to add. + + + + Clears all names from the collection. + + + + + Adds a range of names to the collection. + + The range to add. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Mapping info for a reference property mapping to a class. + + + + + Gets the property. + + + + + Gets the mapping. + + + + + Gets the property reference map data. + + + + + Initializes a new instance of the class. + + The property. + The to use for the reference map. + + + + Appends a prefix to the header of each field of the reference property + + The prefix to be prepended to headers of each reference property + The current + + + + Get the largest index for the + properties and references. + + The max index. + + + + The configuration data for the reference map. + + + + + Gets or sets the header prefix to use. + + + + + Gets the that the data + is associated with. + + + + + Gets the mapping this is a reference for. + + + + + Initializes a new instance of the class. + + The property. + The mapping this is a reference for. + + + + A default that can be used + to create a class map dynamically. + + + + + + Converts a Boolean to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts a Byte to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts a Char to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Represents errors that occur while reading a CSV file. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The message that describes the error. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that + is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Converts a DateTime to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts a DateTimeOffset to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts a Decimal to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts an object to and from a string. + + + + + Converts the object to a string. + + The options to use when converting. + The object to convert to a string. + The string representation of the object. + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Determines whether this instance [can convert to] the specified type. + + The type. + + true if this instance [can convert to] the specified type; otherwise, false. + + + + + Converts a Double to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + + The object created from the string. + + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts an Enum to and from a string. + + + + + Creates a new for the given . + + The type of the Enum. + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Throws an exception when used. This is here so that it's apparent + that there is no support for IEnumerable type coversion. A custom + converter will need to be created to have a field convert to and + from an IEnumerable. + + + + + Throws an exception. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Throws an exception. + + The options to use when converting. + The object to convert to a string. + The string representation of the object. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Determines whether this instance [can convert to] the specified type. + + The type. + + true if this instance [can convert to] the specified type; otherwise, false. + + + + + Converts a Guid to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts an Int16 to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts an Int32 to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts an Int64 to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts objects to and from strings. + + + + + Converts the object to a string. + + The options to use when converting. + The object to convert to a string. + The string representation of the object. + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Determines whether this instance [can convert to] the specified type. + + The type. + + true if this instance [can convert to] the specified type; otherwise, false. + + + + + Converts a Nullable to and from a string. + + + + + Gets the type of the nullable. + + + The type of the nullable. + + + + + Gets the underlying type of the nullable. + + + The underlying type. + + + + + Gets the type converter for the underlying type. + + + The type converter. + + + + + Creates a new for the given . + + The nullable type. + type is not a nullable type. + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Converts the object to a string. + + The options to use when converting. + The object to convert to a string. + The string representation of the object. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts a SByte to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts a Float to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts a string to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts a TimeSpan to and from a string. + + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Creates s. + + + + + Initializes the class. + + + + + Adds the for the given . + + The type the converter converts. + The type converter that converts the type. + + + + Adds the for the given . + + The type the converter converts. + The type converter that converts the type. + + + + Removes the for the given . + + The type to remove the converter for. + + + + Removes the for the given . + + The type to remove the converter for. + + + + Gets the converter for the given . + + The type to get the converter for. + The for the given . + + + + Gets the converter for the given . + + The type to get the converter for. + The for the given . + + + + Options used when doing type conversion. + + + + + Gets or sets the culture info. + + + + + Gets or sets the date time style. + + + + + Gets or sets the time span style. + + + + + Gets or sets the number style. + + + + + Gets the list of values that can be + used to represent a boolean of true. + + + + + Gets the list of values that can be + used to represent a boolean of false. + + + + + Gets or sets the string format. + + + + + Merges TypeConverterOptions by applying the values of sources in order to a + new TypeConverterOptions instance. + + The sources that will be applied. + A new instance of TypeConverterOptions with the source applied to it. + + + + Creates . + + + + + Adds the for the given . + + The type the options are for. + The options. + + + + Adds the for the given . + + The type the options are for. + The options. + + + + Removes the for the given type. + + The type to remove the options for. + + + + Removes the for the given type. + + The type to remove the options for. + + + + Get the for the given . + + The type the options are for. + The options for the given type. + + + + Get the for the given . + + The type the options are for. + The options for the given type. + + + + Converts a UInt16 to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts a UInt32 to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + + Converts a UInt64 to and from a string. + + + + + Converts the string to an object. + + The options to use when converting. + The string to convert to an object. + The object created from the string. + + + + Determines whether this instance [can convert from] the specified type. + + The type. + + true if this instance [can convert from] the specified type; otherwise, false. + + + + diff --git a/Route4MeSDKTest/bin/Debug/Data/CSV/Route4Me Address Book 03-09-2017.csv b/Route4MeSDKTest/bin/Debug/Data/CSV/Route4Me Address Book 03-09-2017.csv new file mode 100644 index 00000000..ff0b9356 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/CSV/Route4Me Address Book 03-09-2017.csv @@ -0,0 +1,3 @@ +id,Territory Name,created_timestamp,address_id,group,alias,address,address_2,member_id,first_name,last_name,email,phone,city,state,country_id,zipcode,lat,lng,curbside_lat,curbside_lng,schedule,schedule_blacklist,in_route_count,last_visited_timestamp,last_routed_timestamp,time_window_start,time_window_end,time_window_start_2,time_window_end_2,service_time,timezone,color,address_icon,Costom_field,Second_custom_field,Custom Field 7 +118,,2/28/2017 14:51,13905016,,"Dollar General-Alexander City,AL","1538 Mill Sq, Alexander City, AL, 35010-2674",,403634,Oleg,,,(256) 215-5511,,,0,,32.936296,-85.972485,32.936296,-85.972485,"[{""enabled"":true,""mode"":""weekly"",""weekly"":{""every"":1,""weekdays"":[4]}}]",Array,1,,2/28/2017 14:56,9:00:00,9:30:00,11:00:00,11:40:00,1:10:00,Asia/Tbilisi,,,Costom_content,Second_custom_content, +119,,2/28/2017 14:51,13905017,,"Dollar General-Alexander City,AL","6278 Alabama 63, Alexander City, AL, 35771-7175",,403634,,Guchashvili,,(256) 414-3086,,,0,,33.02296,-85.942624,33.02296,-85.942624,"[{""enabled"":true,""mode"":""weekly"",""weekly"":{""every"":1,""weekdays"":[4]}}]",Array,2,,2/28/2017 14:56,,,,,,,fa573c,,,, diff --git a/Route4MeSDKTest/bin/Debug/Data/CSV/addressbook v4.csv b/Route4MeSDKTest/bin/Debug/Data/CSV/addressbook v4.csv new file mode 100644 index 00000000..4567411e --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/CSV/addressbook v4.csv @@ -0,0 +1,14 @@ +"id","Territory Name","created_timestamp","address_id","group","alias","address","address_2","member_id","first_name","last_name","email","phone","city","state","country_id","zipcode","lat","lng","curbside_lat","curbside_lng","schedule","schedule_blacklist","in_route_count","last_visited_timestamp","last_routed_timestamp","time_window_start","time_window_end","time_window_start_2","time_window_end_2","service_time","timezone","color","address_icon","delivered","Costom_field","Second_custom_field" +1,,,,,,"17205 RICHMOND TNPK, MILFORD, VA, 22514",,,"EditedName","Pimentel",,,,"0","0",,38.024654,-77.338814,38.024654,-77.338814,,,,,,,,,,0 +2,,,,,,"Test Address1 91007",,,"Test FirstName 1865","Updated 84857",,,,"0","0",,38.024654,-77.338814,38.024654,-77.338814,,,,,,,,,,0 +3,,,,,,"10149 ASHDALE LANE 67 67393253 SANTEE CA 92071 280501691 67393253 IFI 280501691 05-JUN-10 67393253",,,,,,,,,,,40.7143,-74.0067,40.7143,-74.0067 +4,,,,,,"Test Address1 57930",,,"Test FirstName 59460",,,,,"0","0",,38.024654,-77.338814,38.024654,-77.338814,"[{""daily"":{""every"":1},""enabled"":true,""mode"":""daily""}]",,,,,,,,,0,,,,"false" +5,,,,,,"193 Lakebridge Dr, Kings Paark, NY",,,,,,,,,,,40.714269,-74.005973,40.714269,-74.005973,,"""2017-03-16"",""2017-03-18"",""2017-03-19""" +6,,,,,,"219 west creek",,,,,,,,,,,40.719856,-74.01211,40.719856,-74.01211 +7,,,,,,"14 North Moore Street +New York, ny",,,,,,,,,,,40.719697,-74.00661,40.719697,-74.00661 +8,,,,,,"Test Address1 88799",,,"Test FirstName 77545","Updated 17180",,,,"0","0",,38.024654,-77.338814,38.024654,-77.338814,,,,,,,,,,0 +9,,,,,,"14 North Moore StreetnNew York, ny",,,,,,,,,,,40.719697,-74.00661,40.719697,-74.00661 +10,,,,,,"Test Address1 14502",,,"Test FirstName 9768",,,,,"0","0",,38.024654,-77.338814,38.024654,-77.338814,,,,,,,,,,0 +11,,,13905016,,"Dollar General-Alexander City,AL","1538 Mill Sq, Alexander City, AL, 35010-2674",,403634,"Oleg",,,"(256) 215-5511",,,"0",,32.936296,-85.972485,32.936296,-85.972485,"[{""enabled"":true,""mode"":""weekly"",""weekly"":{""every"":1,""weekdays"":[4]}}]","Array",1,,1488293760,32400,34200,39600,42000,4200,"Asia/Tbilisi",,,,"Costom_content","Second_custom_content" +12,,,13905017,,"Dollar General-Alexander City,AL","6278 Alabama 63, Alexander City, AL, 35771-7175",,403634,,"Guchashvili",,"(256) 414-3086",,,"0",,33.02296,-85.942624,33.02296,-85.942624,"[{""enabled"":true,""mode"":""weekly"",""weekly"":{""every"":1,""weekdays"":[4]}}]","Array",2,,1488293760,,,,,,,"fa573c" diff --git a/Route4MeSDKTest/bin/Debug/Data/CSV/orders 1000 with order id.csv b/Route4MeSDKTest/bin/Debug/Data/CSV/orders 1000 with order id.csv new file mode 100644 index 00000000..efd0bbcd --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/CSV/orders 1000 with order id.csv @@ -0,0 +1,6 @@ +order_id,Longitude,Latitude,Address Alias,Address,City,State,Zip Code,Phone,Schedule Date +48,-85.948343,32.930977,"Dollar General-Alexander City,AL",1235 Cherokee Rd,Alexander City,AL,35010-3920,(256) 234-9012,3/10/2017 +49,-85.972485,32.936296,"Dollar General-Alexander City,AL",1538 Mill Sq,Alexander City,AL,35010-2674,(256) 215-5511,3/10/2017 +50,-85.9426244,33.0229598,"Dollar General-Alexander City,AL",6278 Alabama 63,Alexander City,AL,35771-7175,(256) 414-3086,3/10/2017 +51,-85.945398,32.955069,"Dollar General-Alexander City,AL",819 K St,Alexander City,AL,35010-1325,(256) 409-1495,3/10/2017 +52,-86.4617237,31.3196846,"Dollar General-Andalusia,AL",118 Shelby Street,Andalusia,AL,36420-2403,(334) 222-5456,3/10/2017 diff --git a/Route4MeSDKTest/bin/Debug/Data/JSON/Addressbook Get Contacts RESPONSE.json b/Route4MeSDKTest/bin/Debug/Data/JSON/Addressbook Get Contacts RESPONSE.json new file mode 100644 index 00000000..9069fd7a --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/JSON/Addressbook Get Contacts RESPONSE.json @@ -0,0 +1,370 @@ +{ + "results": [{ + "created_timestamp": 1462240497, + "address_id": 6857271, + "address_group": "", + "address_alias": "", + "address_1": "17205 RICHMOND TNPK, MILFORD, VA, 22514", + "address_2": "", + "member_id": 1, + "first_name": "EditedName", + "last_name": "Pimentel", + "address_email": "", + "address_phone_number": "", + "address_city": "", + "address_state_id": "0", + "address_country_id": "0", + "address_zip": "", + "cached_lat": 38.024654, + "cached_lng": -77.338814, + "curbside_lat": 38.024654, + "curbside_lng": -77.338814, + "address_custom_data": { + "schedule": null + }, + "schedule": null, + "schedule_blacklist": null, + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": 0, + "local_timezone_string": "", + "color": "", + "address_icon": null + }, + { + "created_timestamp": 1461921777, + "address_id": 6811704, + "address_group": "", + "address_alias": "", + "address_1": "Test Address1 91007", + "address_2": "", + "member_id": 1, + "first_name": "Test FirstName 1865", + "last_name": "Updated 84857", + "address_email": "", + "address_phone_number": "", + "address_city": "", + "address_state_id": "0", + "address_country_id": "0", + "address_zip": "", + "cached_lat": 38.024654, + "cached_lng": -77.338814, + "curbside_lat": 38.024654, + "curbside_lng": -77.338814, + "address_custom_data": { + "schedule": null + }, + "schedule": null, + "schedule_blacklist": null, + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": 0, + "local_timezone_string": "", + "color": "", + "address_icon": null + }, + { + "created_timestamp": 1427356649, + "address_id": 2640184, + "address_group": "", + "address_alias": "", + "address_1": "10149 ASHDALE LANE\\t67\\t67393253\\t\\t\\tSANTEE\\tCA\\t92071\\t\\t280501691\\t67393253\\tIFI\\t280501691\\t05-JUN-10\\t67393253", + "address_2": "", + "member_id": 97113, + "first_name": "", + "last_name": "", + "address_email": "", + "address_phone_number": "", + "address_city": "", + "address_state_id": "", + "address_country_id": "", + "address_zip": "", + "cached_lat": 40.7143, + "cached_lng": -74.0067, + "curbside_lat": 40.7143, + "curbside_lng": -74.0067, + "address_custom_data": [], + "schedule": null, + "schedule_blacklist": null, + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "address_icon": null + }, + { + "created_timestamp": 1461921782, + "address_id": 6811705, + "address_group": "", + "address_alias": "", + "address_1": "Test Address1 57930", + "address_2": "", + "member_id": 1, + "first_name": "Test FirstName 59460", + "last_name": "", + "address_email": "", + "address_phone_number": "", + "address_city": "", + "address_state_id": "0", + "address_country_id": "0", + "address_zip": "", + "cached_lat": 38.024654, + "cached_lng": -77.338814, + "curbside_lat": 38.024654, + "curbside_lng": -77.338814, + "address_custom_data": { + "schedule": "yes", + "delivered":"false" + }, + "schedule": [{ + "mode": "daily", + "enabled": true, + "daily": { + "every": 1 + } + }], + "schedule_blacklist": null, + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": 0, + "local_timezone_string": "", + "color": "", + "address_icon": null + }, + { + "created_timestamp": 1427356649, + "address_id": 2640185, + "address_group": "", + "address_alias": "", + "address_1": "193 Lakebridge Dr, Kings Paark, NY", + "address_2": "", + "member_id": 97113, + "first_name": "", + "last_name": "", + "address_email": "", + "address_phone_number": "", + "address_city": "", + "address_state_id": "", + "address_country_id": "", + "address_zip": "", + "cached_lat": 40.714269, + "cached_lng": -74.005973, + "curbside_lat": 40.714269, + "curbside_lng": -74.005973, + "address_custom_data": [], + "schedule": null, + "schedule_blacklist": ["2017-03-16", "2017-03-18", "2017-03-19"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "address_icon": null + }, + { + "created_timestamp": 1427356649, + "address_id": 2640186, + "address_group": "", + "address_alias": "", + "address_1": "219 west creek", + "address_2": "", + "member_id": 97113, + "first_name": "", + "last_name": "", + "address_email": "", + "address_phone_number": "", + "address_city": "", + "address_state_id": "", + "address_country_id": "", + "address_zip": "", + "cached_lat": 40.719856, + "cached_lng": -74.01211, + "curbside_lat": 40.719856, + "curbside_lng": -74.01211, + "address_custom_data": [], + "schedule": null, + "schedule_blacklist": null, + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "address_icon": null + }, + { + "created_timestamp": 1427356649, + "address_id": 2640187, + "address_group": "", + "address_alias": "", + "address_1": "14 North Moore Street\\nNew York, ny", + "address_2": "", + "member_id": 97113, + "first_name": "", + "last_name": "", + "address_email": "", + "address_phone_number": "", + "address_city": "", + "address_state_id": "", + "address_country_id": "", + "address_zip": "", + "cached_lat": 40.719697, + "cached_lng": -74.00661, + "curbside_lat": 40.719697, + "curbside_lng": -74.00661, + "address_custom_data": [], + "schedule": null, + "schedule_blacklist": null, + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "address_icon": null + }, + { + "created_timestamp": 1461922101, + "address_id": 6811708, + "address_group": "", + "address_alias": "", + "address_1": "Test Address1 88799", + "address_2": "", + "member_id": 1, + "first_name": "Test FirstName 77545", + "last_name": "Updated 17180", + "address_email": "", + "address_phone_number": "", + "address_city": "", + "address_state_id": "0", + "address_country_id": "0", + "address_zip": "", + "cached_lat": 38.024654, + "cached_lng": -77.338814, + "curbside_lat": 38.024654, + "curbside_lng": -77.338814, + "address_custom_data": { + "schedule": null + }, + "schedule": null, + "schedule_blacklist": null, + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": 0, + "local_timezone_string": "", + "color": "", + "address_icon": null + }, + { + "created_timestamp": 1427356649, + "address_id": 2640188, + "address_group": "", + "address_alias": "", + "address_1": "14 North Moore StreetnNew York, ny", + "address_2": "", + "member_id": 97113, + "first_name": "", + "last_name": "", + "address_email": "", + "address_phone_number": "", + "address_city": "", + "address_state_id": "", + "address_country_id": "", + "address_zip": "", + "cached_lat": 40.719697, + "cached_lng": -74.00661, + "curbside_lat": 40.719697, + "curbside_lng": -74.00661, + "address_custom_data": [], + "schedule": null, + "schedule_blacklist": null, + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "address_icon": null + }, + { + "created_timestamp": 1461922106, + "address_id": 6811709, + "address_group": "", + "address_alias": "", + "address_1": "Test Address1 14502", + "address_2": "", + "member_id": 1, + "first_name": "Test FirstName 9768", + "last_name": "", + "address_email": "", + "address_phone_number": "", + "address_city": "", + "address_state_id": "0", + "address_country_id": "0", + "address_zip": "", + "cached_lat": 38.024654, + "cached_lng": -77.338814, + "curbside_lat": 38.024654, + "curbside_lng": -77.338814, + "address_custom_data": { + "schedule": null + }, + "schedule": null, + "schedule_blacklist": null, + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": 0, + "local_timezone_string": "", + "color": "", + "address_icon": null + }], + "total": 4874 +} \ No newline at end of file diff --git a/Route4MeSDKTest/bin/Debug/Data/JSON/get orders RESPONSE.json b/Route4MeSDKTest/bin/Debug/Data/JSON/get orders RESPONSE.json new file mode 100644 index 00000000..922fa133 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/JSON/get orders RESPONSE.json @@ -0,0 +1,1263 @@ +{ + "results": [{ + "created_timestamp": 1489688218, + "order_id": 9423, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-16", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489687282, + "order_id": 9422, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-16", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489686274, + "order_id": 9421, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-16", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489686273, + "order_id": 9420, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-16", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489686272, + "order_id": 9419, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-16", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489683421, + "order_id": 9418, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-16", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489683419, + "order_id": 9417, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-16", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489680770, + "order_id": 9416, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-16", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489677999, + "order_id": 9415, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-16", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489677998, + "order_id": 9414, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-16", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631866, + "order_id": 9376, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631865, + "order_id": 9375, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631864, + "order_id": 9374, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631863, + "order_id": 9373, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631862, + "order_id": 9372, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631862, + "order_id": 9371, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631860, + "order_id": 9370, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631859, + "order_id": 9369, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631858, + "order_id": 9368, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631858, + "order_id": 9367, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631856, + "order_id": 9366, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631855, + "order_id": 9365, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489631854, + "order_id": 9364, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489630843, + "order_id": 9363, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489627474, + "order_id": 9362, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489625635, + "order_id": 9361, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489624705, + "order_id": 9360, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489623864, + "order_id": 9359, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489623863, + "order_id": 9358, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-16", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }, + { + "created_timestamp": 1489622083, + "order_id": 9357, + "order_status_id": 0, + "day_added_YYMMDD": "2017-03-15", + "day_scheduled_for_YYMMDD": "2017-03-15", + "address_alias": "Luzern 19124", + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, USA", + "address_2": "", + "member_id": 44143, + "EXT_FIELD_first_name": "", + "EXT_FIELD_last_name": "", + "EXT_FIELD_email": "", + "EXT_FIELD_phone": "", + "address_city": "", + "address_state_id": null, + "address_country_id": "0", + "address_zip": "", + "cached_lat": 40.007253, + "cached_lng": -75.100987, + "curbside_lat": 40.007253, + "curbside_lng": -75.100987, + "EXT_FIELD_custom_data": ["create_order_custom_field: thi is customfield", + "hebrew_field: \u05d6\u05d4\u05d5 \u05e9\u05d8\u05d7 \u05e2\u05d1\u05e8\u05d9", + "georgian_text: \u10d4\u10e1 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8 \u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10d0"], + "in_route_count": 0, + "last_visited_timestamp": 0, + "last_routed_timestamp": 0, + "local_time_window_start": null, + "local_time_window_end": null, + "local_time_window_start_2": null, + "local_time_window_end_2": null, + "service_time": null, + "local_timezone_string": null, + "color": null, + "order_icon": null, + "is_validated": false, + "is_pending": true, + "is_accepted": false, + "is_started": false, + "is_completed": false + }], + "total": 1768 +} \ No newline at end of file diff --git a/Route4MeSDKTest/bin/Debug/Data/Other files/addressbook_v4.csv b/Route4MeSDKTest/bin/Debug/Data/Other files/addressbook_v4.csv new file mode 100644 index 00000000..e58f49e9 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/Other files/addressbook_v4.csv @@ -0,0 +1,1001 @@ +id,address_id,address_1,address_2,address_alias,address_group,first_name,last_name,address_email,address_phone_number,cached_lat,cached_lng,curbside_lat,curbside_lng,address_city,address_state_id,address_country_id,address_zip,address_custom_data,schedule_blacklist,service_time,color,address_icon,schedule_id,address_id,mode,enabled,daily_every,weekly_every,weekdays,monthly_every,monthly_mode,monthly_dates,monthly_nth_n,monthly_nth_what,annually_every,annually_use_nth,annually_months,annually_nth_m,annually_nth_what +,,"1235 Cherokee Rd, Alexander City, AL",,"Dollar General-Alexander City,AL",,,,,(256) 234-9012,-85.948343,32.930977,-85.948343,32.930977,,,,35010-3920,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1538 Mill Sq, Alexander City, AL",,"Dollar General-Alexander City,AL",,,,,(256) 215-5511,-85.972485,32.936296,-85.972485,32.936296,,,,35010-2674,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"6278 Alabama 63, Alexander City, AL",,"Dollar General-Alexander City,AL",,,,,(256) 414-3086,-85.9426244,33.0229598,-85.9426244,33.0229598,,,,35771-7175,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"819 K St, Alexander City, AL",,"Dollar General-Alexander City,AL",,,,,(256) 409-1495,-85.945398,32.955069,-85.945398,32.955069,,,,35010-1325,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"118 Shelby Street, Andalusia, AL",,"Dollar General-Andalusia,AL",,,,,(334) 222-5456,-86.4617237,31.3196846,-86.4617237,31.3196846,,,,36420-2403,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"225 Church St, Andalusia, AL",,"Dollar General-Andalusia,AL",,,,,(334) 222-4642,-86.484979,31.308227,-86.484979,31.308227,,,,36420-3701,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"28513 US Hwy 29, Andalusia, AL",,"Dollar General-Andalusia,AL",,,,,(334) 388-2771,-86.4794552,31.3993549,-86.4794552,31.3993549,,,,36421-1315,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"925 River Fall St, Andalusia, AL",,"Dollar General-Andalusia,AL",,,,,(334) 222-1762,-86.495167,31.31455,-86.495167,31.31455,,,,36420-2557,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1421 Golden Springs Rd, Anniston, AL",,"Dollar General-Anniston,AL",,,,,(256) 831-8356,-85.78598,33.627918,-85.78598,33.627918,,,,36207-6923,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2363 Al Highway 202 Ste D, Anniston, AL",,"Dollar General-Anniston,AL",,,,,(256) 240-2939,-85.861063,33.647234,-85.861063,33.647234,,,,36201-5331,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2605 Us Highway 431 N, Anniston, AL",,"Dollar General-Anniston,AL",,,,,(256) 820-1110,-85.86024,33.715829,-85.86024,33.715829,,,,36206-1006,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3115 Noble Street, Anniston, AL",,"Dollar General-Anniston,AL",,,,,(256) 231-4895,-85.829786,33.686131,-85.829786,33.686131,,,,36201,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3440 Choccolocco Rd, Anniston, AL",,"Dollar General-Anniston,AL",,,,,(256) 238-6112,-85.72774,33.649725,-85.72774,33.649725,,,,36207-1640,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"704 S Quintard Ave, Anniston, AL",,"Dollar General-Anniston,AL",,,,,(256) 238-6802,-85.825559,33.638181,-85.825559,33.638181,,,,36201-6677,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1031 A Hwy 72 E, Athens, AL",,"Dollar General-Athens,AL",,,,,(256) 771-1577,-86.954561,34.785661,-86.954561,34.785661,,,,35611-4330,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1210 N Jefferson St, Athens, AL",,"Dollar General-Athens,AL",,,,,(256) 216-0902,-86.971845,34.8151,-86.971845,34.8151,,,,35611-1615,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1233 E Pryor St, Athens, AL",,"Dollar General-Athens,AL",,,,,(256) 233-5496,-86.950568,34.806887,-86.950568,34.806887,,,,35611,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"12375 Us Highway 72, Athens, AL",,"Dollar General-Athens,AL",,,,,(256) 729-0601,-87.100288,34.792682,-87.100288,34.792682,,,,35611-8577,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"15297 Pike Road, Athens, AL",,"Dollar General-Athens,AL",,,,,(256) 434-8277,-86.9216368,34.7760221,-86.9216368,34.7760221,,,,35613-2863,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"16521 Al Highway 251, Athens, AL",,"Dollar General-Athens,AL",,,,,(256) 233-2138,-86.904476,34.824273,-86.904476,34.824273,,,,35613-5047,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"17837 Us Highway 72, Athens, AL",,"Dollar General-Athens,AL",,,,,(256) 771-0018,-87.003163,34.790973,-87.003163,34.790973,,,,35611-3903,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"19300 Al Highway 99, Athens, AL",,"Dollar General-Athens,AL",,,,,(256) 233-4006,-87.018484,34.833503,-87.018484,34.833503,,,,35614-5473,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"600 S Jefferson St, Athens, AL",,"Dollar General-Athens,AL",,,,,(256) 233-1255,-86.97267,34.796979,-86.97267,34.796979,,,,35611-3544,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1106 Opelika Rd, Auburn, AL",,"Dollar General-Auburn,AL",,,,,(334) 246-5254,-85.458874,32.6199874,-85.458874,32.6199874,,,,36830-3312,,,,,,,,monthly,TRUE,,,,1,nth,,,,,,,, +,,"196 East University Dr, Auburn, AL",,"Dollar General-Auburn,AL",,,,,(334) 501-1319,-85.4893036,32.5793457,-85.4893036,32.5793457,,,,36832-6726,,,,,,,,monthly,TRUE,,,,1,nth,,,,,,,, +,,"1961 Wire Rd, Auburn, AL",,"Dollar General-Auburn,AL",,,,,(334) 246-0839,-85.520149,32.5816083,-85.520149,32.5816083,,,,36832,,,,,,,,monthly,TRUE,,,,1,nth,,,,,,,, +,,"5334 AL Hwy 14 W, Auburn, AL",,"Dollar General-Auburn,AL",,,,,(334) 521-3301,-85.5807904,32.600422,-85.5807904,32.600422,,,,36832-1861,,,,,,,,monthly,TRUE,,,,1,nth,,,,,,,, +,,"1750 4Th Ave Sw, Bessemer, AL",,"Dollar General-Bessemer,AL",,,,,(205) 424-9007,-86.994274,33.353238,-86.994274,33.353238,,,,35022-5223,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2417 19th St N, Bessemer, AL",,"Dollar General-Bessemer,AL",,,,,(205) 428-6494,-86.981344,33.418536,-86.981344,33.418536,,,,35020,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"3011 9th Ave N, Bessemer, AL",,"Dollar General-Bessemer,AL",,,,,(205) 424-4820,-86.949779,33.419247,-86.949779,33.419247,,,,35020,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"3459 Warrior River Road, Bessemer, AL",,"Dollar General-Bessemer,AL",,,,,(205) 461-1513,-87.0242453,33.4630995,-87.0242453,33.4630995,,,,35023-1039,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"3979 Parwood Rd-Ste#117, Bessemer, AL",,"Dollar General-Bessemer,AL",,,,,(205) 424-8076,-86.960497,33.345268,-86.960497,33.345268,,,,35022-5627,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"671 9th Ave SW, Bessemer, AL",,"Dollar General-Bessemer,AL",,,,,(205) 428-0906,-86.98021,33.38575,-86.98021,33.38575,,,,35022-4503,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1200 Pinson Valley Pkwy, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 841-0903,-86.776885,33.580622,-86.776885,33.580622,,,,35217-2327,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1552 Forestdale Blvd, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 791-6795,-86.8976,33.567022,-86.8976,33.567022,,,,35214-3018,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1687 Center Point Pkwy Ste 121, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 815-0132,-86.684644,33.631809,-86.684644,33.631809,,,,35215-5525,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2007 Avenue H, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 383-3862,-86.8943863,33.5101242,-86.8943863,33.5101242,,,,35218-1625,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2260 Brewster Rd, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 853-0113,-86.648151,33.653061,-86.648151,33.653061,,,,35235-3501,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2314 Warrior Rd, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 781-2035,-86.877031,33.498156,-86.877031,33.498156,,,,35208-3514,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2328 Center Point Rd, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 520-9502,-86.684017,33.646795,-86.684017,33.646795,,,,35215-3608,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2419 Palomino Lane, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 798-3835,-86.921604,33.580464,-86.921604,33.580464,,,,35214-1917,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3150 Birmingport Rd, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 785-6457,-86.941233,33.52984,-86.941233,33.52984,,,,35224-2861,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3194 New Castle Rd, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 386-3071,-86.7844162,33.6327591,-86.7844162,33.6327591,,,,36017-4127,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3301 26th Street North, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 208-0290,-86.819284,33.554852,-86.819284,33.554852,,,,35207,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3931 Pinson Valley Pkwy, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 856-6999,-86.727789,33.634879,-86.727789,33.634879,,,,35217-1857,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"4600 5th Avenue South, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 206-4348,-86.7622907,33.5272989,-86.7622907,33.5272989,,,,35222-2904,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"9088 Parkway E, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 836-3907,-86.70466,33.584619,-86.70466,33.584619,,,,35206-1505,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"915 3rd Ave West, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 623-3245,-86.851509,33.505408,-86.851509,33.505408,,,,35204,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"917 Dennison Avenue, Birmingham, AL",,"Dollar General-Birmingham,AL",,,,,(205) 326-8007,-86.843732,33.480477,-86.843732,33.480477,,,,35211,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"11511 Us Highway 278 W, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 747-2506,-87.053871,34.20989,-87.053871,34.20989,,,,35057-6241,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"11590 Al Highway 157, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 734-7998,-86.948499,34.23962,-86.948499,34.23962,,,,35057-6718,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"120 Us Hwy 278, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 841-3594,-86.8812467,34.1696698,-86.8812467,34.1696698,,,,35057,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"120 Wesley Avenue North, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 796-5037,-86.683392,34.247595,-86.683392,34.247595,,,,35058,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1208 4Th St Sw, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 735-0066,-86.851215,34.171909,-86.851215,34.171909,,,,35055-3923,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"121 CR 1435, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 841-4499,-86.828598,34.2099915,-86.828598,34.2099915,,,,35058-1474,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1600 3Rd St Se, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 734-5478,-86.815853,34.18211,-86.815853,34.18211,,,,35055-2074,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1642 Town Sq Sw, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 734-4392,-86.836086,34.160263,-86.836086,34.160263,,,,35055-5263,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"203 1St Ave Sw, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 739-5456,-86.843341,34.176203,-86.843341,34.176203,,,,35055-3413,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"31 Megan Ln, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 734-0560,-86.871628,34.106817,-86.871628,34.106817,,,,35057-3369,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"6091 Cr 747, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 615-4688,-86.7406998,34.2638512,-86.7406998,34.2638512,,,,35038,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"801 2Nd Ave Nw, Cullman, AL",,"Dollar General-Cullman,AL",,,,,(256) 775-1519,-86.84947,34.184465,-86.84947,34.184465,,,,35055-2401,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1000 Beltline Rd Sw Ste U, Decatur, AL",,"Dollar General-Decatur,AL",,,,,(256) 350-7377,-87.001919,34.5603,-87.001919,34.5603,,,,35601-6280,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1218 Mill Rd, Decatur, AL",,"Dollar General-Decatur,AL",,,,,(256) 308-2336,-86.982764,34.523282,-86.982764,34.523282,,,,35603-4817,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1502B 6Th Ave Se, Decatur, AL",,"Dollar General-Decatur,AL",,,,,(256) 350-6577,-86.98035,34.583979,-86.98035,34.583979,,,,35601-4918,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1731 Moulton St W, Decatur, AL",,"Dollar General-Decatur,AL",,,,,(256) 350-0494,-87.012109,34.604216,-87.012109,34.604216,,,,35601-7235,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2006 Danville Rd Sw, Decatur, AL",,"Dollar General-Decatur,AL",,,,,(256) 351-0022,-87.009244,34.574358,-87.009244,34.574358,,,,35601-4640,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2400 Old Moulton Rd Sw, Decatur, AL",,"Dollar General-Decatur,AL",,,,,(256) 353-4300,-87.032933,34.588599,-87.032933,34.588599,,,,35603-4474,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1060 W Main St Ste 4, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 678-6036,-85.405309,31.226458,-85.405309,31.226458,,,,36301-1469,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1071 Montgomery Hwy 231, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 803-8824,-85.398187,31.2373441,-85.398187,31.2373441,,,,36303,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1702 E Cottonwood Rd, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 794-1543,-85.375218,31.193269,-85.375218,31.193269,,,,36301-5060,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1815 E Main St Ste 1, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 702-7897,-85.364248,31.218559,-85.364248,31.218559,,,,36301-3013,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2301 Reeves St, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 673-0926,-85.388274,31.255949,-85.388274,31.255949,,,,36303-5815,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2505 Montgomery Hwy, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 678-9865,-85.419088,31.243572,-85.419088,31.243572,,,,36303-2603,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2865 Hartford Hwy, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 702-7652,-85.436193,31.199492,-85.436193,31.199492,,,,36305-4901,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2890 Ross Clark Cir, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 671-7041,-85.430808,31.216803,-85.430808,31.216803,,,,36301-2017,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"3600 S Oates St, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 671-4785,-85.402246,31.174393,-85.402246,31.174393,,,,36301-0604,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"41 North Bay Springs Rd, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 692-3038,-85.524922,31.23867,-85.524922,31.23867,,,,36303,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"6130 Fortner St, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 671-2715,-85.485463,31.210717,-85.485463,31.210717,,,,36305-6822,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"670 Gene Terry Road, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 803-8223,-85.3311619,31.1239015,-85.3311619,31.1239015,,,,35022-4503,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"767 W Selma St Unit 1, Dothan, AL",,"Dollar General-Dothan,AL",,,,,(334) 794-0660,-85.401197,31.20988,-85.401197,31.20988,,,,36301-3467,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"12 Allen Chapel Rd, Batesville, AR",,"Dollar General-Batesville,AR",,,,,(870) 251-0210,-91.638237,35.73733,-91.638237,35.73733,,,,72501-9787,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1979 Batesville Blvd, Batesville, AR",,"Dollar General-Batesville,AR",,,,,(870) 376-4467,-91.6247488,35.7001054,-91.6247488,35.7001054,,,,72501-7896,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"858 N Central Ave, Batesville, AR",,"Dollar General-Batesville,AR",,,,,(870) 793-7702,-91.659078,35.77586,-91.659078,35.77586,,,,72501-5411,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"925 24Th St, Batesville, AR",,"Dollar General-Batesville,AR",,,,,(870) 612-5920,-91.625869,35.770097,-91.625869,35.770097,,,,72501-6106,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"102 N Market St, Benton, AR",,"Dollar General-Benton,AR",,,,,(501) 778-2426,-92.588262,34.563625,-92.588262,34.563625,,,,72015-3769,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1225 Military Rd, Benton, AR",,"Dollar General-Benton,AR",,,,,(501) 778-8827,-92.57815,34.575527,-92.57815,34.575527,,,,72015-2908,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1279 Salem Rd, Benton, AR",,"Dollar General-Benton,AR",,,,,(501) 794-2498,-92.560985,34.628886,-92.560985,34.628886,,,,72019,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2725 Edison Ave, Benton, AR",,"Dollar General-Benton,AR",,,,,(501) 303-6628,-92.5547082,34.5563149,-92.5547082,34.5563149,,,,72015,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"3801 Benton Pkwy, Benton, AR",,"Dollar General-Benton,AR",,,,,(501) 574-0279,-92.5424827,34.5749865,-92.5424827,34.5749865,,,,72015-8500,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"3904 Congo Rd, Benton, AR",,"Dollar General-Benton,AR",,,,,(501) 574-3233,-92.5662075,34.699448,-92.5662075,34.699448,,,,72019-1736,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"714 Edison Ave, Benton, AR",,"Dollar General-Benton,AR",,,,,(501) 776-2747,-92.579613,34.557588,-92.579613,34.557588,,,,72015-4512,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"14 Prospect Ct, Cabot, AR",,"Dollar General-Cabot,AR",,,,,(501) 843-9558,-92.02754,34.976663,-92.02754,34.976663,,,,72023-2899,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3520 W Main Street, Cabot, AR",,"Dollar General-Cabot,AR",,,,,(501) 843-0614,-92.0633396,34.9816006,-92.0633396,34.9816006,,,,72023,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"524 S 2Nd St, Cabot, AR",,"Dollar General-Cabot,AR",,,,,(501) 941-2729,-92.02111,34.970348,-92.02111,34.970348,,,,72023-2542,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"651 S Pine St, Cabot, AR",,"Dollar General-Cabot,AR",,,,,(501) 843-8404,-92.008408,34.961368,-92.008408,34.961368,,,,72023-3825,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1305 Dave Ward Dr, Conway, AR",,"Dollar General-Conway,AR",,,,,(501) 450-9474,-92.442963,35.067832,-92.442963,35.067832,,,,72034-6943,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1600 E Oak St, Conway, AR",,"Dollar General-Conway,AR",,,,,(501) 764-1828,-92.404837,35.091208,-92.404837,35.091208,,,,72032-4740,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2560 Donaghey, Conway, AR",,"Dollar General-Conway,AR",,,,,(501) 329-3036,-92.451316,35.111762,-92.451316,35.111762,,,,72032-2860,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"379 Highway 65 N, Conway, AR",,"Dollar General-Conway,AR",,,,,(501) 327-2020,-92.432007,35.112214,-92.432007,35.112214,,,,72032,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"506 Hwy 64 East, Conway, AR",,"Dollar General-Conway,AR",,,,,(501) 358-4067,-92.32789,35.083072,-92.32789,35.083072,,,,72032,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"816 Hogan Ln, Conway, AR",,"Dollar General-Conway,AR",,,,,(501) 504-2464,-92.49777,35.091086,-92.49777,35.091086,,,,72034-7953,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"111 Roberts Lane, Bakersfield, CA",,"Dollar General Market-Bakersfield,CA",,,,,(661) 401-7837,-119.022464,35.408628,-119.022464,35.408628,,,,93308,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1616 Niles Street, Bakersfield, CA",,"Dollar General-Bakersfield,CA",,,,,(661) 369-7745,-118.976076,35.378443,-118.976076,35.378443,,,,93306,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2317 N Chester Ave, Bakersfield, CA",,"Dollar General-Bakersfield,CA",,,,,(661) 369-7564,-119.021337,35.426923,-119.021337,35.426923,,,,93308,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"258 Bernard Street, Bakersfield, CA",,"Dollar General Market-Bakersfield,CA",,,,,(661) 371-4562,-118.99496,35.39026,-118.99496,35.39026,,,,93305-3541,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2900 Niles Street, Bakersfield, CA",,"Dollar General Market-Bakersfield,CA",,,,,(661) 369-7137,-118.953877,35.37612,-118.953877,35.37612,,,,93306,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3030 Brundage Lane, Bakersfield, CA",,"Dollar General Market-Bakersfield,CA",,,,,(661) 401-7867,-119.037342,35.354119,-119.037342,35.354119,,,,93304,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3101 Wilson Road, Bakersfield, CA",,"Dollar General-Bakersfield,CA",,,,,(661) 369-7401,-119.037353,35.332197,-119.037353,35.332197,,,,93304,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"401 Union Avenue, Bakersfield, CA",,"Dollar General Market-Bakersfield,CA",,,,,(661) 401-7839,-119.003069,35.36075,-119.003069,35.36075,,,,93308-1433,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"5101 White Lane, Bakersfield, CA",,"Dollar General-Bakersfield,CA",,,,,(661) 371-4069,-119.057709,35.318018,-119.057709,35.318018,,,,93309-8925,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1525 9Th Ave E, Bradenton, FL",,"Dollar General-Bradenton,FL",,,,,(941) 746-6274,-82.546374,27.491642,-82.546374,27.491642,,,,34208-2204,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2923 W Manatee Ave, Bradenton, FL",,"Dollar General-Bradenton,FL",,,,,(941) 348-6898,-82.591095,27.4950886,-82.591095,27.4950886,,,,34205-4238,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"3611 1St St Ste 1200, Bradenton, FL",,"Dollar General Market-Bradenton,FL",,,,,(941) 747-1347,-82.562794,27.467982,-82.562794,27.467982,,,,34208-4432,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"4726 Cortez Rd West, Bradenton, FL",,"Dollar General-Bradenton,FL",,,,,(941) 792-6192,-82.608929,27.462707,-82.608929,27.462707,,,,34210-2801,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"5102 15th St E # E, Bradenton, FL",,"Dollar General-Bradenton,FL",,,,,(941) 727-1176,-82.546847,27.450998,-82.546847,27.450998,,,,34203-4858,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"5177 33rd St E # 11, Bradenton, FL",,"Dollar General-Bradenton,FL",,,,,(941) 727-4557,-82.521564,27.449452,-82.521564,27.449452,,,,34203-4328,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"6414 14th St W Ste A, Bradenton, FL",,"Dollar General-Bradenton,FL",,,,,(941) 752-0334,-82.57551,27.42716,-82.57551,27.42716,,,,34207-5329,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"6545 Manatee Ave W, Bradenton, FL",,"Dollar General-Bradenton,FL",,,,,(941) 792-2752,-82.626661,27.495887,-82.626661,27.495887,,,,34209-2326,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"10395 Broad St, Brooksville, FL",,"Dollar General-Brooksville,FL",,,,,(352) 796-9690,-82.3755325,28.5791443,-82.3755325,28.5791443,,,,34601,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"12983 Cortez Blvd, Brooksville, FL",,"Dollar General-Brooksville,FL",,,,,(352) 597-3644,-82.5124479,28.5337459,-82.5124479,28.5337459,,,,34613-4884,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"16312 Spring Hill Dr # 6, Brooksville, FL",,"Dollar General-Brooksville,FL",,,,,(352) 799-8056,-82.455652,28.480822,-82.455652,28.480822,,,,34604-0607,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"6336 Sherman Hills Blvd, Brooksville, FL",,"Dollar General-Brooksville,FL",,,,,(352) 544-6276,-82.228374,28.524854,-82.228374,28.524854,,,,34602-7610,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"856 S Broad St, Brooksville, FL",,"Dollar General-Brooksville,FL",,,,,(352) 799-0928,-82.400221,28.546875,-82.400221,28.546875,,,,34601-3105,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1523 Tropicana Parkway West, Cape Coral, FL",,"Dollar General-Cape Coral,FL",,,,,(239) 242-0713,-82.005528,26.667106,-82.005528,26.667106,,,,33993,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1612 Skyline Blvd, Cape Coral, FL",,"Dollar General-Cape Coral,FL",,,,,(239) 574-1959,-81.9914402,26.6225995,-81.9914402,26.6225995,,,,33991-2645,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2323 Del Prado Blvd S, Cape Coral, FL",,"Dollar General-Cape Coral,FL",,,,,(239) 772-4344,-81.940984,26.609532,-81.940984,26.609532,,,,33990-4615,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2328 Andalusia Blvd, Cape Coral, FL",,"Dollar General-Cape Coral,FL",,,,,(239) 677-4924,-81.9570348,26.6960645,-81.9570348,26.6960645,,,,33909-2301,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3123 Chiquita Blvd S, Cape Coral, FL",,"Dollar General-Cape Coral,FL",,,,,(239) 541-3077,-82.00691,26.593465,-82.00691,26.593465,,,,33914-4265,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"924 Ne Pine Island Rd, Cape Coral, FL",,"Dollar General-Cape Coral,FL",,,,,(239) 574-5365,-81.956883,26.659926,-81.956883,26.659926,,,,33909-2552,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1600 N Myrtle Ave, Clearwater, FL",,"Dollar General-Clearwater,FL",,,,,(727) 443-1565,-82.796088,27.981018,-82.796088,27.981018,,,,33755-2549,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1883 N Highland Ave, Clearwater, FL",,"Dollar General-Clearwater,FL",,,,,(727) 442-1710,-82.775284,27.989291,-82.775284,27.989291,,,,33755-2156,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"422 N Belcher Rd, Clearwater, FL",,"Dollar General-Clearwater,FL",,,,,(727) 446-7461,-82.746349,27.970962,-82.746349,27.970962,,,,33765-2606,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"5251 110th Ave N Ste 108, Clearwater, FL",,"Dollar General-Clearwater,FL",,,,,(727) 592-9618,-82.705695,27.872082,-82.705695,27.872082,,,,33760-4816,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1601 James Lee Blvd East, Crestview, FL",,"Dollar General-Crestview,FL",,,,,(850) 634-0879,-86.549027,30.7598137,-86.549027,30.7598137,,,,32539-3227,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"225 Rasberry Rd, Crestview, FL",,"Dollar General-Crestview,FL",,,,,(850) 683-3550,-86.572807,30.726268,-86.572807,30.726268,,,,32536-6426,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"318 W James Lee Blvd, Crestview, FL",,"Dollar General-Crestview,FL",,,,,(850) 423-9707,-86.577188,30.762846,-86.577188,30.762846,,,,32536,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"783 N Ferdon Blvd, Crestview, FL",,"Dollar General-Crestview,FL",,,,,(850) 682-5752,-86.565313,30.771921,-86.565313,30.771921,,,,32536-2113,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"298 N Suncoast Blvd, Crystal River, FL",,"Dollar General-Crystal River,FL",,,,,(352) 795-8854,-82.579906,28.865221,-82.579906,28.865221,,,,34429-5465,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"6798 W Gulf To Lake Hwy, Crystal River, FL",,"Dollar General-Crystal River,FL",,,,,(352) 564-2010,-82.547598,28.890434,-82.547598,28.890434,,,,34429-9426,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"736 Se US Hwy 19, Crystal River, FL",,"Dollar General-Crystal River,FL",,,,,(352) 564-0811,-82.584748,28.890044,-82.584748,28.890044,,,,34429-4810,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"7958 North Citrus Avenue, Crystal River, FL",,"Dollar General-Crystal River,FL",,,,,(352) 364-4226,-82.5698013,28.9780426,-82.5698013,28.9780426,,,,34428-6943,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1110 E New York Ave, Deland, FL",,"Dollar General-Deland,FL",,,,,(386) 736-3344,-81.281757,29.028086,-81.281757,29.028086,,,,32724-5750,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1512 S Woodland Blvd, Deland, FL",,"Dollar General-Deland,FL",,,,,(386) 736-7022,-81.302785,29.002208,-81.302785,29.002208,,,,32720-7709,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2110 E International Speedway, Deland, FL",,"Dollar General-Deland,FL",,,,,(386) 736-7406,-81.2624071,29.0634862,-81.2624071,29.0634862,,,,32724-8709,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2531 N Woodland Blvd, Deland, FL",,"Dollar General-Deland,FL",,,,,(386) 736-0262,-81.313632,29.078242,-81.313632,29.078242,,,,32720-1301,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"745 N Spring Garden Ave, Deland, FL",,"Dollar General-Deland,FL",,,,,(386) 734-8664,-81.324527,29.039557,-81.324527,29.039557,,,,32720,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1411 Dawson Rd, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 889-1686,-84.184788,31.587223,-84.184788,31.587223,,,,31707-3855,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1515 Radium Springs Rd, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 420-7774,-84.136963,31.549598,-84.136963,31.549598,,,,31705-4051,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1775 Philema Rd S, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 420-8747,-84.116107,31.632034,-84.116107,31.632034,,,,31701-4740,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1824 Martin Luther King J, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 888-1169,-84.155141,31.555468,-84.155141,31.555468,,,,31701,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1906 E Oglethorpe Blvd, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 436-5325,-84.10289,31.570774,-84.10289,31.570774,,,,31705-2935,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2017 N Slappery Blvd, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 446-8141,-84.161871,31.57608,-84.161871,31.57608,,,,31701-1008,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2401 Dawson Rd Ste C, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 435-2816,-84.207391,31.60661,-84.207391,31.60661,,,,31707-2381,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2401 Liberty Expressway, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 888-7474,-84.118219,31.464175,-84.118219,31.464175,,,,31705,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"300 East Oglethorpe Boulevard, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 255-3920,-84.1415558,31.5747318,-84.1415558,31.5747318,,,,31705,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"3005 N Slappey Blvd, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 639-1160,-84.177123,31.623373,-84.177123,31.623373,,,,31701-1021,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"327 S Westover Blvd, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 888-1564,-84.220933,31.573665,-84.220933,31.573665,,,,31707-0609,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"408 South Slappy Blvd, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 432-2210,-84.1757965,31.5711479,-84.1757965,31.5711479,,,,31701,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"4805 Hill Road, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 518-6226,-84.0322606,31.5738165,-84.0322606,31.5738165,,,,31705,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"5731 Newton Road, Albany, GA",,"Dollar General-Albany,GA",,,,,(229) 420-7387,-84.20059,31.5145,-84.20059,31.5145,,,,31701,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1055 Gaines School Rd, Athens, GA",,"Dollar General-Athens,GA",,,,,(706) 227-0844,-83.338839,33.925919,-83.338839,33.925919,,,,30605-3164,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"1125 West Broad Street, Athens, GA",,"Dollar General-Athens,GA",,,,,(706) 247-7861,-83.3911438,33.9538155,-83.3911438,33.9538155,,,,30606,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"11325 Commerce Hwy, Athens, GA",,"Dollar General-Athens,GA",,,,,(706) 227-0008,-83.401819,34.03253,-83.401819,34.03253,,,,30607-4321,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"2194 Lexington Road, Athens, GA",,"Dollar General-Athens,GA",,,,,(706) 395-5876,-83.3403499,33.9447653,-83.3403499,33.9447653,,,,30605-2338,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"2411 Jefferson Rd, Athens, GA",,"Dollar General Market-Athens,GA",,,,,(706) 354-4660,-83.412977,33.972517,-83.412977,33.972517,,,,30607-1202,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"800 Danielsville Rd, Athens, GA",,"Dollar General-Athens,GA",,,,,(706) 389-9632,-83.360936,33.982984,-83.360936,33.982984,,,,30601,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"880 Whitehall Road, Athens, GA",,"Dollar General-Athens,GA",,,,,(706) 395-8426,-83.3647232,33.899395,-83.3647232,33.899395,,,,30605-4223,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"101 Sand Bar Ferry Rd, Augusta, GA",,"Dollar General-Augusta,GA",,,,,(706) 250-6129,-81.9463194,33.4681488,-81.9463194,33.4681488,,,,30901,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"210 S Belair Rd, Augusta, GA",,"Dollar General-Augusta,GA",,,,,(706) 863-3955,-82.137887,33.495839,-82.137887,33.495839,,,,30907-9301,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2344 Washington Rd, Augusta, GA",,"Dollar General-Augusta,GA",,,,,(706) 667-8028,-82.011242,33.497197,-82.011242,33.497197,,,,30904-3162,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2549 Deans Bridge Rd, Augusta, GA",,"Dollar General-Augusta,GA",,,,,(706) 733-2778,-82.018253,33.44306,-82.018253,33.44306,,,,30906,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"3120 Peach Orchard Rd, Augusta, GA",,"Dollar General-Augusta,GA",,,,,(706) 796-7151,-82.026068,33.41111,-82.026068,33.41111,,,,30906-3564,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"3134 Wrightsboro Rd, Augusta, GA",,"Dollar General-Augusta,GA",,,,,(706) 736-7556,-82.053443,33.46999,-82.053443,33.46999,,,,30909-0316,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"3250 Deans Bridge Rd, Augusta, GA",,"Dollar General-Augusta,GA",,,,,(706) 790-7052,-82.067501,33.420422,-82.067501,33.420422,,,,30906-4218,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"36 Kiutuestia Creek Rd, Blairsville, GA",,"Dollar General-Blairsville,GA",,,,,(706) 487-8036,-84.0027161,34.8469162,-84.0027161,34.8469162,,,,30512-4315,,,,,,,,monthly,TRUE,,,,1,dates,"10,20",,,,,,, +,,"42 Copperhead Rd, Blairsville, GA",,"Dollar General-Blairsville,GA",,,,,(706) 745-9826,-84.092959,34.87718,-84.092959,34.87718,,,,30512-3459,,,,,,,,monthly,TRUE,,,,1,dates,"10,20",,,,,,, +,,"513 F Murphy Highway Po Box 1205, Blairsville, GA",,"Dollar General-Blairsville,GA",,,,,(706) 781-1826,-83.971603,34.87569,-83.971603,34.87569,,,,30512-3168,,,,,,,,monthly,TRUE,,,,1,dates,"10,20",,,,,,, +,,"5267 Gainesville Hwy, Blairsville, GA",,"Dollar General-Blairsville,GA",,,,,(706) 835-2019,-83.895961,34.800221,-83.895961,34.800221,,,,30512,,,,,,,,monthly,TRUE,,,,1,dates,"10,20",,,,,,, +,,"93 Ivy Log Road [Po Box 1205], Blairsville, GA",,"Dollar General-Blairsville,GA",,,,,(706) 781-1826,-84.0587845,34.9629669,-84.0587845,34.9629669,,,,30512,,,,,,,,monthly,TRUE,,,,1,dates,"10,20",,,,,,, +,,"93 Ivyl0G Rd, Blairsville, GA",,"Dollar General-Blairsville,GA",,,,,(706) 745-6573,-84.003179,34.9342,-84.003179,34.9342,,,,30512-1456,,,,,,,,monthly,TRUE,,,,1,dates,"10,20",,,,,,, +,,"20 Higginbotham Rd, Brunswick, GA",,"Dollar General-Brunswick,GA",,,,,(912) 217-5762,-81.4573856,31.2271699,-81.4573856,31.2271699,,,,31525,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"25 Cornerstone Lane Llc, Brunswick, GA",,"Dollar General-Brunswick,GA",,,,,(912) 262-1144,-81.5388412,31.2375393,-81.5388412,31.2375393,,,,31523-4224,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2701 J St, Brunswick, GA",,"Dollar General-Brunswick,GA",,,,,(912) 265-2230,-81.481348,31.160203,-81.481348,31.160203,,,,31520-6131,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2915 Norwich St, Brunswick, GA",,"Dollar General-Brunswick,GA",,,,,(912) 267-1515,-81.4983945,31.1689599,-81.4983945,31.1689599,,,,31520,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"315 Venture Dr, Brunswick, GA",,"Dollar General-Brunswick,GA",,,,,(912) 267-9453,-81.507184,31.24678,-81.507184,31.24678,,,,31525-9723,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"375 Palisade Dr, Brunswick, GA",,"Dollar General-Brunswick,GA",,,,,(912) 267-6066,-81.584796,31.140119,-81.584796,31.140119,,,,31523-8207,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"4440 New Jessup Highway, Brunswick, GA",,"Dollar General-Brunswick,GA",,,,,(912) 289-3100,-81.5117506,31.2098448,-81.5117506,31.2098448,,,,31520,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"5598 Altama Ave, Brunswick, GA",,"Dollar General-Brunswick,GA",,,,,(912) 265-8200,-81.4811741,31.2109566,-81.4811741,31.2109566,,,,31525,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1284 Curtis Pkwy, Calhoun, GA",,"Dollar General-Calhoun,GA",,,,,(706) 629-4642,-84.922393,34.475714,-84.922393,34.475714,,,,30701-3919,,,,,,,,monthly,TRUE,,,,1,dates,"10,25",,,,,,, +,,"200 Williams St Se, Calhoun, GA",,"Dollar General-Calhoun,GA",,,,,(706) 629-0604,-84.937986,34.52703,-84.937986,34.52703,,,,30701-4690,,,,,,,,monthly,TRUE,,,,1,dates,"10,25",,,,,,, +,,"3168 New Rosedale Road Ne, Calhoun, GA",,"Dollar General-Calhoun,GA",,,,,(706) 403-4454,-85.1095477,34.4381583,-85.1095477,34.4381583,,,,30701,,,,,,,,monthly,TRUE,,,,1,dates,"10,25",,,,,,, +,,"634 Oothcalooga St, Calhoun, GA",,"Dollar General-Calhoun,GA",,,,,(706) 625-2565,-84.959057,34.500505,-84.959057,34.500505,,,,30701-2342,,,,,,,,monthly,TRUE,,,,1,dates,"10,25",,,,,,, +,,"6935 Fairmount Hwy Se, Calhoun, GA",,"Dollar General-Calhoun,GA",,,,,(706) 625-9005,-84.84304,34.448327,-84.84304,34.448327,,,,30701-4022,,,,,,,,monthly,TRUE,,,,1,dates,"10,25",,,,,,, +,,"920 N Wall St, Calhoun, GA",,"Dollar General-Calhoun,GA",,,,,(706) 624-0480,-84.945,34.517022,-84.945,34.517022,,,,30701-1734,,,,,,,,monthly,TRUE,,,,1,dates,"10,25",,,,,,, +,,"926 Hunts Gin Rd Ne, Calhoun, GA",,"Dollar General-Calhoun,GA",,,,,(706) 629-4466,-84.844327,34.538892,-84.844327,34.538892,,,,30701-9500,,,,,,,,monthly,TRUE,,,,1,dates,"10,25",,,,,,, +,,"1003 N Park St, Carrollton, GA",,"Dollar General-Carrollton,GA",,,,,(770) 836-0173,-85.079294,33.594451,-85.079294,33.594451,,,,30117-2226,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1078 Alabama Street, Carrollton, GA",,"Dollar General-Carrollton,GA",,,,,(678) 321-0996,-85.0980625,33.5876291,-85.0980625,33.5876291,,,,30117-2004,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"111 Newnan Rd, Carrollton, GA",,"Dollar General-Carrollton,GA",,,,,(678) 321-7904,-85.0664493,33.5802195,-85.0664493,33.5802195,,,,30117,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1515 Bankhead Hwy, Carrollton, GA",,"Dollar General-Carrollton,GA",,,,,(770) 838-7966,-85.02674,33.602355,-85.02674,33.602355,,,,30117-1852,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1561 S Highway 27, Carrollton, GA",,"Dollar General-Carrollton,GA",,,,,(770) 836-1617,-85.073878,33.54757,-85.073878,33.54757,,,,30117-8927,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3960 Carrollton Villa Rica Hw, Carrollton, GA",,"Dollar General-Carrollton,GA",,,,,(770) 836-0447,-84.971382,33.644236,-84.971382,33.644236,,,,30116-5539,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"4043 Mt Zion Rd, Carrollton, GA",,"Dollar General-Carrollton,GA",,,,,(770) 836-3994,-85.1792523,33.62736,-85.1792523,33.62736,,,,30117,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"827 Maple St, Carrollton, GA",,"Dollar General-Carrollton,GA",,,,,(678) 796-1988,-85.084267,33.574885,-85.084267,33.574885,,,,30117-3625,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"104 Market Sq, Cartersville, GA",,"Dollar General-Cartersville,GA",,,,,(770) 386-5700,-84.788869,34.174803,-84.788869,34.174803,,,,30120-2854,,,,,,,,monthly,TRUE,,,,1,dates,"10,15",,,,,,, +,,"1316 Cassville Rd Nw, Cartersville, GA",,"Dollar General-Cartersville,GA",,,,,(770) 387-2252,-84.856562,34.229306,-84.856562,34.229306,,,,30120-4870,,,,,,,,monthly,TRUE,,,,1,dates,"10,15",,,,,,, +,,"265 Cassville Rd, Cartersville, GA",,"Dollar General-Cartersville,GA",,,,,(770) 607-7572,-84.815537,34.180915,-84.815537,34.180915,,,,30120-2541,,,,,,,,monthly,TRUE,,,,1,dates,"10,15",,,,,,, +,,"4 Walnut Grove Rd, Cartersville, GA",,"Dollar General-Cartersville,GA",,,,,none listed,-84.8287882,34.1484093,-84.8287882,34.1484093,,,,30120,,,,,,,,monthly,TRUE,,,,1,dates,"10,15",,,,,,, +,,"916 Joe Frank Harris Pkwy, Cartersville, GA",,"Dollar General-Cartersville,GA",,,,,(770) 607-5429,-84.79039,34.197127,-84.79039,34.197127,,,,30120-9024,,,,,,,,monthly,TRUE,,,,1,dates,"10,15",,,,,,, +,,"100 Smyrna Ramhurst Rd E, Chatsworth, GA",,"Dollar General-Chatsworth,GA",,,,,(706) 517-4115,-84.780569,34.728812,-84.780569,34.728812,,,,30705-6785,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"169 Blackwell Rd, Chatsworth, GA",,"Dollar General-Chatsworth,GA",,,,,(706) 695-8836,-84.774968,34.754789,-84.774968,34.754789,,,,30705-3057,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2180 Highway 76, Chatsworth, GA",,"Dollar General-Chatsworth,GA",,,,,(706) 695-1951,-84.811447,34.782748,-84.811447,34.782748,,,,30705-7301,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2676 Springplace Smyrna Rd, Chatsworth, GA",,"Dollar General-Chatsworth,GA",,,,,(706) 517-1508,-84.7672272,34.7450981,-84.7672272,34.7450981,,,,30705,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2301 Cusseta Road, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 405-2007,-84.9590836,32.4481583,-84.9590836,32.4481583,,,,31903,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"2500 Hamilton Road, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 405-3371,-84.9825363,32.4875717,-84.9825363,32.4875717,,,,31904,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"2602 Manchester Expy, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 653-5191,-84.955451,32.506638,-84.955451,32.506638,,,,31904-5207,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"3649 Victory Dr, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 687-0044,-84.944655,32.418716,-84.944655,32.418716,,,,31903-4553,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"3729 Macon Rd, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 561-7299,-84.931542,32.489446,-84.931542,32.489446,,,,31907-2203,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"3846 Saint Marys Rd Unit Sc 09, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 682-5409,-84.931065,32.446473,-84.931065,32.446473,,,,31906-4550,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"3885 Millder Rd Ste B, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 569-6216,-84.92526,32.539764,-84.92526,32.539764,,,,31909-4778,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"4900 River Rd, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 321-0027,-84.982563,32.511217,-84.982563,32.511217,,,,31904-5837,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"5120 Warm Springs Rd, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 565-9028,-84.906241,32.534826,-84.906241,32.534826,,,,31909-6902,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"6001 Crystal Drive, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 405-2733,-84.8880157,32.5132904,-84.8880157,32.5132904,,,,31907,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"6499 Veterans Pkwy Ste C, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 653-1664,-84.954835,32.539127,-84.954835,32.539127,,,,31909-6209,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"915 Amber Dr Ste A, Columbus, GA",,"Dollar General-Columbus,GA",,,,,(706) 569-8505,-84.892584,32.463628,-84.892584,32.463628,,,,31907-7387,,,,,,,,monthly,TRUE,,,,1,dates,"8,18",,,,,,, +,,"10734 Highway 36, Covington, GA",,"Dollar General-Covington,GA",,,,,(678) 342-4545,-83.849263,33.557473,-83.849263,33.557473,,,,30014-4067,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"15797 Highway 36, Covington, GA",,"Dollar General-Covington,GA",,,,,(770) 786-7861,-83.850241,33.423792,-83.850241,33.423792,,,,30014-6021,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2481 Highway 81 S, Covington, GA",,"Dollar General-Covington,GA",,,,,(678) 342-9917,-83.920444,33.556856,-83.920444,33.556856,,,,30014-8605,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"3227 Salem Rd, Covington, GA",,"Dollar General-Covington,GA",,,,,(770)761-8939,-83.972719,33.603844,-83.972719,33.603844,,,,30016,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"5321 Highway 20 S, Covington, GA",,"Dollar General-Covington,GA",,,,,(770) 788-8880,-84.017267,33.549715,-84.017267,33.549715,,,,30016-4409,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"6185 Highway 278 Nw, Covington, GA",,"Dollar General-Covington,GA",,,,,(770) 786-6214,-83.87428,33.605354,-83.87428,33.605354,,,,30014-2127,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"7118 Highway 278 Ne, Covington, GA",,"Dollar General-Covington,GA",,,,,(770) 788-9583,-83.840165,33.601267,-83.840165,33.601267,,,,30014-2669,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1293 Merchants Dr, Dallas, GA",,"Dollar General-Dallas,GA",,,,,(770) 505-4322,-84.797862,33.910747,-84.797862,33.910747,,,,30132-5036,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2388 Villa Rica Hwy, Dallas, GA",,"Dollar General-Dallas,GA",,,,,(678) 363-7398,-84.84048,33.878005,-84.84048,33.878005,,,,30157-7063,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"24 Williams Rd, Dallas, GA",,"Dollar General-Dallas,GA",,,,,(678) 809-6050,-84.835947,34.044408,-84.835947,34.044408,,,,30132,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2425 Gold Mine Rd, Dallas, GA",,"Dollar General-Dallas,GA",,,,,(770) 505-9703,-84.99071,33.923925,-84.99071,33.923925,,,,30157-1248,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"263 E Paulding Dr, Dallas, GA",,"Dollar General-Dallas,GA",,,,,(770) 445-6165,-84.785013,33.955907,-84.785013,33.955907,,,,30157-2701,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"640 W Memorial Dr, Dallas, GA",,"Dollar General-Dallas,GA",,,,,(678) 363-0343,-84.854602,33.920083,-84.854602,33.920083,,,,30132-4123,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1004 Riverburch Pkwy, Dalton, GA",,"Dollar General-Dalton,GA",,,,,(706) 270-5774,-84.944432,34.801111,-84.944432,34.801111,,,,30721-8630,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"101 W Walnut Ave Ste 1, Dalton, GA",,"Dollar General-Dalton,GA",,,,,(706) 275-9039,-84.968489,34.761384,-84.968489,34.761384,,,,30720-8426,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"113 Phelps Rd Se, Dalton, GA",,"Dollar General-Dalton,GA",,,,,(706) 277-0749,-84.986631,34.693036,-84.986631,34.693036,,,,30720-7613,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1214 Dawnville Rd Ne, Dalton, GA",,"Dollar General-Dalton,GA",,,,,(706) 217-3080,-84.887341,34.81625,-84.887341,34.81625,,,,30721-6805,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1902 Dug Gap Road, Dalton, GA",,"Dollar General-Dalton,GA",,,,,(706) 229-4150,-84.9989624,34.7394104,-84.9989624,34.7394104,,,,30720,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"2308 E Morris St, Dalton, GA",,"Dollar General-Dalton,GA",,,,,(706) 278-0086,-84.953755,34.768442,-84.953755,34.768442,,,,30721,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"2524 Cleveland Hwy, Dalton, GA",,"Dollar General-Dalton,GA",,,,,(706) 370-4981,-84.945129,34.822623,-84.945129,34.822623,,,,30721-8157,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"3417 Airport Road, Dalton, GA",,"Dollar General-Dalton,GA",,,,,(706) 508-4457,-84.9176002,34.7562227,-84.9176002,34.7562227,,,,30721-6102,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"511 N Glenwood Ave, Dalton, GA",,"Dollar General-Dalton,GA",,,,,(706) 278-7940,-84.965037,34.778182,-84.965037,34.778182,,,,30721-2814,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1201 Hwy 221, Douglas, GA",,"Dollar General-Douglas,GA",,,,,(912) 383-9963,-82.849904,31.508905,-82.849904,31.508905,,,,31533-6852,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1730 Peterson Ave S, Douglas, GA",,"Dollar General-Douglas,GA",,,,,(912) 384-9506,-82.851045,31.480967,-82.851045,31.480967,,,,31535-5008,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"2489 Hwy 32 W, Douglas, GA",,"Dollar General-Douglas,GA",,,,,(912) 383-0582,-82.885419,31.518125,-82.885419,31.518125,,,,31533-9082,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"4074 Willacooche Highway, Douglas, GA",,"Dollar General-Douglas,GA",,,,,(none listed),-82.8878693,31.4388498,-82.8878693,31.4388498,,,,31535,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"518 Peterson Ave S, Douglas, GA",,"Dollar General-Douglas,GA",,,,,(912) 384-2999,-82.850406,31.503005,-82.850406,31.503005,,,,31533-5254,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"2190 Midway Rd, Douglasville, GA",,"Dollar General-Douglasville,GA",,,,,(770) 942-5580,-84.698168,33.74858,-84.698168,33.74858,,,,30135-1055,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"4061 Anneewakee Rd, Douglasville, GA",,"Dollar General-Douglasville,GA",,,,,(770) 949-6140,-84.701161,33.692777,-84.701161,33.692777,,,,30135-4307,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"4870 Highway 5, Douglasville, GA",,"Dollar General-Douglasville,GA",,,,,(770) 489-6634,-84.804988,33.673461,-84.804988,33.673461,,,,30135-4536,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"6040 Central Church Rd, Douglasville, GA",,"Dollar General-Douglasville,GA",,,,,(770) 489-9687,-84.772593,33.704014,-84.772593,33.704014,,,,30135-6901,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"6134 E Broad St, Douglasville, GA",,"Dollar General-Douglasville,GA",,,,,(770) 920-7666,-84.733443,33.758839,-84.733443,33.758839,,,,30134-2372,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"6307 Cedar Mountain Road, Douglasville, GA",,"Dollar General-Douglasville,GA",,,,,(678) 324-9563,-84.78141,33.759052,-84.78141,33.759052,,,,30134-3504,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"8427 Hwy 166, Douglasville, GA",,"Dollar General-Douglasville,GA",,,,,(678) 383-9320,-84.8507186,33.6194857,-84.8507186,33.6194857,,,,30135,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"151 Jacolyn Dr Nw, Cedar Rapids, IA",,"Dollar General-Cedar Rapids,IA",,,,,(319) 390-1164,-91.731796,41.969243,-91.731796,41.969243,,,,52405-5529,,,,,,,,monthly,TRUE,,,,1,dates,"7,17",,,,,,, +,,"266 Blairs Ferry Rd Ne, Cedar Rapids, IA",,"Dollar General-Cedar Rapids,IA",,,,,(319) 373-7040,-91.632728,42.034179,-91.632728,42.034179,,,,52402-3161,,,,,,,,monthly,TRUE,,,,1,dates,"7,17",,,,,,, +,,"2741 16Th Ave Sw, Cedar Rapids, IA",,"Dollar General-Cedar Rapids,IA",,,,,(319) 398-9402,-91.707131,41.962916,-91.707131,41.962916,,,,52404-1633,,,,,,,,monthly,TRUE,,,,1,dates,"7,17",,,,,,, +,,"3451 Mount Vernon Rd Se, Cedar Rapids, IA",,"Dollar General-Cedar Rapids,IA",,,,,(319) 364-6099,-91.61771,41.976696,-91.61771,41.976696,,,,52403-3736,,,,,,,,monthly,TRUE,,,,1,dates,"7,17",,,,,,, +,,"403 Edgewood Rd Nw, Cedar Rapids, IA",,"Dollar General-Cedar Rapids,IA",,,,,(319) 390-1050,-91.715804,41.97593,-91.715804,41.97593,,,,52405-3651,,,,,,,,monthly,TRUE,,,,1,dates,"7,17",,,,,,, +,,"109 E 50Th St, Davenport, IA",,"Dollar General-Davenport,IA",,,,,(563) 386-4112,-90.541609,41.5721,-90.541609,41.5721,,,,52806-3958,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2170 E Kimberly Rd Ste 350, Davenport, IA",,"Dollar General-Davenport,IA",,,,,(563) 344-0792,-90.545886,41.557084,-90.545886,41.557084,,,,52807-2230,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2217 Rockingham Rd, Davenport, IA",,"Dollar General-Davenport,IA",,,,,(563) 323-8255,-90.609761,41.515693,-90.609761,41.515693,,,,52802-2809,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2604 W Locust St, Davenport, IA",,"Dollar General-Davenport,IA",,,,,(563) 391-0747,-90.615221,41.53837,-90.615221,41.53837,,,,52804-3347,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"3936 N Pine St, Davenport, IA",,"Dollar General-Davenport,IA",,,,,(563) 391-2153,-90.610616,41.56079,-90.610616,41.56079,,,,52806-4944,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"403 E Locust St, Davenport, IA",,"Dollar General-Davenport,IA",,,,,(563) 322-4025,-90.569476,41.538134,-90.569476,41.538134,,,,52803-4328,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1020 E Army Post Rd, Des Moines, IA",,"Dollar General-Des Moines,IA",,,,,(515) 256-7168,-93.60169,41.526492,-93.60169,41.526492,,,,50315-5939,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1428 E Ovid Ave, Des Moines, IA",,"Dollar General-Des Moines,IA",,,,,(515) 263-7910,-93.599932,41.625982,-93.599932,41.625982,,,,50316-1323,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"221 Sw 63Rd St, Des Moines, IA",,"Dollar General-Des Moines,IA",,,,,(515) 255-8070,-93.703204,41.57606,-93.703204,41.57606,,,,50312-1501,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2570 Hubbell Ave, Des Moines, IA",,"Dollar General-Des Moines,IA",,,,,(515) 265-8141,-93.568996,41.610513,-93.568996,41.610513,,,,50317-6102,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2650 Ingersoll Ave, Des Moines, IA",,"Dollar General-Des Moines,IA",,,,,(515) 283-9084,-93.652564,41.58547,-93.652564,41.58547,,,,50312-5238,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3102 Merle Hay Rd, Des Moines, IA",,"Dollar General-Des Moines,IA",,,,,(515) 278-3005,-93.697759,41.623633,-93.697759,41.623633,,,,50310,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3220 Martin Luther King Jr, Des Moines, IA",,"Dollar General-Des Moines,IA",,,,,(515) 422-9038,-93.64955,41.624158,-93.64955,41.624158,,,,50310,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3223 Se 14Th St Ste C, Des Moines, IA",,"Dollar General-Des Moines,IA",,,,,(515) 282-7307,-93.596637,41.555004,-93.596637,41.555004,,,,50320-1331,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"4213 Fleur Dr, Des Moines, IA",,"Dollar General-Des Moines,IA",,,,,(515) 953-0203,-93.644794,41.546034,-93.644794,41.546034,,,,50321-2325,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"12635 S Halsted St, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 568-7194,-87.641226,41.664372,-87.641226,41.664372,,,,60628-7012,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2019 W 79Th Street, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 994-5614,-87.673869,41.750052,-87.673869,41.750052,,,,60620,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2649 E 79Th St, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 356-6388,-87.559917,41.75179,-87.559917,41.75179,,,,60649-5227,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"316 W 103rd Street, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 796-3865,-87.6313782,41.7073402,-87.6313782,41.7073402,,,,60628-2504,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"3527 W Armitage Ave, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 489-1103,-87.714531,41.917188,-87.714531,41.917188,,,,60647-3602,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"4046 W Roosevelt Rd, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 826-0382,-87.726188,41.866287,-87.726188,41.866287,,,,60624-3937,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"5434 W N Ave, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 796-5109,-87.7615014,41.9094676,-87.7615014,41.9094676,,,,60639-4347,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"549 E Pershing Rd, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 924-3785,-87.613488,41.823867,-87.613488,41.823867,,,,60653-1915,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"5627 N Lincoln Ave, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 989-6805,-87.695905,41.983716,-87.695905,41.983716,,,,60659,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"5701 W Belmont Ave, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 622-5846,-87.769033,41.938531,-87.769033,41.938531,,,,60634,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"6225 S Kedzie Ave, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(706) 624-6584,-87.703148,41.780102,-87.703148,41.780102,,,,60629,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"6647 S Western Ave, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(309) 582-5338,-87.683413,41.772187,-87.683413,41.772187,,,,60636-2412,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"8201 S Racine Ave, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 966-2551,-87.653228,41.744743,-87.653228,41.744743,,,,60620-3117,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"9244 S Ashland Ave, Chicago, IL",,"Dollar General-Chicago,IL",,,,,(773) 546-9202,-87.6628,41.725834,-87.6628,41.725834,,,,60620-5050,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1467 King Ave, Decatur, IL",,"Dollar General-Decatur,IL",,,,,(217) 429-1099,-88.98033,39.848958,-88.98033,39.848958,,,,62522-1444,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1736 S Taylorville Road, Decatur, IL",,"Dollar General-Decatur,IL",,,,,(217) 615-0156,-88.9807874,39.8214148,-88.9807874,39.8214148,,,,62521,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"250 W 1St Dr, Decatur, IL",,"Dollar General-Decatur,IL",,,,,(217) 423-9308,-88.956349,39.822043,-88.956349,39.822043,,,,62521-5206,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2922 N Martin Luther King Jr D, Decatur, IL",,"Dollar General-Decatur,IL",,,,,(217) 875-5310,-88.950307,39.875549,-88.950307,39.875549,,,,62526-2428,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3797 E Rte 36, Decatur, IL",,"Dollar General-Decatur,IL",,,,,(217) 428-6653,-88.894819,39.824754,-88.894819,39.824754,,,,62521-5085,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"969 E Eldorado Street, Decatur, IL",,"Dollar General-Decatur,IL",,,,,(217) 615-2969,-88.9443348,39.846018,-88.9443348,39.846018,,,,62521-1913,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"985 W Pershing Rd Unit 3A, Decatur, IL",,"Dollar General-Decatur,IL",,,,,(217) 877-7506,-88.97023,39.876188,-88.97023,39.876188,,,,62526-1573,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1211 E 53Rd St, Anderson, IN",,"Dollar General-Anderson,IN",,,,,(765) 641-0147,-85.664373,40.061674,-85.664373,40.061674,,,,46013-2817,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1315 W 38Th St, Anderson, IN",,"Dollar General-Anderson,IN",,,,,(765) 643-0514,-85.69574,40.076105,-85.69574,40.076105,,,,46013-1007,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1812 Raible Ave, Anderson, IN",,"Dollar General-Anderson,IN",,,,,(765) 643-0091,-85.711009,40.097352,-85.711009,40.097352,,,,46011-4136,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"415 S Scatterfield Rd, Anderson, IN",,"Dollar General-Anderson,IN",,,,,(765) 642-6805,-85.653008,40.11185,-85.653008,40.11185,,,,46012-3602,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2150 State St, Columbus, IN",,"Dollar General-Columbus,IN",,,,,(812) 378-9641,-85.900644,39.196211,-85.900644,39.196211,,,,47201-7306,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2550 Eastbrook Plaza, Columbus, IN",,"Dollar General-Columbus,IN",,,,,(812) 372-3440,-85.894859,39.22505,-85.894859,39.22505,,,,47201-3738,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"3880 25Th St, Columbus, IN",,"Dollar General-Columbus,IN",,,,,(812) 376-8781,-85.877107,39.2236,-85.877107,39.2236,,,,47203-3005,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"4130 W Jonathan Moore Pike, Columbus, IN",,"Dollar General-Columbus,IN",,,,,(812) 342-2575,-85.969884,39.199978,-85.969884,39.199978,,,,47201-8667,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"9620 N Us Highway 31, Columbus, IN",,"Dollar General-Columbus,IN",,,,,(812) 526-5737,-85.954212,39.293203,-85.954212,39.293203,,,,47201-8538,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1464 Ky 185, Bowling Green, KY",,"Dollar General-Bowling Green,KY",,,,,(270) 842-4546,-86.4428095,37.01177,-86.4428095,37.01177,,,,42101-7619,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1554 Us 31W Byp, Bowling Green, KY",,"Dollar General-Bowling Green,KY",,,,,(270) 781-9787,-86.447797,36.980276,-86.447797,36.980276,,,,42101-3070,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"180 River Place Ave, Bowling Green, KY",,"Dollar General Market-Bowling Green,KY",,,,,(270) 842-0701,-86.390328,37.008783,-86.390328,37.008783,,,,42101-7128,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1950 Cave Mill Rd, Bowling Green, KY",,"Dollar General-Bowling Green,KY",,,,,(270) 843-3427,-86.425718,36.945307,-86.425718,36.945307,,,,42104-6337,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2556 Russellville Rd, Bowling Green, KY",,"Dollar General-Bowling Green,KY",,,,,(270) 846-4413,-86.487599,36.963086,-86.487599,36.963086,,,,42101-5216,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2619 Nashville Rd, Bowling Green, KY",,"Dollar General-Bowling Green,KY",,,,,(270) 842-5952,-86.471769,36.957443,-86.471769,36.957443,,,,42101-4027,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"325 E 6th Avenue, Bowling Green, KY",,"Dollar General-Bowling Green,KY",,,,,(270) 282-2216,-86.438591,36.9970588,-86.438591,36.9970588,,,,42101,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"5388 Scottsville Rd, Bowling Green, KY",,"Dollar General-Bowling Green,KY",,,,,(270) 796-2866,-86.409357,36.922477,-86.409357,36.922477,,,,42104-7911,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"901 Morgantown Rd, Bowling Green, KY",,"Dollar General-Bowling Green,KY",,,,,(270) 793-0069,-86.474931,36.988544,-86.474931,36.988544,,,,42101,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1102 Elkhorn Rd, Campbellsville, KY",,"Dollar General-Campbellsville,KY",,,,,(270) 469-4938,-85.328033,37.332473,-85.328033,37.332473,,,,42718-1160,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1325 E Broadway St, Campbellsville, KY",,"Dollar General-Campbellsville,KY",,,,,(270) 465-3020,-85.331022,37.352301,-85.331022,37.352301,,,,42718-1599,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3400 New Columbia Road, Campbellsville, KY",,"Dollar General-Campbellsville,KY",,,,,(270) 572-4081,-85.364136,37.29021,-85.364136,37.29021,,,,42718,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"732 West Broadway, Campbellsville, KY",,"Dollar General-Campbellsville,KY",,,,,(270) 789-0538,-85.360322,37.338264,-85.360322,37.338264,,,,42718-1595,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1242 Highway 770, Corbin, KY",,"Dollar General-Corbin,KY",,,,,(606) 258-0330,-84.131298,36.974822,-84.131298,36.974822,,,,40701-4767,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"14397 N Us Highway 25E, Corbin, KY",,"Dollar General-Corbin,KY",,,,,(606) 523-0341,-84.067113,36.9554,-84.067113,36.9554,,,,40701,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1512 18Th Street, Corbin, KY",,"Dollar General-Corbin,KY",,,,,(606) 526-0399,-84.101499,36.93037,-84.101499,36.93037,,,,40701-2723,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2055 US Hwy 26, Corbin, KY",,"Dollar General-Corbin,KY",,,,,(606) 620-9591,-84.0880737,36.9073982,-84.0880737,36.9073982,,,,40701,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"4005 Cumberland Falls Hwy, Corbin, KY",,"Dollar General-Corbin,KY",,,,,(606) 258-9970,-84.154536,36.908427,-84.154536,36.908427,,,,40701-8617,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1912 S State St, Abbeville, LA",,"Dollar General-Abbeville,LA",,,,,(337) 893-4359,-92.141327,29.956805,-92.141327,29.956805,,,,70510-8226,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2030 Charity St, Abbeville, LA",,"Dollar General-Abbeville,LA",,,,,(337) 893-0493,-92.115609,29.972378,-92.115609,29.972378,,,,70510-5411,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2718 Rodeo Rd, Abbeville, LA",,"Dollar General-Abbeville,LA",,,,,(337) 898-0100,-92.144558,29.953308,-92.144558,29.953308,,,,70510-4083,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"519 Park Ave, Abbeville, LA",,"Dollar General-Abbeville,LA",,,,,(337) 898-1157,-92.139354,29.982118,-92.139354,29.982118,,,,70510-3503,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1616 Bringhurst Street, Alexandria, LA",,"Dollar General-Alexandria,LA",,,,,(318) 709-9670,-92.450441,31.301834,-92.450441,31.301834,,,,71301,,,,,,,,monthly,TRUE,,,,1,dates,"7,17,27",,,,,,, +,,"1800 Macarthur Dr Ste A, Alexandria, LA",,"Dollar General-Alexandria,LA",,,,,(318) 561-2932,-92.472534,31.279282,-92.472534,31.279282,,,,71301-3760,,,,,,,,monthly,TRUE,,,,1,dates,"7,17,27",,,,,,, +,,"2108 N Bolton Ave, Alexandria, LA",,"Dollar General-Alexandria,LA",,,,,(318) 487-1198,-92.474117,31.320918,-92.474117,31.320918,,,,71303-4405,,,,,,,,monthly,TRUE,,,,1,dates,"7,17,27",,,,,,, +,,"2314 Broadway Ave, Alexandria, LA",,"Dollar General-Alexandria,LA",,,,,(318) 442-2863,-92.438684,31.290513,-92.438684,31.290513,,,,71302-4825,,,,,,,,monthly,TRUE,,,,1,dates,"7,17,27",,,,,,, +,,"305 Macarthur Dr, Alexandria, LA",,"Dollar General-Alexandria,LA",,,,,(318) 442-0089,-92.480171,31.297952,-92.480171,31.297952,,,,71303-3106,,,,,,,,monthly,TRUE,,,,1,dates,"7,17,27",,,,,,, +,,"5101 Horseshoe Dr, Alexandria, LA",,"Dollar General-Alexandria,LA",,,,,(318) 445-2302,-92.449714,31.261257,-92.449714,31.261257,,,,71302-2720,,,,,,,,monthly,TRUE,,,,1,dates,"7,17,27",,,,,,, +,,"7518A Coliseum Blvd, Alexandria, LA",,"Dollar General-Alexandria,LA",,,,,(318) 443-6113,-92.527458,31.29611,-92.527458,31.29611,,,,71303-9752,,,,,,,,monthly,TRUE,,,,1,dates,"7,17,27",,,,,,, +,,"11215 Joor Rd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 262-4406,-91.053699,30.549429,-91.053699,30.549429,,,,70818-3410,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"13738 Perkins Rd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 753-2340,-91.066445,30.365442,-91.066445,30.365442,,,,70810-3433,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"13965 Coursey Blvd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 755-3907,-91.021789,30.408385,-91.021789,30.408385,,,,70817-1310,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"14660 Tiger Bend Rd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 753-4454,-91.020809,30.391544,-91.020809,30.391544,,,,70817-4613,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"15363 Old Hammond Hwy, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 275-3004,-91.014863,30.456943,-91.014863,30.456943,,,,70816-1250,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1777 Sharp Rd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 274-8985,-91.065884,30.436507,-91.065884,30.436507,,,,70815-4857,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1871B Staring Ln, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 761-4163,-91.111477,30.391458,-91.111477,30.391458,,,,70810-1031,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"191 Little John Dr, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 272-2978,-91.051124,30.458791,-91.051124,30.458791,,,,70815-6123,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1931 Plank Rd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 358-4495,-91.165273,30.465205,-91.165273,30.465205,,,,70802-2942,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"20321 Highland Rd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 751-4436,-91.005683,30.361148,-91.005683,30.361148,,,,70817-7346,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"3939 Choctaw Dr, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 356-0039,-91.150632,30.470343,-91.150632,30.470343,,,,70805,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"4017 Plank Road, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 228-0923,-91.1579492,30.4860856,-91.1579492,30.4860856,,,,70809,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"4755 Prescott Road, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 228-0999,-91.1428919,30.4875507,-91.1428919,30.4875507,,,,70809-5252,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"4770 Hooper Rd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 355-3532,-91.144178,30.523743,-91.144178,30.523743,,,,70811,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"5455 Airline Hwy, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 356-0896,-91.136011,30.506717,-91.136011,30.506717,,,,70805-1712,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"5652 Government St, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 926-0018,-91.13173,30.444669,-91.13173,30.444669,,,,70806-6034,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"5953 Plank Rd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 355-9830,-91.151736,30.504065,-91.151736,30.504065,,,,70805-1323,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"6315 Scenic Hwy, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 308-2192,-91.170758,30.506037,-91.170758,30.506037,,,,70805,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"7055 Greenwell Springs Rd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 532-2522,-91.1190572,30.4738507,-91.1190572,30.4738507,,,,70805-7441,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"8656 Goodwood Blvd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 923-2235,-91.093702,30.442552,-91.093702,30.442552,,,,70806-7912,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"9355 Greenwell Springs Rd, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 928-3648,-91.085014,30.485034,-91.085014,30.485034,,,,70814,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"9401 Burbank Dr, Baton Rouge, LA",,"Dollar General-Baton Rouge,LA",,,,,(225) 768-7478,-91.123735,30.360223,-91.123735,30.360223,,,,70810-6177,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"14287 Highway 21 S, Bogalusa, LA",,"Dollar General-Bogalusa,LA",,,,,(985) 732-2306,-89.851994,30.732197,-89.851994,30.732197,,,,70427-8025,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"1620 Ave F, Bogalusa, LA",,"Dollar General-Bogalusa,LA",,,,,(985) 205-3185,-89.876439,30.76721,-89.876439,30.76721,,,,70427,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"303 Shenandoah St, Bogalusa, LA",,"Dollar General-Bogalusa,LA",,,,,(985) 735-1571,-89.864901,30.789768,-89.864901,30.789768,,,,70427-3137,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"435 Sullivan Drive, Bogalusa, LA",,"Dollar General-Bogalusa,LA",,,,,(985) 205-3184,-89.851476,30.7768652,-89.851476,30.7768652,,,,70427,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"1310 Swan Lake Rd, Bossier City, LA",,"Dollar General-Bossier City,LA",,,,,(318) 549-3838,-93.672108,32.541726,-93.672108,32.541726,,,,71111-2655,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"202 Benton Rd, Bossier City, LA",,"Dollar General-Bossier City,LA",,,,,(318) 741-9195,-93.716496,32.518298,-93.716496,32.518298,,,,71111-4702,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2100 Stockwell Rd, Bossier City, LA",,"Dollar General-Bossier City,LA",,,,,(318) 742-8771,-93.63804,32.562365,-93.63804,32.562365,,,,71111-5754,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2314 Barksdale Blvd, Bossier City, LA",,"Dollar General-Bossier City,LA",,,,,(318) 742-8945,-93.704491,32.508581,-93.704491,32.508581,,,,71112-3202,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"4612 Barksdale Blvd, Bossier City, LA",,"Dollar General-Bossier City,LA",,,,,(318) 752-4452,-93.667778,32.467187,-93.667778,32.467187,,,,71112-4504,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"5497 Airline Dr, Bossier City, LA",,"Dollar General-Bossier City,LA",,,,,(318) 742-8757,-93.71432,32.621797,-93.71432,32.621797,,,,71111-6803,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1053B Henderson Hwy, Breaux Bridge, LA",,"Dollar General-Breaux Bridge,LA",,,,,(337) 228-1157,-91.828357,30.313916,-91.828357,30.313916,,,,70517-7728,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2310 Cecilia Sr High School H, Breaux Bridge, LA",,"Dollar General-Breaux Bridge,LA",,,,,(337) 667-6462,-91.8416,30.33849,-91.8416,30.33849,,,,70517,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"254 Rees St, Breaux Bridge, LA",,"Dollar General-Breaux Bridge,LA",,,,,(337) 507-3574,-91.898421,30.278021,-91.898421,30.278021,,,,70517-4612,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"4649 Main Hwy, Breaux Bridge, LA",,"Dollar General-Breaux Bridge,LA",,,,,(337) 332-1352,-91.88053,30.235555,-91.88053,30.235555,,,,70517,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"625 S Main St, Breaux Bridge, LA",,"Dollar General-Breaux Bridge,LA",,,,,(337) 332-1562,-91.894943,30.269581,-91.894943,30.269581,,,,70517-5219,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"100 Tyler S/C, Covington, LA",,"Dollar General-Covington,LA",,,,,(985) 871-0299,-90.106319,30.478654,-90.106319,30.478654,,,,70433-3060,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"1000 Business 190 Ste 28, Covington, LA",,"Dollar General-Covington,LA",,,,,(985) 892-2013,-90.085778,30.476569,-90.085778,30.476569,,,,70433-3285,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"1823 N Columbia St, Covington, LA",,"Dollar General-Covington,LA",,,,,(985) 893-0046,-90.105708,30.497583,-90.105708,30.497583,,,,70433-5648,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"78258 Hwy 437, Covington, LA",,"Dollar General Market-Covington,LA",,,,,(985) 635-4146,-90.075533,30.5709567,-90.075533,30.5709567,,,,70435,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"1190 Hatchell Ln, Denham Springs, LA",,"Dollar General-Denham Springs,LA",,,,,(225) 667-6643,-90.943336,30.501008,-90.943336,30.501008,,,,70726-2625,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2330 S Range Ave Ste A, Denham Springs, LA",,"Dollar General-Denham Springs,LA",,,,,(225) 667-6322,-90.956312,30.459106,-90.956312,30.459106,,,,70726-5216,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"25600 La Highway 16, Denham Springs, LA",,"Dollar General-Denham Springs,LA",,,,,(225) 664-7690,-90.941971,30.439653,-90.941971,30.439653,,,,70726-5700,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"25815 Walker Road S, Denham Springs, LA",,"Dollar General-Denham Springs,LA",,,,,(225) 667-4244,-90.862149,30.45405,-90.862149,30.45405,,,,70726-6518,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"26713 Juban Road, Denham Springs, LA",,"Dollar General-Denham Springs,LA",,,,,(225) 372-7548,-90.915473,30.455323,-90.915473,30.455323,,,,70726,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"33835 La Highway 16, Denham Springs, LA",,"Dollar General-Denham Springs,LA",,,,,(225) 664-8994,-90.955751,30.559939,-90.955751,30.559939,,,,70706-0969,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"39578 Hwy 16, Denham Springs, LA",,"Dollar General-Denham Springs,LA",,,,,(225) 304-6872,-90.9128737,30.6410985,-90.9128737,30.6410985,,,,70706-0204,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"8583 Florida Blvd [Us Hwy 190], Denham Springs, LA",,"Dollar General-Denham Springs,LA",,,,,(225) 667-9495,-90.972572,30.464707,-90.972572,30.464707,,,,70726,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1620 Pennsylvania Ave, Baltimore, MD",,"Dollar General-Baltimore,MD",,,,,(410) 383-0567,-76.634379,39.303152,-76.634379,39.303152,,,,21217-3115,,,,,,,,monthly,TRUE,,,,1,dates,"10,14,15,16",,,,,,, +,,"2115 W Patapsco Ave, Baltimore, MD",,"Dollar General-Baltimore,MD",,,,,(410) 646-3247,-76.643997,39.250853,-76.643997,39.250853,,,,21230-2946,,,,,,,,monthly,TRUE,,,,1,dates,"10,14,15,16",,,,,,, +,,"2311 N Northern Pkwy, Baltimore, MD",,"Dollar General-Baltimore,MD",,,,,(410) 444-5745,-76.56681,39.36807,-76.56681,39.36807,,,,21214-1139,,,,,,,,monthly,TRUE,,,,1,dates,"10,14,15,16",,,,,,, +,,"2401 Belair Rd Ste 116, Baltimore, MD",,"Dollar General-Baltimore,MD",,,,,(410) 537-5176,-76.577967,39.317686,-76.577967,39.317686,,,,21213,,,,,,,,monthly,TRUE,,,,1,dates,"10,14,15,16",,,,,,, +,,"2511 Greenmount Ave, Baltimore, MD",,"Dollar General-Baltimore,MD",,,,,(443) 842-5699,-76.6087875,39.3186188,-76.6087875,39.3186188,,,,21217-4732,,,,,,,,monthly,TRUE,,,,1,dates,"10,14,15,16",,,,,,, +,,"4500 Edmondson Ave, Baltimore, MD",,"Dollar General-Baltimore,MD",,,,,(410) 566-0109,-76.691617,39.293638,-76.691617,39.293638,,,,21229-1506,,,,,,,,monthly,TRUE,,,,1,dates,"10,14,15,16",,,,,,, +,,"4810 Belair Rd, Baltimore, MD",,"Dollar General-Baltimore,MD",,,,,(410) 325-1740,-76.558274,39.333686,-76.558274,39.333686,,,,21206-5730,,,,,,,,monthly,TRUE,,,,1,dates,"10,14,15,16",,,,,,, +,,"5405 Baltimore National Pike, Baltimore, MD",,"Dollar General-Baltimore,MD",,,,,(410) 869-1406,-76.716638,39.29101,-76.716638,39.29101,,,,21229-2102,,,,,,,,monthly,TRUE,,,,1,dates,"10,14,15,16",,,,,,, +,,"717 Washington Blvd, Baltimore, MD",,"Dollar General-Baltimore,MD",,,,,(410) 347-5230,-76.626654,39.283129,-76.626654,39.283129,,,,21230,,,,,,,,monthly,TRUE,,,,1,dates,"10,14,15,16",,,,,,, +,,"7350 Harford Rd, Baltimore, MD",,"Dollar General-Baltimore,MD",,,,,(410) 779-9312,-76.546033,39.370133,-76.546033,39.370133,,,,21234,,,,,,,,monthly,TRUE,,,,1,dates,"10,14,15,16",,,,,,, +,,"7405 Liberty Rd, Baltimore, MD",,"Dollar General-Baltimore,MD",,,,,(410) 265-6395,-76.740459,39.347288,-76.740459,39.347288,,,,21207-3812,,,,,,,,monthly,TRUE,,,,1,dates,"10,14,15,16",,,,,,, +,,"1525 Michigan Ave, Battle Creek, MI",,"Dollar General-Battle Creek,MI",,,,,(269) 963-3981,-85.099115,42.306028,-85.099115,42.306028,,,,49017-1947,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1791 W Columbia Ave, Battle Creek, MI",,"Dollar General-Battle Creek,MI",,,,,(269) 565-2538,-85.228358,42.297264,-85.228358,42.297264,,,,49015-2856,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"240 E Roosevelt, Battle Creek, MI",,"Dollar General-Battle Creek,MI",,,,,(269) 969-0634,-85.182902,42.339184,-85.182902,42.339184,,,,49037-2817,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2420 E Columbia Ave, Battle Creek, MI",,"Dollar General-Battle Creek,MI",,,,,(269) 968-5991,-85.14407,42.309784,-85.14407,42.309784,,,,49014-6379,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"535 E Emmett St, Battle Creek, MI",,"Dollar General-Battle Creek,MI",,,,,(269) 962-0407,-85.157769,42.330442,-85.157769,42.330442,,,,49017-5682,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"588 Southwest Capital Ave, Battle Creek, MI",,"Dollar General-Battle Creek,MI",,,,,(269) 962-1312,-85.19956,42.306324,-85.19956,42.306324,,,,49015,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"10920 E Jefferson Ave, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 486-2805,-82.9743209,42.3651796,-82.9743209,42.3651796,,,,48214-3211,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"12421 Hayes St, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 486-0648,-82.965055,42.421802,-82.965055,42.421802,,,,48205-4118,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"12555 W Grand River Ave #900, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 931-0265,-83.166726,42.379777,-83.166726,42.379777,,,,48204-1867,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"13341 E 7 Mile Rd, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 483-7743,-82.988217,42.434867,-82.988217,42.434867,,,,48205,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"14611 W Mcnichols Rd, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 327-1282,-83.190032,42.416164,-83.190032,42.416164,,,,48235,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1559 E Lafayette St, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 656-2291,-83.032176,42.338264,-83.032176,42.338264,,,,48207-2958,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"18209 Joy Rd, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 486-1976,-83.21788,42.357544,-83.21788,42.357544,,,,48228-3126,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"18604 Fenkell Street, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 493-1043,-83.224179,42.401049,-83.224179,42.401049,,,,48223,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"20164 Van Dyke, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 312-8694,-83.024576,42.44433,-83.024576,42.44433,,,,48234,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"3000 W Davison, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 312-8959,-83.12583,42.391615,-83.12583,42.391615,,,,48238,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"3812 E Davison St, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 366-0627,-83.061369,42.415544,-83.061369,42.415544,,,,48212-1702,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"8800 Schaefer Hwy, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 406-8853,-83.177025,42.358856,-83.177025,42.358856,,,,48228-2516,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"9350 Woodward, Detroit, MI",,"Dollar General-Detroit,MI",,,,,(313) 872-6258,-83.082736,42.384382,-83.082736,42.384382,,,,48202,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"13025 Lorraine Rd, Biloxi, MS",,"Dollar General-Biloxi,MS",,,,,(662) 728-0300,-88.992036,30.473032,-88.992036,30.473032,,,,39532-9574,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"14495 Lamey Bridge Rd, Biloxi, MS",,"Dollar General-Biloxi,MS",,,,,(228) 396-2765,-88.908816,30.49581,-88.908816,30.49581,,,,39532-8957,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2040 Pass Rd, Biloxi, MS",,"Dollar General-Biloxi,MS",,,,,(228) 385-2256,-88.957782,30.402707,-88.957782,30.402707,,,,39531,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"920 Cedar Lake Rd Ste D, Biloxi, MS",,"Dollar General-Biloxi,MS",,,,,(601) 919-3530,-88.933782,30.444051,-88.933782,30.444051,,,,39532-2107,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1042 Highway 471, Brandon, MS",,"Dollar General-Brandon,MS",,,,,(601) 833-8845,-89.995699,32.297801,-89.995699,32.297801,,,,39042-8629,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1905 Spillway Rd, Brandon, MS",,"Dollar General-Brandon,MS",,,,,(601) 835-1104,-90.039852,32.381827,-90.039852,32.381827,,,,39047-8232,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"208 E Government St, Brandon, MS",,"Dollar General-Brandon,MS",,,,,(601) 855-0073,-89.985245,32.272957,-89.985245,32.272957,,,,39042-3152,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"3267 Hwy 18, Brandon, MS",,"Dollar General-Brandon,MS",,,,,(601) 724-8868,-89.95971,32.244583,-89.95971,32.244583,,,,39042,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"643 Holly Bush Rd, Brandon, MS",,"Dollar General-Brandon,MS",,,,,(601) 605-4432,-89.95229,32.399607,-89.95229,32.399607,,,,39047-8801,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"769 Highway 468, Brandon, MS",,"Dollar General-Brandon,MS",,,,,(601) 407-2555,-90.031362,32.225061,-90.031362,32.225061,,,,39042-7314,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"125 N Jackson St, Brookhaven, MS",,"Dollar General-Brookhaven,MS",,,,,(601) 799-4090,-90.444339,31.580546,-90.444339,31.580546,,,,39601-3037,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1662 Caleb Dr Se, Brookhaven, MS",,"Dollar General-Brookhaven,MS",,,,,(601) 833-2937,-90.454819,31.574132,-90.454819,31.574132,,,,39601,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"211 Highway 51 N, Brookhaven, MS",,"Dollar General-Brookhaven,MS",,,,,(662) 624-5791,-90.456979,31.583416,-90.456979,31.583416,,,,39601-2653,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"345 hwy 84 West, Brookhaven, MS",,"Dollar General-Brookhaven,MS",,,,,(601) 265-3016,-90.501194,31.534762,-90.501194,31.534762,,,,39601,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"975 Highway 550 Nw, Brookhaven, MS",,"Dollar General-Brookhaven,MS",,,,,(601) 833-1368,-90.502311,31.60866,-90.502311,31.60866,,,,39601,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1032 Highway 69 S, Columbus, MS",,"Dollar General-Columbus,MS",,,,,(662) 368-2398,-88.388996,33.481315,-88.388996,33.481315,,,,39702,,,,,,,,monthly,TRUE,,,,1,dates,"10,19,18,22",,,,,,, +,,"1311 Main St, Columbus, MS",,"Dollar General-Columbus,MS",,,,,(662) 287-8796,-88.418256,33.496611,-88.418256,33.496611,,,,39701-4965,,,,,,,,monthly,TRUE,,,,1,dates,"10,19,18,22",,,,,,, +,,"1731 Highway 45 N, Columbus, MS",,"Dollar General-Columbus,MS",,,,,(662) 241-4499,-88.434446,33.514736,-88.434446,33.514736,,,,39705-2117,,,,,,,,monthly,TRUE,,,,1,dates,"10,19,18,22",,,,,,, +,,"212 Alabama St, Columbus, MS",,"Dollar General-Columbus,MS",,,,,(662) 286-9676,-88.384063,33.495879,-88.384063,33.495879,,,,39702-5204,,,,,,,,monthly,TRUE,,,,1,dates,"10,19,18,22",,,,,,, +,,"2219 Military Rd, Columbus, MS",,"Dollar General-Columbus,MS",,,,,(662) 368-8127,-88.409281,33.52088,-88.409281,33.52088,,,,39705,,,,,,,,monthly,TRUE,,,,1,dates,"10,19,18,22",,,,,,, +,,"3277 Highway 45 N, Columbus, MS",,"Dollar General-Columbus,MS",,,,,(662) 286-8424,-88.437206,33.542241,-88.437206,33.542241,,,,39705-1634,,,,,,,,monthly,TRUE,,,,1,dates,"10,19,18,22",,,,,,, +,,"5302 Hwy 182 E, Columbus, MS",,"Dollar General-Columbus,MS",,,,,(662) 243-7071,-88.338185,33.492863,-88.338185,33.492863,,,,39702-8225,,,,,,,,monthly,TRUE,,,,1,dates,"10,19,18,22",,,,,,, +,,"60 Center St, Columbus, MS",,"Dollar General-Columbus,MS",,,,,(662) 287-4060,-88.324144,33.443001,-88.324144,33.443001,,,,39702-8573,,,,,,,,monthly,TRUE,,,,1,dates,"10,19,18,22",,,,,,, +,,"7624 Hwy 45 N, Columbus, MS",,"Dollar General-Columbus,MS",,,,,(662) 570-1535,-88.4227786,33.6026582,-88.4227786,33.6026582,,,,39705-3353,,,,,,,,monthly,TRUE,,,,1,dates,"10,19,18,22",,,,,,, +,,"801 Tuscaloosa Rd, Columbus, MS",,"Dollar General-Columbus,MS",,,,,(662) 327-5711,-88.3662611,33.519955,-88.3662611,33.519955,,,,39702-1616,,,,,,,,monthly,TRUE,,,,1,dates,"10,19,18,22",,,,,,, +,,"2035 E Shiloh Rd, Corinth, MS",,"Dollar General-Corinth,MS",,,,,(228) 392-6522,-88.499106,34.94546,-88.499106,34.94546,,,,38834-3726,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"3501 Highway 72 W, Corinth, MS",,"Dollar General-Corinth,MS",,,,,(601) 469-3344,-88.558752,34.930853,-88.558752,34.930853,,,,38834-8560,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"4137 Country Road 200, Corinth, MS",,"Dollar General-Corinth,MS",,,,,(601) 469-4785,-88.456983,34.93069,-88.456983,34.93069,,,,38834-7500,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"509 Foote St, Corinth, MS",,"Dollar General-Corinth,MS",,,,,(228) 497-4712,-88.519946,34.935808,-88.519946,34.935808,,,,38834-4832,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"902 S Cass St, Corinth, MS",,"Dollar General-Corinth,MS",,,,,(228) 497-6006,-88.516706,34.923753,-88.516706,34.923753,,,,38834-6403,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1005 Patton Ave, Asheville, NC",,"Dollar General-Asheville,NC",,,,,(828) 225-4003,-82.590591,35.58697,-82.590591,35.58697,,,,28806-3622,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"347 B Leicester Hwy, Asheville, NC",,"Dollar General-Asheville,NC",,,,,(828) 258-2825,-82.623524,35.602044,-82.623524,35.602044,,,,28806,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"458 Weaverville Rd, Asheville, NC",,"Dollar General-Asheville,NC",,,,,(828) 398-4132,-82.5835224,35.6702605,-82.5835224,35.6702605,,,,28804-1121,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"800 Fairview Rd Ste A5, Asheville, NC",,"Dollar General-Asheville,NC",,,,,(828) 299-1736,-82.505268,35.569755,-82.505268,35.569755,,,,28803-1173,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"85 Tunnel Rd Ste 7, Asheville, NC",,"Dollar General-Asheville,NC",,,,,(828) 253-1168,-82.53255,35.595027,-82.53255,35.595027,,,,28805-1232,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1031 S Williamson Ave, Burlington, NC",,"Dollar General-Burlington,NC",,,,,(336) 586-9755,-79.417815,36.07833,-79.417815,36.07833,,,,27215-9726,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2091 Chapel Hill Rd, Burlington, NC",,"Dollar General-Burlington,NC",,,,,(336) 437-0160,-79.431298,36.068109,-79.431298,36.068109,,,,27215-7114,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2125 N Church St, Burlington, NC",,"Dollar General-Burlington,NC",,,,,(336) 229-1360,-79.401042,36.094126,-79.401042,36.094126,,,,27217-3003,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2631 Ramada Rd, Burlington, NC",,"Dollar General-Burlington,NC",,,,,(336) 226-0443,-79.470681,36.066438,-79.470681,36.066438,,,,27215-5469,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"4070 S Nc Hwy 49, Burlington, NC",,"Dollar General-Burlington,NC",,,,,(336) 223-8150,-79.4437071,36.0239681,-79.4437071,36.0239681,,,,27215,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"600 Rauhut Street, Burlington, NC",,"Dollar General-Burlington,NC",,,,,(336) 278-1341,-79.434288,36.103663,-79.434288,36.103663,,,,27217,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"10018 Albemarle Rd, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 545-5146,-80.674971,35.209118,-80.674971,35.209118,,,,28227-3402,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1949 E Seventh St, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 347-1379,-80.818483,35.212929,-80.818483,35.212929,,,,28204-2417,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"221 Heathway Dr, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 597-9450,-80.76529,35.27288,-80.76529,35.27288,,,,28213,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2303 Westinghouse [Blvd #2], Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 583-5829,-80.9443436,35.1293449,-80.9443436,35.1293449,,,,28273-6515,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2804 West Sugar Creek Rd, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 817-2192,-80.801926,35.300857,-80.801926,35.300857,,,,28262,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"3708 Oakdale Road, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 469-5602,-80.902487,35.32328,-80.902487,35.32328,,,,28216,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"5200 Albemarle Rd, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 566-3639,-80.760344,35.201613,-80.760344,35.201613,,,,28212-3605,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"6217 South Blvd, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 556-1223,-80.876184,35.150895,-80.876184,35.150895,,,,28217-4440,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"6445 Old Statesville Rd, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 598-0493,-80.837769,35.311026,-80.837769,35.311026,,,,28269,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"7322 Plaza Road Ext, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 567-9200,-80.717709,35.2554,-80.717709,35.2554,,,,28215-1924,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"7411 E Independence Blvd # 31, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 531-9442,-80.738133,35.161674,-80.738133,35.161674,,,,28227-9451,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"8001-8050 Moores Chapel Road, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 398-0713,-80.938426,35.275473,-80.938426,35.275473,,,,28214-1551,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"8825 E. Wt Harris Blvd, Charlotte, NC",,"Dollar General-Charlotte,NC",,,,,(704) 531-0844,-80.725843,35.200505,-80.725843,35.200505,,,,28227,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1304 Conover Blvd E, Conover, NC",,"Dollar General-Conover,NC",,,,,(828) 464-2023,-81.199348,35.702743,-81.199348,35.702743,,,,28613,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"428 Conover Blvd W, Conover, NC",,"Dollar General-Conover,NC",,,,,(828) 465-1185,-81.224144,35.697303,-81.224144,35.697303,,,,28613-2729,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"508 10Th St Nw Ste B, Conover, NC",,"Dollar General-Conover,NC",,,,,(828) 466-0501,-81.226563,35.717126,-81.226563,35.717126,,,,28613-2339,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"6568 N Nc 16 Hwy, Conover, NC",,"Dollar General-Conover,NC",,,,,(828) 431-2070,-81.189322,35.812166,-81.189322,35.812166,,,,28613-7413,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"101 Ganyard Farm Way, Durham, NC",,"Dollar General-Durham,NC",,,,,(919) 598-5300,-78.834806,35.984489,-78.834806,35.984489,,,,27703,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2000 Chapel Hill Rd Ste 1, Durham, NC",,"Dollar General-Durham,NC",,,,,(919) 493-8205,-78.926766,35.987148,-78.926766,35.987148,,,,27707-1155,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3427 Hillsborough Rd, Durham, NC",,"Dollar General-Durham,NC",,,,,(919) 309-9199,-78.946584,36.019335,-78.946584,36.019335,,,,27705-3008,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3830 Guess Rd, Durham, NC",,"Dollar General-Durham,NC",,,,,(919) 477-5169,-78.928804,36.059582,-78.928804,36.059582,,,,27705-1506,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"4623 Hillsborough Rd, Durham, NC",,"Dollar General-Durham,NC",,,,,(919) 382-0100,-78.978657,36.032856,-78.978657,36.032856,,,,27705-2343,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"5279 N Roxboro Rd, Durham, NC",,"Dollar General-Durham,NC",,,,,(919) 479-5869,-78.909875,36.076132,-78.909875,36.076132,,,,27712-2800,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"800 Broad St, Durham, NC",,"Dollar General-Durham,NC",,,,,(919) 416-1303,-78.919433,36.010139,-78.919433,36.010139,,,,27705-4138,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1200 E Stadium Dr, Eden, NC",,"Dollar General-Eden,NC",,,,,(336) 635-1486,-79.701086,36.512534,-79.701086,36.512534,,,,27288-3810,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"519 Morgan Rd, Eden, NC",,"Dollar General-Eden,NC",,,,,(336) 623-2737,-79.760852,36.515,-79.760852,36.515,,,,27288-2523,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"640 S Van Buren Rd Unit P, Eden, NC",,"Dollar General-Eden,NC",,,,,(336) 623-3780,-79.739756,36.491655,-79.739756,36.491655,,,,27288-5365,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"7720 Nc Hwy 770 Bldg 2, Eden, NC",,"Dollar General-Eden,NC",,,,,(336) 627-1034,-79.79022,36.481086,-79.79022,36.481086,,,,27288-7598,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"11816 Central Ave Se, Albuquerque, NM",,"Dollar General-Albuquerque,NM",,,,,(505) 323-3728,-106.516314,35.070327,-106.516314,35.070327,,,,87123-2952,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1811 Coors Blvd Sw, Albuquerque, NM",,"Dollar General-Albuquerque,NM",,,,,(505) 234-1948,-106.707436,35.051147,-106.707436,35.051147,,,,87121,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"201 Montano Rd Nw, Albuquerque, NM",,"Dollar General-Albuquerque,NM",,,,,(505) 344-0514,-106.637243,35.138524,-106.637243,35.138524,,,,87107-5257,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"301 San Pedro Dr Se, Albuquerque, NM",,"Dollar General-Albuquerque,NM",,,,,(505) 265-0024,-106.577631,35.074553,-106.577631,35.074553,,,,87108-3089,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"4910 Lomas Blvd Ne Ste A, Albuquerque, NM",,"Dollar General-Albuquerque,NM",,,,,(505) 266-3885,-106.589881,35.087334,-106.589881,35.087334,,,,87110-6382,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"7615 Isletta Blvd. Sw, Albuquerque, NM",,"Dollar General-Albuquerque,NM",,,,,(505) 877-1186,-106.694681,34.951998,-106.694681,34.951998,,,,87105,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"840 East Juan Tabo, Albuquerque, NM",,"Dollar General-Albuquerque,NM",,,,,(505) 332-3216,-106.51479,35.085175,-106.51479,35.085175,,,,87123-1427,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1055 Genesee St, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 895-1014,-78.838998,42.902454,-78.838998,42.902454,,,,14211-3006,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1336 Hertel Ave, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 877-0710,-78.858581,42.947872,-78.858581,42.947872,,,,14216-2833,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1618 Main St, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 259-2738,-78.862808,42.91748,-78.862808,42.91748,,,,14209,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1833 Elmwood Ave, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 875-4914,-78.878071,42.946719,-78.878071,42.946719,,,,14207-2409,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2137 Seneca St, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 247-5324,-78.80823,42.854043,-78.80823,42.854043,,,,14210,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"230 Holden St, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 833-0878,-78.835044,42.938976,-78.835044,42.938976,,,,14214-2234,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"244 Forest Ave, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 954-8261,-78.889823,42.927993,-78.889823,42.927993,,,,14213,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3079 Bailey Ave, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 833-3127,-78.813561,42.938526,-78.813561,42.938526,,,,14215-1618,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"315 W Ferry St, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 885-1740,-78.88983,42.915169,-78.88983,42.915169,,,,14213-1911,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3170 Delaware Ave, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 447-4305,-78.871013,42.970633,-78.871013,42.970633,,,,14217-2023,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"338 Kenmore Ave, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 837-0310,-78.830438,42.958142,-78.830438,42.958142,,,,14223-2922,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"437 Tonawanda Street, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 259-1339,-78.898674,42.941433,-78.898674,42.941433,,,,14207,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"663 East Ferry Street, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 507-4837,-78.836654,42.914226,-78.836654,42.914226,,,,14211,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"827 Tonawanda St, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 875-1248,-78.904375,42.951082,-78.904375,42.951082,,,,14207-1449,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"93 S Rossler Ave, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 822-1105,-78.794698,42.876703,-78.794698,42.876703,,,,14206-3433,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"942 Mckinley Pkwy, Buffalo, NY",,"Dollar General-Buffalo,NY",,,,,(716) 824-3687,-78.824252,42.857178,-78.824252,42.857178,,,,14220-1016,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1045 Vernon Odom Blvd, Akron, OH",,"Dollar General-Akron,OH",,,,,(330) 252-2539,-81.559356,41.067803,-81.559356,41.067803,,,,44307-1073,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1356 S Arlington St, Akron, OH",,"Dollar General-Akron,OH",,,,,(330) 724-4495,-81.491517,41.034521,-81.491517,41.034521,,,,44306-3732,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1551 Brittain Road, Akron, OH",,"Dollar General-Akron,OH",,,,,(330) 630-3391,-81.46625,41.10506,-81.46625,41.10506,,,,44310-2763,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1736 Merriman Rd, Akron, OH",,"Dollar General-Akron,OH",,,,,(330) 835-4006,-81.5516786,41.1343065,-81.5516786,41.1343065,,,,44313-5252,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2072 Mogadore Rd, Akron, OH",,"Dollar General-Akron,OH",,,,,(330) 784-6512,-81.4536928,41.0620511,-81.4536928,41.0620511,,,,44312-1117,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2765 S Arlington Rd, Akron, OH",,"Dollar General-Akron,OH",,,,,(330) 645-1346,-81.492074,40.995959,-81.492074,40.995959,,,,44312-4713,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3333 Manchester Rd, Akron, OH",,"Dollar General-Akron,OH",,,,,(330) 644-5066,-81.554889,41.009359,-81.554889,41.009359,,,,44319-1434,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3849 S Main St, Akron, OH",,"Dollar General-Akron,OH",,,,,(330) 645-7029,-81.522089,40.98153,-81.522089,40.98153,,,,44319-3649,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"5235 Manchester Rd, Akron, OH",,"Dollar General-Akron,OH",,,,,(330) 882-4049,-81.566186,40.959547,-81.566186,40.959547,,,,44319-4208,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"600 N Main St, Akron, OH",,"Dollar General-Akron,OH",,,,,(330) 253-2821,-81.511118,41.10169,-81.511118,41.10169,,,,44310-3114,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"855 Canton Rd, Akron, OH",,"Dollar General-Akron,OH",,,,,(330) 733-1054,-81.434368,41.040858,-81.434368,41.040858,,,,44312-3314,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"901 Copley Rd, Akron, OH",,"Dollar General-Akron,OH",,,,,(234) 200-0766,-81.554321,41.083923,-81.554321,41.083923,,,,44320-2906,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"994 Brown St, Akron, OH",,"Dollar General-Akron,OH",,,,,(234) 200-5132,-81.510099,41.054687,-81.510099,41.054687,,,,44311-2262,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1424 Whipple Ave Nw, Canton, OH",,"Dollar General-Canton,OH",,,,,(330) 477-1031,-81.42513,40.813597,-81.42513,40.813597,,,,44708-2831,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"2103 Tuscarawas St E, Canton, OH",,"Dollar General-Canton,OH",,,,,(330) 456-9719,-81.348965,40.793349,-81.348965,40.793349,,,,44707-2864,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"2682 Easton St Ne, Canton, OH",,"Dollar General-Canton,OH",,,,,(330) 649-9127,-81.331919,40.873615,-81.331919,40.873615,,,,44721-2623,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"2976 Market Ave N, Canton, OH",,"Dollar General-Canton,OH",,,,,(330) 456-2344,-81.365928,40.830293,-81.365928,40.830293,,,,44714-1658,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"3250 Cleveland Ave Nw, Canton, OH",,"Dollar General-Canton,OH",,,,,(330) 493-9187,-81.388926,40.834891,-81.388926,40.834891,,,,44709-2868,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"3626 Cleveland Ave Sw, Canton, OH",,"Dollar General-Canton,OH",,,,,(330) 484-4124,-81.377439,40.756916,-81.377439,40.756916,,,,44707-1448,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"5200 Tuscarawas St W, Canton, OH",,"Dollar General-Canton,OH",,,,,(330) 479-9083,-81.448686,40.792133,-81.448686,40.792133,,,,44708-5055,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"5384 Fulton Dr Nw, Canton, OH",,"Dollar General-Canton,OH",,,,,(330) 244-1990,-81.450003,40.853262,-81.450003,40.853262,,,,44718-1808,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"1050 E Main St, Chillicothe, OH",,"Dollar General-Chillicothe,OH",,,,,(740) 772-6684,-82.9521666,39.3377783,-82.9521666,39.3377783,,,,45601-2848,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1400 N Bridge St, Chillicothe, OH",,"Dollar General-Chillicothe,OH",,,,,(740) 779-9948,-82.976228,39.364331,-82.976228,39.364331,,,,45601-4101,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"19520 US Hwy 50, Chillicothe, OH",,"Dollar General-Chillicothe,OH",,,,,(none listed),-83.0490547,39.3497041,-83.0490547,39.3497041,,,,45601,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"609 Central Ctr, Chillicothe, OH",,"Dollar General-Chillicothe,OH",,,,,(740) 779-1372,-83.003137,39.337126,-83.003137,39.337126,,,,45601-2249,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"10152 Princeton Glendale Rd, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 874-0709,-84.464873,39.304307,-84.464873,39.304307,,,,45246-1212,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1027 William Howard Taft Road, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 815-5408,-84.487014,39.12696,-84.487014,39.12696,,,,45206-2011,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"11850 Hamilton Ave, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 742-3482,-84.563305,39.298467,-84.563305,39.298467,,,,45231-1131,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"24 E Eswin St, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 742-2632,-84.522632,39.268777,-84.522632,39.268777,,,,45218-1405,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"4109 Plainville Rd, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 272-2671,-84.379567,39.149634,-84.379567,39.149634,,,,45227-3244,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"4958 Delhi Pike, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 451-9046,-84.607536,39.095358,-84.607536,39.095358,,,,45238-5344,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"545 Clough Pike, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 252-2731,-84.3011703,39.0856514,-84.3011703,39.0856514,,,,45244-2313,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"5700 Harrison Ave, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 574-8800,-84.638665,39.171107,-84.638665,39.171107,,,,45248-1602,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"5795 Cheviot Rd, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 741-3665,-84.601221,39.198559,-84.601221,39.198559,,,,45247-7079,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"6600 Hamilton Avenue, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 729-7516,-84.548172,39.2142029,-84.548172,39.2142029,,,,45224,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"8251-c Beechmont Ave, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 474-3579,-84.325969,39.072726,-84.325969,39.072726,,,,45255-4210,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"940 W North Bend Rd, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 542-4520,-84.552129,39.203281,-84.552129,39.203281,,,,45224-2220,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"9517 Pippin Rd, Cincinnati, OH",,"Dollar General-Cincinnati,OH",,,,,(513) 252-2722,-84.5749614,39.2434779,-84.5749614,39.2434779,,,,45231-2221,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"14693 Lorain Avenue, Cleveland, OH",,"Dollar General-Cleveland,OH",,,,,(216) 252-4334,-81.798214,41.453425,-81.798214,41.453425,,,,44111-3166,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"15707 St Clair Ave, Cleveland, OH",,"Dollar General-Cleveland,OH",,,,,(216) 273-8269,-81.570285,41.557433,-81.570285,41.557433,,,,44110,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"2272 East 55th Street, Cleveland, OH",,"Dollar General-Cleveland,OH",,,,,(216) 551-9125,-81.651821,41.496929,-81.651821,41.496929,,,,44103,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"2966 East 116th St, Cleveland, OH",,"Dollar General-Cleveland,OH",,,,,(216) 206-7219,-81.602857,41.461587,-81.602857,41.461587,,,,44104-2626,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"3785 Lee Road, Cleveland, OH",,"Dollar General-Cleveland,OH",,,,,(216) 359-1786,-81.564781,41.456533,-81.564781,41.456533,,,,44128-1463,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"4279 Mayfield Rd., Cleveland, OH",,"Dollar General-Cleveland,OH",,,,,(216) 273-8568,-81.525913,41.520722,-81.525913,41.520722,,,,44121,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"5133 Superior Ave, Cleveland, OH",,"Dollar General-Cleveland,OH",,,,,(216) 539-2154,-81.654625,41.516853,-81.654625,41.516853,,,,44103,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"6815 Broadway Ave, Cleveland, OH",,"Dollar General-Cleveland,OH",,,,,(216) 429-2856,-81.641682,41.460911,-81.641682,41.460911,,,,44105-1311,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"9111 Miles Ave, Cleveland, OH",,"Dollar General-Cleveland,OH",,,,,(216) 539-0639,-81.623435,41.445227,-81.623435,41.445227,,,,44105-6136,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"9200 Madison Ave, Cleveland, OH",,"Dollar General-Cleveland,OH",,,,,(216) 551-9124,-81.746417,41.47721,-81.746417,41.47721,,,,44102-2719,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1130 Norton Rd, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 878-0332,-83.144076,39.927816,-83.144076,39.927816,,,,43228-3250,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1260 Demorest Rd, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 308-0025,-83.090244,39.929112,-83.090244,39.929112,,,,43204-7003,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1391 East Main Street, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 300-5619,-82.962176,39.957689,-82.962176,39.957689,,,,43205,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1410 Harrisburg Pike, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 274-1663,-83.052544,39.929263,-83.052544,39.929263,,,,43223-3231,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1500 E Livingston Ave, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 930-6639,-82.9573426,39.9491141,-82.9573426,39.9491141,,,,43205-2925,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1596 Parsons Ave, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 653-6930,-82.983881,39.930706,-82.983881,39.930706,,,,43207-1217,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1660 E Dublin Granville Rd, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 899-7498,-82.973766,40.087456,-82.973766,40.087456,,,,43229-3503,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1959 Morse Rd, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 840-0588,-82.966208,40.059784,-82.966208,40.059784,,,,43229-6663,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"2012 Lockbourne Rd., Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 445-0723,-82.965118,39.923891,-82.965118,39.923891,,,,43207,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"2100 Sullivant Avenue, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 328-8406,-83.055303,39.94701,-83.055303,39.94701,,,,43223,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"3000 E Broad St, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 237-0001,-82.920696,39.971322,-82.920696,39.971322,,,,43209-1965,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"3349 Refugee Road, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 452-4817,-82.910929,39.91713,-82.910929,39.91713,,,,43232,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"3350 Cleveland Ave, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 447-3134,-82.963191,40.035639,-82.963191,40.035639,,,,43224-3677,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"3636 Lockbourne Rd, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 491-8889,-82.967885,39.888781,-82.967885,39.888781,,,,43207-5131,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"3861 S High St, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 491-8955,-83.0006,39.883394,-83.0006,39.883394,,,,43207-4013,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"4050 Alum Creek Thimbleberry Dr, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 491-4124,-82.930304,39.885221,-82.930304,39.885221,,,,43207,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"4245 Macsway Ave, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 367-9012,-82.883086,39.923565,-82.883086,39.923565,,,,43232-4247,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"4868 W Broad St, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 851-1563,-83.130944,39.952293,-83.130944,39.952293,,,,43228-1602,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"4932 N High St, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 781-9032,-83.019322,40.063026,-83.019322,40.063026,,,,43214,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"5001 Chatterton Rd, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 837-3034,-82.861687,39.915495,-82.861687,39.915495,,,,43232-5802,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"5680 Cleveland Ave, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 891-9127,-82.950772,40.086343,-82.950772,40.086343,,,,43231-2879,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"745 Georgesville Rd, Columbus, OH",,"Dollar General-Columbus,OH",,,,,(614) 276-5665,-83.113847,39.936298,-83.113847,39.936298,,,,43228-2826,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1431 Wayne Ave, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 222-2971,-84.172873,39.74801,-84.172873,39.74801,,,,45410-1411,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1714 Woodman Dr, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 252-4839,-84.121991,39.730601,-84.121991,39.730601,,,,45420-3662,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1819 W 3Rd St, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 263-6125,-84.22464,39.754271,-84.22464,39.754271,,,,45417-2536,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"2228 N Gettysburg Ave, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 278-0759,-84.253627,39.78405,-84.253627,39.78405,,,,45406,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"2300 Valley Pike, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 503-7526,-84.143786,39.789258,-84.143786,39.789258,,,,45404-2588,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"2312 N Main St, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 276-3229,-84.210555,39.785337,-84.210555,39.785337,,,,45405-3439,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"2821 Linden Ave, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 660-6361,-84.140603,39.748239,-84.140603,39.748239,,,,45410,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"445 Salem Ave, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 225-3851,-84.209379,39.767129,-84.209379,39.767129,,,,45406-5815,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"4600 N Main St, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 274-7559,-84.225477,39.81014,-84.225477,39.81014,,,,45405-5019,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"4963 Springboro Pike, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 643-3136,-84.2234879,39.6562195,-84.2234879,39.6562195,,,,45449-2842,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"5245 N Dixie Hwy, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 277-7052,-84.22352,39.685145,-84.22352,39.685145,,,,45414-3806,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"5520 Airway Rd, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 254-6516,-84.108026,39.771326,-84.108026,39.771326,,,,45431-1505,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"5997 W Third Street, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 268-2186,-84.290561,39.746458,-84.290561,39.746458,,,,45427,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"8126 N Main St, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 890-2528,-84.2605743,39.8420296,-84.2605743,39.8420296,,,,45415-1748,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"888 S Gettysburg Ave, Dayton, OH",,"Dollar General-Dayton,OH",,,,,(937) 503-7548,-84.252754,39.734368,-84.252754,39.734368,,,,45417-3518,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"702 Lake Murray Dr, Ardmore, OK",,"Dollar General-Ardmore,OK",,,,,(580) 319-4029,-97.1227798,34.1628227,-97.1227798,34.1628227,,,,73401-3847,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"1213 N Washington St, Ardmore, OK",,"Dollar General-Ardmore,OK",,,,,(580) 226-1421,-97.123963,34.184886,-97.123963,34.184886,,,,73401-6661,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"5030 State Highway 199, Ardmore, OK",,"Dollar General-Ardmore,OK",,,,,(580) 226-2094,-96.989957,34.187403,-96.989957,34.187403,,,,73401-0578,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"601 N Commerce St Ste A, Ardmore, OK",,"Dollar General-Ardmore,OK",,,,,(580) 490-9905,-97.143419,34.181747,-97.143419,34.181747,,,,73401-3912,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"617 1/2 W Broadway St, Ardmore, OK",,"Dollar General-Ardmore,OK",,,,,(580) 223-7149,-97.134991,34.174846,-97.134991,34.174846,,,,73401-4522,,,,,,,,monthly,TRUE,,,,1,dates,"7,15",,,,,,, +,,"6401 E Kenosha Street, Broken Arrow, OK",,"Dollar General-Broken Arrow,OK",,,,,(918) 505-9484,-95.753224,36.060934,-95.753224,36.060934,,,,74014-8102,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1201 E Kenosha St, Broken Arrow, OK",,"Dollar General-Broken Arrow,OK",,,,,(918) 251-9223,-95.776851,36.060814,-95.776851,36.060814,,,,74012-2008,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1904 W New Orleans St, Broken Arrow, OK",,"Dollar General-Broken Arrow,OK",,,,,(918) 455-8694,-95.812169,36.017533,-95.812169,36.017533,,,,74011-1427,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"5000 North 37Th Street, Broken Arrow, OK",,"Dollar General-Broken Arrow,OK",,,,,(918) 355-1162,-95.810051,35.993231,-95.810051,35.993231,,,,74011,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"6124 S Garnett Rd, Broken Arrow, OK",,"Dollar General-Broken Arrow,OK",,,,,(918) 307-8136,-95.851211,36.07487,-95.851211,36.07487,,,,74012-1217,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"711 W Houston St, Broken Arrow, OK",,"Dollar General-Broken Arrow,OK",,,,,(918) 251-1120,-95.797607,36.046399,-95.797607,36.046399,,,,74012-3759,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1111 E Will Rogers Blvd, Claremore, OK",,"Dollar General-Claremore,OK",,,,,(918) 505-7031,-95.5967215,36.3073234,-95.5967215,36.3073234,,,,74017,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1901 W 4th Street S, Claremore, OK",,"Dollar General-Claremore,OK",,,,,(918) 379-9888,-95.632794,36.314731,-95.632794,36.314731,,,,74017,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"26083 S Dollar Dr, Claremore, OK",,"Dollar General-Claremore,OK",,,,,(918) 266-9886,-95.640749,36.278407,-95.640749,36.278407,,,,74019,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1620 N Lynn Riggs Blvd, Claremore, OK",,"Dollar General-Claremore,OK",,,,,(918) 342-0863,-95.60866,36.323649,-95.60866,36.323649,,,,74017-3054,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"16413 E 410 Rd, Claremore, OK",,"Dollar General-Claremore,OK",,,,,(918) 283-2588,-95.531023,36.423591,-95.531023,36.423591,,,,74017-0446,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1685 W Country Club Rd, Claremore, OK",,"Dollar General-Claremore,OK",,,,,(918) 343-0414,-95.628812,36.292822,-95.628812,36.292822,,,,74017-5541,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1741 West Tilgham St, Allentown, PA",,"Dollar General-Allentown,PA",,,,,(484) 602-2705,-75.4981783,40.6058744,-75.4981783,40.6058744,,,,18104,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1866 Catasauqua Rd, Allentown, PA",,"Dollar General-Allentown,PA",,,,,(610) 231-0436,-75.430174,40.641139,-75.430174,40.641139,,,,18109-3128,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2106 Union Blvd, Allentown, PA",,"Dollar General-Allentown,PA",,,,,(610) 435-9740,-75.424527,40.625672,-75.424527,40.625672,,,,18109-1634,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2306 28th St Sw, Allentown, PA",,"Dollar General-Allentown,PA",,,,,(484) 619-2913,-75.4789301,40.5613317,-75.4789301,40.5613317,,,,18103,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"105 Concord Church Road, Beaver Falls, PA",,"Dollar General-Beaver Falls,PA",,,,,(724) 359-0652,-80.2869996,40.790688,-80.2869996,40.790688,,,,15010,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"2580 Constitution Blvd, Beaver Falls, PA",,"Dollar General-Beaver Falls,PA",,,,,(724) 846-8233,-80.374069,40.773155,-80.374069,40.773155,,,,15010-1294,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"4801 4Th Ave, Beaver Falls, PA",,"Dollar General-Beaver Falls,PA",,,,,(724) 846-4074,-80.336937,40.786057,-80.336937,40.786057,,,,15010-3308,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"618 7Th Ave, Beaver Falls, PA",,"Dollar General-Beaver Falls,PA",,,,,(724) 843-1591,-80.329046,40.738781,-80.329046,40.738781,,,,15010-4626,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"119 N Main St, Butler, PA",,"Dollar General-Butler,PA",,,,,(724) 282-1794,-79.89507,40.861377,-79.89507,40.861377,,,,16001-4902,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1627 N Main Street, Butler, PA",,"Dollar General-Butler,PA",,,,,(724) 282-0453,-79.913351,40.902372,-79.913351,40.902372,,,,16001-1543,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"230 Greater Butler Mart, Butler, PA",,"Dollar General-Butler,PA",,,,,(724) 214-1035,-79.918849,40.843588,-79.918849,40.843588,,,,16001-3283,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"295 Butler Cmns, Butler, PA",,"Dollar General-Butler,PA",,,,,(724) 284-3718,-79.942388,40.876718,-79.942388,40.876718,,,,16001-2485,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"379 Pittsburgh Rd, Butler, PA",,"Dollar General-Butler,PA",,,,,(724) 256-4401,-79.929837,40.781703,-79.929837,40.781703,,,,16002-3962,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1110 Richland Ave E, Aiken, SC",,"Dollar General-Aiken,SC",,,,,(803) 502-0087,-81.705045,33.556157,-81.705045,33.556157,,,,29801-4761,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1151 York St Ne, Aiken, SC",,"Dollar General-Aiken,SC",,,,,(803) 641-9682,-81.70256,33.578268,-81.70256,33.578268,,,,29801-4119,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1307 Edgefield Hwy, Aiken, SC",,"Dollar General-Aiken,SC",,,,,(803) 643-4824,-81.725081,33.594376,-81.725081,33.594376,,,,29801,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1553 Whiskey Rd, Aiken, SC",,"Dollar General-Aiken,SC",,,,,(803) 643-3421,-81.724329,33.532518,-81.724329,33.532518,,,,29803-5311,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1652 Richland Ave W, Aiken, SC",,"Dollar General-Aiken,SC",,,,,(803) 642-5146,-81.741492,33.565417,-81.741492,33.565417,,,,29801-3236,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"7011 Harvey Ct, Aiken, SC",,"Dollar General-Aiken,SC",,,,,(803) 642-1213,-81.632517,33.650747,-81.632517,33.650747,,,,29805-9331,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1475 Pearman Dairy Rd Ste B, Anderson, SC",,"Dollar General-Anderson,SC",,,,,(864) 964-9036,-82.695678,34.529002,-82.695678,34.529002,,,,29625-2081,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1525 N Main St, Anderson, SC",,"Dollar General-Anderson,SC",,,,,(864) 224-3224,-82.65441,34.516188,-82.65441,34.516188,,,,29621-4734,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2835 S Main St, Anderson, SC",,"Dollar General-Anderson,SC",,,,,(864) 225-0094,-82.649377,34.47658,-82.649377,34.47658,,,,29624-3741,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"3420 Clemson Blvd, Anderson, SC",,"Dollar General-Anderson,SC",,,,,(864) 261-8405,-82.6709,34.547051,-82.6709,34.547051,,,,29621-1324,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"3502 E River St, Anderson, SC",,"Dollar General-Anderson,SC",,,,,(864) 224-2341,-82.602899,34.482155,-82.602899,34.482155,,,,29621-7336,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"4435 Highway 24, Anderson, SC",,"Dollar General-Anderson,SC",,,,,(864) 225-0035,-82.761732,34.511479,-82.761732,34.511479,,,,29626-5216,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1238 Camp Rd Ste B, Charleston, SC",,"Dollar General-Charleston,SC",,,,,(843) 406-0182,-79.948975,32.727801,-79.948975,32.727801,,,,29412-9206,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1722 Old Towne Rd, Charleston, SC",,"Dollar General-Charleston,SC",,,,,(843) 556-5477,-79.992811,32.818222,-79.992811,32.818222,,,,29407-5035,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1739 Maybank Hwy #2, Charleston, SC",,"Dollar General-Charleston,SC",,,,,(843) 795-8409,-79.977003,32.762582,-79.977003,32.762582,,,,29412-2103,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"2346 Ashley River Rd, Charleston, SC",,"Dollar General-Charleston,SC",,,,,(843) 763-9476,-80.037448,32.823372,-80.037448,32.823372,,,,29414-4752,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"4741 Rivers Ave, Charleston, SC",,"Dollar General-Charleston,SC",,,,,(843) 480-0370,-79.995557,32.87241,-79.995557,32.87241,,,,29405-6645,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"103 William Hardin Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 419-0507,-80.944107,34.113622,-80.944107,34.113622,,,,29223-7818,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1563B Broad River Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 731-5175,-81.087686,34.032049,-81.087686,34.032049,,,,29210-7301,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1601 Shivers Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 798-5310,-81.107699,34.05373,-81.107699,34.05373,,,,29210-5443,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1630 Lake Murray Blvd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 781-1665,-81.192515,34.082567,-81.192515,34.082567,,,,29212-8623,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1720 Taylor St, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 254-4557,-81.027419,34.009115,-81.027419,34.009115,,,,29201-3453,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1905 Bluff Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 988-0297,-80.999766,33.961071,-80.999766,33.961071,,,,29201,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2101 Oak St # 13, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 931-0031,-81.021221,34.018166,-81.021221,34.018166,,,,29204-1193,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2324 Decker Blvd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 788-5375,-80.947553,34.054788,-80.947553,34.054788,,,,29206-2322,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2900 Leesburg Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 783-6242,-80.902721,33.982715,-80.902721,33.982715,,,,29209-3242,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3724 Covenant Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 782-0708,-80.981404,34.031835,-80.981404,34.031835,,,,29204-4218,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"4015 W Beltline Blvd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 765-0622,-81.008592,34.036807,-81.008592,34.036807,,,,29204-1506,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"536 Saint Andrews Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 772-3697,-81.128711,34.045452,-81.128711,34.045452,,,,29210-4516,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"5807 N Main St, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 754-0126,-81.013997,34.056589,-81.013997,34.056589,,,,29203-6224,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"619 Beltline Blvd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 790-0108,-80.979984,33.992056,-80.979984,33.992056,,,,29209-3628,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"6246 Two Notch Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 714-7859,-80.973262,34.056341,-80.973262,34.056341,,,,29223,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"6322 Monticello Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 714-3203,-81.045047,34.061722,-81.045047,34.061722,,,,29203-2538,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"6870 Garners Ferry Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 695-5577,-80.957171,33.975807,-80.957171,33.975807,,,,29209-1609,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"7925 Wilson Blvd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 470-5328,-80.9955628,34.0879677,-80.9955628,34.0879677,,,,29203,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"9221 Two Notch Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 699-9129,-80.923129,34.095194,-80.923129,34.095194,,,,29223-6428,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"931 Longtown Rd, Columbia, SC",,"Dollar General-Columbia,SC",,,,,(803) 865-8119,-80.929267,34.160973,-80.929267,34.160973,,,,29229-9420,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1500 4Th Ave, Conway, SC",,"Dollar General-Conway,SC",,,,,(843) 381-0838,-79.054453,33.832963,-79.054453,33.832963,,,,29526-5032,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1610 Church St Ste V, Conway, SC",,"Dollar General-Conway,SC",,,,,(843) 248-8946,-79.063593,33.846093,-79.063593,33.846093,,,,29526-2932,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2069 Hwy 544, Conway, SC",,"Dollar General-Conway,SC",,,,,(843) 347-4408,-79.020165,33.761107,-79.020165,33.761107,,,,29526-9202,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2140 Highway 905, Conway, SC",,"Dollar General-Conway,SC",,,,,(843) 369-0086,-78.989188,33.864493,-78.989188,33.864493,,,,29526-6845,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2609 Main Street, Conway, SC",,"Dollar General-Conway,SC",,,,,(843) 488-1664,-79.052602,33.869149,-79.052602,33.869149,,,,29526,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2899 Lees Landing Cir, Conway, SC",,"Dollar General-Conway,SC",,,,,(843) 347-9372,-78.961818,33.823139,-78.961818,33.823139,,,,29526-7917,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"3220 Hwy 378, Conway, SC",,"Dollar General-Conway,SC",,,,,(843) 279-0357,-79.118602,33.837968,-79.118602,33.837968,,,,29527,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"3546 Highway 701 S, Conway, SC",,"Dollar General-Conway,SC",,,,,(843) 397-0663,-79.077808,33.805908,-79.077808,33.805908,,,,29527-6043,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"4657 W Highway 501, Conway, SC",,"Dollar General-Conway,SC",,,,,(843) 365-0208,-79.131358,33.899326,-79.131358,33.899326,,,,29526-4462,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"4745 Highway 701 N, Conway, SC",,"Dollar General-Conway,SC",,,,,(843) 365-9329,-79.037727,33.927101,-79.037727,33.927101,,,,29526-5750,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"7130 Highway 905, Conway, SC",,"Dollar General-Conway,SC",,,,,(843) 369-0335,-78.844861,33.904947,-78.844861,33.904947,,,,29526-6232,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2245 Timmonsville Hwy, Darlington, SC",,"Dollar General-Darlington,SC",,,,,(843) 395-8034,-79.896697,34.224388,-79.896697,34.224388,,,,29532-7513,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3530 N Governor Williams Hwy, Darlington, SC",,"Dollar General-Darlington,SC",,,,,(843) 968-0014,-79.8944081,34.4034109,-79.8944081,34.4034109,,,,29540,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"504 Pearl St, Darlington, SC",,"Dollar General-Darlington,SC",,,,,(843) 393-3840,-79.877577,34.299492,-79.877577,34.299492,,,,29532-3817,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"904 Lamar Hwy, Darlington, SC",,"Dollar General-Darlington,SC",,,,,(843) 639-5105,-79.893785,34.288892,-79.893785,34.288892,,,,29532-4929,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"941 S Governor Williams Hwy, Darlington, SC",,"Dollar General-Darlington,SC",,,,,(843) 393-5085,-79.861602,34.283376,-79.861602,34.283376,,,,29532-5667,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"1520 E Main St, Easley, SC",,"Dollar General-Easley,SC",,,,,(864) 859-1666,-82.576695,34.829944,-82.576695,34.829944,,,,29640-3758,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"2800 Earls Bridge Rd, Easley, SC",,"Dollar General-Easley,SC",,,,,(864) 810-4107,-82.5536641,34.9394082,-82.5536641,34.9394082,,,,29640-9568,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"311 Pelzer Hwy, Easley, SC",,"Dollar General-Easley,SC",,,,,(864) 442-0106,-82.601872,34.807283,-82.601872,34.807283,,,,29642-1668,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"3309 Pelzer Hwy, Easley, SC",,"Dollar General-Easley,SC",,,,,(864) 306-8003,-82.56487,34.758998,-82.56487,34.758998,,,,29642-8373,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"3711 Farrs Bridge Rd, Easley, SC",,"Dollar General-Easley,SC",,,,,(864) 294-0706,-82.538007,34.89117,-82.538007,34.89117,,,,29640-9323,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"504 West Main St, Easley, SC",,"Dollar General-Easley,SC",,,,,(864) 810-6822,-82.612588,34.829283,-82.612588,34.829283,,,,29640,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1801 Antioch Pike, Antioch, TN",,"Dollar General-Antioch,TN",,,,,(615) 833-3820,-86.684674,36.070438,-86.684674,36.070438,,,,37013-3311,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2214 Hobson Pike, Antioch, TN",,"Dollar General-Antioch,TN",,,,,(615) 641-6098,-86.59668,36.059375,-86.59668,36.059375,,,,37013-1107,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"2724 Murfreesboro Pike, Antioch, TN",,"Dollar General-Antioch,TN",,,,,(615) 361-6700,-86.632012,36.068254,-86.632012,36.068254,,,,37013-2004,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"6412 Nolensville Pike, Antioch, TN",,"Dollar General-Antioch,TN",,,,,(615) 208-5147,-86.7024765,36.012291,-86.7024765,36.012291,,,,37013-4605,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"151 Browns Ferry Rd, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 821-8426,-85.365269,35.023321,-85.365269,35.023321,,,,37419,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2010 Mccallie Ave, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 624-6800,-85.273035,35.035144,-85.273035,35.035144,,,,37404-3139,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2303 E 23Rd St, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 622-5544,-85.276983,35.017036,-85.276983,35.017036,,,,37407-1110,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"3101 Dodson Ave, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 208-9167,-85.249662,35.07312,-85.249662,35.07312,,,,37406,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"3600 Hixson Pike Ste 106, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 875-4345,-85.27214,35.106636,-85.27214,35.106636,,,,37415-3561,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"3635 Brainerd Rd, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 698-4349,-85.245004,35.023695,-85.245004,35.023695,,,,37411-3602,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"3920 Ringgold Rd Ste A, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 624-7523,-85.253172,34.997804,-85.253172,34.997804,,,,37412-1643,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"4211 Rossville Blvd, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 867-9300,-85.290957,34.994447,-85.290957,34.994447,,,,37407-2925,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"4850 Highway 58, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 208-9609,-85.181793,35.091492,-85.181793,35.091492,,,,37416,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"5707 Ringgold Rd, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 668-0019,-85.266534,35.008587,-85.266534,35.008587,,,,37412-3541,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"5952 Brainerd Rd, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 499-5662,-85.207662,35.0164,-85.207662,35.0164,,,,37421-6800,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"7331 Lee Hwy, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 499-2755,-85.146795,35.053968,-85.146795,35.053968,,,,37421-1404,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"772 Mountain Creek Rd, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 876-1192,-85.32746,35.099808,-85.32746,35.099808,,,,37405-1631,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"8126 E Brainerd Rd Ste B, Chattanooga, TN",,"Dollar General-Chattanooga,TN",,,,,(423) 499-5944,-85.148779,35.003551,-85.148779,35.003551,,,,37421-4364,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1100 Ash Ridge Drive, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 266-0481,-87.4297564,36.5812996,-87.4297564,36.5812996,,,,37042,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1481a Tiny Town Road, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 553-8502,-87.369248,36.625123,-87.369248,36.625123,,,,37042,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"155 Edmonson Ferry Road, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 538-3681,-87.3462177,36.5030368,-87.3462177,36.5030368,,,,37040,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1600 Fort Campbell Blvd, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 552-3212,-87.408016,36.575686,-87.408016,36.575686,,,,37042-3695,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1945 Madison St Ste B, Clarksville, TN",,"Dollar General Market-Clarksville,TN",,,,,(931) 645-2789,-87.298261,36.514601,-87.298261,36.514601,,,,37043-8034,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2105 Trenton Rd, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 645-1228,-87.313261,36.56429,-87.313261,36.56429,,,,37040-6652,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2410 Madison St, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 552-6877,-87.268567,36.50748,-87.268567,36.50748,,,,37043-5455,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2748 Hwy 48, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 552-4189,-87.370476,36.442706,-87.370476,36.442706,,,,37040-7456,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"324 Madison St, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 647-5673,-87.356614,36.525354,-87.356614,36.525354,,,,37040-3647,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"3315 Fort Campbell Blvd, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 431-3467,-87.436116,36.637515,-87.436116,36.637515,,,,37042-5601,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"3855 Trenton Rd, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 645-2888,-87.317953,36.623133,-87.317953,36.623133,,,,37040-5614,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"440 Dover Rd, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 444-5184,-87.412585,36.55135,-87.412585,36.55135,,,,37042,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"5425 Ashland City Rd, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 362-3436,-87.205914,36.413413,-87.205914,36.413413,,,,37043,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"898 Hwy 76, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 266-4541,-87.2356644,36.5209948,-87.2356644,36.5209948,,,,37043,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"924 New Providence Blvd, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 645-5033,-87.379649,36.54906,-87.379649,36.54906,,,,37042-4469,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"927 Tracy Lane, Clarksville, TN",,"Dollar General-Clarksville,TN",,,,,(931) 538-3997,-87.3338044,36.5795615,-87.3338044,36.5795615,,,,37040,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"216 Grove Ave Sw, Cleveland, TN",,"Dollar General-Cleveland,TN",,,,,(423) 479-9717,-84.885397,35.161223,-84.885397,35.161223,,,,37311-5717,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2175 Spring Place Rd Se, Cleveland, TN",,"Dollar General-Cleveland,TN",,,,,(423) 559-0080,-84.854992,35.130046,-84.854992,35.130046,,,,37323-3340,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2430 Blackburn Rd Se, Cleveland, TN",,"Dollar General-Cleveland,TN",,,,,(423) 479-5360,-84.877896,35.130311,-84.877896,35.130311,,,,37323-0619,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"3425 Waterlevel Hwy, Cleveland, TN",,"Dollar General-Cleveland,TN",,,,,(423) 472-2533,-84.838051,35.147683,-84.838051,35.147683,,,,37323-6652,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"3690 Michigan Ave, Cleveland, TN",,"Dollar General-Cleveland,TN",,,,,(423) 476-0003,-84.818068,35.181766,-84.818068,35.181766,,,,37312,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"4625 Georgetown Rd Nw, Cleveland, TN",,"Dollar General-Cleveland,TN",,,,,(423) 244-0518,-84.887302,35.194407,-84.887302,35.194407,,,,37312-1634,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"4955 N Lee Hwy, Cleveland, TN",,"Dollar General-Cleveland,TN",,,,,(423) 339-1178,-84.83334,35.212791,-84.83334,35.212791,,,,37312-4158,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"860 25Th St Nw, Cleveland, TN",,"Dollar General-Cleveland,TN",,,,,(423) 479-7542,-84.873899,35.183664,-84.873899,35.183664,,,,37311-3713,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"125 Bear Creek Pike, Columbia, TN",,"Dollar General-Columbia,TN",,,,,(931) 840-0575,-87.01487,35.63528,-87.01487,35.63528,,,,38401-2266,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1301 S James Campbell Blvd, Columbia, TN",,"Dollar General-Columbia,TN",,,,,(931) 381-8829,-87.064249,35.601598,-87.064249,35.601598,,,,38401-0102,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1314 Fountain Heights Road, Columbia, TN",,"Dollar General-Columbia,TN",,,,,(931) 398-5732,-86.9871597,35.5409737,-86.9871597,35.5409737,,,,38401-8167,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1390 Hampshire Pike Ste A, Columbia, TN",,"Dollar General-Columbia,TN",,,,,(931) 381-1145,-87.081896,35.619838,-87.081896,35.619838,,,,38401,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"230 E James Campbell Blvd #14, Columbia, TN",,"Dollar General-Columbia,TN",,,,,(931) 381-4633,-87.033973,35.588297,-87.033973,35.588297,,,,38401-4597,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2490 Nashville Hwy, Columbia, TN",,"Dollar General-Columbia,TN",,,,,(931) 486-1953,-86.976786,35.705522,-86.976786,35.705522,,,,38401-7236,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"5024 Trotwood Ave, Columbia, TN",,"Dollar General-Columbia,TN",,,,,(931) 840-4700,-87.097122,35.590108,-87.097122,35.590108,,,,38401-5074,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"704 Bear Creek Pike, Columbia, TN",,"Dollar General-Columbia,TN",,,,,(931) 381-6691,-86.969138,35.636236,-86.969138,35.636236,,,,38401,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"101 Tommy Dodson Hwy, Cookeville, TN",,"Dollar General-Cookeville,TN",,,,,(931) 498-2595,-85.385413,36.275029,-85.385413,36.275029,,,,38506-9014,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1068 E 10Th St Ste F, Cookeville, TN",,"Dollar General-Cookeville,TN",,,,,(931) 528-0201,-85.481609,36.176267,-85.481609,36.176267,,,,38501-2195,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"17666 Dodson Branch Hwy, Cookeville, TN",,"Dollar General-Cookeville,TN",,,,,(931) 400-2187,-85.524793,36.269946,-85.524793,36.269946,,,,38501,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1781 S Jefferson Ave, Cookeville, TN",,"Dollar General-Cookeville,TN",,,,,(931) 284-4828,-85.506634,36.113373,-85.506634,36.113373,,,,38506,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"185 S Jefferson Ave, Cookeville, TN",,"Dollar General Market-Cookeville,TN",,,,,(931) 528-1719,-85.500586,36.159455,-85.500586,36.159455,,,,38501-3424,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1945 N Washington, Cookeville, TN",,"Dollar General-Cookeville,TN",,,,,(931) 526-1884,-85.496459,36.186112,-85.496459,36.186112,,,,38501-1026,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1999 Burgess Falls Rd, Cookeville, TN",,"Dollar General-Cookeville,TN",,,,,(931) 432-6831,-85.544407,36.119673,-85.544407,36.119673,,,,38506-5638,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"379 W Main St, Cookeville, TN",,"Dollar General-Cookeville,TN",,,,,(931) 537-9346,-85.452818,36.189617,-85.452818,36.189617,,,,38506-5391,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"403 W Broad St, Cookeville, TN",,"Dollar General-Cookeville,TN",,,,,(931) 526-7584,-85.515011,36.165737,-85.515011,36.165737,,,,38501-2333,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"7020 Roberts Matthews Hwy, Cookeville, TN",,"Dollar General-Cookeville,TN",,,,,(931) 739-7020,-85.505691,36.05707,-85.505691,36.05707,,,,38506,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"878 W Jackson St, Cookeville, TN",,"Dollar General-Cookeville,TN",,,,,(931) 528-1169,-85.52448,36.159692,-85.52448,36.159692,,,,38501-7123,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1259 Miller Ave [Ste 104], Crossville, TN",,"Dollar General Market-Crossville,TN",,,,,(931) 484-1738,-85.034666,35.94361,-85.034666,35.94361,,,,38555-5272,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"146 Woodmere Mall, Crossville, TN",,"Dollar General-Crossville,TN",,,,,(931) 456-8331,-85.030499,35.95762,-85.030499,35.95762,,,,38555-4230,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1846 S Main St, Crossville, TN",,"Dollar General-Crossville,TN",,,,,(931) 484-7546,-85.006189,35.926712,-85.006189,35.926712,,,,38555-5912,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1858 N Main St, Crossville, TN",,"Dollar General-Crossville,TN",,,,,(931) 456-7664,-85.037942,35.973071,-85.037942,35.973071,,,,38555-8763,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"31 Kearney Dr, Crossville, TN",,"Dollar General-Crossville,TN",,,,,(931) 707-9160,-85.049144,35.919341,-85.049144,35.919341,,,,38572,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"4518 Hwy 127 North, Crossville, TN",,"Dollar General-Crossville,TN",,,,,(931) 210-6497,-85.0444324,36.0089812,-85.0444324,36.0089812,,,,38571-7439,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"5643 Peavine Rd, Crossville, TN",,"Dollar General-Crossville,TN",,,,,(931) 456-6611,-84.911574,36.005841,-84.911574,36.005841,,,,38571-7911,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"188 Beasley Dr, Dickson, TN",,"Dollar General-Dickson,TN",,,,,(615) 740-8888,-87.381556,36.062334,-87.381556,36.062334,,,,37055-2840,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2106 Highway 46 S, Dickson, TN",,"Dollar General-Dickson,TN",,,,,(615) 229-6947,-87.3446446,36.0274187,-87.3446446,36.0274187,,,,37055-5953,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"225 N Main St, Dickson, TN",,"Dollar General-Dickson,TN",,,,,(615) 446-8743,-87.386491,36.077533,-87.386491,36.077533,,,,37055-1801,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"4610 Highway 70 W, Dickson, TN",,"Dollar General-Dickson,TN",,,,,(615) 441-8648,-87.517197,36.091295,-87.517197,36.091295,,,,37055-4540,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"706 Henslee Dr, Dickson, TN",,"Dollar General-Dickson,TN",,,,,(615) 441-5918,-87.390755,36.086338,-87.390755,36.086338,,,,37055-1213,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1120 Forrest St, Dyersburg, TN",,"Dollar General-Dyersburg,TN",,,,,(731) 285-3627,-89.400236,36.035235,-89.400236,36.035235,,,,38024-3746,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1478 Us Highway 51 Byp E, Dyersburg, TN",,"Dollar General-Dyersburg,TN",,,,,(731) 287-1914,-89.367223,36.052737,-89.367223,36.052737,,,,38024-1249,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2450 Lake Rd Ste A, Dyersburg, TN",,"Dollar General-Dyersburg,TN",,,,,(731) 287-8503,-89.395111,36.06053,-89.395111,36.06053,,,,38024-1688,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"55 Highway 210 N, Dyersburg, TN",,"Dollar General-Dyersburg,TN",,,,,(731) 286-0401,-89.393124,35.984324,-89.393124,35.984324,,,,38024-8213,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"801 E Court St, Dyersburg, TN",,"Dollar General-Dyersburg,TN",,,,,(731) 285-4569,-89.37677,36.031405,-89.37677,36.031405,,,,38024-4830,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1091 N Judge Ely Blvd, Abilene, TX",,"Dollar General-Abilene,TX",,,,,(325) 670-0966,-99.705975,32.461639,-99.705975,32.461639,,,,79601-3853,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1202 N Mockingbird Ln, Abilene, TX",,"Dollar General-Abilene,TX",,,,,(325) 672-2712,-99.757997,32.463389,-99.757997,32.463389,,,,79603-4706,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1290 Butternut St, Abilene, TX",,"Dollar General-Abilene,TX",,,,,(325) 673-3651,-99.738704,32.434113,-99.738704,32.434113,,,,79602-3715,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2017 Ambler Ave, Abilene, TX",,"Dollar General-Abilene,TX",,,,,(325) 603-2199,-99.7447021,32.474395,-99.7447021,32.474395,,,,79603-2239,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2926 S 27Th St, Abilene, TX",,"Dollar General-Abilene,TX",,,,,(325) 695-1182,-99.757232,32.417496,-99.757232,32.417496,,,,79605-6330,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"3726 Catclaw Dr # 1, Abilene, TX",,"Dollar General-Abilene,TX",,,,,(325) 691-8869,-99.774853,32.40627,-99.774853,32.40627,,,,79606-8202,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"5401 S 7th St, Abilene, TX",,"Dollar General-Abilene,TX",,,,,(325) 267-8951,-99.794531,32.443984,-99.794531,32.443984,,,,79605-2543,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"630 S Leggett, Abilene, TX",,"Dollar General-Abilene,TX",,,,,(325) 677-8255,-99.771204,32.444498,-99.771204,32.444498,,,,79605-1636,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"6617 Buffalo Gap Rd, Abilene, TX",,"Dollar General-Abilene,TX",,,,,(325) 692-1417,-99.777363,32.369312,-99.777363,32.369312,,,,79606-5944,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1011 E Frontage Rd Ste C, Alamo, TX",,"Dollar General-Alamo,TX",,,,,(956) 782-1187,-98.1205655,26.1906291,-98.1205655,26.1906291,,,,78516-2320,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1011 W Frontage Rd [Ste C], Alamo, TX",,"Dollar General-Alamo,TX",,,,,(956) 782-1187,-98.120453,26.190528,-98.120453,26.190528,,,,78516-2320,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1018 N Alamo Rd, Alamo, TX",,"Dollar General-Alamo,TX",,,,,(956) 783-8266,-98.119513,26.204407,-98.119513,26.204407,,,,78516-6800,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"807 Ridge Rd, Alamo, TX",,"Dollar General-Alamo,TX",,,,,(956) 702-7927,-98.116201,26.170834,-98.116201,26.170834,,,,78516-9596,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1430 W Amarillo Blvd, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 223-2747,-101.835288,35.221969,-101.835288,35.221969,,,,79107-5505,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1518 Se 10th Ave, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 371-7988,-101.820254,35.201172,-101.820254,35.201172,,,,79102-4138,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"203 East Willow Creek Rd, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 340-7873,-101.8296596,35.279985,-101.8296596,35.279985,,,,79108,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2726 W 10Th Street, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 373-8229,-101.866709,35.205019,-101.866709,35.205019,,,,79102,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2950 E Fm 1151, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 340-7878,-101.8035278,35.090229,-101.8035278,35.090229,,,,79118-4306,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"307 E Hastings Ave, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 383-2826,-101.831081,35.251025,-101.831081,35.251025,,,,79108-5263,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3412 S Georgia St, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 468-7747,-101.866381,35.17813,-101.866381,35.17813,,,,79109-4842,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3415 Bell St Ste C, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 352-9533,-101.90214,35.175973,-101.90214,35.175973,,,,79109-4148,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3510 S Osage St, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 373-1343,-101.813048,35.17818,-101.813048,35.17818,,,,79118-6763,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3611 Ne 24Th Ave, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 381-0993,-101.795117,35.236626,-101.795117,35.236626,,,,79107-7242,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"403 S Western St, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 467-0869,-101.883939,35.213149,-101.883939,35.213149,,,,79106-8555,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"4210 Sw 45Th Ave Ste A, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 353-3244,-101.884221,35.163965,-101.884221,35.163965,,,,79109-0400,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"4308 S Washington St, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 356-8879,-101.848664,35.166801,-101.848664,35.166801,,,,79110-2016,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"5131 Plains Blvd, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 358-1636,-101.893987,35.195958,-101.893987,35.195958,,,,79106-4515,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"5811 S Western St, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 359-5571,-101.883676,35.148104,-101.883676,35.148104,,,,79110-3644,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"7040 Mccormick Road, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 622-9337,-101.914207,35.072513,-101.914207,35.072513,,,,79118,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"7125 Bell St, Amarillo, TX",,"Dollar General-Amarillo,TX",,,,,(806) 356-0993,-101.901761,35.133092,-101.901761,35.133092,,,,79109-7004,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1001 Ne Green Oaks Blvd #151, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 460-8028,-97.094035,32.78475,-97.094035,32.78475,,,,76006-2316,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1200 E Pioneer Pkwy, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 795-6700,-97.092374,32.707799,-97.092374,32.707799,,,,76010-6410,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1525 New York Ave, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 548-7530,-97.080195,32.720524,-97.080195,32.720524,,,,76010-4723,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1527 S Bowen Rd, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 274-5757,-97.149056,32.72102,-97.149056,32.72102,,,,76013-3335,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1811 E Mayfield Rd, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 557-4445,-97.082589,32.69183,-97.082589,32.69183,,,,76014-2504,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2535 Arkansas Ln-Ste #333, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 860-8580,-97.06535,32.706273,-97.06535,32.706273,,,,76010-8702,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"453 Fielder North Plz, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 274-8522,-97.131549,32.752328,-97.131549,32.752328,,,,76012-2308,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"4651 West Sublett Road, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 563-1874,-97.181517,32.647535,-97.181517,32.647535,,,,76017,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"5320 Matlock Rd, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 557-0484,-97.115183,32.660624,-97.115183,32.660624,,,,76018-1610,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"5531 New York Ave, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 468-7998,-97.076864,32.656417,-97.076864,32.656417,,,,76018-1801,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"5777 Sw Green Oaks Blvd, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 483-5955,-97.193023,32.673764,-97.193023,32.673764,,,,76017-1202,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"6315 S Cooper St, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 557-1525,-97.133522,32.643493,-97.133522,32.643493,,,,76001-5616,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"903 E Park Row Dr, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 801-5804,-97.097332,32.721111,-97.097332,32.721111,,,,76010-4508,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"905 W Pioneer Pkwy, Arlington, TX",,"Dollar General-Arlington,TX",,,,,(817) 795-3344,-97.116656,32.708707,-97.116656,32.708707,,,,76013-6369,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"12320 Dessau Rd, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 719-5155,-97.648414,30.38775,-97.648414,30.38775,,,,78754-1801,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"13712 webberville Rd, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 276-7211,-97.588641,30.250012,-97.588641,30.250012,,,,78724,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"1401 S Pleasant Valley Rd, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 693-4147,-97.719323,30.239156,-97.719323,30.239156,,,,78741,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"2101 West Ben White, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 326-1855,-97.790297,30.230334,-97.790297,30.230334,,,,78704,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"405 E Braker Ln, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 491-8455,-97.67901,30.377867,-97.67901,30.377867,,,,78753-2748,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"5000 Springdale Rd, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 898-9016,-97.678389,30.292529,-97.678389,30.292529,,,,78723,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"5002 Nuckols Crossing Rd, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 804-5244,-97.738024,30.194853,-97.738024,30.194853,,,,78744-3730,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"5738 Manchaca Rd # 2, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 448-9600,-97.800274,30.214037,-97.800274,30.214037,,,,78745-3635,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"6010 E Riverside Dr, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 385-4040,-97.706867,30.226744,-97.706867,30.226744,,,,78741-6512,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"6600 Fm 969, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 926-7762,-97.657617,30.284346,-97.657617,30.284346,,,,78724,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"6729 Manor Road, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 354-2548,-97.666327,30.310965,-97.666327,30.310965,,,,78723,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"6800 West Gate Blvd Ste 115, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 447-4753,-97.814652,30.208712,-97.814652,30.208712,,,,78745-4868,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"6929 Airport Blvd Ste 160, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 302-9085,-97.717827,30.336064,-97.717827,30.336064,,,,78752-3617,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"709 W Stassney Ln, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 912-9487,-97.781975,30.208491,-97.781975,30.208491,,,,78745-3031,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"825 E Rundberg Ln Ste G1, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 873-9288,-97.686387,30.357122,-97.686387,30.357122,,,,78753-4800,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"9600 Manchaca Rd, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 291-8681,-97.82254,30.176352,-97.82254,30.176352,,,,78748-6207,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"9616 N Lamar Blvd Ste 120, Austin, TX",,"Dollar General-Austin,TX",,,,,(512) 339-0533,-97.695607,30.365907,-97.695607,30.365907,,,,78753-4150,,,,,,,,weekly,TRUE,,1,2,,,,,,,,,, +,,"11455 Eagle Dr, Baytown, TX",,"Dollar General-Baytown,TX",,,,,(281) 576-4925,-94.863678,29.854803,-94.863678,29.854803,,,,77520-9877,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1721 Garth Rd, Baytown, TX",,"Dollar General-Baytown,TX",,,,,(281) 427-3619,-94.9779,29.744665,-94.9779,29.744665,,,,77520-2411,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"3606 N Main St, Baytown, TX",,"Dollar General-Baytown,TX",,,,,(281) 427-3606,-94.963875,29.76165,-94.963875,29.76165,,,,77521-3302,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"400 N Alexander Dr, Baytown, TX",,"Dollar General-Baytown,TX",,,,,(281) 420-1892,-94.957598,29.731299,-94.957598,29.731299,,,,77520-5807,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"4220 Decker Dr, Baytown, TX",,"Dollar General-Baytown,TX",,,,,(281) 424-8151,-95.010562,29.768502,-95.010562,29.768502,,,,77520-1640,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"6930 Garth Rd, Baytown, TX",,"Dollar General-Baytown,TX",,,,,(281) 421-7394,-94.981241,29.802265,-94.981241,29.802265,,,,77521-9646,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"10 N 11Th St, Beaumont, TX",,"Dollar General-Beaumont,TX",,,,,(409) 833-7358,-94.129521,30.078542,-94.129521,30.078542,,,,77702-2211,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"19797 Fm 365 Rd, Beaumont, TX",,"Dollar General-Beaumont,TX",,,,,(409) 794-3033,-94.256458,29.928145,-94.256458,29.928145,,,,77705-8781,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2210 Gulf St, Beaumont, TX",,"Dollar General-Beaumont,TX",,,,,(409) 838-9037,-94.112121,30.099072,-94.112121,30.099072,,,,77703-5204,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2602 Dowlen Rd, Beaumont, TX",,"Dollar General-Beaumont,TX",,,,,(409) 860-0883,-94.168146,30.102883,-94.168146,30.102883,,,,77706-2543,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"2730 Lucas E Drive, Beaumont, TX",,"Dollar General-Beaumont,TX",,,,,(409) 242-6863,-94.1281161,30.1256651,-94.1281161,30.1256651,,,,77703,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"3710 Highland Ave, Beaumont, TX",,"Dollar General-Beaumont,TX",,,,,(409) 212-8801,-94.086114,30.050362,-94.086114,30.050362,,,,77705-3835,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"4050 Fannett Rd, Beaumont, TX",,"Dollar General-Beaumont,TX",,,,,(409) 840-9331,-94.127071,30.046916,-94.127071,30.046916,,,,77705-2704,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"5468 College St, Beaumont, TX",,"Dollar General-Beaumont,TX",,,,,(409) 842-4848,-94.153889,30.068043,-94.153889,30.068043,,,,77707-3634,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"7335 Highway 105, Beaumont, TX",,"Dollar General-Beaumont,TX",,,,,(409) 895-0989,-94.188975,30.133022,-94.188975,30.133022,,,,77713-4525,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"8455 Phelan Rd, Beaumont, TX",,"Dollar General-Beaumont,TX",,,,,(409) 866-0594,-94.192223,30.07647,-94.192223,30.07647,,,,77707-5616,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1300 W Ruben M Torres Blvd, Brownsville, TX",,"Dollar General-Brownsville,TX",,,,,(956) 554-0393,-97.536448,25.940821,-97.536448,25.940821,,,,78520-5040,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1304 Central Blvd, Brownsville, TX",,"Dollar General-Brownsville,TX",,,,,(956) 574-9376,-97.511397,25.92473,-97.511397,25.92473,,,,78523-7560,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"14 Sam Perl Blvd, Brownsville, TX",,"Dollar General-Brownsville,TX",,,,,(956) 284-0859,-97.501396,25.898158,-97.501396,25.898158,,,,78520,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1552 Palm Blvd Ste A, Brownsville, TX",,"Dollar General-Brownsville,TX",,,,,(956) 548-2646,-97.498897,25.915865,-97.498897,25.915865,,,,78520-7264,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"235 Morningside Rd, Brownsville, TX",,"Dollar General-Brownsville,TX",,,,,(956) 550-9978,-97.454495,25.903497,-97.454495,25.903497,,,,78521-4934,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"5444 S Padre Isld Hwy, Brownsville, TX",,"Dollar General-Brownsville,TX",,,,,(956) 832-0832,-97.453778,25.928006,-97.453778,25.928006,,,,78521-4412,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2000 Highway 377 S, Brownwood, TX",,"Dollar General-Brownwood,TX",,,,,(325) 646-7766,-98.99215,31.70826,-98.99215,31.70826,,,,76801-4017,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"315 E Commerce St, Brownwood, TX",,"Dollar General-Brownwood,TX",,,,,(325) 641-8054,-98.976009,31.729884,-98.976009,31.729884,,,,76801-1823,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"3706 Austin Ave, Brownwood, TX",,"Dollar General-Brownwood,TX",,,,,(none listed),-98.9591722,31.6842894,-98.9591722,31.6842894,,,,76801,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"8015 Highway 279, Brownwood, TX",,"Dollar General-Brownwood,TX",,,,,(325) 784-5485,-99.092938,31.8195813,-99.092938,31.8195813,,,,76801-0025,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1201 W Martin Luther King Jr, Bryan, TX",,"Dollar General-Bryan,TX",,,,,(979) 314-0682,-96.383091,30.683437,-96.383091,30.683437,,,,77803,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1314 W Villa Maria Rd, Bryan, TX",,"Dollar General-Bryan,TX",,,,,(979) 823-7858,-96.374107,30.632191,-96.374107,30.632191,,,,77801-4236,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1576 E William J Bryan Parkway, Bryan, TX",,"Dollar General-Bryan,TX",,,,,(979) 314-0683,-96.354436,30.6729,-96.354436,30.6729,,,,77803,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1709 S Texas Ave, Bryan, TX",,"Dollar General-Bryan,TX",,,,,(979) 779-0864,-96.364767,30.654345,-96.364767,30.654345,,,,77802-1020,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2711 Boonville Rd, Bryan, TX",,"Dollar General-Bryan,TX",,,,,(979) 774-3753,-96.32474,30.67105,-96.32474,30.67105,,,,77808-2229,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3706 N Texas Ave, Bryan, TX",,"Dollar General-Bryan,TX",,,,,(979) 431-5998,-96.391181,30.70132,-96.391181,30.70132,,,,77803-0734,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"11025 Fostoria Road, Cleveland, TX",,"Dollar General-Cleveland,TX",,,,,(281) 622-4315,-95.1448732,30.2841266,-95.1448732,30.2841266,,,,77328,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"116 Truly Plz, Cleveland, TX",,"Dollar General-Cleveland,TX",,,,,(281) 659-0104,-95.095987,30.334275,-95.095987,30.334275,,,,77327-4889,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"18350 E Highway 105, Cleveland, TX",,"Dollar General-Cleveland,TX",,,,,(281) 659-2915,-95.245729,30.31166,-95.245729,30.31166,,,,77328-2430,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"22880 Hwy 321, Cleveland, TX",,"Dollar General-Cleveland,TX",,,,,(281) 761-7014,-94.994213,30.317547,-94.994213,30.317547,,,,77327,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"4775 Fm 787 W, Cleveland, TX",,"Dollar General-Cleveland,TX",,,,,(281) 761-2298,-94.8383617,30.4509681,-94.8383617,30.4509681,,,,77327,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"640 East Houston Street, Cleveland, TX",,"Dollar General-Cleveland,TX",,,,,(281) 592-1316,-95.082381,30.340894,-95.082381,30.340894,,,,77327-4689,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"14515 Fm 1485 Rd, Conroe, TX",,"Dollar General-Conroe,TX",,,,,(936) 231-3881,-95.300491,30.239344,-95.300491,30.239344,,,,77306-8907,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"16995 Fm 1314, Conroe, TX",,"Dollar General-Conroe,TX",,,,,(281) 601-4553,-95.353425,30.205542,-95.353425,30.205542,,,,77302,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2017 N Frazier St, Conroe, TX",,"Dollar General-Conroe,TX",,,,,(936) 539-5212,-95.466724,30.332245,-95.466724,30.332245,,,,77301-1233,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2495 N Loop 336 W, Conroe, TX",,"Dollar General-Conroe,TX",,,,,(936) 494-3344,-95.495838,30.326923,-95.495838,30.326923,,,,77304-3581,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2560 E Davis Hwy, Conroe, TX",,"Dollar General-Conroe,TX",,,,,(936) 756-6064,-95.4179,30.32042,-95.4179,30.32042,,,,77304,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"733 W Davis St, Conroe, TX",,"Dollar General-Conroe,TX",,,,,(936) 539-5214,-95.463883,30.312093,-95.463883,30.312093,,,,77301-2704,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"10309 S Padre Island Dr Ste A2, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 937-8892,-97.271451,27.503095,-97.271451,27.503095,,,,78418-4455,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"14102 Northwest Blvd, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 241-5680,-97.642536,27.857117,-97.642536,27.857117,,,,78410-5121,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2701 Waldron Rd, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 937-7300,-97.298203,27.642943,-97.298203,27.642943,,,,78418-4823,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2767 S Staples St, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 855-3755,-97.4025469,27.7613126,-97.4025469,27.7613126,,,,78404-3619,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2978 Holly Road, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 225-2120,-97.424761,27.722129,-97.424761,27.722129,,,,78415,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3130 Morgan Ave, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 371-2384,-97.424882,27.778026,-97.424882,27.778026,,,,78405-2160,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3928 Leopard St, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 882-2380,-97.437857,27.797165,-97.437857,27.797165,,,,78408-2822,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"4714 Greenwood Dr, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 806-0940,-97.437338,27.749154,-97.437338,27.749154,,,,78416-1773,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"4902 Holly Rd, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 986-9285,-97.388264,27.704544,-97.388264,27.704544,,,,78411-4766,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"6057 Weber Rd, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 814-3530,-97.408236,27.706541,-97.408236,27.706541,,,,78413-3970,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"609 S Staples St, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 882-7070,-97.402316,27.785583,-97.402316,27.785583,,,,78401-3334,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"6726 Saratoga Blvd, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 994-1337,-97.363286,27.675446,-97.363286,27.675446,,,,78414-3906,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"831 Airline Rd Ste B, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 985-6914,-97.362308,27.717969,-97.362308,27.717969,,,,78412-3187,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"9850 Leopard St, Corpus Christi, TX",,"Dollar General-Corpus Christi,TX",,,,,(361) 242-1613,-97.559172,27.83099,-97.559172,27.83099,,,,78410-1612,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3600 S Us Hwy 287, Corsicana, TX",,"Dollar General-Corsicana,TX",,,,,(903) 345-4639,-96.435069,32.06245,-96.435069,32.06245,,,,75109-8959,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3811 W Highway 22, Corsicana, TX",,"Dollar General-Corsicana,TX",,,,,(903) 872-4935,-96.5188,32.087041,-96.5188,32.087041,,,,75110-2465,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"615 W 2Nd Ave, Corsicana, TX",,"Dollar General-Corsicana,TX",,,,,(903) 872-2752,-96.471684,32.094326,-96.471684,32.094326,,,,75110-2943,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"842 W 7Th Ave Ste G, Corsicana, TX",,"Dollar General-Corsicana,TX",,,,,(903) 872-6640,-96.47123,32.087848,-96.47123,32.087848,,,,75110-6370,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"10055 Marsh Ln, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(214) 366-7621,-96.856429,32.882058,-96.856429,32.882058,,,,75229-6058,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"11255 Garland Rd Ste 200, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(214) 321-7959,-96.682837,32.84972,-96.682837,32.84972,,,,75218-2518,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1780 S Beltline Road, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(214) 613-1165,-96.60035,32.677766,-96.60035,32.677766,,,,75253,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2020 N Masters Dr Ste 102, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(972) 329-3272,-96.648054,32.747298,-96.648054,32.747298,,,,75217-3182,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"2919 Cedar Crest Blvd, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(214) 942-2889,-96.78867,32.741693,-96.78867,32.741693,,,,75203-4011,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"3515 W Northwest Highway, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(469) 522-2516,-96.861284,32.858668,-96.861284,32.858668,,,,75220,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"3936 S Polk St Ste 114, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(214) 374-7554,-96.839964,32.696546,-96.839964,32.696546,,,,75224-4483,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"4627 W Kiest Blvd, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(214) 337-0157,-96.899414,32.705951,-96.899414,32.705951,,,,75236-1168,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"6905 Lake June Rd, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(214) 391-7386,-96.703057,32.734542,-96.703057,32.734542,,,,75217-1325,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"7771 S Loop 12, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(214) 391-7269,-96.689055,32.712645,-96.689055,32.712645,,,,75217,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"8786 Ferguson Rd, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(214) 324-8773,-96.698603,32.812691,-96.698603,32.812691,,,,75228,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"9035 Forest Ln Ste 101, Dallas, TX",,"Dollar General-Dallas,TX",,,,,(972) 783-9399,-96.748256,32.9094,-96.748256,32.9094,,,,75243-4160,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1107 Avenue C, Denton, TX",,"Dollar General-Denton,TX",,,,,(940) 591-9887,-97.150594,33.204798,-97.150594,33.204798,,,,76201-6501,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1609 E Mckinney St, Denton, TX",,"Dollar General-Denton,TX",,,,,(940) 591-9508,-97.110455,33.215849,-97.110455,33.215849,,,,76209-4539,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1626 W Univeristy Dr Ste A, Denton, TX",,"Dollar General-Denton,TX",,,,,(940) 383-2920,-97.145578,33.21556,-97.145578,33.21556,,,,76201-1760,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2127 Sadau Ct, Denton, TX",,"Dollar General-Denton,TX",,,,,(940) 243-2124,-97.102967,33.188659,-97.102967,33.188659,,,,76210-4941,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"3001 N Elm St Ste 100, Denton, TX",,"Dollar General-Denton,TX",,,,,(940) 382-8434,-97.13702,33.24231,-97.13702,33.24231,,,,76207-7664,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1600 S Salinas Blvd, Donna, TX",,"Dollar General-Donna,TX",,,,,(956) 377-2568,-98.0439682,26.1640396,-98.0439682,26.1640396,,,,78537,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"209 S 8Th St # 227, Donna, TX",,"Dollar General-Donna,TX",,,,,(956) 464-1032,-98.055542,26.169187,-98.055542,26.169187,,,,78537-3136,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"4215 N FM 493, Donna, TX",,"Dollar General-Donna,TX",,,,,(956) 377-2566,-98.037577,26.200959,-98.037577,26.200959,,,,78537,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"717 W Bus Hwy 83, Donna, TX",,"Dollar General-Donna,TX",,,,,(956) 377-1222,-98.073184,26.184194,-98.073184,26.184194,,,,78537,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"7900 N Fm 493, Donna, TX",,"Dollar General-Donna,TX",,,,,(956) 461-5778,-98.03685,26.218897,-98.03685,26.218897,,,,78537-5082,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1651 S Veterans Blvd, Eagle Pass, TX",,"Dollar General-Eagle Pass,TX",,,,,(830) 773-9004,-100.473765,28.692537,-100.473765,28.692537,,,,78852-6480,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1910 Paso Del Rio Blvd, Eagle Pass, TX",,"Dollar General-Eagle Pass,TX",,,,,(830) 773-5778,-100.49672,28.729023,-100.49672,28.729023,,,,78852-3488,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"2743 N Veterans Blvd, Eagle Pass, TX",,"Dollar General-Eagle Pass,TX",,,,,(830) 758-0384,-100.481548,28.733608,-100.481548,28.733608,,,,78852-6635,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"3245 Del Rio Blvd, Eagle Pass, TX",,"Dollar General-Eagle Pass,TX",,,,,(830) 319-3422,-100.4950634,28.7548947,-100.4950634,28.7548947,,,,78852,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"5819 Fm 1021, Eagle Pass, TX",,"Dollar General-Eagle Pass,TX",,,,,(830) 758-7628,-100.439446,28.656635,-100.439446,28.656635,,,,78852-1236,,,,,,,,monthly,TRUE,,,,1,dates,6,,,,,,, +,,"1121 S Raul Longoria Rd, Edinburg, TX",,"Dollar General-Edinburg,TX",,,,,(956) 318-3539,-98.138385,26.2908,-98.138385,26.2908,,,,78539-2716,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1311 W Owassa Rd, Edinburg, TX",,"Dollar General-Edinburg,TX",,,,,(956) 787-7001,-98.190807,26.249614,-98.190807,26.249614,,,,78539,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1406 W Monte Cristo Rd, Edinburg, TX",,"Dollar General-Edinburg,TX",,,,,(956) 383-4534,-98.16967,26.338952,-98.16967,26.338952,,,,78541-7329,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1801 E Monte Cristo Rd, Edinburg, TX",,"Dollar General-Edinburg,TX",,,,,(956) 383-3636,-98.136099,26.33436,-98.136099,26.33436,,,,78542,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"1821 S Alamo Road, Edinburg, TX",,"Dollar General-Edinburg,TX",,,,,(956) 380-0066,-98.107356,26.276674,-98.107356,26.276674,,,,78539,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"3007 S Sugar Rd, Edinburg, TX",,"Dollar General-Edinburg,TX",,,,,(956) 292-0993,-98.182126,26.279268,-98.182126,26.279268,,,,78539-2117,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"302 E Cano St, Edinburg, TX",,"Dollar General-Edinburg,TX",,,,,(956) 318-1787,-98.160202,26.299903,-98.160202,26.299903,,,,78539-4512,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"4406 S Raul Longoria Rd, Edinburg, TX",,"Dollar General-Edinburg,TX",,,,,(956) 283-1545,-98.142589,26.26516,-98.142589,26.26516,,,,78542-2026,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"5107 W Monte Cristo Rd, Edinburg, TX",,"Dollar General-Edinburg,TX",,,,,(956) 316-2217,-98.2080129,26.3446905,-98.2080129,26.3446905,,,,78541-8852,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"5125 S Alamo Rd, Edinburg, TX",,"Dollar General-Edinburg,TX",,,,,(956) 283-1357,-98.096125,26.347815,-98.096125,26.347815,,,,78539-8732,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"8920 E Highway 107, Edinburg, TX",,"Dollar General-Edinburg,TX",,,,,(none listed),-98.0667952,26.2946599,-98.0667952,26.2946599,,,,78542,,,,,,,,weekly,TRUE,,1,5,,,,,,,,,, +,,"10180 Dyer Street, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 257-4686,-106.4034042,31.9061165,-106.4034042,31.9061165,,,,79924,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"10810 Mccombs St, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 822-9728,-106.407146,31.926805,-106.407146,31.926805,,,,79924-1507,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"11100 Sean Haggerty Drive Bldg C, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 822-2288,-106.424599,31.93841,-106.424599,31.93841,,,,79934,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"115 S Americas Ave Ste B, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 859-3116,-106.314813,31.679856,-106.314813,31.679856,,,,79907-6906,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"11680 Pebble Hills Blvd, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 855-1969,-106.286404,31.782363,-106.286404,31.782363,,,,79936-0964,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"1348 N Zaragoza Rd, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 857-5092,-106.298364,31.728897,-106.298364,31.728897,,,,79936-7945,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"135 S Mesa Hills Dr, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 760-6836,-106.527478,31.818654,-106.527478,31.818654,,,,79912-5467,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"14392 Montana Ave, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 849-0491,-106.179666,31.817924,-106.179666,31.817924,,,,79938-7201,,,,,,,,monthly,TRUE,,,,1,dates,7,,,,,,, +,,"1550 N Resler Dr Ste M, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 760-5021,-106.570419,31.881267,-106.570419,31.881267,,,,79912-1437,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1580 George Dieter Dr Ste 102, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 921-6910,-106.301578,31.748874,-106.301578,31.748874,,,,79936-7612,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"1700 N Zaragoza, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 855-1146,-106.279594,31.750738,-106.279594,31.750738,,,,79936-7965,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"2400 N Mesa, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 577-0214,-106.501112,31.774866,-106.501112,31.774866,,,,79902-3109,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"3017 Mcrae Blvd, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 599-1622,-106.35626,31.784216,-106.35626,31.784216,,,,79925-4533,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"3028 Pershing Dr, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 565-2927,-106.45941,31.784589,-106.45941,31.784589,,,,79903-2523,,,,,,,,weekly,TRUE,,1,3,,,,,,,,,, +,,"3350 George Deiter Dr, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 857-9114,-106.302024,31.791044,-106.302024,31.791044,,,,79936-2387,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"3440 Dyer St, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 566-8086,-106.444641,31.807465,-106.444641,31.807465,,,,79930-6318,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"500 N Zaragoza Rd Ste Ih, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 859-7932,-106.321711,31.702002,-106.321711,31.702002,,,,79907-4700,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"500C N Carolina Dr, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 593-3141,-106.364027,31.741785,-106.364027,31.741785,,,,79915-2608,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"5100 Doniphan Dr, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 585-2671,-106.581384,31.845849,-106.581384,31.845849,,,,79932-1602,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"5111 Fairbanks Dr, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 757-3002,-106.423874,31.90313,-106.423874,31.90313,,,,79924-3835,,,,,,,,monthly,TRUE,,,,1,dates,9,,,,,,, +,,"5421 Montana Ave Ste A, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 778-6841,-106.425148,31.783792,-106.425148,31.783792,,,,79903-4909,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"6225 Upper Valley Road, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 877-5060,-106.610738,31.875601,-106.610738,31.875601,,,,79922-4310,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"6910 N Mesa St Ste A, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 587-0097,-106.547936,31.835406,-106.547936,31.835406,,,,79912-4446,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"7021 Alameda Ave, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 778-7335,-106.395503,31.756516,-106.395503,31.756516,,,,79915-3454,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"8500 Dyer St Ste 61, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 755-4795,-106.43586,31.857783,-106.43586,31.857783,,,,79904-2800,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"9155 Dyer St Ste 21, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 751-6968,-106.426928,31.872153,-106.426928,31.872153,,,,79924-6401,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"9530 Viscount Blvd Ste 2A, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 633-8087,-106.36354,31.765733,-106.36354,31.765733,,,,79925-7000,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"9801 Dyer St, El Paso, TX",,"Dollar General-El Paso,TX",,,,,(915) 759-7020,-106.41329,31.892781,-106.41329,31.892781,,,,79924-4707,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1249 Cedar Rd Ste 106, Chesapeake, VA",,"Dollar General-Chesapeake,VA",,,,,(757) 382-4244,-76.285008,36.717454,-76.285008,36.717454,,,,23322-7292,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1367 Kempsville Rd, Chesapeake, VA",,"Dollar General-Chesapeake,VA",,,,,(757) 547-2223,-76.203952,36.764009,-76.203952,36.764009,,,,23320-1415,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"1435 Bainbridge Blvd, Chesapeake, VA",,"Dollar General-Chesapeake,VA",,,,,(757) 543-2279,-76.277653,36.811068,-76.277653,36.811068,,,,23324-2237,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"2617 Moses Grandy Trk Ste 112, Chesapeake, VA",,"Dollar General-Chesapeake,VA",,,,,(757) 485-5932,-76.34288,36.740494,-76.34288,36.740494,,,,23323-6711,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"3302 S Military Hwy, Chesapeake, VA",,"Dollar General-Chesapeake,VA",,,,,(757) 558-1124,-76.336139,36.772443,-76.336139,36.772443,,,,23323-3545,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"701-D North Battlefield Blvd, Chesapeake, VA",,"Dollar General-Chesapeake,VA",,,,,(757) 549-6653,-76.243818,36.744362,-76.243818,36.744362,,,,23320-0000,,,,,,,,monthly,TRUE,,,,1,dates,8,,,,,,, +,,"109 Piney Forest Rd, Danville, VA",,"Dollar General-Danville,VA",,,,,(434) 793-4988,-79.414346,36.594194,-79.414346,36.594194,,,,24540-4125,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1307 S Boston Road, Danville, VA",,"Dollar General-Danville,VA",,,,,(434) 688-0722,-79.343404,36.581105,-79.343404,36.581105,,,,24540,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1424 S Main St, Danville, VA",,"Dollar General-Danville,VA",,,,,(434) 792-9438,-79.405342,36.559366,-79.405342,36.559366,,,,24541,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1500 Westover Drive, Danville, VA",,"Dollar General-Danville,VA",,,,,(434) 688-3136,-79.449752,36.590457,-79.449752,36.590457,,,,24541,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2001 Piney Forest Rd, Danville, VA",,"Dollar General Market-Danville,VA",,,,,(434) 688-4627,-79.4131775,36.6028099,-79.4131775,36.6028099,,,,24540,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2398 W Main St, Danville, VA",,"Dollar General-Danville,VA",,,,,(434) 792-0121,-79.457823,36.558445,-79.457823,36.558445,,,,24541,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3555 Franklin Turnpike, Danville, VA",,"Dollar General-Danville,VA",,,,,(434) 688-4624,-79.415357,36.668839,-79.415357,36.668839,,,,24540,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"649 W Main St, Danville, VA",,"Dollar General-Danville,VA",,,,,(434) 797-2603,-79.419013,36.572353,-79.419013,36.572353,,,,24541-4201,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2952 Harper Rd, Beckley, WV",,"Dollar General-Beckley,WV",,,,,(304) 252-4306,-81.245663,37.804992,-81.245663,37.804992,,,,25801-9470,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2970 Robert C Byrd Dr, Beckley, WV",,"Dollar General-Beckley,WV",,,,,(304) 253-3172,-81.194417,37.777665,-81.194417,37.777665,,,,25801-4448,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"306 Beckley Plaza Ste 11, Beckley, WV",,"Dollar General-Beckley,WV",,,,,(304) 252-2079,-81.183417,37.811951,-81.183417,37.811951,,,,25801-2215,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"995 South Eisenhower Drive, Beckley, WV",,"Dollar General-Beckley,WV",,,,,(304) 256-7560,-81.160108,37.770066,-81.160108,37.770066,,,,25801,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"1555 Washington Street East, Charleston, WV",,"Dollar General-Charleston,WV",,,,,(304) 344-4262,-81.619764,38.341847,-81.619764,38.341847,,,,25311,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"222 Washington St W, Charleston, WV",,"Dollar General-Charleston,WV",,,,,(304) 346-7757,-81.641115,38.361109,-81.641115,38.361109,,,,25302-2346,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"4817 Midland Dr, Charleston, WV",,"Dollar General-Charleston,WV",,,,,(304) 553-7288,-81.5610067,38.2896663,-81.5610067,38.2896663,,,,25306-6354,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"504 Campbells Creek Dr, Charleston, WV",,"Dollar General-Charleston,WV",,,,,(304) 925-6137,-81.520236,38.317597,-81.520236,38.317597,,,,25306-6810,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"6283 Sissonville Dr, Charleston, WV",,"Dollar General-Charleston,WV",,,,,(304) 984-9073,-81.67091,38.475049,-81.67091,38.475049,,,,25312-9445,,,,,,,,weekly,TRUE,,1,4,,,,,,,,,, +,,"1302 Jamison Ave, Roanoke, VA",,"Dollar General-Roanoke,VA",,,,,(540) 345-1890,-79.9214706,37.271595,-79.9214706,37.271595,,,,24013-2016,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2227 Garden City Blvd Se, Roanoke, VA",,"Dollar General-Roanoke,VA",,,,,(540) 427-3153,-79.919734,37.248741,-79.919734,37.248741,,,,24014-3706,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2312 Orange Ave Ne # 4, Roanoke, VA",,"Dollar General-Roanoke,VA",,,,,(540) 343-5204,-79.909759,37.290763,-79.909759,37.290763,,,,24012-8311,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"3318 Brandon Ave Sw, Roanoke, VA",,"Dollar General-Roanoke,VA",,,,,(540) 343-1108,-80.003046,37.263328,-80.003046,37.263328,,,,24018-1520,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"3323 Melrose Ave Nw, Roanoke, VA",,"Dollar General-Roanoke,VA",,,,,(540) 366-2726,-79.990217,37.29136,-79.990217,37.29136,,,,24017-1943,,,,,,,,monthly,TRUE,,,,1,dates,10,,,,,,, +,,"2620 5Th Ave, Huntington, WV",,"Dollar General-Huntington,WV",,,,,(304) 697-2875,-82.407329,38.425847,-82.407329,38.425847,,,,25702-1329,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2908 Spring Valley Drive, Huntington, WV",,"Dollar General-Huntington,WV",,,,,(681) 203-5591,-82.5313721,38.375351,-82.5313721,38.375351,,,,25704-9800,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"318 Norway Ave, Huntington, WV",,"Dollar General-Huntington,WV",,,,,(304) 908-5492,-82.4072584,38.4071081,-82.4072584,38.4071081,,,,25705-1308,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"4341 Us Route 60, Huntington, WV",,"Dollar General-Huntington,WV",,,,,(304) 733-5648,-82.366162,38.411765,-82.366162,38.411765,,,,25705-2942,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"914 14Th St W, Huntington, WV",,"Dollar General-Huntington,WV",,,,,(304) 697-6855,-82.478302,38.408009,-82.478302,38.408009,,,,25704-2309,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1000 E Dupont Rd, Parkersburg, WV",,"Dollar General-Parkersburg,WV",,,,,(304) 422-4165,-81.582299,39.24652,-81.582299,39.24652,,,,26101-9724,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"2107 Pike St Ste 6, Parkersburg, WV",,"Dollar General-Parkersburg,WV",,,,,(304) 428-0054,-81.54168,39.234703,-81.54168,39.234703,,,,26101-6973,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3001 Dudley Ave, Parkersburg, WV",,"Dollar General-Parkersburg,WV",,,,,(304) 422-3992,-81.536537,39.283769,-81.536537,39.283769,,,,26104-1812,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3344 Staunton Turnpike, Parkersburg, WV",,"Dollar General-Parkersburg,WV",,,,,(304) 422-1686,-81.50492,39.221538,-81.50492,39.221538,,,,26104,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"835 7Th St, Parkersburg, WV",,"Dollar General-Parkersburg,WV",,,,,(304) 485-3195,-81.548757,39.26401,-81.548757,39.26401,,,,26101-5268,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1 Park St, Petersburg, WV",,"Dollar General-Petersburg,WV",,,,,(304) 257-4050,-79.125182,38.990592,-79.125182,38.990592,,,,26847-1731,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"100 S Lynn Shores Drive, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 463-3309,-76.108754,36.838998,-76.108754,36.838998,,,,23452,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1021 Virginia Beach Blvd, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 491-4891,-75.992868,36.84192,-75.992868,36.84192,,,,23451-5669,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1505 Lynnhaven Pkwy Ste 1355, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 468-9760,-76.099139,36.795664,-76.099139,36.795664,,,,23453-2014,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1920 Centerville Tpke, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 479-5114,-76.191506,36.779129,-76.191506,36.779129,,,,23464-6800,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"1948 Diamond Springs Rd, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 464-3902,-76.179401,36.902395,-76.179401,36.902395,,,,23455-2335,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3208 Holland Rd Ste 107, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 468-2815,-76.08072,36.792793,-76.08072,36.792793,,,,23453-2864,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"3600 S Plaza Trl, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 498-4271,-76.095627,36.840979,-76.095627,36.840979,,,,23452-3310,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"4239 Holand Rd -Suite #788, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 495-5404,-76.092157,36.83444,-76.092157,36.83444,,,,23452-1941,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"4807 Shore Dr, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 363-2888,-76.136089,36.904258,-76.136089,36.904258,,,,23455-2714,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"5013 Virginia Beach Blvd, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 499-6450,-76.15179,36.843683,-76.15179,36.843683,,,,23462-6610,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"5277 Princess Anne Rd, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 490-0649,-76.167085,36.828006,-76.167085,36.828006,,,,23462-6398,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, +,,"649 Newtown Rd, Virginia Beach, VA",,"Dollar General-Virginia Beach,VA",,,,,(757) 497-2273,-76.173324,36.861781,-76.173324,36.861781,,,,23462-1600,,,,,,,,weekly,TRUE,,1,1,,,,,,,,,, diff --git a/Route4MeSDKTest/bin/Debug/Data/Other files/addressbook_v4_short.csv b/Route4MeSDKTest/bin/Debug/Data/Other files/addressbook_v4_short.csv new file mode 100644 index 00000000..763e20c9 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/Other files/addressbook_v4_short.csv @@ -0,0 +1,11 @@ +id,address_id,address_1,address_2,address_alias,address_group,first_name,last_name,address_email,address_phone_number,cached_lat,cached_lng,curbside_lat,curbside_lng,address_city,address_state_id,address_country_id,address_zip,address_custom_data,schedule_blacklist,service_time,color,address_icon +,,"1235 Cherokee Rd, Alexander City, AL",,"Dollar General-Alexander City,AL",,,,,(256) 234-9012,-85.948343,32.930977,-85.948343,32.930977,,,,35010-3920,,,,, +,,"1538 Mill Sq, Alexander City, AL",,"Dollar General-Alexander City,AL",,,,,(256) 215-5511,-85.972485,32.936296,-85.972485,32.936296,,,,35010-2674,,,,, +,,"6278 Alabama 63, Alexander City, AL",,"Dollar General-Alexander City,AL",,,,,(256) 414-3086,-85.9426244,33.0229598,-85.9426244,33.0229598,,,,35771-7175,,,,, +,,"819 K St, Alexander City, AL",,"Dollar General-Alexander City,AL",,,,,(256) 409-1495,-85.945398,32.955069,-85.945398,32.955069,,,,35010-1325,,,,, +,,"118 Shelby Street, Andalusia, AL",,"Dollar General-Andalusia,AL",,,,,(334) 222-5456,-86.4617237,31.3196846,-86.4617237,31.3196846,,,,36420-2403,,,,, +,,"225 Church St, Andalusia, AL",,"Dollar General-Andalusia,AL",,,,,(334) 222-4642,-86.484979,31.308227,-86.484979,31.308227,,,,36420-3701,,,,, +,,"28513 US Hwy 29, Andalusia, AL",,"Dollar General-Andalusia,AL",,,,,(334) 388-2771,-86.4794552,31.3993549,-86.4794552,31.3993549,,,,36421-1315,,,,, +,,"925 River Fall St, Andalusia, AL",,"Dollar General-Andalusia,AL",,,,,(334) 222-1762,-86.495167,31.31455,-86.495167,31.31455,,,,36420-2557,,,,, +,,"1421 Golden Springs Rd, Anniston, AL",,"Dollar General-Anniston,AL",,,,,(256) 831-8356,-85.78598,33.627918,-85.78598,33.627918,,,,36207-6923,,,,, +,,"2363 Al Highway 202 Ste D, Anniston, AL",,"Dollar General-Anniston,AL",,,,,(256) 240-2939,-85.861063,33.647234,-85.861063,33.647234,,,,36201-5331,,,,, diff --git a/Route4MeSDKTest/bin/Debug/Data/Other files/addressbook_v4_short.xlsx b/Route4MeSDKTest/bin/Debug/Data/Other files/addressbook_v4_short.xlsx new file mode 100644 index 00000000..9ac64a82 Binary files /dev/null and b/Route4MeSDKTest/bin/Debug/Data/Other files/addressbook_v4_short.xlsx differ diff --git a/Route4MeSDKTest/bin/Debug/Data/Other files/addresses 1000.csv b/Route4MeSDKTest/bin/Debug/Data/Other files/addresses 1000.csv new file mode 100644 index 00000000..e6377eb9 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/Other files/addresses 1000.csv @@ -0,0 +1,1000 @@ +-85.948343,32.930977,"Dollar General-Alexander City,AL",1235 Cherokee Rd,Alexander City,AL,35010-3920,(256) 234-9012,weekly,TRUE,1,4,,,,,, +-85.972485,32.936296,"Dollar General-Alexander City,AL",1538 Mill Sq,Alexander City,AL,35010-2674,(256) 215-5511,weekly,TRUE,1,4,,,,,, +-85.9426244,33.0229598,"Dollar General-Alexander City,AL",6278 Alabama 63,Alexander City,AL,35771-7175,(256) 414-3086,weekly,TRUE,1,4,,,,,, +-85.945398,32.955069,"Dollar General-Alexander City,AL",819 K St,Alexander City,AL,35010-1325,(256) 409-1495,weekly,TRUE,1,4,,,,,, +-86.4617237,31.3196846,"Dollar General-Andalusia,AL",118 Shelby Street,Andalusia,AL,36420-2403,(334) 222-5456,weekly,TRUE,1,2,,,,,, +-86.484979,31.308227,"Dollar General-Andalusia,AL",225 Church St,Andalusia,AL,36420-3701,(334) 222-4642,weekly,TRUE,1,2,,,,,, +-86.4794552,31.3993549,"Dollar General-Andalusia,AL",28513 US Hwy 29,Andalusia,AL,36421-1315,(334) 388-2771,weekly,TRUE,1,2,,,,,, +-86.495167,31.31455,"Dollar General-Andalusia,AL",925 River Fall St,Andalusia,AL,36420-2557,(334) 222-1762,weekly,TRUE,1,2,,,,,, +-85.78598,33.627918,"Dollar General-Anniston,AL",1421 Golden Springs Rd,Anniston,AL,36207-6923,(256) 831-8356,monthly,TRUE,1,,dates,8,,,, +-85.861063,33.647234,"Dollar General-Anniston,AL",2363 Al Highway 202 Ste D,Anniston,AL,36201-5331,(256) 240-2939,monthly,TRUE,1,,dates,8,,,, +-85.86024,33.715829,"Dollar General-Anniston,AL",2605 Us Highway 431 N,Anniston,AL,36206-1006,(256) 820-1110,monthly,TRUE,1,,dates,8,,,, +-85.829786,33.686131,"Dollar General-Anniston,AL",3115 Noble Street,Anniston,AL,36201,(256) 231-4895,monthly,TRUE,1,,dates,8,,,, +-85.72774,33.649725,"Dollar General-Anniston,AL",3440 Choccolocco Rd,Anniston,AL,36207-1640,(256) 238-6112,monthly,TRUE,1,,dates,8,,,, +-85.825559,33.638181,"Dollar General-Anniston,AL",704 S Quintard Ave,Anniston,AL,36201-6677,(256) 238-6802,monthly,TRUE,1,,dates,8,,,, +-86.954561,34.785661,"Dollar General-Athens,AL",1031 A Hwy 72 E,Athens,AL,35611-4330,(256) 771-1577,weekly,TRUE,1,3,,,,,, +-86.971845,34.8151,"Dollar General-Athens,AL",1210 N Jefferson St,Athens,AL,35611-1615,(256) 216-0902,weekly,TRUE,1,3,,,,,, +-86.950568,34.806887,"Dollar General-Athens,AL",1233 E Pryor St,Athens,AL,35611,(256) 233-5496,weekly,TRUE,1,3,,,,,, +-87.100288,34.792682,"Dollar General-Athens,AL",12375 Us Highway 72,Athens,AL,35611-8577,(256) 729-0601,weekly,TRUE,1,3,,,,,, +-86.9216368,34.7760221,"Dollar General-Athens,AL",15297 Pike Road,Athens,AL,35613-2863,(256) 434-8277,weekly,TRUE,1,3,,,,,, +-86.904476,34.824273,"Dollar General-Athens,AL",16521 Al Highway 251,Athens,AL,35613-5047,(256) 233-2138,weekly,TRUE,1,3,,,,,, +-87.003163,34.790973,"Dollar General-Athens,AL",17837 Us Highway 72,Athens,AL,35611-3903,(256) 771-0018,weekly,TRUE,1,3,,,,,, +-87.018484,34.833503,"Dollar General-Athens,AL",19300 Al Highway 99,Athens,AL,35614-5473,(256) 233-4006,weekly,TRUE,1,3,,,,,, +-86.97267,34.796979,"Dollar General-Athens,AL",600 S Jefferson St,Athens,AL,35611-3544,(256) 233-1255,weekly,TRUE,1,3,,,,,, +-85.458874,32.6199874,"Dollar General-Auburn,AL",1106 Opelika Rd,Auburn,AL,36830-3312,(334) 246-5254,monthly,TRUE,1,,nth,,,,2,4 +-85.4893036,32.5793457,"Dollar General-Auburn,AL",196 East University Dr,Auburn,AL,36832-6726,(334) 501-1319,monthly,TRUE,1,,nth,,,,2,4 +-85.520149,32.5816083,"Dollar General-Auburn,AL",1961 Wire Rd,Auburn,AL,36832,(334) 246-0839,monthly,TRUE,1,,nth,,,,2,4 +-85.5807904,32.600422,"Dollar General-Auburn,AL",5334 AL Hwy 14 W,Auburn,AL,36832-1861,(334) 521-3301,monthly,TRUE,1,,nth,,,,2,4 +-86.994274,33.353238,"Dollar General-Bessemer,AL",1750 4Th Ave Sw,Bessemer,AL,35022-5223,(205) 424-9007,weekly,TRUE,1,5,,,,,, +-86.981344,33.418536,"Dollar General-Bessemer,AL",2417 19th St N,Bessemer,AL,35020,(205) 428-6494,weekly,TRUE,1,5,,,,,, +-86.949779,33.419247,"Dollar General-Bessemer,AL",3011 9th Ave N,Bessemer,AL,35020,(205) 424-4820,weekly,TRUE,1,5,,,,,, +-87.0242453,33.4630995,"Dollar General-Bessemer,AL",3459 Warrior River Road,Bessemer,AL,35023-1039,(205) 461-1513,weekly,TRUE,1,5,,,,,, +-86.960497,33.345268,"Dollar General-Bessemer,AL",3979 Parwood Rd-Ste#117,Bessemer,AL,35022-5627,(205) 424-8076,weekly,TRUE,1,5,,,,,, +-86.98021,33.38575,"Dollar General-Bessemer,AL",671 9th Ave SW,Bessemer,AL,35022-4503,(205) 428-0906,weekly,TRUE,1,5,,,,,, +-86.776885,33.580622,"Dollar General-Birmingham,AL",1200 Pinson Valley Pkwy,Birmingham,AL,35217-2327,(205) 841-0903,monthly,TRUE,1,,dates,9,,,, +-86.8976,33.567022,"Dollar General-Birmingham,AL",1552 Forestdale Blvd,Birmingham,AL,35214-3018,(205) 791-6795,monthly,TRUE,1,,dates,9,,,, +-86.684644,33.631809,"Dollar General-Birmingham,AL",1687 Center Point Pkwy Ste 121,Birmingham,AL,35215-5525,(205) 815-0132,monthly,TRUE,1,,dates,9,,,, +-86.8943863,33.5101242,"Dollar General-Birmingham,AL",2007 Avenue H,Birmingham,AL,35218-1625,(205) 383-3862,monthly,TRUE,1,,dates,9,,,, +-86.648151,33.653061,"Dollar General-Birmingham,AL",2260 Brewster Rd,Birmingham,AL,35235-3501,(205) 853-0113,monthly,TRUE,1,,dates,9,,,, +-86.877031,33.498156,"Dollar General-Birmingham,AL",2314 Warrior Rd,Birmingham,AL,35208-3514,(205) 781-2035,monthly,TRUE,1,,dates,9,,,, +-86.684017,33.646795,"Dollar General-Birmingham,AL",2328 Center Point Rd,Birmingham,AL,35215-3608,(205) 520-9502,monthly,TRUE,1,,dates,9,,,, +-86.921604,33.580464,"Dollar General-Birmingham,AL",2419 Palomino Lane,Birmingham,AL,35214-1917,(205) 798-3835,monthly,TRUE,1,,dates,9,,,, +-86.941233,33.52984,"Dollar General-Birmingham,AL",3150 Birmingport Rd,Birmingham,AL,35224-2861,(205) 785-6457,monthly,TRUE,1,,dates,9,,,, +-86.7844162,33.6327591,"Dollar General-Birmingham,AL",3194 New Castle Rd,Birmingham,AL,36017-4127,(205) 386-3071,monthly,TRUE,1,,dates,9,,,, +-86.819284,33.554852,"Dollar General-Birmingham,AL",3301 26th Street North,Birmingham,AL,35207,(205) 208-0290,monthly,TRUE,1,,dates,9,,,, +-86.727789,33.634879,"Dollar General-Birmingham,AL",3931 Pinson Valley Pkwy,Birmingham,AL,35217-1857,(205) 856-6999,monthly,TRUE,1,,dates,9,,,, +-86.7622907,33.5272989,"Dollar General-Birmingham,AL",4600 5th Avenue South,Birmingham,AL,35222-2904,(205) 206-4348,monthly,TRUE,1,,dates,9,,,, +-86.70466,33.584619,"Dollar General-Birmingham,AL",9088 Parkway E,Birmingham,AL,35206-1505,(205) 836-3907,monthly,TRUE,1,,dates,9,,,, +-86.851509,33.505408,"Dollar General-Birmingham,AL",915 3rd Ave West,Birmingham,AL,35204,(205) 623-3245,monthly,TRUE,1,,dates,9,,,, +-86.843732,33.480477,"Dollar General-Birmingham,AL",917 Dennison Avenue,Birmingham,AL,35211,(205) 326-8007,monthly,TRUE,1,,dates,9,,,, +-87.053871,34.20989,"Dollar General-Cullman,AL",11511 Us Highway 278 W,Cullman,AL,35057-6241,(256) 747-2506,weekly,TRUE,1,2,,,,,, +-86.948499,34.23962,"Dollar General-Cullman,AL",11590 Al Highway 157,Cullman,AL,35057-6718,(256) 734-7998,weekly,TRUE,1,2,,,,,, +-86.8812467,34.1696698,"Dollar General-Cullman,AL",120 Us Hwy 278,Cullman,AL,35057,(256) 841-3594,weekly,TRUE,1,2,,,,,, +-86.683392,34.247595,"Dollar General-Cullman,AL",120 Wesley Avenue North,Cullman,AL,35058,(256) 796-5037,weekly,TRUE,1,2,,,,,, +-86.851215,34.171909,"Dollar General-Cullman,AL",1208 4Th St Sw,Cullman,AL,35055-3923,(256) 735-0066,weekly,TRUE,1,2,,,,,, +-86.828598,34.2099915,"Dollar General-Cullman,AL",121 CR 1435,Cullman,AL,35058-1474,(256) 841-4499,weekly,TRUE,1,2,,,,,, +-86.815853,34.18211,"Dollar General-Cullman,AL",1600 3Rd St Se,Cullman,AL,35055-2074,(256) 734-5478,weekly,TRUE,1,2,,,,,, +-86.836086,34.160263,"Dollar General-Cullman,AL",1642 Town Sq Sw,Cullman,AL,35055-5263,(256) 734-4392,weekly,TRUE,1,2,,,,,, +-86.843341,34.176203,"Dollar General-Cullman,AL",203 1St Ave Sw,Cullman,AL,35055-3413,(256) 739-5456,weekly,TRUE,1,2,,,,,, +-86.871628,34.106817,"Dollar General-Cullman,AL",31 Megan Ln,Cullman,AL,35057-3369,(256) 734-0560,weekly,TRUE,1,2,,,,,, +-86.7406998,34.2638512,"Dollar General-Cullman,AL",6091 Cr 747,Cullman,AL,35038,(256) 615-4688,weekly,TRUE,1,2,,,,,, +-86.84947,34.184465,"Dollar General-Cullman,AL",801 2Nd Ave Nw,Cullman,AL,35055-2401,(256) 775-1519,weekly,TRUE,1,2,,,,,, +-87.001919,34.5603,"Dollar General-Decatur,AL",1000 Beltline Rd Sw Ste U,Decatur,AL,35601-6280,(256) 350-7377,monthly,TRUE,1,,dates,6,,,, +-86.982764,34.523282,"Dollar General-Decatur,AL",1218 Mill Rd,Decatur,AL,35603-4817,(256) 308-2336,monthly,TRUE,1,,dates,6,,,, +-86.98035,34.583979,"Dollar General-Decatur,AL",1502B 6Th Ave Se,Decatur,AL,35601-4918,(256) 350-6577,monthly,TRUE,1,,dates,6,,,, +-87.012109,34.604216,"Dollar General-Decatur,AL",1731 Moulton St W,Decatur,AL,35601-7235,(256) 350-0494,monthly,TRUE,1,,dates,6,,,, +-87.009244,34.574358,"Dollar General-Decatur,AL",2006 Danville Rd Sw,Decatur,AL,35601-4640,(256) 351-0022,monthly,TRUE,1,,dates,6,,,, +-87.032933,34.588599,"Dollar General-Decatur,AL",2400 Old Moulton Rd Sw,Decatur,AL,35603-4474,(256) 353-4300,monthly,TRUE,1,,dates,6,,,, +-85.405309,31.226458,"Dollar General-Dothan,AL",1060 W Main St Ste 4,Dothan,AL,36301-1469,(334) 678-6036,weekly,TRUE,1,2,,,,,, +-85.398187,31.2373441,"Dollar General-Dothan,AL",1071 Montgomery Hwy 231,Dothan,AL,36303,(334) 803-8824,weekly,TRUE,1,2,,,,,, +-85.375218,31.193269,"Dollar General-Dothan,AL",1702 E Cottonwood Rd,Dothan,AL,36301-5060,(334) 794-1543,weekly,TRUE,1,2,,,,,, +-85.364248,31.218559,"Dollar General-Dothan,AL",1815 E Main St Ste 1,Dothan,AL,36301-3013,(334) 702-7897,weekly,TRUE,1,2,,,,,, +-85.388274,31.255949,"Dollar General-Dothan,AL",2301 Reeves St,Dothan,AL,36303-5815,(334) 673-0926,weekly,TRUE,1,2,,,,,, +-85.419088,31.243572,"Dollar General-Dothan,AL",2505 Montgomery Hwy,Dothan,AL,36303-2603,(334) 678-9865,weekly,TRUE,1,2,,,,,, +-85.436193,31.199492,"Dollar General-Dothan,AL",2865 Hartford Hwy,Dothan,AL,36305-4901,(334) 702-7652,weekly,TRUE,1,2,,,,,, +-85.430808,31.216803,"Dollar General-Dothan,AL",2890 Ross Clark Cir,Dothan,AL,36301-2017,(334) 671-7041,weekly,TRUE,1,2,,,,,, +-85.402246,31.174393,"Dollar General-Dothan,AL",3600 S Oates St,Dothan,AL,36301-0604,(334) 671-4785,weekly,TRUE,1,2,,,,,, +-85.524922,31.23867,"Dollar General-Dothan,AL",41 North Bay Springs Rd,Dothan,AL,36303,(334) 692-3038,weekly,TRUE,1,2,,,,,, +-85.485463,31.210717,"Dollar General-Dothan,AL",6130 Fortner St,Dothan,AL,36305-6822,(334) 671-2715,weekly,TRUE,1,2,,,,,, +-85.3311619,31.1239015,"Dollar General-Dothan,AL",670 Gene Terry Road,Dothan,AL,35022-4503,(334) 803-8223,weekly,TRUE,1,2,,,,,, +-85.401197,31.20988,"Dollar General-Dothan,AL",767 W Selma St Unit 1,Dothan,AL,36301-3467,(334) 794-0660,weekly,TRUE,1,2,,,,,, +-91.638237,35.73733,"Dollar General-Batesville,AR",12 Allen Chapel Rd,Batesville,AR,72501-9787,(870) 251-0210,monthly,TRUE,1,,dates,9,,,, +-91.6247488,35.7001054,"Dollar General-Batesville,AR",1979 Batesville Blvd,Batesville,AR,72501-7896,(870) 376-4467,monthly,TRUE,1,,dates,9,,,, +-91.659078,35.77586,"Dollar General-Batesville,AR",858 N Central Ave,Batesville,AR,72501-5411,(870) 793-7702,monthly,TRUE,1,,dates,9,,,, +-91.625869,35.770097,"Dollar General-Batesville,AR",925 24Th St,Batesville,AR,72501-6106,(870) 612-5920,monthly,TRUE,1,,dates,9,,,, +-92.588262,34.563625,"Dollar General-Benton,AR",102 N Market St,Benton,AR,72015-3769,(501) 778-2426,weekly,TRUE,1,2,,,,,, +-92.57815,34.575527,"Dollar General-Benton,AR",1225 Military Rd,Benton,AR,72015-2908,(501) 778-8827,weekly,TRUE,1,2,,,,,, +-92.560985,34.628886,"Dollar General-Benton,AR",1279 Salem Rd,Benton,AR,72019,(501) 794-2498,weekly,TRUE,1,2,,,,,, +-92.5547082,34.5563149,"Dollar General-Benton,AR",2725 Edison Ave,Benton,AR,72015,(501) 303-6628,weekly,TRUE,1,2,,,,,, +-92.5424827,34.5749865,"Dollar General-Benton,AR",3801 Benton Pkwy,Benton,AR,72015-8500,(501) 574-0279,weekly,TRUE,1,2,,,,,, +-92.5662075,34.699448,"Dollar General-Benton,AR",3904 Congo Rd,Benton,AR,72019-1736,(501) 574-3233,weekly,TRUE,1,2,,,,,, +-92.579613,34.557588,"Dollar General-Benton,AR",714 Edison Ave,Benton,AR,72015-4512,(501) 776-2747,weekly,TRUE,1,2,,,,,, +-92.02754,34.976663,"Dollar General-Cabot,AR",14 Prospect Ct,Cabot,AR,72023-2899,(501) 843-9558,monthly,TRUE,1,,dates,8,,,, +-92.0633396,34.9816006,"Dollar General-Cabot,AR",3520 W Main Street,Cabot,AR,72023,(501) 843-0614,monthly,TRUE,1,,dates,8,,,, +-92.02111,34.970348,"Dollar General-Cabot,AR",524 S 2Nd St,Cabot,AR,72023-2542,(501) 941-2729,monthly,TRUE,1,,dates,8,,,, +-92.008408,34.961368,"Dollar General-Cabot,AR",651 S Pine St,Cabot,AR,72023-3825,(501) 843-8404,monthly,TRUE,1,,dates,8,,,, +-92.442963,35.067832,"Dollar General-Conway,AR",1305 Dave Ward Dr,Conway,AR,72034-6943,(501) 450-9474,monthly,TRUE,1,,dates,8,,,, +-92.404837,35.091208,"Dollar General-Conway,AR",1600 E Oak St,Conway,AR,72032-4740,(501) 764-1828,monthly,TRUE,1,,dates,8,,,, +-92.451316,35.111762,"Dollar General-Conway,AR",2560 Donaghey,Conway,AR,72032-2860,(501) 329-3036,monthly,TRUE,1,,dates,8,,,, +-92.432007,35.112214,"Dollar General-Conway,AR",379 Highway 65 N,Conway,AR,72032,(501) 327-2020,monthly,TRUE,1,,dates,8,,,, +-92.32789,35.083072,"Dollar General-Conway,AR",506 Hwy 64 East,Conway,AR,72032,(501) 358-4067,monthly,TRUE,1,,dates,8,,,, +-92.49777,35.091086,"Dollar General-Conway,AR",816 Hogan Ln,Conway,AR,72034-7953,(501) 504-2464,monthly,TRUE,1,,dates,8,,,, +-119.022464,35.408628,"Dollar General Market-Bakersfield,CA",111 Roberts Lane,Bakersfield,CA,93308,(661) 401-7837,monthly,TRUE,1,,dates,8,,,, +-118.976076,35.378443,"Dollar General-Bakersfield,CA",1616 Niles Street,Bakersfield,CA,93306,(661) 369-7745,monthly,TRUE,1,,dates,8,,,, +-119.021337,35.426923,"Dollar General-Bakersfield,CA",2317 N Chester Ave,Bakersfield,CA,93308,(661) 369-7564,monthly,TRUE,1,,dates,8,,,, +-118.99496,35.39026,"Dollar General Market-Bakersfield,CA",258 Bernard Street,Bakersfield,CA,93305-3541,(661) 371-4562,monthly,TRUE,1,,dates,8,,,, +-118.953877,35.37612,"Dollar General Market-Bakersfield,CA",2900 Niles Street,Bakersfield,CA,93306,(661) 369-7137,monthly,TRUE,1,,dates,8,,,, +-119.037342,35.354119,"Dollar General Market-Bakersfield,CA",3030 Brundage Lane,Bakersfield,CA,93304,(661) 401-7867,monthly,TRUE,1,,dates,8,,,, +-119.037353,35.332197,"Dollar General-Bakersfield,CA",3101 Wilson Road,Bakersfield,CA,93304,(661) 369-7401,monthly,TRUE,1,,dates,8,,,, +-119.003069,35.36075,"Dollar General Market-Bakersfield,CA",401 Union Avenue,Bakersfield,CA,93308-1433,(661) 401-7839,monthly,TRUE,1,,dates,8,,,, +-119.057709,35.318018,"Dollar General-Bakersfield,CA",5101 White Lane,Bakersfield,CA,93309-8925,(661) 371-4069,monthly,TRUE,1,,dates,8,,,, +-82.546374,27.491642,"Dollar General-Bradenton,FL",1525 9Th Ave E,Bradenton,FL,34208-2204,(941) 746-6274,weekly,TRUE,1,2,,,,,, +-82.591095,27.4950886,"Dollar General-Bradenton,FL",2923 W Manatee Ave,Bradenton,FL,34205-4238,(941) 348-6898,weekly,TRUE,1,2,,,,,, +-82.562794,27.467982,"Dollar General Market-Bradenton,FL",3611 1St St Ste 1200,Bradenton,FL,34208-4432,(941) 747-1347,weekly,TRUE,1,2,,,,,, +-82.608929,27.462707,"Dollar General-Bradenton,FL",4726 Cortez Rd West,Bradenton,FL,34210-2801,(941) 792-6192,weekly,TRUE,1,2,,,,,, +-82.546847,27.450998,"Dollar General-Bradenton,FL",5102 15th St E # E,Bradenton,FL,34203-4858,(941) 727-1176,weekly,TRUE,1,2,,,,,, +-82.521564,27.449452,"Dollar General-Bradenton,FL",5177 33rd St E # 11,Bradenton,FL,34203-4328,(941) 727-4557,weekly,TRUE,1,2,,,,,, +-82.57551,27.42716,"Dollar General-Bradenton,FL",6414 14th St W Ste A,Bradenton,FL,34207-5329,(941) 752-0334,weekly,TRUE,1,2,,,,,, +-82.626661,27.495887,"Dollar General-Bradenton,FL",6545 Manatee Ave W,Bradenton,FL,34209-2326,(941) 792-2752,weekly,TRUE,1,2,,,,,, +-82.3755325,28.5791443,"Dollar General-Brooksville,FL",10395 Broad St,Brooksville,FL,34601,(352) 796-9690,monthly,TRUE,1,,dates,8,,,, +-82.5124479,28.5337459,"Dollar General-Brooksville,FL",12983 Cortez Blvd,Brooksville,FL,34613-4884,(352) 597-3644,monthly,TRUE,1,,dates,8,,,, +-82.455652,28.480822,"Dollar General-Brooksville,FL",16312 Spring Hill Dr # 6,Brooksville,FL,34604-0607,(352) 799-8056,monthly,TRUE,1,,dates,8,,,, +-82.228374,28.524854,"Dollar General-Brooksville,FL",6336 Sherman Hills Blvd,Brooksville,FL,34602-7610,(352) 544-6276,monthly,TRUE,1,,dates,8,,,, +-82.400221,28.546875,"Dollar General-Brooksville,FL",856 S Broad St,Brooksville,FL,34601-3105,(352) 799-0928,monthly,TRUE,1,,dates,8,,,, +-82.005528,26.667106,"Dollar General-Cape Coral,FL",1523 Tropicana Parkway West,Cape Coral,FL,33993,(239) 242-0713,monthly,TRUE,1,,dates,8,,,, +-81.9914402,26.6225995,"Dollar General-Cape Coral,FL",1612 Skyline Blvd,Cape Coral,FL,33991-2645,(239) 574-1959,monthly,TRUE,1,,dates,8,,,, +-81.940984,26.609532,"Dollar General-Cape Coral,FL",2323 Del Prado Blvd S,Cape Coral,FL,33990-4615,(239) 772-4344,monthly,TRUE,1,,dates,8,,,, +-81.9570348,26.6960645,"Dollar General-Cape Coral,FL",2328 Andalusia Blvd,Cape Coral,FL,33909-2301,(239) 677-4924,monthly,TRUE,1,,dates,8,,,, +-82.00691,26.593465,"Dollar General-Cape Coral,FL",3123 Chiquita Blvd S,Cape Coral,FL,33914-4265,(239) 541-3077,monthly,TRUE,1,,dates,8,,,, +-81.956883,26.659926,"Dollar General-Cape Coral,FL",924 Ne Pine Island Rd,Cape Coral,FL,33909-2552,(239) 574-5365,monthly,TRUE,1,,dates,8,,,, +-82.796088,27.981018,"Dollar General-Clearwater,FL",1600 N Myrtle Ave,Clearwater,FL,33755-2549,(727) 443-1565,weekly,TRUE,1,1,,,,,, +-82.775284,27.989291,"Dollar General-Clearwater,FL",1883 N Highland Ave,Clearwater,FL,33755-2156,(727) 442-1710,weekly,TRUE,1,1,,,,,, +-82.746349,27.970962,"Dollar General-Clearwater,FL",422 N Belcher Rd,Clearwater,FL,33765-2606,(727) 446-7461,weekly,TRUE,1,1,,,,,, +-82.705695,27.872082,"Dollar General-Clearwater,FL",5251 110th Ave N Ste 108,Clearwater,FL,33760-4816,(727) 592-9618,weekly,TRUE,1,1,,,,,, +-86.549027,30.7598137,"Dollar General-Crestview,FL",1601 James Lee Blvd East,Crestview,FL,32539-3227,(850) 634-0879,monthly,TRUE,1,,dates,9,,,, +-86.572807,30.726268,"Dollar General-Crestview,FL",225 Rasberry Rd,Crestview,FL,32536-6426,(850) 683-3550,monthly,TRUE,1,,dates,9,,,, +-86.577188,30.762846,"Dollar General-Crestview,FL",318 W James Lee Blvd,Crestview,FL,32536,(850) 423-9707,monthly,TRUE,1,,dates,9,,,, +-86.565313,30.771921,"Dollar General-Crestview,FL",783 N Ferdon Blvd,Crestview,FL,32536-2113,(850) 682-5752,monthly,TRUE,1,,dates,9,,,, +-82.579906,28.865221,"Dollar General-Crystal River,FL",298 N Suncoast Blvd,Crystal River,FL,34429-5465,(352) 795-8854,weekly,TRUE,1,5,,,,,, +-82.547598,28.890434,"Dollar General-Crystal River,FL",6798 W Gulf To Lake Hwy,Crystal River,FL,34429-9426,(352) 564-2010,weekly,TRUE,1,5,,,,,, +-82.584748,28.890044,"Dollar General-Crystal River,FL",736 Se US Hwy 19,Crystal River,FL,34429-4810,(352) 564-0811,weekly,TRUE,1,5,,,,,, +-82.5698013,28.9780426,"Dollar General-Crystal River,FL",7958 North Citrus Avenue,Crystal River,FL,34428-6943,(352) 364-4226,weekly,TRUE,1,5,,,,,, +-81.281757,29.028086,"Dollar General-Deland,FL",1110 E New York Ave,Deland,FL,32724-5750,(386) 736-3344,weekly,TRUE,1,5,,,,,, +-81.302785,29.002208,"Dollar General-Deland,FL",1512 S Woodland Blvd,Deland,FL,32720-7709,(386) 736-7022,weekly,TRUE,1,5,,,,,, +-81.2624071,29.0634862,"Dollar General-Deland,FL",2110 E International Speedway,Deland,FL,32724-8709,(386) 736-7406,weekly,TRUE,1,5,,,,,, +-81.313632,29.078242,"Dollar General-Deland,FL",2531 N Woodland Blvd,Deland,FL,32720-1301,(386) 736-0262,weekly,TRUE,1,5,,,,,, +-81.324527,29.039557,"Dollar General-Deland,FL",745 N Spring Garden Ave,Deland,FL,32720,(386) 734-8664,weekly,TRUE,1,5,,,,,, +-84.184788,31.587223,"Dollar General-Albany,GA",1411 Dawson Rd,Albany,GA,31707-3855,(229) 889-1686,monthly,TRUE,1,,dates,6,,,, +-84.136963,31.549598,"Dollar General-Albany,GA",1515 Radium Springs Rd,Albany,GA,31705-4051,(229) 420-7774,monthly,TRUE,1,,dates,6,,,, +-84.116107,31.632034,"Dollar General-Albany,GA",1775 Philema Rd S,Albany,GA,31701-4740,(229) 420-8747,monthly,TRUE,1,,dates,6,,,, +-84.155141,31.555468,"Dollar General-Albany,GA",1824 Martin Luther King J,Albany,GA,31701,(229) 888-1169,monthly,TRUE,1,,dates,6,,,, +-84.10289,31.570774,"Dollar General-Albany,GA",1906 E Oglethorpe Blvd,Albany,GA,31705-2935,(229) 436-5325,monthly,TRUE,1,,dates,6,,,, +-84.161871,31.57608,"Dollar General-Albany,GA",2017 N Slappery Blvd,Albany,GA,31701-1008,(229) 446-8141,monthly,TRUE,1,,dates,6,,,, +-84.207391,31.60661,"Dollar General-Albany,GA",2401 Dawson Rd Ste C,Albany,GA,31707-2381,(229) 435-2816,monthly,TRUE,1,,dates,6,,,, +-84.118219,31.464175,"Dollar General-Albany,GA",2401 Liberty Expressway,Albany,GA,31705,(229) 888-7474,weekly,TRUE,1,3,,,,,, +-84.1415558,31.5747318,"Dollar General-Albany,GA",300 East Oglethorpe Boulevard,Albany,GA,31705,(229) 255-3920,weekly,TRUE,1,3,,,,,, +-84.177123,31.623373,"Dollar General-Albany,GA",3005 N Slappey Blvd,Albany,GA,31701-1021,(229) 639-1160,weekly,TRUE,1,3,,,,,, +-84.220933,31.573665,"Dollar General-Albany,GA",327 S Westover Blvd,Albany,GA,31707-0609,(229) 888-1564,weekly,TRUE,1,3,,,,,, +-84.1757965,31.5711479,"Dollar General-Albany,GA",408 South Slappy Blvd,Albany,GA,31701,(229) 432-2210,weekly,TRUE,1,3,,,,,, +-84.0322606,31.5738165,"Dollar General-Albany,GA",4805 Hill Road,Albany,GA,31705,(229) 518-6226,weekly,TRUE,1,3,,,,,, +-84.20059,31.5145,"Dollar General-Albany,GA",5731 Newton Road,Albany,GA,31701,(229) 420-7387,weekly,TRUE,1,3,,,,,, +-83.338839,33.925919,"Dollar General-Athens,GA",1055 Gaines School Rd,Athens,GA,30605-3164,(706) 227-0844,monthly,TRUE,1,,dates,7,,,, +-83.3911438,33.9538155,"Dollar General-Athens,GA",1125 West Broad Street,Athens,GA,30606,(706) 247-7861,monthly,TRUE,1,,dates,7,,,, +-83.401819,34.03253,"Dollar General-Athens,GA",11325 Commerce Hwy,Athens,GA,30607-4321,(706) 227-0008,monthly,TRUE,1,,dates,7,,,, +-83.3403499,33.9447653,"Dollar General-Athens,GA",2194 Lexington Road,Athens,GA,30605-2338,(706) 395-5876,monthly,TRUE,1,,dates,7,,,, +-83.412977,33.972517,"Dollar General Market-Athens,GA",2411 Jefferson Rd,Athens,GA,30607-1202,(706) 354-4660,monthly,TRUE,1,,dates,7,,,, +-83.360936,33.982984,"Dollar General-Athens,GA",800 Danielsville Rd,Athens,GA,30601,(706) 389-9632,monthly,TRUE,1,,dates,7,,,, +-83.3647232,33.899395,"Dollar General-Athens,GA",880 Whitehall Road,Athens,GA,30605-4223,(706) 395-8426,monthly,TRUE,1,,dates,7,,,, +-81.9463194,33.4681488,"Dollar General-Augusta,GA",101 Sand Bar Ferry Rd,Augusta,GA,30901,(706) 250-6129,weekly,TRUE,1,4,,,,,, +-82.137887,33.495839,"Dollar General-Augusta,GA",210 S Belair Rd,Augusta,GA,30907-9301,(706) 863-3955,weekly,TRUE,1,4,,,,,, +-82.011242,33.497197,"Dollar General-Augusta,GA",2344 Washington Rd,Augusta,GA,30904-3162,(706) 667-8028,weekly,TRUE,1,4,,,,,, +-82.018253,33.44306,"Dollar General-Augusta,GA",2549 Deans Bridge Rd,Augusta,GA,30906,(706) 733-2778,weekly,TRUE,1,4,,,,,, +-82.026068,33.41111,"Dollar General-Augusta,GA",3120 Peach Orchard Rd,Augusta,GA,30906-3564,(706) 796-7151,weekly,TRUE,1,4,,,,,, +-82.053443,33.46999,"Dollar General-Augusta,GA",3134 Wrightsboro Rd,Augusta,GA,30909-0316,(706) 736-7556,weekly,TRUE,1,4,,,,,, +-82.067501,33.420422,"Dollar General-Augusta,GA",3250 Deans Bridge Rd,Augusta,GA,30906-4218,(706) 790-7052,weekly,TRUE,1,4,,,,,, +-84.0027161,34.8469162,"Dollar General-Blairsville,GA",36 Kiutuestia Creek Rd,Blairsville,GA,30512-4315,(706) 487-8036,monthly,TRUE,1,,dates,"10,20",,,, +-84.092959,34.87718,"Dollar General-Blairsville,GA",42 Copperhead Rd,Blairsville,GA,30512-3459,(706) 745-9826,monthly,TRUE,1,,dates,"10,20",,,, +-83.971603,34.87569,"Dollar General-Blairsville,GA",513 F Murphy Highway Po Box 1205,Blairsville,GA,30512-3168,(706) 781-1826,monthly,TRUE,1,,dates,"10,20",,,, +-83.895961,34.800221,"Dollar General-Blairsville,GA",5267 Gainesville Hwy,Blairsville,GA,30512,(706) 835-2019,monthly,TRUE,1,,dates,"10,20",,,, +-84.0587845,34.9629669,"Dollar General-Blairsville,GA",93 Ivy Log Road [Po Box 1205],Blairsville,GA,30512,(706) 781-1826,monthly,TRUE,1,,dates,"10,20",,,, +-84.003179,34.9342,"Dollar General-Blairsville,GA",93 Ivyl0G Rd,Blairsville,GA,30512-1456,(706) 745-6573,monthly,TRUE,1,,dates,"10,20",,,, +-81.4573856,31.2271699,"Dollar General-Brunswick,GA",20 Higginbotham Rd,Brunswick,GA,31525,(912) 217-5762,weekly,TRUE,1,2,,,,,, +-81.5388412,31.2375393,"Dollar General-Brunswick,GA",25 Cornerstone Lane Llc,Brunswick,GA,31523-4224,(912) 262-1144,weekly,TRUE,1,2,,,,,, +-81.481348,31.160203,"Dollar General-Brunswick,GA",2701 J St,Brunswick,GA,31520-6131,(912) 265-2230,weekly,TRUE,1,2,,,,,, +-81.4983945,31.1689599,"Dollar General-Brunswick,GA",2915 Norwich St,Brunswick,GA,31520,(912) 267-1515,weekly,TRUE,1,2,,,,,, +-81.507184,31.24678,"Dollar General-Brunswick,GA",315 Venture Dr,Brunswick,GA,31525-9723,(912) 267-9453,weekly,TRUE,1,2,,,,,, +-81.584796,31.140119,"Dollar General-Brunswick,GA",375 Palisade Dr,Brunswick,GA,31523-8207,(912) 267-6066,weekly,TRUE,1,2,,,,,, +-81.5117506,31.2098448,"Dollar General-Brunswick,GA",4440 New Jessup Highway,Brunswick,GA,31520,(912) 289-3100,weekly,TRUE,1,2,,,,,, +-81.4811741,31.2109566,"Dollar General-Brunswick,GA",5598 Altama Ave,Brunswick,GA,31525,(912) 265-8200,weekly,TRUE,1,2,,,,,, +-84.922393,34.475714,"Dollar General-Calhoun,GA",1284 Curtis Pkwy,Calhoun,GA,30701-3919,(706) 629-4642,monthly,TRUE,1,,dates,"10,25",,,, +-84.937986,34.52703,"Dollar General-Calhoun,GA",200 Williams St Se,Calhoun,GA,30701-4690,(706) 629-0604,monthly,TRUE,1,,dates,"10,25",,,, +-85.1095477,34.4381583,"Dollar General-Calhoun,GA",3168 New Rosedale Road Ne,Calhoun,GA,30701,(706) 403-4454,monthly,TRUE,1,,dates,"10,25",,,, +-84.959057,34.500505,"Dollar General-Calhoun,GA",634 Oothcalooga St,Calhoun,GA,30701-2342,(706) 625-2565,monthly,TRUE,1,,dates,"10,25",,,, +-84.84304,34.448327,"Dollar General-Calhoun,GA",6935 Fairmount Hwy Se,Calhoun,GA,30701-4022,(706) 625-9005,monthly,TRUE,1,,dates,"10,25",,,, +-84.945,34.517022,"Dollar General-Calhoun,GA",920 N Wall St,Calhoun,GA,30701-1734,(706) 624-0480,monthly,TRUE,1,,dates,"10,25",,,, +-84.844327,34.538892,"Dollar General-Calhoun,GA",926 Hunts Gin Rd Ne,Calhoun,GA,30701-9500,(706) 629-4466,monthly,TRUE,1,,dates,"10,25",,,, +-85.079294,33.594451,"Dollar General-Carrollton,GA",1003 N Park St,Carrollton,GA,30117-2226,(770) 836-0173,weekly,TRUE,1,1,,,,,, +-85.0980625,33.5876291,"Dollar General-Carrollton,GA",1078 Alabama Street,Carrollton,GA,30117-2004,(678) 321-0996,weekly,TRUE,1,1,,,,,, +-85.0664493,33.5802195,"Dollar General-Carrollton,GA",111 Newnan Rd,Carrollton,GA,30117,(678) 321-7904,weekly,TRUE,1,1,,,,,, +-85.02674,33.602355,"Dollar General-Carrollton,GA",1515 Bankhead Hwy,Carrollton,GA,30117-1852,(770) 838-7966,weekly,TRUE,1,1,,,,,, +-85.073878,33.54757,"Dollar General-Carrollton,GA",1561 S Highway 27,Carrollton,GA,30117-8927,(770) 836-1617,weekly,TRUE,1,1,,,,,, +-84.971382,33.644236,"Dollar General-Carrollton,GA",3960 Carrollton Villa Rica Hw,Carrollton,GA,30116-5539,(770) 836-0447,weekly,TRUE,1,1,,,,,, +-85.1792523,33.62736,"Dollar General-Carrollton,GA",4043 Mt Zion Rd,Carrollton,GA,30117,(770) 836-3994,weekly,TRUE,1,1,,,,,, +-85.084267,33.574885,"Dollar General-Carrollton,GA",827 Maple St,Carrollton,GA,30117-3625,(678) 796-1988,weekly,TRUE,1,1,,,,,, +-84.788869,34.174803,"Dollar General-Cartersville,GA",104 Market Sq,Cartersville,GA,30120-2854,(770) 386-5700,monthly,TRUE,1,,dates,"10,15",,,, +-84.856562,34.229306,"Dollar General-Cartersville,GA",1316 Cassville Rd Nw,Cartersville,GA,30120-4870,(770) 387-2252,monthly,TRUE,1,,dates,"10,15",,,, +-84.815537,34.180915,"Dollar General-Cartersville,GA",265 Cassville Rd,Cartersville,GA,30120-2541,(770) 607-7572,monthly,TRUE,1,,dates,"10,15",,,, +-84.8287882,34.1484093,"Dollar General-Cartersville,GA",4 Walnut Grove Rd,Cartersville,GA,30120,none listed,monthly,TRUE,1,,dates,"10,15",,,, +-84.79039,34.197127,"Dollar General-Cartersville,GA",916 Joe Frank Harris Pkwy,Cartersville,GA,30120-9024,(770) 607-5429,monthly,TRUE,1,,dates,"10,15",,,, +-84.780569,34.728812,"Dollar General-Chatsworth,GA",100 Smyrna Ramhurst Rd E,Chatsworth,GA,30705-6785,(706) 517-4115,weekly,TRUE,1,1,,,,,, +-84.774968,34.754789,"Dollar General-Chatsworth,GA",169 Blackwell Rd,Chatsworth,GA,30705-3057,(706) 695-8836,weekly,TRUE,1,1,,,,,, +-84.811447,34.782748,"Dollar General-Chatsworth,GA",2180 Highway 76,Chatsworth,GA,30705-7301,(706) 695-1951,weekly,TRUE,1,1,,,,,, +-84.7672272,34.7450981,"Dollar General-Chatsworth,GA",2676 Springplace Smyrna Rd,Chatsworth,GA,30705,(706) 517-1508,weekly,TRUE,1,1,,,,,, +-84.9590836,32.4481583,"Dollar General-Columbus,GA",2301 Cusseta Road,Columbus,GA,31903,(706) 405-2007,monthly,TRUE,1,,dates,"8,18",,,, +-84.9825363,32.4875717,"Dollar General-Columbus,GA",2500 Hamilton Road,Columbus,GA,31904,(706) 405-3371,monthly,TRUE,1,,dates,"8,18",,,, +-84.955451,32.506638,"Dollar General-Columbus,GA",2602 Manchester Expy,Columbus,GA,31904-5207,(706) 653-5191,monthly,TRUE,1,,dates,"8,18",,,, +-84.944655,32.418716,"Dollar General-Columbus,GA",3649 Victory Dr,Columbus,GA,31903-4553,(706) 687-0044,monthly,TRUE,1,,dates,"8,18",,,, +-84.931542,32.489446,"Dollar General-Columbus,GA",3729 Macon Rd,Columbus,GA,31907-2203,(706) 561-7299,monthly,TRUE,1,,dates,"8,18",,,, +-84.931065,32.446473,"Dollar General-Columbus,GA",3846 Saint Marys Rd Unit Sc 09,Columbus,GA,31906-4550,(706) 682-5409,monthly,TRUE,1,,dates,"8,18",,,, +-84.92526,32.539764,"Dollar General-Columbus,GA",3885 Millder Rd Ste B,Columbus,GA,31909-4778,(706) 569-6216,monthly,TRUE,1,,dates,"8,18",,,, +-84.982563,32.511217,"Dollar General-Columbus,GA",4900 River Rd,Columbus,GA,31904-5837,(706) 321-0027,monthly,TRUE,1,,dates,"8,18",,,, +-84.906241,32.534826,"Dollar General-Columbus,GA",5120 Warm Springs Rd,Columbus,GA,31909-6902,(706) 565-9028,monthly,TRUE,1,,dates,"8,18",,,, +-84.8880157,32.5132904,"Dollar General-Columbus,GA",6001 Crystal Drive,Columbus,GA,31907,(706) 405-2733,monthly,TRUE,1,,dates,"8,18",,,, +-84.954835,32.539127,"Dollar General-Columbus,GA",6499 Veterans Pkwy Ste C,Columbus,GA,31909-6209,(706) 653-1664,monthly,TRUE,1,,dates,"8,18",,,, +-84.892584,32.463628,"Dollar General-Columbus,GA",915 Amber Dr Ste A,Columbus,GA,31907-7387,(706) 569-8505,monthly,TRUE,1,,dates,"8,18",,,, +-83.849263,33.557473,"Dollar General-Covington,GA",10734 Highway 36,Covington,GA,30014-4067,(678) 342-4545,weekly,TRUE,1,5,,,,,, +-83.850241,33.423792,"Dollar General-Covington,GA",15797 Highway 36,Covington,GA,30014-6021,(770) 786-7861,weekly,TRUE,1,5,,,,,, +-83.920444,33.556856,"Dollar General-Covington,GA",2481 Highway 81 S,Covington,GA,30014-8605,(678) 342-9917,weekly,TRUE,1,5,,,,,, +-83.972719,33.603844,"Dollar General-Covington,GA",3227 Salem Rd,Covington,GA,30016,(770)761-8939,weekly,TRUE,1,5,,,,,, +-84.017267,33.549715,"Dollar General-Covington,GA",5321 Highway 20 S,Covington,GA,30016-4409,(770) 788-8880,weekly,TRUE,1,5,,,,,, +-83.87428,33.605354,"Dollar General-Covington,GA",6185 Highway 278 Nw,Covington,GA,30014-2127,(770) 786-6214,weekly,TRUE,1,5,,,,,, +-83.840165,33.601267,"Dollar General-Covington,GA",7118 Highway 278 Ne,Covington,GA,30014-2669,(770) 788-9583,weekly,TRUE,1,5,,,,,, +-84.797862,33.910747,"Dollar General-Dallas,GA",1293 Merchants Dr,Dallas,GA,30132-5036,(770) 505-4322,monthly,TRUE,1,,dates,9,,,, +-84.84048,33.878005,"Dollar General-Dallas,GA",2388 Villa Rica Hwy,Dallas,GA,30157-7063,(678) 363-7398,monthly,TRUE,1,,dates,9,,,, +-84.835947,34.044408,"Dollar General-Dallas,GA",24 Williams Rd,Dallas,GA,30132,(678) 809-6050,monthly,TRUE,1,,dates,9,,,, +-84.99071,33.923925,"Dollar General-Dallas,GA",2425 Gold Mine Rd,Dallas,GA,30157-1248,(770) 505-9703,monthly,TRUE,1,,dates,9,,,, +-84.785013,33.955907,"Dollar General-Dallas,GA",263 E Paulding Dr,Dallas,GA,30157-2701,(770) 445-6165,monthly,TRUE,1,,dates,9,,,, +-84.854602,33.920083,"Dollar General-Dallas,GA",640 W Memorial Dr,Dallas,GA,30132-4123,(678) 363-0343,monthly,TRUE,1,,dates,9,,,, +-84.944432,34.801111,"Dollar General-Dalton,GA",1004 Riverburch Pkwy,Dalton,GA,30721-8630,(706) 270-5774,weekly,TRUE,1,3,,,,,, +-84.968489,34.761384,"Dollar General-Dalton,GA",101 W Walnut Ave Ste 1,Dalton,GA,30720-8426,(706) 275-9039,weekly,TRUE,1,3,,,,,, +-84.986631,34.693036,"Dollar General-Dalton,GA",113 Phelps Rd Se,Dalton,GA,30720-7613,(706) 277-0749,weekly,TRUE,1,3,,,,,, +-84.887341,34.81625,"Dollar General-Dalton,GA",1214 Dawnville Rd Ne,Dalton,GA,30721-6805,(706) 217-3080,weekly,TRUE,1,3,,,,,, +-84.9989624,34.7394104,"Dollar General-Dalton,GA",1902 Dug Gap Road,Dalton,GA,30720,(706) 229-4150,weekly,TRUE,1,3,,,,,, +-84.953755,34.768442,"Dollar General-Dalton,GA",2308 E Morris St,Dalton,GA,30721,(706) 278-0086,weekly,TRUE,1,3,,,,,, +-84.945129,34.822623,"Dollar General-Dalton,GA",2524 Cleveland Hwy,Dalton,GA,30721-8157,(706) 370-4981,weekly,TRUE,1,3,,,,,, +-84.9176002,34.7562227,"Dollar General-Dalton,GA",3417 Airport Road,Dalton,GA,30721-6102,(706) 508-4457,weekly,TRUE,1,3,,,,,, +-84.965037,34.778182,"Dollar General-Dalton,GA",511 N Glenwood Ave,Dalton,GA,30721-2814,(706) 278-7940,weekly,TRUE,1,3,,,,,, +-82.849904,31.508905,"Dollar General-Douglas,GA",1201 Hwy 221,Douglas,GA,31533-6852,(912) 383-9963,weekly,TRUE,1,3,,,,,, +-82.851045,31.480967,"Dollar General-Douglas,GA",1730 Peterson Ave S,Douglas,GA,31535-5008,(912) 384-9506,weekly,TRUE,1,3,,,,,, +-82.885419,31.518125,"Dollar General-Douglas,GA",2489 Hwy 32 W,Douglas,GA,31533-9082,(912) 383-0582,weekly,TRUE,1,3,,,,,, +-82.8878693,31.4388498,"Dollar General-Douglas,GA",4074 Willacooche Highway,Douglas,GA,31535,(none listed),weekly,TRUE,1,3,,,,,, +-82.850406,31.503005,"Dollar General-Douglas,GA",518 Peterson Ave S,Douglas,GA,31533-5254,(912) 384-2999,weekly,TRUE,1,3,,,,,, +-84.698168,33.74858,"Dollar General-Douglasville,GA",2190 Midway Rd,Douglasville,GA,30135-1055,(770) 942-5580,weekly,TRUE,1,3,,,,,, +-84.701161,33.692777,"Dollar General-Douglasville,GA",4061 Anneewakee Rd,Douglasville,GA,30135-4307,(770) 949-6140,weekly,TRUE,1,3,,,,,, +-84.804988,33.673461,"Dollar General-Douglasville,GA",4870 Highway 5,Douglasville,GA,30135-4536,(770) 489-6634,weekly,TRUE,1,3,,,,,, +-84.772593,33.704014,"Dollar General-Douglasville,GA",6040 Central Church Rd,Douglasville,GA,30135-6901,(770) 489-9687,weekly,TRUE,1,3,,,,,, +-84.733443,33.758839,"Dollar General-Douglasville,GA",6134 E Broad St,Douglasville,GA,30134-2372,(770) 920-7666,weekly,TRUE,1,3,,,,,, +-84.78141,33.759052,"Dollar General-Douglasville,GA",6307 Cedar Mountain Road,Douglasville,GA,30134-3504,(678) 324-9563,weekly,TRUE,1,3,,,,,, +-84.8507186,33.6194857,"Dollar General-Douglasville,GA",8427 Hwy 166,Douglasville,GA,30135,(678) 383-9320,weekly,TRUE,1,3,,,,,, +-91.731796,41.969243,"Dollar General-Cedar Rapids,IA",151 Jacolyn Dr Nw,Cedar Rapids,IA,52405-5529,(319) 390-1164,monthly,TRUE,1,,dates,"7,17",,,, +-91.632728,42.034179,"Dollar General-Cedar Rapids,IA",266 Blairs Ferry Rd Ne,Cedar Rapids,IA,52402-3161,(319) 373-7040,monthly,TRUE,1,,dates,"7,17",,,, +-91.707131,41.962916,"Dollar General-Cedar Rapids,IA",2741 16Th Ave Sw,Cedar Rapids,IA,52404-1633,(319) 398-9402,monthly,TRUE,1,,dates,"7,17",,,, +-91.61771,41.976696,"Dollar General-Cedar Rapids,IA",3451 Mount Vernon Rd Se,Cedar Rapids,IA,52403-3736,(319) 364-6099,monthly,TRUE,1,,dates,"7,17",,,, +-91.715804,41.97593,"Dollar General-Cedar Rapids,IA",403 Edgewood Rd Nw,Cedar Rapids,IA,52405-3651,(319) 390-1050,monthly,TRUE,1,,dates,"7,17",,,, +-90.541609,41.5721,"Dollar General-Davenport,IA",109 E 50Th St,Davenport,IA,52806-3958,(563) 386-4112,weekly,TRUE,1,4,,,,,, +-90.545886,41.557084,"Dollar General-Davenport,IA",2170 E Kimberly Rd Ste 350,Davenport,IA,52807-2230,(563) 344-0792,weekly,TRUE,1,4,,,,,, +-90.609761,41.515693,"Dollar General-Davenport,IA",2217 Rockingham Rd,Davenport,IA,52802-2809,(563) 323-8255,weekly,TRUE,1,4,,,,,, +-90.615221,41.53837,"Dollar General-Davenport,IA",2604 W Locust St,Davenport,IA,52804-3347,(563) 391-0747,weekly,TRUE,1,4,,,,,, +-90.610616,41.56079,"Dollar General-Davenport,IA",3936 N Pine St,Davenport,IA,52806-4944,(563) 391-2153,weekly,TRUE,1,4,,,,,, +-90.569476,41.538134,"Dollar General-Davenport,IA",403 E Locust St,Davenport,IA,52803-4328,(563) 322-4025,weekly,TRUE,1,4,,,,,, +-93.60169,41.526492,"Dollar General-Des Moines,IA",1020 E Army Post Rd,Des Moines,IA,50315-5939,(515) 256-7168,monthly,TRUE,1,,dates,8,,,, +-93.599932,41.625982,"Dollar General-Des Moines,IA",1428 E Ovid Ave,Des Moines,IA,50316-1323,(515) 263-7910,monthly,TRUE,1,,dates,8,,,, +-93.703204,41.57606,"Dollar General-Des Moines,IA",221 Sw 63Rd St,Des Moines,IA,50312-1501,(515) 255-8070,monthly,TRUE,1,,dates,8,,,, +-93.568996,41.610513,"Dollar General-Des Moines,IA",2570 Hubbell Ave,Des Moines,IA,50317-6102,(515) 265-8141,monthly,TRUE,1,,dates,8,,,, +-93.652564,41.58547,"Dollar General-Des Moines,IA",2650 Ingersoll Ave,Des Moines,IA,50312-5238,(515) 283-9084,monthly,TRUE,1,,dates,8,,,, +-93.697759,41.623633,"Dollar General-Des Moines,IA",3102 Merle Hay Rd,Des Moines,IA,50310,(515) 278-3005,monthly,TRUE,1,,dates,8,,,, +-93.64955,41.624158,"Dollar General-Des Moines,IA",3220 Martin Luther King Jr,Des Moines,IA,50310,(515) 422-9038,monthly,TRUE,1,,dates,8,,,, +-93.596637,41.555004,"Dollar General-Des Moines,IA",3223 Se 14Th St Ste C,Des Moines,IA,50320-1331,(515) 282-7307,monthly,TRUE,1,,dates,8,,,, +-93.644794,41.546034,"Dollar General-Des Moines,IA",4213 Fleur Dr,Des Moines,IA,50321-2325,(515) 953-0203,monthly,TRUE,1,,dates,8,,,, +-87.641226,41.664372,"Dollar General-Chicago,IL",12635 S Halsted St,Chicago,IL,60628-7012,(773) 568-7194,weekly,TRUE,1,4,,,,,, +-87.673869,41.750052,"Dollar General-Chicago,IL",2019 W 79Th Street,Chicago,IL,60620,(773) 994-5614,weekly,TRUE,1,4,,,,,, +-87.559917,41.75179,"Dollar General-Chicago,IL",2649 E 79Th St,Chicago,IL,60649-5227,(773) 356-6388,weekly,TRUE,1,4,,,,,, +-87.6313782,41.7073402,"Dollar General-Chicago,IL",316 W 103rd Street,Chicago,IL,60628-2504,(773) 796-3865,weekly,TRUE,1,4,,,,,, +-87.714531,41.917188,"Dollar General-Chicago,IL",3527 W Armitage Ave,Chicago,IL,60647-3602,(773) 489-1103,weekly,TRUE,1,4,,,,,, +-87.726188,41.866287,"Dollar General-Chicago,IL",4046 W Roosevelt Rd,Chicago,IL,60624-3937,(773) 826-0382,weekly,TRUE,1,4,,,,,, +-87.7615014,41.9094676,"Dollar General-Chicago,IL",5434 W N Ave,Chicago,IL,60639-4347,(773) 796-5109,weekly,TRUE,1,4,,,,,, +-87.613488,41.823867,"Dollar General-Chicago,IL",549 E Pershing Rd,Chicago,IL,60653-1915,(773) 924-3785,weekly,TRUE,1,4,,,,,, +-87.695905,41.983716,"Dollar General-Chicago,IL",5627 N Lincoln Ave,Chicago,IL,60659,(773) 989-6805,weekly,TRUE,1,4,,,,,, +-87.769033,41.938531,"Dollar General-Chicago,IL",5701 W Belmont Ave,Chicago,IL,60634,(773) 622-5846,weekly,TRUE,1,4,,,,,, +-87.703148,41.780102,"Dollar General-Chicago,IL",6225 S Kedzie Ave,Chicago,IL,60629,(706) 624-6584,weekly,TRUE,1,4,,,,,, +-87.683413,41.772187,"Dollar General-Chicago,IL",6647 S Western Ave,Chicago,IL,60636-2412,(309) 582-5338,weekly,TRUE,1,4,,,,,, +-87.653228,41.744743,"Dollar General-Chicago,IL",8201 S Racine Ave,Chicago,IL,60620-3117,(773) 966-2551,weekly,TRUE,1,4,,,,,, +-87.6628,41.725834,"Dollar General-Chicago,IL",9244 S Ashland Ave,Chicago,IL,60620-5050,(773) 546-9202,weekly,TRUE,1,4,,,,,, +-88.98033,39.848958,"Dollar General-Decatur,IL",1467 King Ave,Decatur,IL,62522-1444,(217) 429-1099,monthly,TRUE,1,,dates,8,,,, +-88.9807874,39.8214148,"Dollar General-Decatur,IL",1736 S Taylorville Road,Decatur,IL,62521,(217) 615-0156,monthly,TRUE,1,,dates,8,,,, +-88.956349,39.822043,"Dollar General-Decatur,IL",250 W 1St Dr,Decatur,IL,62521-5206,(217) 423-9308,monthly,TRUE,1,,dates,8,,,, +-88.950307,39.875549,"Dollar General-Decatur,IL",2922 N Martin Luther King Jr D,Decatur,IL,62526-2428,(217) 875-5310,monthly,TRUE,1,,dates,8,,,, +-88.894819,39.824754,"Dollar General-Decatur,IL",3797 E Rte 36,Decatur,IL,62521-5085,(217) 428-6653,monthly,TRUE,1,,dates,8,,,, +-88.9443348,39.846018,"Dollar General-Decatur,IL",969 E Eldorado Street,Decatur,IL,62521-1913,(217) 615-2969,monthly,TRUE,1,,dates,8,,,, +-88.97023,39.876188,"Dollar General-Decatur,IL",985 W Pershing Rd Unit 3A,Decatur,IL,62526-1573,(217) 877-7506,monthly,TRUE,1,,dates,8,,,, +-85.664373,40.061674,"Dollar General-Anderson,IN",1211 E 53Rd St,Anderson,IN,46013-2817,(765) 641-0147,weekly,TRUE,1,2,,,,,, +-85.69574,40.076105,"Dollar General-Anderson,IN",1315 W 38Th St,Anderson,IN,46013-1007,(765) 643-0514,weekly,TRUE,1,2,,,,,, +-85.711009,40.097352,"Dollar General-Anderson,IN",1812 Raible Ave,Anderson,IN,46011-4136,(765) 643-0091,weekly,TRUE,1,2,,,,,, +-85.653008,40.11185,"Dollar General-Anderson,IN",415 S Scatterfield Rd,Anderson,IN,46012-3602,(765) 642-6805,weekly,TRUE,1,2,,,,,, +-85.900644,39.196211,"Dollar General-Columbus,IN",2150 State St,Columbus,IN,47201-7306,(812) 378-9641,weekly,TRUE,1,2,,,,,, +-85.894859,39.22505,"Dollar General-Columbus,IN",2550 Eastbrook Plaza,Columbus,IN,47201-3738,(812) 372-3440,weekly,TRUE,1,2,,,,,, +-85.877107,39.2236,"Dollar General-Columbus,IN",3880 25Th St,Columbus,IN,47203-3005,(812) 376-8781,weekly,TRUE,1,2,,,,,, +-85.969884,39.199978,"Dollar General-Columbus,IN",4130 W Jonathan Moore Pike,Columbus,IN,47201-8667,(812) 342-2575,weekly,TRUE,1,2,,,,,, +-85.954212,39.293203,"Dollar General-Columbus,IN",9620 N Us Highway 31,Columbus,IN,47201-8538,(812) 526-5737,weekly,TRUE,1,2,,,,,, +-86.4428095,37.01177,"Dollar General-Bowling Green,KY",1464 Ky 185,Bowling Green,KY,42101-7619,(270) 842-4546,monthly,TRUE,1,,dates,8,,,, +-86.447797,36.980276,"Dollar General-Bowling Green,KY",1554 Us 31W Byp,Bowling Green,KY,42101-3070,(270) 781-9787,monthly,TRUE,1,,dates,8,,,, +-86.390328,37.008783,"Dollar General Market-Bowling Green,KY",180 River Place Ave,Bowling Green,KY,42101-7128,(270) 842-0701,monthly,TRUE,1,,dates,8,,,, +-86.425718,36.945307,"Dollar General-Bowling Green,KY",1950 Cave Mill Rd,Bowling Green,KY,42104-6337,(270) 843-3427,monthly,TRUE,1,,dates,8,,,, +-86.487599,36.963086,"Dollar General-Bowling Green,KY",2556 Russellville Rd,Bowling Green,KY,42101-5216,(270) 846-4413,monthly,TRUE,1,,dates,8,,,, +-86.471769,36.957443,"Dollar General-Bowling Green,KY",2619 Nashville Rd,Bowling Green,KY,42101-4027,(270) 842-5952,monthly,TRUE,1,,dates,8,,,, +-86.438591,36.9970588,"Dollar General-Bowling Green,KY",325 E 6th Avenue,Bowling Green,KY,42101,(270) 282-2216,monthly,TRUE,1,,dates,8,,,, +-86.409357,36.922477,"Dollar General-Bowling Green,KY",5388 Scottsville Rd,Bowling Green,KY,42104-7911,(270) 796-2866,monthly,TRUE,1,,dates,8,,,, +-86.474931,36.988544,"Dollar General-Bowling Green,KY",901 Morgantown Rd,Bowling Green,KY,42101,(270) 793-0069,monthly,TRUE,1,,dates,8,,,, +-85.328033,37.332473,"Dollar General-Campbellsville,KY",1102 Elkhorn Rd,Campbellsville,KY,42718-1160,(270) 469-4938,weekly,TRUE,1,1,,,,,, +-85.331022,37.352301,"Dollar General-Campbellsville,KY",1325 E Broadway St,Campbellsville,KY,42718-1599,(270) 465-3020,weekly,TRUE,1,1,,,,,, +-85.364136,37.29021,"Dollar General-Campbellsville,KY",3400 New Columbia Road,Campbellsville,KY,42718,(270) 572-4081,weekly,TRUE,1,1,,,,,, +-85.360322,37.338264,"Dollar General-Campbellsville,KY",732 West Broadway,Campbellsville,KY,42718-1595,(270) 789-0538,weekly,TRUE,1,1,,,,,, +-84.131298,36.974822,"Dollar General-Corbin,KY",1242 Highway 770,Corbin,KY,40701-4767,(606) 258-0330,weekly,TRUE,1,1,,,,,, +-84.067113,36.9554,"Dollar General-Corbin,KY",14397 N Us Highway 25E,Corbin,KY,40701,(606) 523-0341,weekly,TRUE,1,1,,,,,, +-84.101499,36.93037,"Dollar General-Corbin,KY",1512 18Th Street,Corbin,KY,40701-2723,(606) 526-0399,weekly,TRUE,1,1,,,,,, +-84.0880737,36.9073982,"Dollar General-Corbin,KY",2055 US Hwy 26,Corbin,KY,40701,(606) 620-9591,weekly,TRUE,1,1,,,,,, +-84.154536,36.908427,"Dollar General-Corbin,KY",4005 Cumberland Falls Hwy,Corbin,KY,40701-8617,(606) 258-9970,weekly,TRUE,1,1,,,,,, +-92.141327,29.956805,"Dollar General-Abbeville,LA",1912 S State St,Abbeville,LA,70510-8226,(337) 893-4359,weekly,TRUE,1,1,,,,,, +-92.115609,29.972378,"Dollar General-Abbeville,LA",2030 Charity St,Abbeville,LA,70510-5411,(337) 893-0493,weekly,TRUE,1,1,,,,,, +-92.144558,29.953308,"Dollar General-Abbeville,LA",2718 Rodeo Rd,Abbeville,LA,70510-4083,(337) 898-0100,weekly,TRUE,1,1,,,,,, +-92.139354,29.982118,"Dollar General-Abbeville,LA",519 Park Ave,Abbeville,LA,70510-3503,(337) 898-1157,weekly,TRUE,1,1,,,,,, +-92.450441,31.301834,"Dollar General-Alexandria,LA",1616 Bringhurst Street,Alexandria,LA,71301,(318) 709-9670,monthly,TRUE,1,,dates,"7,17,27",,,, +-92.472534,31.279282,"Dollar General-Alexandria,LA",1800 Macarthur Dr Ste A,Alexandria,LA,71301-3760,(318) 561-2932,monthly,TRUE,1,,dates,"7,17,27",,,, +-92.474117,31.320918,"Dollar General-Alexandria,LA",2108 N Bolton Ave,Alexandria,LA,71303-4405,(318) 487-1198,monthly,TRUE,1,,dates,"7,17,27",,,, +-92.438684,31.290513,"Dollar General-Alexandria,LA",2314 Broadway Ave,Alexandria,LA,71302-4825,(318) 442-2863,monthly,TRUE,1,,dates,"7,17,27",,,, +-92.480171,31.297952,"Dollar General-Alexandria,LA",305 Macarthur Dr,Alexandria,LA,71303-3106,(318) 442-0089,monthly,TRUE,1,,dates,"7,17,27",,,, +-92.449714,31.261257,"Dollar General-Alexandria,LA",5101 Horseshoe Dr,Alexandria,LA,71302-2720,(318) 445-2302,monthly,TRUE,1,,dates,"7,17,27",,,, +-92.527458,31.29611,"Dollar General-Alexandria,LA",7518A Coliseum Blvd,Alexandria,LA,71303-9752,(318) 443-6113,monthly,TRUE,1,,dates,"7,17,27",,,, +-91.053699,30.549429,"Dollar General-Baton Rouge,LA",11215 Joor Rd,Baton Rouge,LA,70818-3410,(225) 262-4406,weekly,TRUE,1,3,,,,,, +-91.066445,30.365442,"Dollar General-Baton Rouge,LA",13738 Perkins Rd,Baton Rouge,LA,70810-3433,(225) 753-2340,weekly,TRUE,1,3,,,,,, +-91.021789,30.408385,"Dollar General-Baton Rouge,LA",13965 Coursey Blvd,Baton Rouge,LA,70817-1310,(225) 755-3907,weekly,TRUE,1,3,,,,,, +-91.020809,30.391544,"Dollar General-Baton Rouge,LA",14660 Tiger Bend Rd,Baton Rouge,LA,70817-4613,(225) 753-4454,weekly,TRUE,1,3,,,,,, +-91.014863,30.456943,"Dollar General-Baton Rouge,LA",15363 Old Hammond Hwy,Baton Rouge,LA,70816-1250,(225) 275-3004,weekly,TRUE,1,3,,,,,, +-91.065884,30.436507,"Dollar General-Baton Rouge,LA",1777 Sharp Rd,Baton Rouge,LA,70815-4857,(225) 274-8985,weekly,TRUE,1,3,,,,,, +-91.111477,30.391458,"Dollar General-Baton Rouge,LA",1871B Staring Ln,Baton Rouge,LA,70810-1031,(225) 761-4163,weekly,TRUE,1,3,,,,,, +-91.051124,30.458791,"Dollar General-Baton Rouge,LA",191 Little John Dr,Baton Rouge,LA,70815-6123,(225) 272-2978,weekly,TRUE,1,3,,,,,, +-91.165273,30.465205,"Dollar General-Baton Rouge,LA",1931 Plank Rd,Baton Rouge,LA,70802-2942,(225) 358-4495,weekly,TRUE,1,3,,,,,, +-91.005683,30.361148,"Dollar General-Baton Rouge,LA",20321 Highland Rd,Baton Rouge,LA,70817-7346,(225) 751-4436,weekly,TRUE,1,3,,,,,, +-91.150632,30.470343,"Dollar General-Baton Rouge,LA",3939 Choctaw Dr,Baton Rouge,LA,70805,(225) 356-0039,weekly,TRUE,1,3,,,,,, +-91.1579492,30.4860856,"Dollar General-Baton Rouge,LA",4017 Plank Road,Baton Rouge,LA,70809,(225) 228-0923,weekly,TRUE,1,3,,,,,, +-91.1428919,30.4875507,"Dollar General-Baton Rouge,LA",4755 Prescott Road,Baton Rouge,LA,70809-5252,(225) 228-0999,weekly,TRUE,1,3,,,,,, +-91.144178,30.523743,"Dollar General-Baton Rouge,LA",4770 Hooper Rd,Baton Rouge,LA,70811,(225) 355-3532,weekly,TRUE,1,3,,,,,, +-91.136011,30.506717,"Dollar General-Baton Rouge,LA",5455 Airline Hwy,Baton Rouge,LA,70805-1712,(225) 356-0896,weekly,TRUE,1,3,,,,,, +-91.13173,30.444669,"Dollar General-Baton Rouge,LA",5652 Government St,Baton Rouge,LA,70806-6034,(225) 926-0018,weekly,TRUE,1,3,,,,,, +-91.151736,30.504065,"Dollar General-Baton Rouge,LA",5953 Plank Rd,Baton Rouge,LA,70805-1323,(225) 355-9830,weekly,TRUE,1,3,,,,,, +-91.170758,30.506037,"Dollar General-Baton Rouge,LA",6315 Scenic Hwy,Baton Rouge,LA,70805,(225) 308-2192,weekly,TRUE,1,3,,,,,, +-91.1190572,30.4738507,"Dollar General-Baton Rouge,LA",7055 Greenwell Springs Rd,Baton Rouge,LA,70805-7441,(225) 532-2522,weekly,TRUE,1,3,,,,,, +-91.093702,30.442552,"Dollar General-Baton Rouge,LA",8656 Goodwood Blvd,Baton Rouge,LA,70806-7912,(225) 923-2235,weekly,TRUE,1,3,,,,,, +-91.085014,30.485034,"Dollar General-Baton Rouge,LA",9355 Greenwell Springs Rd,Baton Rouge,LA,70814,(225) 928-3648,weekly,TRUE,1,3,,,,,, +-91.123735,30.360223,"Dollar General-Baton Rouge,LA",9401 Burbank Dr,Baton Rouge,LA,70810-6177,(225) 768-7478,weekly,TRUE,1,3,,,,,, +-89.851994,30.732197,"Dollar General-Bogalusa,LA",14287 Highway 21 S,Bogalusa,LA,70427-8025,(985) 732-2306,monthly,TRUE,1,,dates,7,,,, +-89.876439,30.76721,"Dollar General-Bogalusa,LA",1620 Ave F,Bogalusa,LA,70427,(985) 205-3185,monthly,TRUE,1,,dates,7,,,, +-89.864901,30.789768,"Dollar General-Bogalusa,LA",303 Shenandoah St,Bogalusa,LA,70427-3137,(985) 735-1571,monthly,TRUE,1,,dates,7,,,, +-89.851476,30.7768652,"Dollar General-Bogalusa,LA",435 Sullivan Drive,Bogalusa,LA,70427,(985) 205-3184,monthly,TRUE,1,,dates,7,,,, +-93.672108,32.541726,"Dollar General-Bossier City,LA",1310 Swan Lake Rd,Bossier City,LA,71111-2655,(318) 549-3838,weekly,TRUE,1,1,,,,,, +-93.716496,32.518298,"Dollar General-Bossier City,LA",202 Benton Rd,Bossier City,LA,71111-4702,(318) 741-9195,weekly,TRUE,1,1,,,,,, +-93.63804,32.562365,"Dollar General-Bossier City,LA",2100 Stockwell Rd,Bossier City,LA,71111-5754,(318) 742-8771,weekly,TRUE,1,1,,,,,, +-93.704491,32.508581,"Dollar General-Bossier City,LA",2314 Barksdale Blvd,Bossier City,LA,71112-3202,(318) 742-8945,weekly,TRUE,1,1,,,,,, +-93.667778,32.467187,"Dollar General-Bossier City,LA",4612 Barksdale Blvd,Bossier City,LA,71112-4504,(318) 752-4452,weekly,TRUE,1,1,,,,,, +-93.71432,32.621797,"Dollar General-Bossier City,LA",5497 Airline Dr,Bossier City,LA,71111-6803,(318) 742-8757,weekly,TRUE,1,1,,,,,, +-91.828357,30.313916,"Dollar General-Breaux Bridge,LA",1053B Henderson Hwy,Breaux Bridge,LA,70517-7728,(337) 228-1157,weekly,TRUE,1,1,,,,,, +-91.8416,30.33849,"Dollar General-Breaux Bridge,LA",2310 Cecilia Sr High School H,Breaux Bridge,LA,70517,(337) 667-6462,weekly,TRUE,1,1,,,,,, +-91.898421,30.278021,"Dollar General-Breaux Bridge,LA",254 Rees St,Breaux Bridge,LA,70517-4612,(337) 507-3574,weekly,TRUE,1,1,,,,,, +-91.88053,30.235555,"Dollar General-Breaux Bridge,LA",4649 Main Hwy,Breaux Bridge,LA,70517,(337) 332-1352,weekly,TRUE,1,1,,,,,, +-91.894943,30.269581,"Dollar General-Breaux Bridge,LA",625 S Main St,Breaux Bridge,LA,70517-5219,(337) 332-1562,weekly,TRUE,1,1,,,,,, +-90.106319,30.478654,"Dollar General-Covington,LA",100 Tyler S/C,Covington,LA,70433-3060,(985) 871-0299,monthly,TRUE,1,,dates,7,,,, +-90.085778,30.476569,"Dollar General-Covington,LA",1000 Business 190 Ste 28,Covington,LA,70433-3285,(985) 892-2013,monthly,TRUE,1,,dates,7,,,, +-90.105708,30.497583,"Dollar General-Covington,LA",1823 N Columbia St,Covington,LA,70433-5648,(985) 893-0046,monthly,TRUE,1,,dates,7,,,, +-90.075533,30.5709567,"Dollar General Market-Covington,LA",78258 Hwy 437,Covington,LA,70435,(985) 635-4146,monthly,TRUE,1,,dates,7,,,, +-90.943336,30.501008,"Dollar General-Denham Springs,LA",1190 Hatchell Ln,Denham Springs,LA,70726-2625,(225) 667-6643,weekly,TRUE,1,4,,,,,, +-90.956312,30.459106,"Dollar General-Denham Springs,LA",2330 S Range Ave Ste A,Denham Springs,LA,70726-5216,(225) 667-6322,weekly,TRUE,1,4,,,,,, +-90.941971,30.439653,"Dollar General-Denham Springs,LA",25600 La Highway 16,Denham Springs,LA,70726-5700,(225) 664-7690,weekly,TRUE,1,4,,,,,, +-90.862149,30.45405,"Dollar General-Denham Springs,LA",25815 Walker Road S,Denham Springs,LA,70726-6518,(225) 667-4244,weekly,TRUE,1,4,,,,,, +-90.915473,30.455323,"Dollar General-Denham Springs,LA",26713 Juban Road,Denham Springs,LA,70726,(225) 372-7548,weekly,TRUE,1,4,,,,,, +-90.955751,30.559939,"Dollar General-Denham Springs,LA",33835 La Highway 16,Denham Springs,LA,70706-0969,(225) 664-8994,weekly,TRUE,1,4,,,,,, +-90.9128737,30.6410985,"Dollar General-Denham Springs,LA",39578 Hwy 16,Denham Springs,LA,70706-0204,(225) 304-6872,weekly,TRUE,1,4,,,,,, +-90.972572,30.464707,"Dollar General-Denham Springs,LA",8583 Florida Blvd [Us Hwy 190],Denham Springs,LA,70726,(225) 667-9495,weekly,TRUE,1,4,,,,,, +-76.634379,39.303152,"Dollar General-Baltimore,MD",1620 Pennsylvania Ave,Baltimore,MD,21217-3115,(410) 383-0567,monthly,TRUE,1,,dates,"10,14,15,16",,,, +-76.643997,39.250853,"Dollar General-Baltimore,MD",2115 W Patapsco Ave,Baltimore,MD,21230-2946,(410) 646-3247,monthly,TRUE,1,,dates,"10,14,15,16",,,, +-76.56681,39.36807,"Dollar General-Baltimore,MD",2311 N Northern Pkwy,Baltimore,MD,21214-1139,(410) 444-5745,monthly,TRUE,1,,dates,"10,14,15,16",,,, +-76.577967,39.317686,"Dollar General-Baltimore,MD",2401 Belair Rd Ste 116,Baltimore,MD,21213,(410) 537-5176,monthly,TRUE,1,,dates,"10,14,15,16",,,, +-76.6087875,39.3186188,"Dollar General-Baltimore,MD",2511 Greenmount Ave,Baltimore,MD,21217-4732,(443) 842-5699,monthly,TRUE,1,,dates,"10,14,15,16",,,, +-76.691617,39.293638,"Dollar General-Baltimore,MD",4500 Edmondson Ave,Baltimore,MD,21229-1506,(410) 566-0109,monthly,TRUE,1,,dates,"10,14,15,16",,,, +-76.558274,39.333686,"Dollar General-Baltimore,MD",4810 Belair Rd,Baltimore,MD,21206-5730,(410) 325-1740,monthly,TRUE,1,,dates,"10,14,15,16",,,, +-76.716638,39.29101,"Dollar General-Baltimore,MD",5405 Baltimore National Pike,Baltimore,MD,21229-2102,(410) 869-1406,monthly,TRUE,1,,dates,"10,14,15,16",,,, +-76.626654,39.283129,"Dollar General-Baltimore,MD",717 Washington Blvd,Baltimore,MD,21230,(410) 347-5230,monthly,TRUE,1,,dates,"10,14,15,16",,,, +-76.546033,39.370133,"Dollar General-Baltimore,MD",7350 Harford Rd,Baltimore,MD,21234,(410) 779-9312,monthly,TRUE,1,,dates,"10,14,15,16",,,, +-76.740459,39.347288,"Dollar General-Baltimore,MD",7405 Liberty Rd,Baltimore,MD,21207-3812,(410) 265-6395,monthly,TRUE,1,,dates,"10,14,15,16",,,, +-85.099115,42.306028,"Dollar General-Battle Creek,MI",1525 Michigan Ave,Battle Creek,MI,49017-1947,(269) 963-3981,weekly,TRUE,1,4,,,,,, +-85.228358,42.297264,"Dollar General-Battle Creek,MI",1791 W Columbia Ave,Battle Creek,MI,49015-2856,(269) 565-2538,weekly,TRUE,1,4,,,,,, +-85.182902,42.339184,"Dollar General-Battle Creek,MI",240 E Roosevelt,Battle Creek,MI,49037-2817,(269) 969-0634,weekly,TRUE,1,4,,,,,, +-85.14407,42.309784,"Dollar General-Battle Creek,MI",2420 E Columbia Ave,Battle Creek,MI,49014-6379,(269) 968-5991,weekly,TRUE,1,4,,,,,, +-85.157769,42.330442,"Dollar General-Battle Creek,MI",535 E Emmett St,Battle Creek,MI,49017-5682,(269) 962-0407,weekly,TRUE,1,4,,,,,, +-85.19956,42.306324,"Dollar General-Battle Creek,MI",588 Southwest Capital Ave,Battle Creek,MI,49015,(269) 962-1312,weekly,TRUE,1,4,,,,,, +-82.9743209,42.3651796,"Dollar General-Detroit,MI",10920 E Jefferson Ave,Detroit,MI,48214-3211,(313) 486-2805,monthly,TRUE,1,,dates,10,,,, +-82.965055,42.421802,"Dollar General-Detroit,MI",12421 Hayes St,Detroit,MI,48205-4118,(313) 486-0648,monthly,TRUE,1,,dates,10,,,, +-83.166726,42.379777,"Dollar General-Detroit,MI",12555 W Grand River Ave #900,Detroit,MI,48204-1867,(313) 931-0265,monthly,TRUE,1,,dates,10,,,, +-82.988217,42.434867,"Dollar General-Detroit,MI",13341 E 7 Mile Rd,Detroit,MI,48205,(313) 483-7743,monthly,TRUE,1,,dates,10,,,, +-83.190032,42.416164,"Dollar General-Detroit,MI",14611 W Mcnichols Rd,Detroit,MI,48235,(313) 327-1282,monthly,TRUE,1,,dates,10,,,, +-83.032176,42.338264,"Dollar General-Detroit,MI",1559 E Lafayette St,Detroit,MI,48207-2958,(313) 656-2291,monthly,TRUE,1,,dates,10,,,, +-83.21788,42.357544,"Dollar General-Detroit,MI",18209 Joy Rd,Detroit,MI,48228-3126,(313) 486-1976,monthly,TRUE,1,,dates,10,,,, +-83.224179,42.401049,"Dollar General-Detroit,MI",18604 Fenkell Street,Detroit,MI,48223,(313) 493-1043,monthly,TRUE,1,,dates,10,,,, +-83.024576,42.44433,"Dollar General-Detroit,MI",20164 Van Dyke,Detroit,MI,48234,(313) 312-8694,monthly,TRUE,1,,dates,10,,,, +-83.12583,42.391615,"Dollar General-Detroit,MI",3000 W Davison,Detroit,MI,48238,(313) 312-8959,monthly,TRUE,1,,dates,10,,,, +-83.061369,42.415544,"Dollar General-Detroit,MI",3812 E Davison St,Detroit,MI,48212-1702,(313) 366-0627,monthly,TRUE,1,,dates,10,,,, +-83.177025,42.358856,"Dollar General-Detroit,MI",8800 Schaefer Hwy,Detroit,MI,48228-2516,(313) 406-8853,monthly,TRUE,1,,dates,10,,,, +-83.082736,42.384382,"Dollar General-Detroit,MI",9350 Woodward,Detroit,MI,48202,(313) 872-6258,monthly,TRUE,1,,dates,10,,,, +-88.992036,30.473032,"Dollar General-Biloxi,MS",13025 Lorraine Rd,Biloxi,MS,39532-9574,(662) 728-0300,weekly,TRUE,1,1,,,,,, +-88.908816,30.49581,"Dollar General-Biloxi,MS",14495 Lamey Bridge Rd,Biloxi,MS,39532-8957,(228) 396-2765,weekly,TRUE,1,1,,,,,, +-88.957782,30.402707,"Dollar General-Biloxi,MS",2040 Pass Rd,Biloxi,MS,39531,(228) 385-2256,weekly,TRUE,1,1,,,,,, +-88.933782,30.444051,"Dollar General-Biloxi,MS",920 Cedar Lake Rd Ste D,Biloxi,MS,39532-2107,(601) 919-3530,weekly,TRUE,1,1,,,,,, +-89.995699,32.297801,"Dollar General-Brandon,MS",1042 Highway 471,Brandon,MS,39042-8629,(601) 833-8845,monthly,TRUE,1,,dates,10,,,, +-90.039852,32.381827,"Dollar General-Brandon,MS",1905 Spillway Rd,Brandon,MS,39047-8232,(601) 835-1104,monthly,TRUE,1,,dates,10,,,, +-89.985245,32.272957,"Dollar General-Brandon,MS",208 E Government St,Brandon,MS,39042-3152,(601) 855-0073,monthly,TRUE,1,,dates,10,,,, +-89.95971,32.244583,"Dollar General-Brandon,MS",3267 Hwy 18,Brandon,MS,39042,(601) 724-8868,monthly,TRUE,1,,dates,10,,,, +-89.95229,32.399607,"Dollar General-Brandon,MS",643 Holly Bush Rd,Brandon,MS,39047-8801,(601) 605-4432,monthly,TRUE,1,,dates,10,,,, +-90.031362,32.225061,"Dollar General-Brandon,MS",769 Highway 468,Brandon,MS,39042-7314,(601) 407-2555,monthly,TRUE,1,,dates,10,,,, +-90.444339,31.580546,"Dollar General-Brookhaven,MS",125 N Jackson St,Brookhaven,MS,39601-3037,(601) 799-4090,weekly,TRUE,1,2,,,,,, +-90.454819,31.574132,"Dollar General-Brookhaven,MS",1662 Caleb Dr Se,Brookhaven,MS,39601,(601) 833-2937,weekly,TRUE,1,2,,,,,, +-90.456979,31.583416,"Dollar General-Brookhaven,MS",211 Highway 51 N,Brookhaven,MS,39601-2653,(662) 624-5791,weekly,TRUE,1,2,,,,,, +-90.501194,31.534762,"Dollar General-Brookhaven,MS",345 hwy 84 West,Brookhaven,MS,39601,(601) 265-3016,weekly,TRUE,1,2,,,,,, +-90.502311,31.60866,"Dollar General-Brookhaven,MS",975 Highway 550 Nw,Brookhaven,MS,39601,(601) 833-1368,weekly,TRUE,1,2,,,,,, +-88.388996,33.481315,"Dollar General-Columbus,MS",1032 Highway 69 S,Columbus,MS,39702,(662) 368-2398,monthly,TRUE,1,,dates,"10,19,18,22",,,, +-88.418256,33.496611,"Dollar General-Columbus,MS",1311 Main St,Columbus,MS,39701-4965,(662) 287-8796,monthly,TRUE,1,,dates,"10,19,18,22",,,, +-88.434446,33.514736,"Dollar General-Columbus,MS",1731 Highway 45 N,Columbus,MS,39705-2117,(662) 241-4499,monthly,TRUE,1,,dates,"10,19,18,22",,,, +-88.384063,33.495879,"Dollar General-Columbus,MS",212 Alabama St,Columbus,MS,39702-5204,(662) 286-9676,monthly,TRUE,1,,dates,"10,19,18,22",,,, +-88.409281,33.52088,"Dollar General-Columbus,MS",2219 Military Rd,Columbus,MS,39705,(662) 368-8127,monthly,TRUE,1,,dates,"10,19,18,22",,,, +-88.437206,33.542241,"Dollar General-Columbus,MS",3277 Highway 45 N,Columbus,MS,39705-1634,(662) 286-8424,monthly,TRUE,1,,dates,"10,19,18,22",,,, +-88.338185,33.492863,"Dollar General-Columbus,MS",5302 Hwy 182 E,Columbus,MS,39702-8225,(662) 243-7071,monthly,TRUE,1,,dates,"10,19,18,22",,,, +-88.324144,33.443001,"Dollar General-Columbus,MS",60 Center St,Columbus,MS,39702-8573,(662) 287-4060,monthly,TRUE,1,,dates,"10,19,18,22",,,, +-88.4227786,33.6026582,"Dollar General-Columbus,MS",7624 Hwy 45 N,Columbus,MS,39705-3353,(662) 570-1535,monthly,TRUE,1,,dates,"10,19,18,22",,,, +-88.3662611,33.519955,"Dollar General-Columbus,MS",801 Tuscaloosa Rd,Columbus,MS,39702-1616,(662) 327-5711,monthly,TRUE,1,,dates,"10,19,18,22",,,, +-88.499106,34.94546,"Dollar General-Corinth,MS",2035 E Shiloh Rd,Corinth,MS,38834-3726,(228) 392-6522,weekly,TRUE,1,4,,,,,, +-88.558752,34.930853,"Dollar General-Corinth,MS",3501 Highway 72 W,Corinth,MS,38834-8560,(601) 469-3344,weekly,TRUE,1,4,,,,,, +-88.456983,34.93069,"Dollar General-Corinth,MS",4137 Country Road 200,Corinth,MS,38834-7500,(601) 469-4785,weekly,TRUE,1,4,,,,,, +-88.519946,34.935808,"Dollar General-Corinth,MS",509 Foote St,Corinth,MS,38834-4832,(228) 497-4712,weekly,TRUE,1,4,,,,,, +-88.516706,34.923753,"Dollar General-Corinth,MS",902 S Cass St,Corinth,MS,38834-6403,(228) 497-6006,weekly,TRUE,1,4,,,,,, +-82.590591,35.58697,"Dollar General-Asheville,NC",1005 Patton Ave,Asheville,NC,28806-3622,(828) 225-4003,weekly,TRUE,1,4,,,,,, +-82.623524,35.602044,"Dollar General-Asheville,NC",347 B Leicester Hwy,Asheville,NC,28806,(828) 258-2825,weekly,TRUE,1,4,,,,,, +-82.5835224,35.6702605,"Dollar General-Asheville,NC",458 Weaverville Rd,Asheville,NC,28804-1121,(828) 398-4132,weekly,TRUE,1,4,,,,,, +-82.505268,35.569755,"Dollar General-Asheville,NC",800 Fairview Rd Ste A5,Asheville,NC,28803-1173,(828) 299-1736,weekly,TRUE,1,4,,,,,, +-82.53255,35.595027,"Dollar General-Asheville,NC",85 Tunnel Rd Ste 7,Asheville,NC,28805-1232,(828) 253-1168,weekly,TRUE,1,4,,,,,, +-79.417815,36.07833,"Dollar General-Burlington,NC",1031 S Williamson Ave,Burlington,NC,27215-9726,(336) 586-9755,monthly,TRUE,1,,dates,10,,,, +-79.431298,36.068109,"Dollar General-Burlington,NC",2091 Chapel Hill Rd,Burlington,NC,27215-7114,(336) 437-0160,monthly,TRUE,1,,dates,10,,,, +-79.401042,36.094126,"Dollar General-Burlington,NC",2125 N Church St,Burlington,NC,27217-3003,(336) 229-1360,monthly,TRUE,1,,dates,10,,,, +-79.470681,36.066438,"Dollar General-Burlington,NC",2631 Ramada Rd,Burlington,NC,27215-5469,(336) 226-0443,monthly,TRUE,1,,dates,10,,,, +-79.4437071,36.0239681,"Dollar General-Burlington,NC",4070 S Nc Hwy 49,Burlington,NC,27215,(336) 223-8150,monthly,TRUE,1,,dates,10,,,, +-79.434288,36.103663,"Dollar General-Burlington,NC",600 Rauhut Street,Burlington,NC,27217,(336) 278-1341,monthly,TRUE,1,,dates,10,,,, +-80.674971,35.209118,"Dollar General-Charlotte,NC",10018 Albemarle Rd,Charlotte,NC,28227-3402,(704) 545-5146,monthly,TRUE,1,,dates,10,,,, +-80.818483,35.212929,"Dollar General-Charlotte,NC",1949 E Seventh St,Charlotte,NC,28204-2417,(704) 347-1379,monthly,TRUE,1,,dates,10,,,, +-80.76529,35.27288,"Dollar General-Charlotte,NC",221 Heathway Dr,Charlotte,NC,28213,(704) 597-9450,monthly,TRUE,1,,dates,10,,,, +-80.9443436,35.1293449,"Dollar General-Charlotte,NC",2303 Westinghouse [Blvd #2],Charlotte,NC,28273-6515,(704) 583-5829,monthly,TRUE,1,,dates,10,,,, +-80.801926,35.300857,"Dollar General-Charlotte,NC",2804 West Sugar Creek Rd,Charlotte,NC,28262,(704) 817-2192,monthly,TRUE,1,,dates,10,,,, +-80.902487,35.32328,"Dollar General-Charlotte,NC",3708 Oakdale Road,Charlotte,NC,28216,(704) 469-5602,monthly,TRUE,1,,dates,10,,,, +-80.760344,35.201613,"Dollar General-Charlotte,NC",5200 Albemarle Rd,Charlotte,NC,28212-3605,(704) 566-3639,monthly,TRUE,1,,dates,10,,,, +-80.876184,35.150895,"Dollar General-Charlotte,NC",6217 South Blvd,Charlotte,NC,28217-4440,(704) 556-1223,monthly,TRUE,1,,dates,10,,,, +-80.837769,35.311026,"Dollar General-Charlotte,NC",6445 Old Statesville Rd,Charlotte,NC,28269,(704) 598-0493,monthly,TRUE,1,,dates,10,,,, +-80.717709,35.2554,"Dollar General-Charlotte,NC",7322 Plaza Road Ext,Charlotte,NC,28215-1924,(704) 567-9200,monthly,TRUE,1,,dates,10,,,, +-80.738133,35.161674,"Dollar General-Charlotte,NC",7411 E Independence Blvd # 31,Charlotte,NC,28227-9451,(704) 531-9442,monthly,TRUE,1,,dates,10,,,, +-80.938426,35.275473,"Dollar General-Charlotte,NC",8001-8050 Moores Chapel Road,Charlotte,NC,28214-1551,(704) 398-0713,monthly,TRUE,1,,dates,10,,,, +-80.725843,35.200505,"Dollar General-Charlotte,NC",8825 E. Wt Harris Blvd,Charlotte,NC,28227,(704) 531-0844,monthly,TRUE,1,,dates,10,,,, +-81.199348,35.702743,"Dollar General-Conover,NC",1304 Conover Blvd E,Conover,NC,28613,(828) 464-2023,weekly,TRUE,1,1,,,,,, +-81.224144,35.697303,"Dollar General-Conover,NC",428 Conover Blvd W,Conover,NC,28613-2729,(828) 465-1185,weekly,TRUE,1,1,,,,,, +-81.226563,35.717126,"Dollar General-Conover,NC",508 10Th St Nw Ste B,Conover,NC,28613-2339,(828) 466-0501,weekly,TRUE,1,1,,,,,, +-81.189322,35.812166,"Dollar General-Conover,NC",6568 N Nc 16 Hwy,Conover,NC,28613-7413,(828) 431-2070,weekly,TRUE,1,1,,,,,, +-78.834806,35.984489,"Dollar General-Durham,NC",101 Ganyard Farm Way,Durham,NC,27703,(919) 598-5300,monthly,TRUE,1,,dates,9,,,, +-78.926766,35.987148,"Dollar General-Durham,NC",2000 Chapel Hill Rd Ste 1,Durham,NC,27707-1155,(919) 493-8205,monthly,TRUE,1,,dates,9,,,, +-78.946584,36.019335,"Dollar General-Durham,NC",3427 Hillsborough Rd,Durham,NC,27705-3008,(919) 309-9199,monthly,TRUE,1,,dates,9,,,, +-78.928804,36.059582,"Dollar General-Durham,NC",3830 Guess Rd,Durham,NC,27705-1506,(919) 477-5169,monthly,TRUE,1,,dates,9,,,, +-78.978657,36.032856,"Dollar General-Durham,NC",4623 Hillsborough Rd,Durham,NC,27705-2343,(919) 382-0100,monthly,TRUE,1,,dates,9,,,, +-78.909875,36.076132,"Dollar General-Durham,NC",5279 N Roxboro Rd,Durham,NC,27712-2800,(919) 479-5869,monthly,TRUE,1,,dates,9,,,, +-78.919433,36.010139,"Dollar General-Durham,NC",800 Broad St,Durham,NC,27705-4138,(919) 416-1303,monthly,TRUE,1,,dates,9,,,, +-79.701086,36.512534,"Dollar General-Eden,NC",1200 E Stadium Dr,Eden,NC,27288-3810,(336) 635-1486,monthly,TRUE,1,,dates,9,,,, +-79.760852,36.515,"Dollar General-Eden,NC",519 Morgan Rd,Eden,NC,27288-2523,(336) 623-2737,monthly,TRUE,1,,dates,9,,,, +-79.739756,36.491655,"Dollar General-Eden,NC",640 S Van Buren Rd Unit P,Eden,NC,27288-5365,(336) 623-3780,monthly,TRUE,1,,dates,9,,,, +-79.79022,36.481086,"Dollar General-Eden,NC",7720 Nc Hwy 770 Bldg 2,Eden,NC,27288-7598,(336) 627-1034,monthly,TRUE,1,,dates,9,,,, +-106.516314,35.070327,"Dollar General-Albuquerque,NM",11816 Central Ave Se,Albuquerque,NM,87123-2952,(505) 323-3728,weekly,TRUE,1,5,,,,,, +-106.707436,35.051147,"Dollar General-Albuquerque,NM",1811 Coors Blvd Sw,Albuquerque,NM,87121,(505) 234-1948,weekly,TRUE,1,5,,,,,, +-106.637243,35.138524,"Dollar General-Albuquerque,NM",201 Montano Rd Nw,Albuquerque,NM,87107-5257,(505) 344-0514,weekly,TRUE,1,5,,,,,, +-106.577631,35.074553,"Dollar General-Albuquerque,NM",301 San Pedro Dr Se,Albuquerque,NM,87108-3089,(505) 265-0024,weekly,TRUE,1,5,,,,,, +-106.589881,35.087334,"Dollar General-Albuquerque,NM",4910 Lomas Blvd Ne Ste A,Albuquerque,NM,87110-6382,(505) 266-3885,weekly,TRUE,1,5,,,,,, +-106.694681,34.951998,"Dollar General-Albuquerque,NM",7615 Isletta Blvd. Sw,Albuquerque,NM,87105,(505) 877-1186,weekly,TRUE,1,5,,,,,, +-106.51479,35.085175,"Dollar General-Albuquerque,NM",840 East Juan Tabo,Albuquerque,NM,87123-1427,(505) 332-3216,weekly,TRUE,1,5,,,,,, +-78.838998,42.902454,"Dollar General-Buffalo,NY",1055 Genesee St,Buffalo,NY,14211-3006,(716) 895-1014,monthly,TRUE,1,,dates,9,,,, +-78.858581,42.947872,"Dollar General-Buffalo,NY",1336 Hertel Ave,Buffalo,NY,14216-2833,(716) 877-0710,monthly,TRUE,1,,dates,9,,,, +-78.862808,42.91748,"Dollar General-Buffalo,NY",1618 Main St,Buffalo,NY,14209,(716) 259-2738,monthly,TRUE,1,,dates,9,,,, +-78.878071,42.946719,"Dollar General-Buffalo,NY",1833 Elmwood Ave,Buffalo,NY,14207-2409,(716) 875-4914,monthly,TRUE,1,,dates,9,,,, +-78.80823,42.854043,"Dollar General-Buffalo,NY",2137 Seneca St,Buffalo,NY,14210,(716) 247-5324,monthly,TRUE,1,,dates,9,,,, +-78.835044,42.938976,"Dollar General-Buffalo,NY",230 Holden St,Buffalo,NY,14214-2234,(716) 833-0878,monthly,TRUE,1,,dates,9,,,, +-78.889823,42.927993,"Dollar General-Buffalo,NY",244 Forest Ave,Buffalo,NY,14213,(716) 954-8261,monthly,TRUE,1,,dates,9,,,, +-78.813561,42.938526,"Dollar General-Buffalo,NY",3079 Bailey Ave,Buffalo,NY,14215-1618,(716) 833-3127,monthly,TRUE,1,,dates,9,,,, +-78.88983,42.915169,"Dollar General-Buffalo,NY",315 W Ferry St,Buffalo,NY,14213-1911,(716) 885-1740,monthly,TRUE,1,,dates,9,,,, +-78.871013,42.970633,"Dollar General-Buffalo,NY",3170 Delaware Ave,Buffalo,NY,14217-2023,(716) 447-4305,monthly,TRUE,1,,dates,9,,,, +-78.830438,42.958142,"Dollar General-Buffalo,NY",338 Kenmore Ave,Buffalo,NY,14223-2922,(716) 837-0310,monthly,TRUE,1,,dates,9,,,, +-78.898674,42.941433,"Dollar General-Buffalo,NY",437 Tonawanda Street,Buffalo,NY,14207,(716) 259-1339,monthly,TRUE,1,,dates,9,,,, +-78.836654,42.914226,"Dollar General-Buffalo,NY",663 East Ferry Street,Buffalo,NY,14211,(716) 507-4837,monthly,TRUE,1,,dates,9,,,, +-78.904375,42.951082,"Dollar General-Buffalo,NY",827 Tonawanda St,Buffalo,NY,14207-1449,(716) 875-1248,monthly,TRUE,1,,dates,9,,,, +-78.794698,42.876703,"Dollar General-Buffalo,NY",93 S Rossler Ave,Buffalo,NY,14206-3433,(716) 822-1105,monthly,TRUE,1,,dates,9,,,, +-78.824252,42.857178,"Dollar General-Buffalo,NY",942 Mckinley Pkwy,Buffalo,NY,14220-1016,(716) 824-3687,monthly,TRUE,1,,dates,9,,,, +-81.559356,41.067803,"Dollar General-Akron,OH",1045 Vernon Odom Blvd,Akron,OH,44307-1073,(330) 252-2539,weekly,TRUE,1,1,,,,,, +-81.491517,41.034521,"Dollar General-Akron,OH",1356 S Arlington St,Akron,OH,44306-3732,(330) 724-4495,weekly,TRUE,1,1,,,,,, +-81.46625,41.10506,"Dollar General-Akron,OH",1551 Brittain Road,Akron,OH,44310-2763,(330) 630-3391,weekly,TRUE,1,1,,,,,, +-81.5516786,41.1343065,"Dollar General-Akron,OH",1736 Merriman Rd,Akron,OH,44313-5252,(330) 835-4006,weekly,TRUE,1,1,,,,,, +-81.4536928,41.0620511,"Dollar General-Akron,OH",2072 Mogadore Rd,Akron,OH,44312-1117,(330) 784-6512,weekly,TRUE,1,1,,,,,, +-81.492074,40.995959,"Dollar General-Akron,OH",2765 S Arlington Rd,Akron,OH,44312-4713,(330) 645-1346,weekly,TRUE,1,1,,,,,, +-81.554889,41.009359,"Dollar General-Akron,OH",3333 Manchester Rd,Akron,OH,44319-1434,(330) 644-5066,weekly,TRUE,1,1,,,,,, +-81.522089,40.98153,"Dollar General-Akron,OH",3849 S Main St,Akron,OH,44319-3649,(330) 645-7029,weekly,TRUE,1,1,,,,,, +-81.566186,40.959547,"Dollar General-Akron,OH",5235 Manchester Rd,Akron,OH,44319-4208,(330) 882-4049,weekly,TRUE,1,1,,,,,, +-81.511118,41.10169,"Dollar General-Akron,OH",600 N Main St,Akron,OH,44310-3114,(330) 253-2821,weekly,TRUE,1,1,,,,,, +-81.434368,41.040858,"Dollar General-Akron,OH",855 Canton Rd,Akron,OH,44312-3314,(330) 733-1054,weekly,TRUE,1,1,,,,,, +-81.554321,41.083923,"Dollar General-Akron,OH",901 Copley Rd,Akron,OH,44320-2906,(234) 200-0766,weekly,TRUE,1,1,,,,,, +-81.510099,41.054687,"Dollar General-Akron,OH",994 Brown St,Akron,OH,44311-2262,(234) 200-5132,weekly,TRUE,1,1,,,,,, +-81.42513,40.813597,"Dollar General-Canton,OH",1424 Whipple Ave Nw,Canton,OH,44708-2831,(330) 477-1031,monthly,TRUE,1,,dates,7,,,, +-81.348965,40.793349,"Dollar General-Canton,OH",2103 Tuscarawas St E,Canton,OH,44707-2864,(330) 456-9719,monthly,TRUE,1,,dates,7,,,, +-81.331919,40.873615,"Dollar General-Canton,OH",2682 Easton St Ne,Canton,OH,44721-2623,(330) 649-9127,monthly,TRUE,1,,dates,7,,,, +-81.365928,40.830293,"Dollar General-Canton,OH",2976 Market Ave N,Canton,OH,44714-1658,(330) 456-2344,monthly,TRUE,1,,dates,7,,,, +-81.388926,40.834891,"Dollar General-Canton,OH",3250 Cleveland Ave Nw,Canton,OH,44709-2868,(330) 493-9187,monthly,TRUE,1,,dates,7,,,, +-81.377439,40.756916,"Dollar General-Canton,OH",3626 Cleveland Ave Sw,Canton,OH,44707-1448,(330) 484-4124,monthly,TRUE,1,,dates,7,,,, +-81.448686,40.792133,"Dollar General-Canton,OH",5200 Tuscarawas St W,Canton,OH,44708-5055,(330) 479-9083,monthly,TRUE,1,,dates,7,,,, +-81.450003,40.853262,"Dollar General-Canton,OH",5384 Fulton Dr Nw,Canton,OH,44718-1808,(330) 244-1990,monthly,TRUE,1,,dates,7,,,, +-82.9521666,39.3377783,"Dollar General-Chillicothe,OH",1050 E Main St,Chillicothe,OH,45601-2848,(740) 772-6684,weekly,TRUE,1,3,,,,,, +-82.976228,39.364331,"Dollar General-Chillicothe,OH",1400 N Bridge St,Chillicothe,OH,45601-4101,(740) 779-9948,weekly,TRUE,1,3,,,,,, +-83.0490547,39.3497041,"Dollar General-Chillicothe,OH",19520 US Hwy 50,Chillicothe,OH,45601,(none listed),weekly,TRUE,1,3,,,,,, +-83.003137,39.337126,"Dollar General-Chillicothe,OH",609 Central Ctr,Chillicothe,OH,45601-2249,(740) 779-1372,weekly,TRUE,1,3,,,,,, +-84.464873,39.304307,"Dollar General-Cincinnati,OH",10152 Princeton Glendale Rd,Cincinnati,OH,45246-1212,(513) 874-0709,weekly,TRUE,1,3,,,,,, +-84.487014,39.12696,"Dollar General-Cincinnati,OH",1027 William Howard Taft Road,Cincinnati,OH,45206-2011,(513) 815-5408,weekly,TRUE,1,3,,,,,, +-84.563305,39.298467,"Dollar General-Cincinnati,OH",11850 Hamilton Ave,Cincinnati,OH,45231-1131,(513) 742-3482,weekly,TRUE,1,3,,,,,, +-84.522632,39.268777,"Dollar General-Cincinnati,OH",24 E Eswin St,Cincinnati,OH,45218-1405,(513) 742-2632,weekly,TRUE,1,3,,,,,, +-84.379567,39.149634,"Dollar General-Cincinnati,OH",4109 Plainville Rd,Cincinnati,OH,45227-3244,(513) 272-2671,weekly,TRUE,1,3,,,,,, +-84.607536,39.095358,"Dollar General-Cincinnati,OH",4958 Delhi Pike,Cincinnati,OH,45238-5344,(513) 451-9046,weekly,TRUE,1,3,,,,,, +-84.3011703,39.0856514,"Dollar General-Cincinnati,OH",545 Clough Pike,Cincinnati,OH,45244-2313,(513) 252-2731,weekly,TRUE,1,3,,,,,, +-84.638665,39.171107,"Dollar General-Cincinnati,OH",5700 Harrison Ave,Cincinnati,OH,45248-1602,(513) 574-8800,weekly,TRUE,1,3,,,,,, +-84.601221,39.198559,"Dollar General-Cincinnati,OH",5795 Cheviot Rd,Cincinnati,OH,45247-7079,(513) 741-3665,weekly,TRUE,1,3,,,,,, +-84.548172,39.2142029,"Dollar General-Cincinnati,OH",6600 Hamilton Avenue,Cincinnati,OH,45224,(513) 729-7516,weekly,TRUE,1,3,,,,,, +-84.325969,39.072726,"Dollar General-Cincinnati,OH",8251-c Beechmont Ave,Cincinnati,OH,45255-4210,(513) 474-3579,weekly,TRUE,1,3,,,,,, +-84.552129,39.203281,"Dollar General-Cincinnati,OH",940 W North Bend Rd,Cincinnati,OH,45224-2220,(513) 542-4520,weekly,TRUE,1,3,,,,,, +-84.5749614,39.2434779,"Dollar General-Cincinnati,OH",9517 Pippin Rd,Cincinnati,OH,45231-2221,(513) 252-2722,weekly,TRUE,1,3,,,,,, +-81.798214,41.453425,"Dollar General-Cleveland,OH",14693 Lorain Avenue,Cleveland,OH,44111-3166,(216) 252-4334,monthly,TRUE,1,,dates,"7,15",,,, +-81.570285,41.557433,"Dollar General-Cleveland,OH",15707 St Clair Ave,Cleveland,OH,44110,(216) 273-8269,monthly,TRUE,1,,dates,"7,15",,,, +-81.651821,41.496929,"Dollar General-Cleveland,OH",2272 East 55th Street,Cleveland,OH,44103,(216) 551-9125,monthly,TRUE,1,,dates,"7,15",,,, +-81.602857,41.461587,"Dollar General-Cleveland,OH",2966 East 116th St,Cleveland,OH,44104-2626,(216) 206-7219,monthly,TRUE,1,,dates,"7,15",,,, +-81.564781,41.456533,"Dollar General-Cleveland,OH",3785 Lee Road,Cleveland,OH,44128-1463,(216) 359-1786,monthly,TRUE,1,,dates,"7,15",,,, +-81.525913,41.520722,"Dollar General-Cleveland,OH",4279 Mayfield Rd.,Cleveland,OH,44121,(216) 273-8568,monthly,TRUE,1,,dates,"7,15",,,, +-81.654625,41.516853,"Dollar General-Cleveland,OH",5133 Superior Ave,Cleveland,OH,44103,(216) 539-2154,monthly,TRUE,1,,dates,"7,15",,,, +-81.641682,41.460911,"Dollar General-Cleveland,OH",6815 Broadway Ave,Cleveland,OH,44105-1311,(216) 429-2856,monthly,TRUE,1,,dates,"7,15",,,, +-81.623435,41.445227,"Dollar General-Cleveland,OH",9111 Miles Ave,Cleveland,OH,44105-6136,(216) 539-0639,monthly,TRUE,1,,dates,"7,15",,,, +-81.746417,41.47721,"Dollar General-Cleveland,OH",9200 Madison Ave,Cleveland,OH,44102-2719,(216) 551-9124,monthly,TRUE,1,,dates,"7,15",,,, +-83.144076,39.927816,"Dollar General-Columbus,OH",1130 Norton Rd,Columbus,OH,43228-3250,(614) 878-0332,monthly,TRUE,1,,dates,"7,15",,,, +-83.090244,39.929112,"Dollar General-Columbus,OH",1260 Demorest Rd,Columbus,OH,43204-7003,(614) 308-0025,monthly,TRUE,1,,dates,"7,15",,,, +-82.962176,39.957689,"Dollar General-Columbus,OH",1391 East Main Street,Columbus,OH,43205,(614) 300-5619,monthly,TRUE,1,,dates,"7,15",,,, +-83.052544,39.929263,"Dollar General-Columbus,OH",1410 Harrisburg Pike,Columbus,OH,43223-3231,(614) 274-1663,monthly,TRUE,1,,dates,"7,15",,,, +-82.9573426,39.9491141,"Dollar General-Columbus,OH",1500 E Livingston Ave,Columbus,OH,43205-2925,(614) 930-6639,monthly,TRUE,1,,dates,"7,15",,,, +-82.983881,39.930706,"Dollar General-Columbus,OH",1596 Parsons Ave,Columbus,OH,43207-1217,(614) 653-6930,monthly,TRUE,1,,dates,"7,15",,,, +-82.973766,40.087456,"Dollar General-Columbus,OH",1660 E Dublin Granville Rd,Columbus,OH,43229-3503,(614) 899-7498,monthly,TRUE,1,,dates,"7,15",,,, +-82.966208,40.059784,"Dollar General-Columbus,OH",1959 Morse Rd,Columbus,OH,43229-6663,(614) 840-0588,monthly,TRUE,1,,dates,"7,15",,,, +-82.965118,39.923891,"Dollar General-Columbus,OH",2012 Lockbourne Rd.,Columbus,OH,43207,(614) 445-0723,monthly,TRUE,1,,dates,"7,15",,,, +-83.055303,39.94701,"Dollar General-Columbus,OH",2100 Sullivant Avenue,Columbus,OH,43223,(614) 328-8406,monthly,TRUE,1,,dates,"7,15",,,, +-82.920696,39.971322,"Dollar General-Columbus,OH",3000 E Broad St,Columbus,OH,43209-1965,(614) 237-0001,monthly,TRUE,1,,dates,"7,15",,,, +-82.910929,39.91713,"Dollar General-Columbus,OH",3349 Refugee Road,Columbus,OH,43232,(614) 452-4817,monthly,TRUE,1,,dates,"7,15",,,, +-82.963191,40.035639,"Dollar General-Columbus,OH",3350 Cleveland Ave,Columbus,OH,43224-3677,(614) 447-3134,monthly,TRUE,1,,dates,"7,15",,,, +-82.967885,39.888781,"Dollar General-Columbus,OH",3636 Lockbourne Rd,Columbus,OH,43207-5131,(614) 491-8889,monthly,TRUE,1,,dates,"7,15",,,, +-83.0006,39.883394,"Dollar General-Columbus,OH",3861 S High St,Columbus,OH,43207-4013,(614) 491-8955,monthly,TRUE,1,,dates,"7,15",,,, +-82.930304,39.885221,"Dollar General-Columbus,OH",4050 Alum Creek Thimbleberry Dr,Columbus,OH,43207,(614) 491-4124,monthly,TRUE,1,,dates,"7,15",,,, +-82.883086,39.923565,"Dollar General-Columbus,OH",4245 Macsway Ave,Columbus,OH,43232-4247,(614) 367-9012,monthly,TRUE,1,,dates,"7,15",,,, +-83.130944,39.952293,"Dollar General-Columbus,OH",4868 W Broad St,Columbus,OH,43228-1602,(614) 851-1563,monthly,TRUE,1,,dates,"7,15",,,, +-83.019322,40.063026,"Dollar General-Columbus,OH",4932 N High St,Columbus,OH,43214,(614) 781-9032,monthly,TRUE,1,,dates,"7,15",,,, +-82.861687,39.915495,"Dollar General-Columbus,OH",5001 Chatterton Rd,Columbus,OH,43232-5802,(614) 837-3034,monthly,TRUE,1,,dates,"7,15",,,, +-82.950772,40.086343,"Dollar General-Columbus,OH",5680 Cleveland Ave,Columbus,OH,43231-2879,(614) 891-9127,monthly,TRUE,1,,dates,"7,15",,,, +-83.113847,39.936298,"Dollar General-Columbus,OH",745 Georgesville Rd,Columbus,OH,43228-2826,(614) 276-5665,monthly,TRUE,1,,dates,"7,15",,,, +-84.172873,39.74801,"Dollar General-Dayton,OH",1431 Wayne Ave,Dayton,OH,45410-1411,(937) 222-2971,monthly,TRUE,1,,dates,"7,15",,,, +-84.121991,39.730601,"Dollar General-Dayton,OH",1714 Woodman Dr,Dayton,OH,45420-3662,(937) 252-4839,monthly,TRUE,1,,dates,"7,15",,,, +-84.22464,39.754271,"Dollar General-Dayton,OH",1819 W 3Rd St,Dayton,OH,45417-2536,(937) 263-6125,monthly,TRUE,1,,dates,"7,15",,,, +-84.253627,39.78405,"Dollar General-Dayton,OH",2228 N Gettysburg Ave,Dayton,OH,45406,(937) 278-0759,monthly,TRUE,1,,dates,"7,15",,,, +-84.143786,39.789258,"Dollar General-Dayton,OH",2300 Valley Pike,Dayton,OH,45404-2588,(937) 503-7526,monthly,TRUE,1,,dates,"7,15",,,, +-84.210555,39.785337,"Dollar General-Dayton,OH",2312 N Main St,Dayton,OH,45405-3439,(937) 276-3229,monthly,TRUE,1,,dates,"7,15",,,, +-84.140603,39.748239,"Dollar General-Dayton,OH",2821 Linden Ave,Dayton,OH,45410,(937) 660-6361,monthly,TRUE,1,,dates,"7,15",,,, +-84.209379,39.767129,"Dollar General-Dayton,OH",445 Salem Ave,Dayton,OH,45406-5815,(937) 225-3851,monthly,TRUE,1,,dates,"7,15",,,, +-84.225477,39.81014,"Dollar General-Dayton,OH",4600 N Main St,Dayton,OH,45405-5019,(937) 274-7559,monthly,TRUE,1,,dates,"7,15",,,, +-84.2234879,39.6562195,"Dollar General-Dayton,OH",4963 Springboro Pike,Dayton,OH,45449-2842,(937) 643-3136,monthly,TRUE,1,,dates,"7,15",,,, +-84.22352,39.685145,"Dollar General-Dayton,OH",5245 N Dixie Hwy,Dayton,OH,45414-3806,(937) 277-7052,monthly,TRUE,1,,dates,"7,15",,,, +-84.108026,39.771326,"Dollar General-Dayton,OH",5520 Airway Rd,Dayton,OH,45431-1505,(937) 254-6516,monthly,TRUE,1,,dates,"7,15",,,, +-84.290561,39.746458,"Dollar General-Dayton,OH",5997 W Third Street,Dayton,OH,45427,(937) 268-2186,monthly,TRUE,1,,dates,"7,15",,,, +-84.2605743,39.8420296,"Dollar General-Dayton,OH",8126 N Main St,Dayton,OH,45415-1748,(937) 890-2528,monthly,TRUE,1,,dates,"7,15",,,, +-84.252754,39.734368,"Dollar General-Dayton,OH",888 S Gettysburg Ave,Dayton,OH,45417-3518,(937) 503-7548,monthly,TRUE,1,,dates,"7,15",,,, +-97.1227798,34.1628227,"Dollar General-Ardmore,OK",702 Lake Murray Dr,Ardmore,OK,73401-3847,(580) 319-4029,monthly,TRUE,1,,dates,"7,15",,,, +-97.123963,34.184886,"Dollar General-Ardmore,OK",1213 N Washington St,Ardmore,OK,73401-6661,(580) 226-1421,monthly,TRUE,1,,dates,"7,15",,,, +-96.989957,34.187403,"Dollar General-Ardmore,OK",5030 State Highway 199,Ardmore,OK,73401-0578,(580) 226-2094,monthly,TRUE,1,,dates,"7,15",,,, +-97.143419,34.181747,"Dollar General-Ardmore,OK",601 N Commerce St Ste A,Ardmore,OK,73401-3912,(580) 490-9905,monthly,TRUE,1,,dates,"7,15",,,, +-97.134991,34.174846,"Dollar General-Ardmore,OK",617 1/2 W Broadway St,Ardmore,OK,73401-4522,(580) 223-7149,monthly,TRUE,1,,dates,"7,15",,,, +-95.753224,36.060934,"Dollar General-Broken Arrow,OK",6401 E Kenosha Street,Broken Arrow,OK,74014-8102,(918) 505-9484,weekly,TRUE,1,5,,,,,, +-95.776851,36.060814,"Dollar General-Broken Arrow,OK",1201 E Kenosha St,Broken Arrow,OK,74012-2008,(918) 251-9223,weekly,TRUE,1,5,,,,,, +-95.812169,36.017533,"Dollar General-Broken Arrow,OK",1904 W New Orleans St,Broken Arrow,OK,74011-1427,(918) 455-8694,weekly,TRUE,1,5,,,,,, +-95.810051,35.993231,"Dollar General-Broken Arrow,OK",5000 North 37Th Street,Broken Arrow,OK,74011,(918) 355-1162,weekly,TRUE,1,5,,,,,, +-95.851211,36.07487,"Dollar General-Broken Arrow,OK",6124 S Garnett Rd,Broken Arrow,OK,74012-1217,(918) 307-8136,weekly,TRUE,1,5,,,,,, +-95.797607,36.046399,"Dollar General-Broken Arrow,OK",711 W Houston St,Broken Arrow,OK,74012-3759,(918) 251-1120,weekly,TRUE,1,5,,,,,, +-95.5967215,36.3073234,"Dollar General-Claremore,OK",1111 E Will Rogers Blvd,Claremore,OK,74017,(918) 505-7031,monthly,TRUE,1,,dates,6,,,, +-95.632794,36.314731,"Dollar General-Claremore,OK",1901 W 4th Street S,Claremore,OK,74017,(918) 379-9888,monthly,TRUE,1,,dates,6,,,, +-95.640749,36.278407,"Dollar General-Claremore,OK",26083 S Dollar Dr,Claremore,OK,74019,(918) 266-9886,monthly,TRUE,1,,dates,6,,,, +-95.60866,36.323649,"Dollar General-Claremore,OK",1620 N Lynn Riggs Blvd,Claremore,OK,74017-3054,(918) 342-0863,monthly,TRUE,1,,dates,6,,,, +-95.531023,36.423591,"Dollar General-Claremore,OK",16413 E 410 Rd,Claremore,OK,74017-0446,(918) 283-2588,monthly,TRUE,1,,dates,6,,,, +-95.628812,36.292822,"Dollar General-Claremore,OK",1685 W Country Club Rd,Claremore,OK,74017-5541,(918) 343-0414,monthly,TRUE,1,,dates,6,,,, +-75.4981783,40.6058744,"Dollar General-Allentown,PA",1741 West Tilgham St,Allentown,PA,18104,(484) 602-2705,weekly,TRUE,1,4,,,,,, +-75.430174,40.641139,"Dollar General-Allentown,PA",1866 Catasauqua Rd,Allentown,PA,18109-3128,(610) 231-0436,weekly,TRUE,1,4,,,,,, +-75.424527,40.625672,"Dollar General-Allentown,PA",2106 Union Blvd,Allentown,PA,18109-1634,(610) 435-9740,weekly,TRUE,1,4,,,,,, +-75.4789301,40.5613317,"Dollar General-Allentown,PA",2306 28th St Sw,Allentown,PA,18103,(484) 619-2913,weekly,TRUE,1,4,,,,,, +-80.2869996,40.790688,"Dollar General-Beaver Falls,PA",105 Concord Church Road,Beaver Falls,PA,15010,(724) 359-0652,monthly,TRUE,1,,dates,7,,,, +-80.374069,40.773155,"Dollar General-Beaver Falls,PA",2580 Constitution Blvd,Beaver Falls,PA,15010-1294,(724) 846-8233,monthly,TRUE,1,,dates,7,,,, +-80.336937,40.786057,"Dollar General-Beaver Falls,PA",4801 4Th Ave,Beaver Falls,PA,15010-3308,(724) 846-4074,monthly,TRUE,1,,dates,7,,,, +-80.329046,40.738781,"Dollar General-Beaver Falls,PA",618 7Th Ave,Beaver Falls,PA,15010-4626,(724) 843-1591,monthly,TRUE,1,,dates,7,,,, +-79.89507,40.861377,"Dollar General-Butler,PA",119 N Main St,Butler,PA,16001-4902,(724) 282-1794,weekly,TRUE,1,1,,,,,, +-79.913351,40.902372,"Dollar General-Butler,PA",1627 N Main Street,Butler,PA,16001-1543,(724) 282-0453,weekly,TRUE,1,1,,,,,, +-79.918849,40.843588,"Dollar General-Butler,PA",230 Greater Butler Mart,Butler,PA,16001-3283,(724) 214-1035,weekly,TRUE,1,1,,,,,, +-79.942388,40.876718,"Dollar General-Butler,PA",295 Butler Cmns,Butler,PA,16001-2485,(724) 284-3718,weekly,TRUE,1,1,,,,,, +-79.929837,40.781703,"Dollar General-Butler,PA",379 Pittsburgh Rd,Butler,PA,16002-3962,(724) 256-4401,weekly,TRUE,1,1,,,,,, +-81.705045,33.556157,"Dollar General-Aiken,SC",1110 Richland Ave E,Aiken,SC,29801-4761,(803) 502-0087,weekly,TRUE,1,1,,,,,, +-81.70256,33.578268,"Dollar General-Aiken,SC",1151 York St Ne,Aiken,SC,29801-4119,(803) 641-9682,weekly,TRUE,1,1,,,,,, +-81.725081,33.594376,"Dollar General-Aiken,SC",1307 Edgefield Hwy,Aiken,SC,29801,(803) 643-4824,weekly,TRUE,1,1,,,,,, +-81.724329,33.532518,"Dollar General-Aiken,SC",1553 Whiskey Rd,Aiken,SC,29803-5311,(803) 643-3421,weekly,TRUE,1,1,,,,,, +-81.741492,33.565417,"Dollar General-Aiken,SC",1652 Richland Ave W,Aiken,SC,29801-3236,(803) 642-5146,weekly,TRUE,1,1,,,,,, +-81.632517,33.650747,"Dollar General-Aiken,SC",7011 Harvey Ct,Aiken,SC,29805-9331,(803) 642-1213,weekly,TRUE,1,1,,,,,, +-82.695678,34.529002,"Dollar General-Anderson,SC",1475 Pearman Dairy Rd Ste B,Anderson,SC,29625-2081,(864) 964-9036,monthly,TRUE,1,,dates,10,,,, +-82.65441,34.516188,"Dollar General-Anderson,SC",1525 N Main St,Anderson,SC,29621-4734,(864) 224-3224,monthly,TRUE,1,,dates,10,,,, +-82.649377,34.47658,"Dollar General-Anderson,SC",2835 S Main St,Anderson,SC,29624-3741,(864) 225-0094,monthly,TRUE,1,,dates,10,,,, +-82.6709,34.547051,"Dollar General-Anderson,SC",3420 Clemson Blvd,Anderson,SC,29621-1324,(864) 261-8405,monthly,TRUE,1,,dates,10,,,, +-82.602899,34.482155,"Dollar General-Anderson,SC",3502 E River St,Anderson,SC,29621-7336,(864) 224-2341,monthly,TRUE,1,,dates,10,,,, +-82.761732,34.511479,"Dollar General-Anderson,SC",4435 Highway 24,Anderson,SC,29626-5216,(864) 225-0035,monthly,TRUE,1,,dates,10,,,, +-79.948975,32.727801,"Dollar General-Charleston,SC",1238 Camp Rd Ste B,Charleston,SC,29412-9206,(843) 406-0182,weekly,TRUE,1,3,,,,,, +-79.992811,32.818222,"Dollar General-Charleston,SC",1722 Old Towne Rd,Charleston,SC,29407-5035,(843) 556-5477,weekly,TRUE,1,3,,,,,, +-79.977003,32.762582,"Dollar General-Charleston,SC",1739 Maybank Hwy #2,Charleston,SC,29412-2103,(843) 795-8409,weekly,TRUE,1,3,,,,,, +-80.037448,32.823372,"Dollar General-Charleston,SC",2346 Ashley River Rd,Charleston,SC,29414-4752,(843) 763-9476,weekly,TRUE,1,3,,,,,, +-79.995557,32.87241,"Dollar General-Charleston,SC",4741 Rivers Ave,Charleston,SC,29405-6645,(843) 480-0370,weekly,TRUE,1,3,,,,,, +-80.944107,34.113622,"Dollar General-Columbia,SC",103 William Hardin Rd,Columbia,SC,29223-7818,(803) 419-0507,monthly,TRUE,1,,dates,9,,,, +-81.087686,34.032049,"Dollar General-Columbia,SC",1563B Broad River Rd,Columbia,SC,29210-7301,(803) 731-5175,monthly,TRUE,1,,dates,9,,,, +-81.107699,34.05373,"Dollar General-Columbia,SC",1601 Shivers Rd,Columbia,SC,29210-5443,(803) 798-5310,monthly,TRUE,1,,dates,9,,,, +-81.192515,34.082567,"Dollar General-Columbia,SC",1630 Lake Murray Blvd,Columbia,SC,29212-8623,(803) 781-1665,monthly,TRUE,1,,dates,9,,,, +-81.027419,34.009115,"Dollar General-Columbia,SC",1720 Taylor St,Columbia,SC,29201-3453,(803) 254-4557,monthly,TRUE,1,,dates,9,,,, +-80.999766,33.961071,"Dollar General-Columbia,SC",1905 Bluff Rd,Columbia,SC,29201,(803) 988-0297,monthly,TRUE,1,,dates,9,,,, +-81.021221,34.018166,"Dollar General-Columbia,SC",2101 Oak St # 13,Columbia,SC,29204-1193,(803) 931-0031,monthly,TRUE,1,,dates,9,,,, +-80.947553,34.054788,"Dollar General-Columbia,SC",2324 Decker Blvd,Columbia,SC,29206-2322,(803) 788-5375,monthly,TRUE,1,,dates,9,,,, +-80.902721,33.982715,"Dollar General-Columbia,SC",2900 Leesburg Rd,Columbia,SC,29209-3242,(803) 783-6242,monthly,TRUE,1,,dates,9,,,, +-80.981404,34.031835,"Dollar General-Columbia,SC",3724 Covenant Rd,Columbia,SC,29204-4218,(803) 782-0708,monthly,TRUE,1,,dates,9,,,, +-81.008592,34.036807,"Dollar General-Columbia,SC",4015 W Beltline Blvd,Columbia,SC,29204-1506,(803) 765-0622,monthly,TRUE,1,,dates,9,,,, +-81.128711,34.045452,"Dollar General-Columbia,SC",536 Saint Andrews Rd,Columbia,SC,29210-4516,(803) 772-3697,monthly,TRUE,1,,dates,9,,,, +-81.013997,34.056589,"Dollar General-Columbia,SC",5807 N Main St,Columbia,SC,29203-6224,(803) 754-0126,monthly,TRUE,1,,dates,9,,,, +-80.979984,33.992056,"Dollar General-Columbia,SC",619 Beltline Blvd,Columbia,SC,29209-3628,(803) 790-0108,monthly,TRUE,1,,dates,9,,,, +-80.973262,34.056341,"Dollar General-Columbia,SC",6246 Two Notch Rd,Columbia,SC,29223,(803) 714-7859,monthly,TRUE,1,,dates,9,,,, +-81.045047,34.061722,"Dollar General-Columbia,SC",6322 Monticello Rd,Columbia,SC,29203-2538,(803) 714-3203,monthly,TRUE,1,,dates,9,,,, +-80.957171,33.975807,"Dollar General-Columbia,SC",6870 Garners Ferry Rd,Columbia,SC,29209-1609,(803) 695-5577,monthly,TRUE,1,,dates,9,,,, +-80.9955628,34.0879677,"Dollar General-Columbia,SC",7925 Wilson Blvd,Columbia,SC,29203,(803) 470-5328,monthly,TRUE,1,,dates,9,,,, +-80.923129,34.095194,"Dollar General-Columbia,SC",9221 Two Notch Rd,Columbia,SC,29223-6428,(803) 699-9129,monthly,TRUE,1,,dates,9,,,, +-80.929267,34.160973,"Dollar General-Columbia,SC",931 Longtown Rd,Columbia,SC,29229-9420,(803) 865-8119,monthly,TRUE,1,,dates,9,,,, +-79.054453,33.832963,"Dollar General-Conway,SC",1500 4Th Ave,Conway,SC,29526-5032,(843) 381-0838,weekly,TRUE,1,5,,,,,, +-79.063593,33.846093,"Dollar General-Conway,SC",1610 Church St Ste V,Conway,SC,29526-2932,(843) 248-8946,weekly,TRUE,1,5,,,,,, +-79.020165,33.761107,"Dollar General-Conway,SC",2069 Hwy 544,Conway,SC,29526-9202,(843) 347-4408,weekly,TRUE,1,5,,,,,, +-78.989188,33.864493,"Dollar General-Conway,SC",2140 Highway 905,Conway,SC,29526-6845,(843) 369-0086,weekly,TRUE,1,5,,,,,, +-79.052602,33.869149,"Dollar General-Conway,SC",2609 Main Street,Conway,SC,29526,(843) 488-1664,weekly,TRUE,1,5,,,,,, +-78.961818,33.823139,"Dollar General-Conway,SC",2899 Lees Landing Cir,Conway,SC,29526-7917,(843) 347-9372,weekly,TRUE,1,5,,,,,, +-79.118602,33.837968,"Dollar General-Conway,SC",3220 Hwy 378,Conway,SC,29527,(843) 279-0357,weekly,TRUE,1,5,,,,,, +-79.077808,33.805908,"Dollar General-Conway,SC",3546 Highway 701 S,Conway,SC,29527-6043,(843) 397-0663,weekly,TRUE,1,5,,,,,, +-79.131358,33.899326,"Dollar General-Conway,SC",4657 W Highway 501,Conway,SC,29526-4462,(843) 365-0208,weekly,TRUE,1,5,,,,,, +-79.037727,33.927101,"Dollar General-Conway,SC",4745 Highway 701 N,Conway,SC,29526-5750,(843) 365-9329,weekly,TRUE,1,5,,,,,, +-78.844861,33.904947,"Dollar General-Conway,SC",7130 Highway 905,Conway,SC,29526-6232,(843) 369-0335,weekly,TRUE,1,5,,,,,, +-79.896697,34.224388,"Dollar General-Darlington,SC",2245 Timmonsville Hwy,Darlington,SC,29532-7513,(843) 395-8034,monthly,TRUE,1,,dates,9,,,, +-79.8944081,34.4034109,"Dollar General-Darlington,SC",3530 N Governor Williams Hwy,Darlington,SC,29540,(843) 968-0014,monthly,TRUE,1,,dates,9,,,, +-79.877577,34.299492,"Dollar General-Darlington,SC",504 Pearl St,Darlington,SC,29532-3817,(843) 393-3840,monthly,TRUE,1,,dates,9,,,, +-79.893785,34.288892,"Dollar General-Darlington,SC",904 Lamar Hwy,Darlington,SC,29532-4929,(843) 639-5105,monthly,TRUE,1,,dates,9,,,, +-79.861602,34.283376,"Dollar General-Darlington,SC",941 S Governor Williams Hwy,Darlington,SC,29532-5667,(843) 393-5085,monthly,TRUE,1,,dates,9,,,, +-82.576695,34.829944,"Dollar General-Easley,SC",1520 E Main St,Easley,SC,29640-3758,(864) 859-1666,weekly,TRUE,1,3,,,,,, +-82.5536641,34.9394082,"Dollar General-Easley,SC",2800 Earls Bridge Rd,Easley,SC,29640-9568,(864) 810-4107,weekly,TRUE,1,3,,,,,, +-82.601872,34.807283,"Dollar General-Easley,SC",311 Pelzer Hwy,Easley,SC,29642-1668,(864) 442-0106,weekly,TRUE,1,3,,,,,, +-82.56487,34.758998,"Dollar General-Easley,SC",3309 Pelzer Hwy,Easley,SC,29642-8373,(864) 306-8003,weekly,TRUE,1,3,,,,,, +-82.538007,34.89117,"Dollar General-Easley,SC",3711 Farrs Bridge Rd,Easley,SC,29640-9323,(864) 294-0706,weekly,TRUE,1,3,,,,,, +-82.612588,34.829283,"Dollar General-Easley,SC",504 West Main St,Easley,SC,29640,(864) 810-6822,weekly,TRUE,1,3,,,,,, +-86.684674,36.070438,"Dollar General-Antioch,TN",1801 Antioch Pike,Antioch,TN,37013-3311,(615) 833-3820,monthly,TRUE,1,,dates,9,,,, +-86.59668,36.059375,"Dollar General-Antioch,TN",2214 Hobson Pike,Antioch,TN,37013-1107,(615) 641-6098,monthly,TRUE,1,,dates,9,,,, +-86.632012,36.068254,"Dollar General-Antioch,TN",2724 Murfreesboro Pike,Antioch,TN,37013-2004,(615) 361-6700,monthly,TRUE,1,,dates,9,,,, +-86.7024765,36.012291,"Dollar General-Antioch,TN",6412 Nolensville Pike,Antioch,TN,37013-4605,(615) 208-5147,monthly,TRUE,1,,dates,9,,,, +-85.365269,35.023321,"Dollar General-Chattanooga,TN",151 Browns Ferry Rd,Chattanooga,TN,37419,(423) 821-8426,weekly,TRUE,1,2,,,,,, +-85.273035,35.035144,"Dollar General-Chattanooga,TN",2010 Mccallie Ave,Chattanooga,TN,37404-3139,(423) 624-6800,weekly,TRUE,1,2,,,,,, +-85.276983,35.017036,"Dollar General-Chattanooga,TN",2303 E 23Rd St,Chattanooga,TN,37407-1110,(423) 622-5544,weekly,TRUE,1,2,,,,,, +-85.249662,35.07312,"Dollar General-Chattanooga,TN",3101 Dodson Ave,Chattanooga,TN,37406,(423) 208-9167,weekly,TRUE,1,2,,,,,, +-85.27214,35.106636,"Dollar General-Chattanooga,TN",3600 Hixson Pike Ste 106,Chattanooga,TN,37415-3561,(423) 875-4345,weekly,TRUE,1,2,,,,,, +-85.245004,35.023695,"Dollar General-Chattanooga,TN",3635 Brainerd Rd,Chattanooga,TN,37411-3602,(423) 698-4349,weekly,TRUE,1,2,,,,,, +-85.253172,34.997804,"Dollar General-Chattanooga,TN",3920 Ringgold Rd Ste A,Chattanooga,TN,37412-1643,(423) 624-7523,weekly,TRUE,1,2,,,,,, +-85.290957,34.994447,"Dollar General-Chattanooga,TN",4211 Rossville Blvd,Chattanooga,TN,37407-2925,(423) 867-9300,weekly,TRUE,1,2,,,,,, +-85.181793,35.091492,"Dollar General-Chattanooga,TN",4850 Highway 58,Chattanooga,TN,37416,(423) 208-9609,weekly,TRUE,1,2,,,,,, +-85.266534,35.008587,"Dollar General-Chattanooga,TN",5707 Ringgold Rd,Chattanooga,TN,37412-3541,(423) 668-0019,weekly,TRUE,1,2,,,,,, +-85.207662,35.0164,"Dollar General-Chattanooga,TN",5952 Brainerd Rd,Chattanooga,TN,37421-6800,(423) 499-5662,weekly,TRUE,1,2,,,,,, +-85.146795,35.053968,"Dollar General-Chattanooga,TN",7331 Lee Hwy,Chattanooga,TN,37421-1404,(423) 499-2755,weekly,TRUE,1,2,,,,,, +-85.32746,35.099808,"Dollar General-Chattanooga,TN",772 Mountain Creek Rd,Chattanooga,TN,37405-1631,(423) 876-1192,weekly,TRUE,1,2,,,,,, +-85.148779,35.003551,"Dollar General-Chattanooga,TN",8126 E Brainerd Rd Ste B,Chattanooga,TN,37421-4364,(423) 499-5944,weekly,TRUE,1,2,,,,,, +-87.4297564,36.5812996,"Dollar General-Clarksville,TN",1100 Ash Ridge Drive,Clarksville,TN,37042,(931) 266-0481,monthly,TRUE,1,,dates,10,,,, +-87.369248,36.625123,"Dollar General-Clarksville,TN",1481a Tiny Town Road,Clarksville,TN,37042,(931) 553-8502,monthly,TRUE,1,,dates,10,,,, +-87.3462177,36.5030368,"Dollar General-Clarksville,TN",155 Edmonson Ferry Road,Clarksville,TN,37040,(931) 538-3681,monthly,TRUE,1,,dates,10,,,, +-87.408016,36.575686,"Dollar General-Clarksville,TN",1600 Fort Campbell Blvd,Clarksville,TN,37042-3695,(931) 552-3212,monthly,TRUE,1,,dates,10,,,, +-87.298261,36.514601,"Dollar General Market-Clarksville,TN",1945 Madison St Ste B,Clarksville,TN,37043-8034,(931) 645-2789,monthly,TRUE,1,,dates,10,,,, +-87.313261,36.56429,"Dollar General-Clarksville,TN",2105 Trenton Rd,Clarksville,TN,37040-6652,(931) 645-1228,monthly,TRUE,1,,dates,10,,,, +-87.268567,36.50748,"Dollar General-Clarksville,TN",2410 Madison St,Clarksville,TN,37043-5455,(931) 552-6877,monthly,TRUE,1,,dates,10,,,, +-87.370476,36.442706,"Dollar General-Clarksville,TN",2748 Hwy 48,Clarksville,TN,37040-7456,(931) 552-4189,monthly,TRUE,1,,dates,10,,,, +-87.356614,36.525354,"Dollar General-Clarksville,TN",324 Madison St,Clarksville,TN,37040-3647,(931) 647-5673,monthly,TRUE,1,,dates,10,,,, +-87.436116,36.637515,"Dollar General-Clarksville,TN",3315 Fort Campbell Blvd,Clarksville,TN,37042-5601,(931) 431-3467,monthly,TRUE,1,,dates,10,,,, +-87.317953,36.623133,"Dollar General-Clarksville,TN",3855 Trenton Rd,Clarksville,TN,37040-5614,(931) 645-2888,monthly,TRUE,1,,dates,10,,,, +-87.412585,36.55135,"Dollar General-Clarksville,TN",440 Dover Rd,Clarksville,TN,37042,(931) 444-5184,monthly,TRUE,1,,dates,10,,,, +-87.205914,36.413413,"Dollar General-Clarksville,TN",5425 Ashland City Rd,Clarksville,TN,37043,(931) 362-3436,monthly,TRUE,1,,dates,10,,,, +-87.2356644,36.5209948,"Dollar General-Clarksville,TN",898 Hwy 76,Clarksville,TN,37043,(931) 266-4541,monthly,TRUE,1,,dates,10,,,, +-87.379649,36.54906,"Dollar General-Clarksville,TN",924 New Providence Blvd,Clarksville,TN,37042-4469,(931) 645-5033,monthly,TRUE,1,,dates,10,,,, +-87.3338044,36.5795615,"Dollar General-Clarksville,TN",927 Tracy Lane,Clarksville,TN,37040,(931) 538-3997,monthly,TRUE,1,,dates,10,,,, +-84.885397,35.161223,"Dollar General-Cleveland,TN",216 Grove Ave Sw,Cleveland,TN,37311-5717,(423) 479-9717,weekly,TRUE,1,4,,,,,, +-84.854992,35.130046,"Dollar General-Cleveland,TN",2175 Spring Place Rd Se,Cleveland,TN,37323-3340,(423) 559-0080,weekly,TRUE,1,4,,,,,, +-84.877896,35.130311,"Dollar General-Cleveland,TN",2430 Blackburn Rd Se,Cleveland,TN,37323-0619,(423) 479-5360,weekly,TRUE,1,4,,,,,, +-84.838051,35.147683,"Dollar General-Cleveland,TN",3425 Waterlevel Hwy,Cleveland,TN,37323-6652,(423) 472-2533,weekly,TRUE,1,4,,,,,, +-84.818068,35.181766,"Dollar General-Cleveland,TN",3690 Michigan Ave,Cleveland,TN,37312,(423) 476-0003,weekly,TRUE,1,4,,,,,, +-84.887302,35.194407,"Dollar General-Cleveland,TN",4625 Georgetown Rd Nw,Cleveland,TN,37312-1634,(423) 244-0518,weekly,TRUE,1,4,,,,,, +-84.83334,35.212791,"Dollar General-Cleveland,TN",4955 N Lee Hwy,Cleveland,TN,37312-4158,(423) 339-1178,weekly,TRUE,1,4,,,,,, +-84.873899,35.183664,"Dollar General-Cleveland,TN",860 25Th St Nw,Cleveland,TN,37311-3713,(423) 479-7542,weekly,TRUE,1,4,,,,,, +-87.01487,35.63528,"Dollar General-Columbia,TN",125 Bear Creek Pike,Columbia,TN,38401-2266,(931) 840-0575,monthly,TRUE,1,,dates,6,,,, +-87.064249,35.601598,"Dollar General-Columbia,TN",1301 S James Campbell Blvd,Columbia,TN,38401-0102,(931) 381-8829,monthly,TRUE,1,,dates,6,,,, +-86.9871597,35.5409737,"Dollar General-Columbia,TN",1314 Fountain Heights Road,Columbia,TN,38401-8167,(931) 398-5732,monthly,TRUE,1,,dates,6,,,, +-87.081896,35.619838,"Dollar General-Columbia,TN",1390 Hampshire Pike Ste A,Columbia,TN,38401,(931) 381-1145,monthly,TRUE,1,,dates,6,,,, +-87.033973,35.588297,"Dollar General-Columbia,TN",230 E James Campbell Blvd #14,Columbia,TN,38401-4597,(931) 381-4633,monthly,TRUE,1,,dates,6,,,, +-86.976786,35.705522,"Dollar General-Columbia,TN",2490 Nashville Hwy,Columbia,TN,38401-7236,(931) 486-1953,monthly,TRUE,1,,dates,6,,,, +-87.097122,35.590108,"Dollar General-Columbia,TN",5024 Trotwood Ave,Columbia,TN,38401-5074,(931) 840-4700,monthly,TRUE,1,,dates,6,,,, +-86.969138,35.636236,"Dollar General-Columbia,TN",704 Bear Creek Pike,Columbia,TN,38401,(931) 381-6691,monthly,TRUE,1,,dates,6,,,, +-85.385413,36.275029,"Dollar General-Cookeville,TN",101 Tommy Dodson Hwy,Cookeville,TN,38506-9014,(931) 498-2595,weekly,TRUE,1,3,,,,,, +-85.481609,36.176267,"Dollar General-Cookeville,TN",1068 E 10Th St Ste F,Cookeville,TN,38501-2195,(931) 528-0201,weekly,TRUE,1,3,,,,,, +-85.524793,36.269946,"Dollar General-Cookeville,TN",17666 Dodson Branch Hwy,Cookeville,TN,38501,(931) 400-2187,weekly,TRUE,1,3,,,,,, +-85.506634,36.113373,"Dollar General-Cookeville,TN",1781 S Jefferson Ave,Cookeville,TN,38506,(931) 284-4828,weekly,TRUE,1,3,,,,,, +-85.500586,36.159455,"Dollar General Market-Cookeville,TN",185 S Jefferson Ave,Cookeville,TN,38501-3424,(931) 528-1719,weekly,TRUE,1,3,,,,,, +-85.496459,36.186112,"Dollar General-Cookeville,TN",1945 N Washington,Cookeville,TN,38501-1026,(931) 526-1884,weekly,TRUE,1,3,,,,,, +-85.544407,36.119673,"Dollar General-Cookeville,TN",1999 Burgess Falls Rd,Cookeville,TN,38506-5638,(931) 432-6831,weekly,TRUE,1,3,,,,,, +-85.452818,36.189617,"Dollar General-Cookeville,TN",379 W Main St,Cookeville,TN,38506-5391,(931) 537-9346,weekly,TRUE,1,3,,,,,, +-85.515011,36.165737,"Dollar General-Cookeville,TN",403 W Broad St,Cookeville,TN,38501-2333,(931) 526-7584,weekly,TRUE,1,3,,,,,, +-85.505691,36.05707,"Dollar General-Cookeville,TN",7020 Roberts Matthews Hwy,Cookeville,TN,38506,(931) 739-7020,weekly,TRUE,1,3,,,,,, +-85.52448,36.159692,"Dollar General-Cookeville,TN",878 W Jackson St,Cookeville,TN,38501-7123,(931) 528-1169,weekly,TRUE,1,3,,,,,, +-85.034666,35.94361,"Dollar General Market-Crossville,TN",1259 Miller Ave [Ste 104],Crossville,TN,38555-5272,(931) 484-1738,weekly,TRUE,1,3,,,,,, +-85.030499,35.95762,"Dollar General-Crossville,TN",146 Woodmere Mall,Crossville,TN,38555-4230,(931) 456-8331,weekly,TRUE,1,3,,,,,, +-85.006189,35.926712,"Dollar General-Crossville,TN",1846 S Main St,Crossville,TN,38555-5912,(931) 484-7546,weekly,TRUE,1,3,,,,,, +-85.037942,35.973071,"Dollar General-Crossville,TN",1858 N Main St,Crossville,TN,38555-8763,(931) 456-7664,weekly,TRUE,1,3,,,,,, +-85.049144,35.919341,"Dollar General-Crossville,TN",31 Kearney Dr,Crossville,TN,38572,(931) 707-9160,weekly,TRUE,1,3,,,,,, +-85.0444324,36.0089812,"Dollar General-Crossville,TN",4518 Hwy 127 North,Crossville,TN,38571-7439,(931) 210-6497,weekly,TRUE,1,3,,,,,, +-84.911574,36.005841,"Dollar General-Crossville,TN",5643 Peavine Rd,Crossville,TN,38571-7911,(931) 456-6611,weekly,TRUE,1,3,,,,,, +-87.381556,36.062334,"Dollar General-Dickson,TN",188 Beasley Dr,Dickson,TN,37055-2840,(615) 740-8888,monthly,TRUE,1,,dates,6,,,, +-87.3446446,36.0274187,"Dollar General-Dickson,TN",2106 Highway 46 S,Dickson,TN,37055-5953,(615) 229-6947,monthly,TRUE,1,,dates,6,,,, +-87.386491,36.077533,"Dollar General-Dickson,TN",225 N Main St,Dickson,TN,37055-1801,(615) 446-8743,monthly,TRUE,1,,dates,6,,,, +-87.517197,36.091295,"Dollar General-Dickson,TN",4610 Highway 70 W,Dickson,TN,37055-4540,(615) 441-8648,monthly,TRUE,1,,dates,6,,,, +-87.390755,36.086338,"Dollar General-Dickson,TN",706 Henslee Dr,Dickson,TN,37055-1213,(615) 441-5918,monthly,TRUE,1,,dates,6,,,, +-89.400236,36.035235,"Dollar General-Dyersburg,TN",1120 Forrest St,Dyersburg,TN,38024-3746,(731) 285-3627,weekly,TRUE,1,5,,,,,, +-89.367223,36.052737,"Dollar General-Dyersburg,TN",1478 Us Highway 51 Byp E,Dyersburg,TN,38024-1249,(731) 287-1914,weekly,TRUE,1,5,,,,,, +-89.395111,36.06053,"Dollar General-Dyersburg,TN",2450 Lake Rd Ste A,Dyersburg,TN,38024-1688,(731) 287-8503,weekly,TRUE,1,5,,,,,, +-89.393124,35.984324,"Dollar General-Dyersburg,TN",55 Highway 210 N,Dyersburg,TN,38024-8213,(731) 286-0401,weekly,TRUE,1,5,,,,,, +-89.37677,36.031405,"Dollar General-Dyersburg,TN",801 E Court St,Dyersburg,TN,38024-4830,(731) 285-4569,weekly,TRUE,1,5,,,,,, +-99.705975,32.461639,"Dollar General-Abilene,TX",1091 N Judge Ely Blvd,Abilene,TX,79601-3853,(325) 670-0966,monthly,TRUE,1,,dates,6,,,, +-99.757997,32.463389,"Dollar General-Abilene,TX",1202 N Mockingbird Ln,Abilene,TX,79603-4706,(325) 672-2712,monthly,TRUE,1,,dates,6,,,, +-99.738704,32.434113,"Dollar General-Abilene,TX",1290 Butternut St,Abilene,TX,79602-3715,(325) 673-3651,monthly,TRUE,1,,dates,6,,,, +-99.7447021,32.474395,"Dollar General-Abilene,TX",2017 Ambler Ave,Abilene,TX,79603-2239,(325) 603-2199,monthly,TRUE,1,,dates,6,,,, +-99.757232,32.417496,"Dollar General-Abilene,TX",2926 S 27Th St,Abilene,TX,79605-6330,(325) 695-1182,monthly,TRUE,1,,dates,6,,,, +-99.774853,32.40627,"Dollar General-Abilene,TX",3726 Catclaw Dr # 1,Abilene,TX,79606-8202,(325) 691-8869,monthly,TRUE,1,,dates,6,,,, +-99.794531,32.443984,"Dollar General-Abilene,TX",5401 S 7th St,Abilene,TX,79605-2543,(325) 267-8951,monthly,TRUE,1,,dates,6,,,, +-99.771204,32.444498,"Dollar General-Abilene,TX",630 S Leggett,Abilene,TX,79605-1636,(325) 677-8255,monthly,TRUE,1,,dates,6,,,, +-99.777363,32.369312,"Dollar General-Abilene,TX",6617 Buffalo Gap Rd,Abilene,TX,79606-5944,(325) 692-1417,monthly,TRUE,1,,dates,6,,,, +-98.1205655,26.1906291,"Dollar General-Alamo,TX",1011 E Frontage Rd Ste C,Alamo,TX,78516-2320,(956) 782-1187,weekly,TRUE,1,2,,,,,, +-98.120453,26.190528,"Dollar General-Alamo,TX",1011 W Frontage Rd [Ste C],Alamo,TX,78516-2320,(956) 782-1187,weekly,TRUE,1,2,,,,,, +-98.119513,26.204407,"Dollar General-Alamo,TX",1018 N Alamo Rd,Alamo,TX,78516-6800,(956) 783-8266,weekly,TRUE,1,2,,,,,, +-98.116201,26.170834,"Dollar General-Alamo,TX",807 Ridge Rd,Alamo,TX,78516-9596,(956) 702-7927,weekly,TRUE,1,2,,,,,, +-101.835288,35.221969,"Dollar General-Amarillo,TX",1430 W Amarillo Blvd,Amarillo,TX,79107-5505,(806) 223-2747,monthly,TRUE,1,,dates,8,,,, +-101.820254,35.201172,"Dollar General-Amarillo,TX",1518 Se 10th Ave,Amarillo,TX,79102-4138,(806) 371-7988,monthly,TRUE,1,,dates,8,,,, +-101.8296596,35.279985,"Dollar General-Amarillo,TX",203 East Willow Creek Rd,Amarillo,TX,79108,(806) 340-7873,monthly,TRUE,1,,dates,8,,,, +-101.866709,35.205019,"Dollar General-Amarillo,TX",2726 W 10Th Street,Amarillo,TX,79102,(806) 373-8229,monthly,TRUE,1,,dates,8,,,, +-101.8035278,35.090229,"Dollar General-Amarillo,TX",2950 E Fm 1151,Amarillo,TX,79118-4306,(806) 340-7878,monthly,TRUE,1,,dates,8,,,, +-101.831081,35.251025,"Dollar General-Amarillo,TX",307 E Hastings Ave,Amarillo,TX,79108-5263,(806) 383-2826,monthly,TRUE,1,,dates,8,,,, +-101.866381,35.17813,"Dollar General-Amarillo,TX",3412 S Georgia St,Amarillo,TX,79109-4842,(806) 468-7747,monthly,TRUE,1,,dates,8,,,, +-101.90214,35.175973,"Dollar General-Amarillo,TX",3415 Bell St Ste C,Amarillo,TX,79109-4148,(806) 352-9533,monthly,TRUE,1,,dates,8,,,, +-101.813048,35.17818,"Dollar General-Amarillo,TX",3510 S Osage St,Amarillo,TX,79118-6763,(806) 373-1343,monthly,TRUE,1,,dates,8,,,, +-101.795117,35.236626,"Dollar General-Amarillo,TX",3611 Ne 24Th Ave,Amarillo,TX,79107-7242,(806) 381-0993,weekly,TRUE,1,4,,,,,, +-101.883939,35.213149,"Dollar General-Amarillo,TX",403 S Western St,Amarillo,TX,79106-8555,(806) 467-0869,weekly,TRUE,1,4,,,,,, +-101.884221,35.163965,"Dollar General-Amarillo,TX",4210 Sw 45Th Ave Ste A,Amarillo,TX,79109-0400,(806) 353-3244,weekly,TRUE,1,4,,,,,, +-101.848664,35.166801,"Dollar General-Amarillo,TX",4308 S Washington St,Amarillo,TX,79110-2016,(806) 356-8879,weekly,TRUE,1,4,,,,,, +-101.893987,35.195958,"Dollar General-Amarillo,TX",5131 Plains Blvd,Amarillo,TX,79106-4515,(806) 358-1636,weekly,TRUE,1,4,,,,,, +-101.883676,35.148104,"Dollar General-Amarillo,TX",5811 S Western St,Amarillo,TX,79110-3644,(806) 359-5571,weekly,TRUE,1,4,,,,,, +-101.914207,35.072513,"Dollar General-Amarillo,TX",7040 Mccormick Road,Amarillo,TX,79118,(806) 622-9337,weekly,TRUE,1,4,,,,,, +-101.901761,35.133092,"Dollar General-Amarillo,TX",7125 Bell St,Amarillo,TX,79109-7004,(806) 356-0993,weekly,TRUE,1,4,,,,,, +-97.094035,32.78475,"Dollar General-Arlington,TX",1001 Ne Green Oaks Blvd #151,Arlington,TX,76006-2316,(817) 460-8028,monthly,TRUE,1,,dates,10,,,, +-97.092374,32.707799,"Dollar General-Arlington,TX",1200 E Pioneer Pkwy,Arlington,TX,76010-6410,(817) 795-6700,monthly,TRUE,1,,dates,10,,,, +-97.080195,32.720524,"Dollar General-Arlington,TX",1525 New York Ave,Arlington,TX,76010-4723,(817) 548-7530,monthly,TRUE,1,,dates,10,,,, +-97.149056,32.72102,"Dollar General-Arlington,TX",1527 S Bowen Rd,Arlington,TX,76013-3335,(817) 274-5757,monthly,TRUE,1,,dates,10,,,, +-97.082589,32.69183,"Dollar General-Arlington,TX",1811 E Mayfield Rd,Arlington,TX,76014-2504,(817) 557-4445,monthly,TRUE,1,,dates,10,,,, +-97.06535,32.706273,"Dollar General-Arlington,TX",2535 Arkansas Ln-Ste #333,Arlington,TX,76010-8702,(817) 860-8580,monthly,TRUE,1,,dates,10,,,, +-97.131549,32.752328,"Dollar General-Arlington,TX",453 Fielder North Plz,Arlington,TX,76012-2308,(817) 274-8522,monthly,TRUE,1,,dates,10,,,, +-97.181517,32.647535,"Dollar General-Arlington,TX",4651 West Sublett Road,Arlington,TX,76017,(817) 563-1874,monthly,TRUE,1,,dates,10,,,, +-97.115183,32.660624,"Dollar General-Arlington,TX",5320 Matlock Rd,Arlington,TX,76018-1610,(817) 557-0484,monthly,TRUE,1,,dates,10,,,, +-97.076864,32.656417,"Dollar General-Arlington,TX",5531 New York Ave,Arlington,TX,76018-1801,(817) 468-7998,monthly,TRUE,1,,dates,10,,,, +-97.193023,32.673764,"Dollar General-Arlington,TX",5777 Sw Green Oaks Blvd,Arlington,TX,76017-1202,(817) 483-5955,monthly,TRUE,1,,dates,10,,,, +-97.133522,32.643493,"Dollar General-Arlington,TX",6315 S Cooper St,Arlington,TX,76001-5616,(817) 557-1525,monthly,TRUE,1,,dates,10,,,, +-97.097332,32.721111,"Dollar General-Arlington,TX",903 E Park Row Dr,Arlington,TX,76010-4508,(817) 801-5804,monthly,TRUE,1,,dates,10,,,, +-97.116656,32.708707,"Dollar General-Arlington,TX",905 W Pioneer Pkwy,Arlington,TX,76013-6369,(817) 795-3344,monthly,TRUE,1,,dates,10,,,, +-97.648414,30.38775,"Dollar General-Austin,TX",12320 Dessau Rd,Austin,TX,78754-1801,(512) 719-5155,weekly,TRUE,1,2,,,,,, +-97.588641,30.250012,"Dollar General-Austin,TX",13712 webberville Rd,Austin,TX,78724,(512) 276-7211,weekly,TRUE,1,2,,,,,, +-97.719323,30.239156,"Dollar General-Austin,TX",1401 S Pleasant Valley Rd,Austin,TX,78741,(512) 693-4147,weekly,TRUE,1,2,,,,,, +-97.790297,30.230334,"Dollar General-Austin,TX",2101 West Ben White,Austin,TX,78704,(512) 326-1855,weekly,TRUE,1,2,,,,,, +-97.67901,30.377867,"Dollar General-Austin,TX",405 E Braker Ln,Austin,TX,78753-2748,(512) 491-8455,weekly,TRUE,1,2,,,,,, +-97.678389,30.292529,"Dollar General-Austin,TX",5000 Springdale Rd,Austin,TX,78723,(512) 898-9016,weekly,TRUE,1,2,,,,,, +-97.738024,30.194853,"Dollar General-Austin,TX",5002 Nuckols Crossing Rd,Austin,TX,78744-3730,(512) 804-5244,weekly,TRUE,1,2,,,,,, +-97.800274,30.214037,"Dollar General-Austin,TX",5738 Manchaca Rd # 2,Austin,TX,78745-3635,(512) 448-9600,weekly,TRUE,1,2,,,,,, +-97.706867,30.226744,"Dollar General-Austin,TX",6010 E Riverside Dr,Austin,TX,78741-6512,(512) 385-4040,weekly,TRUE,1,2,,,,,, +-97.657617,30.284346,"Dollar General-Austin,TX",6600 Fm 969,Austin,TX,78724,(512) 926-7762,weekly,TRUE,1,2,,,,,, +-97.666327,30.310965,"Dollar General-Austin,TX",6729 Manor Road,Austin,TX,78723,(512) 354-2548,weekly,TRUE,1,2,,,,,, +-97.814652,30.208712,"Dollar General-Austin,TX",6800 West Gate Blvd Ste 115,Austin,TX,78745-4868,(512) 447-4753,weekly,TRUE,1,2,,,,,, +-97.717827,30.336064,"Dollar General-Austin,TX",6929 Airport Blvd Ste 160,Austin,TX,78752-3617,(512) 302-9085,weekly,TRUE,1,2,,,,,, +-97.781975,30.208491,"Dollar General-Austin,TX",709 W Stassney Ln,Austin,TX,78745-3031,(512) 912-9487,weekly,TRUE,1,2,,,,,, +-97.686387,30.357122,"Dollar General-Austin,TX",825 E Rundberg Ln Ste G1,Austin,TX,78753-4800,(512) 873-9288,weekly,TRUE,1,2,,,,,, +-97.82254,30.176352,"Dollar General-Austin,TX",9600 Manchaca Rd,Austin,TX,78748-6207,(512) 291-8681,weekly,TRUE,1,2,,,,,, +-97.695607,30.365907,"Dollar General-Austin,TX",9616 N Lamar Blvd Ste 120,Austin,TX,78753-4150,(512) 339-0533,weekly,TRUE,1,2,,,,,, +-94.863678,29.854803,"Dollar General-Baytown,TX",11455 Eagle Dr,Baytown,TX,77520-9877,(281) 576-4925,monthly,TRUE,1,,dates,10,,,, +-94.9779,29.744665,"Dollar General-Baytown,TX",1721 Garth Rd,Baytown,TX,77520-2411,(281) 427-3619,monthly,TRUE,1,,dates,10,,,, +-94.963875,29.76165,"Dollar General-Baytown,TX",3606 N Main St,Baytown,TX,77521-3302,(281) 427-3606,monthly,TRUE,1,,dates,10,,,, +-94.957598,29.731299,"Dollar General-Baytown,TX",400 N Alexander Dr,Baytown,TX,77520-5807,(281) 420-1892,monthly,TRUE,1,,dates,10,,,, +-95.010562,29.768502,"Dollar General-Baytown,TX",4220 Decker Dr,Baytown,TX,77520-1640,(281) 424-8151,monthly,TRUE,1,,dates,10,,,, +-94.981241,29.802265,"Dollar General-Baytown,TX",6930 Garth Rd,Baytown,TX,77521-9646,(281) 421-7394,monthly,TRUE,1,,dates,10,,,, +-94.129521,30.078542,"Dollar General-Beaumont,TX",10 N 11Th St,Beaumont,TX,77702-2211,(409) 833-7358,weekly,TRUE,1,4,,,,,, +-94.256458,29.928145,"Dollar General-Beaumont,TX",19797 Fm 365 Rd,Beaumont,TX,77705-8781,(409) 794-3033,weekly,TRUE,1,4,,,,,, +-94.112121,30.099072,"Dollar General-Beaumont,TX",2210 Gulf St,Beaumont,TX,77703-5204,(409) 838-9037,weekly,TRUE,1,4,,,,,, +-94.168146,30.102883,"Dollar General-Beaumont,TX",2602 Dowlen Rd,Beaumont,TX,77706-2543,(409) 860-0883,weekly,TRUE,1,4,,,,,, +-94.1281161,30.1256651,"Dollar General-Beaumont,TX",2730 Lucas E Drive,Beaumont,TX,77703,(409) 242-6863,weekly,TRUE,1,4,,,,,, +-94.086114,30.050362,"Dollar General-Beaumont,TX",3710 Highland Ave,Beaumont,TX,77705-3835,(409) 212-8801,weekly,TRUE,1,4,,,,,, +-94.127071,30.046916,"Dollar General-Beaumont,TX",4050 Fannett Rd,Beaumont,TX,77705-2704,(409) 840-9331,weekly,TRUE,1,4,,,,,, +-94.153889,30.068043,"Dollar General-Beaumont,TX",5468 College St,Beaumont,TX,77707-3634,(409) 842-4848,weekly,TRUE,1,4,,,,,, +-94.188975,30.133022,"Dollar General-Beaumont,TX",7335 Highway 105,Beaumont,TX,77713-4525,(409) 895-0989,weekly,TRUE,1,4,,,,,, +-94.192223,30.07647,"Dollar General-Beaumont,TX",8455 Phelan Rd,Beaumont,TX,77707-5616,(409) 866-0594,weekly,TRUE,1,4,,,,,, +-97.536448,25.940821,"Dollar General-Brownsville,TX",1300 W Ruben M Torres Blvd,Brownsville,TX,78520-5040,(956) 554-0393,monthly,TRUE,1,,dates,6,,,, +-97.511397,25.92473,"Dollar General-Brownsville,TX",1304 Central Blvd,Brownsville,TX,78523-7560,(956) 574-9376,monthly,TRUE,1,,dates,6,,,, +-97.501396,25.898158,"Dollar General-Brownsville,TX",14 Sam Perl Blvd,Brownsville,TX,78520,(956) 284-0859,monthly,TRUE,1,,dates,6,,,, +-97.498897,25.915865,"Dollar General-Brownsville,TX",1552 Palm Blvd Ste A,Brownsville,TX,78520-7264,(956) 548-2646,monthly,TRUE,1,,dates,6,,,, +-97.454495,25.903497,"Dollar General-Brownsville,TX",235 Morningside Rd,Brownsville,TX,78521-4934,(956) 550-9978,monthly,TRUE,1,,dates,6,,,, +-97.453778,25.928006,"Dollar General-Brownsville,TX",5444 S Padre Isld Hwy,Brownsville,TX,78521-4412,(956) 832-0832,monthly,TRUE,1,,dates,6,,,, +-98.99215,31.70826,"Dollar General-Brownwood,TX",2000 Highway 377 S,Brownwood,TX,76801-4017,(325) 646-7766,weekly,TRUE,1,4,,,,,, +-98.976009,31.729884,"Dollar General-Brownwood,TX",315 E Commerce St,Brownwood,TX,76801-1823,(325) 641-8054,weekly,TRUE,1,4,,,,,, +-98.9591722,31.6842894,"Dollar General-Brownwood,TX",3706 Austin Ave,Brownwood,TX,76801,(none listed),weekly,TRUE,1,4,,,,,, +-99.092938,31.8195813,"Dollar General-Brownwood,TX",8015 Highway 279,Brownwood,TX,76801-0025,(325) 784-5485,weekly,TRUE,1,4,,,,,, +-96.383091,30.683437,"Dollar General-Bryan,TX",1201 W Martin Luther King Jr,Bryan,TX,77803,(979) 314-0682,monthly,TRUE,1,,dates,8,,,, +-96.374107,30.632191,"Dollar General-Bryan,TX",1314 W Villa Maria Rd,Bryan,TX,77801-4236,(979) 823-7858,monthly,TRUE,1,,dates,8,,,, +-96.354436,30.6729,"Dollar General-Bryan,TX",1576 E William J Bryan Parkway,Bryan,TX,77803,(979) 314-0683,monthly,TRUE,1,,dates,8,,,, +-96.364767,30.654345,"Dollar General-Bryan,TX",1709 S Texas Ave,Bryan,TX,77802-1020,(979) 779-0864,monthly,TRUE,1,,dates,8,,,, +-96.32474,30.67105,"Dollar General-Bryan,TX",2711 Boonville Rd,Bryan,TX,77808-2229,(979) 774-3753,monthly,TRUE,1,,dates,8,,,, +-96.391181,30.70132,"Dollar General-Bryan,TX",3706 N Texas Ave,Bryan,TX,77803-0734,(979) 431-5998,monthly,TRUE,1,,dates,8,,,, +-95.1448732,30.2841266,"Dollar General-Cleveland,TX",11025 Fostoria Road,Cleveland,TX,77328,(281) 622-4315,weekly,TRUE,1,1,,,,,, +-95.095987,30.334275,"Dollar General-Cleveland,TX",116 Truly Plz,Cleveland,TX,77327-4889,(281) 659-0104,weekly,TRUE,1,1,,,,,, +-95.245729,30.31166,"Dollar General-Cleveland,TX",18350 E Highway 105,Cleveland,TX,77328-2430,(281) 659-2915,weekly,TRUE,1,1,,,,,, +-94.994213,30.317547,"Dollar General-Cleveland,TX",22880 Hwy 321,Cleveland,TX,77327,(281) 761-7014,weekly,TRUE,1,1,,,,,, +-94.8383617,30.4509681,"Dollar General-Cleveland,TX",4775 Fm 787 W,Cleveland,TX,77327,(281) 761-2298,weekly,TRUE,1,1,,,,,, +-95.082381,30.340894,"Dollar General-Cleveland,TX",640 East Houston Street,Cleveland,TX,77327-4689,(281) 592-1316,weekly,TRUE,1,1,,,,,, +-95.300491,30.239344,"Dollar General-Conroe,TX",14515 Fm 1485 Rd,Conroe,TX,77306-8907,(936) 231-3881,weekly,TRUE,1,1,,,,,, +-95.353425,30.205542,"Dollar General-Conroe,TX",16995 Fm 1314,Conroe,TX,77302,(281) 601-4553,weekly,TRUE,1,1,,,,,, +-95.466724,30.332245,"Dollar General-Conroe,TX",2017 N Frazier St,Conroe,TX,77301-1233,(936) 539-5212,weekly,TRUE,1,1,,,,,, +-95.495838,30.326923,"Dollar General-Conroe,TX",2495 N Loop 336 W,Conroe,TX,77304-3581,(936) 494-3344,weekly,TRUE,1,1,,,,,, +-95.4179,30.32042,"Dollar General-Conroe,TX",2560 E Davis Hwy,Conroe,TX,77304,(936) 756-6064,weekly,TRUE,1,1,,,,,, +-95.463883,30.312093,"Dollar General-Conroe,TX",733 W Davis St,Conroe,TX,77301-2704,(936) 539-5214,weekly,TRUE,1,1,,,,,, +-97.271451,27.503095,"Dollar General-Corpus Christi,TX",10309 S Padre Island Dr Ste A2,Corpus Christi,TX,78418-4455,(361) 937-8892,weekly,TRUE,1,1,,,,,, +-97.642536,27.857117,"Dollar General-Corpus Christi,TX",14102 Northwest Blvd,Corpus Christi,TX,78410-5121,(361) 241-5680,weekly,TRUE,1,1,,,,,, +-97.298203,27.642943,"Dollar General-Corpus Christi,TX",2701 Waldron Rd,Corpus Christi,TX,78418-4823,(361) 937-7300,weekly,TRUE,1,1,,,,,, +-97.4025469,27.7613126,"Dollar General-Corpus Christi,TX",2767 S Staples St,Corpus Christi,TX,78404-3619,(361) 855-3755,weekly,TRUE,1,1,,,,,, +-97.424761,27.722129,"Dollar General-Corpus Christi,TX",2978 Holly Road,Corpus Christi,TX,78415,(361) 225-2120,weekly,TRUE,1,1,,,,,, +-97.424882,27.778026,"Dollar General-Corpus Christi,TX",3130 Morgan Ave,Corpus Christi,TX,78405-2160,(361) 371-2384,weekly,TRUE,1,1,,,,,, +-97.437857,27.797165,"Dollar General-Corpus Christi,TX",3928 Leopard St,Corpus Christi,TX,78408-2822,(361) 882-2380,weekly,TRUE,1,1,,,,,, +-97.437338,27.749154,"Dollar General-Corpus Christi,TX",4714 Greenwood Dr,Corpus Christi,TX,78416-1773,(361) 806-0940,weekly,TRUE,1,1,,,,,, +-97.388264,27.704544,"Dollar General-Corpus Christi,TX",4902 Holly Rd,Corpus Christi,TX,78411-4766,(361) 986-9285,weekly,TRUE,1,1,,,,,, +-97.408236,27.706541,"Dollar General-Corpus Christi,TX",6057 Weber Rd,Corpus Christi,TX,78413-3970,(361) 814-3530,weekly,TRUE,1,1,,,,,, +-97.402316,27.785583,"Dollar General-Corpus Christi,TX",609 S Staples St,Corpus Christi,TX,78401-3334,(361) 882-7070,weekly,TRUE,1,1,,,,,, +-97.363286,27.675446,"Dollar General-Corpus Christi,TX",6726 Saratoga Blvd,Corpus Christi,TX,78414-3906,(361) 994-1337,weekly,TRUE,1,1,,,,,, +-97.362308,27.717969,"Dollar General-Corpus Christi,TX",831 Airline Rd Ste B,Corpus Christi,TX,78412-3187,(361) 985-6914,weekly,TRUE,1,1,,,,,, +-97.559172,27.83099,"Dollar General-Corpus Christi,TX",9850 Leopard St,Corpus Christi,TX,78410-1612,(361) 242-1613,weekly,TRUE,1,1,,,,,, +-96.435069,32.06245,"Dollar General-Corsicana,TX",3600 S Us Hwy 287,Corsicana,TX,75109-8959,(903) 345-4639,monthly,TRUE,1,,dates,9,,,, +-96.5188,32.087041,"Dollar General-Corsicana,TX",3811 W Highway 22,Corsicana,TX,75110-2465,(903) 872-4935,monthly,TRUE,1,,dates,9,,,, +-96.471684,32.094326,"Dollar General-Corsicana,TX",615 W 2Nd Ave,Corsicana,TX,75110-2943,(903) 872-2752,monthly,TRUE,1,,dates,9,,,, +-96.47123,32.087848,"Dollar General-Corsicana,TX",842 W 7Th Ave Ste G,Corsicana,TX,75110-6370,(903) 872-6640,monthly,TRUE,1,,dates,9,,,, +-96.856429,32.882058,"Dollar General-Dallas,TX",10055 Marsh Ln,Dallas,TX,75229-6058,(214) 366-7621,weekly,TRUE,1,5,,,,,, +-96.682837,32.84972,"Dollar General-Dallas,TX",11255 Garland Rd Ste 200,Dallas,TX,75218-2518,(214) 321-7959,weekly,TRUE,1,5,,,,,, +-96.60035,32.677766,"Dollar General-Dallas,TX",1780 S Beltline Road,Dallas,TX,75253,(214) 613-1165,weekly,TRUE,1,5,,,,,, +-96.648054,32.747298,"Dollar General-Dallas,TX",2020 N Masters Dr Ste 102,Dallas,TX,75217-3182,(972) 329-3272,weekly,TRUE,1,5,,,,,, +-96.78867,32.741693,"Dollar General-Dallas,TX",2919 Cedar Crest Blvd,Dallas,TX,75203-4011,(214) 942-2889,weekly,TRUE,1,5,,,,,, +-96.861284,32.858668,"Dollar General-Dallas,TX",3515 W Northwest Highway,Dallas,TX,75220,(469) 522-2516,weekly,TRUE,1,5,,,,,, +-96.839964,32.696546,"Dollar General-Dallas,TX",3936 S Polk St Ste 114,Dallas,TX,75224-4483,(214) 374-7554,weekly,TRUE,1,5,,,,,, +-96.899414,32.705951,"Dollar General-Dallas,TX",4627 W Kiest Blvd,Dallas,TX,75236-1168,(214) 337-0157,weekly,TRUE,1,5,,,,,, +-96.703057,32.734542,"Dollar General-Dallas,TX",6905 Lake June Rd,Dallas,TX,75217-1325,(214) 391-7386,weekly,TRUE,1,5,,,,,, +-96.689055,32.712645,"Dollar General-Dallas,TX",7771 S Loop 12,Dallas,TX,75217,(214) 391-7269,weekly,TRUE,1,5,,,,,, +-96.698603,32.812691,"Dollar General-Dallas,TX",8786 Ferguson Rd,Dallas,TX,75228,(214) 324-8773,weekly,TRUE,1,5,,,,,, +-96.748256,32.9094,"Dollar General-Dallas,TX",9035 Forest Ln Ste 101,Dallas,TX,75243-4160,(972) 783-9399,weekly,TRUE,1,5,,,,,, +-97.150594,33.204798,"Dollar General-Denton,TX",1107 Avenue C,Denton,TX,76201-6501,(940) 591-9887,monthly,TRUE,1,,dates,6,,,, +-97.110455,33.215849,"Dollar General-Denton,TX",1609 E Mckinney St,Denton,TX,76209-4539,(940) 591-9508,monthly,TRUE,1,,dates,6,,,, +-97.145578,33.21556,"Dollar General-Denton,TX",1626 W Univeristy Dr Ste A,Denton,TX,76201-1760,(940) 383-2920,monthly,TRUE,1,,dates,6,,,, +-97.102967,33.188659,"Dollar General-Denton,TX",2127 Sadau Ct,Denton,TX,76210-4941,(940) 243-2124,monthly,TRUE,1,,dates,6,,,, +-97.13702,33.24231,"Dollar General-Denton,TX",3001 N Elm St Ste 100,Denton,TX,76207-7664,(940) 382-8434,monthly,TRUE,1,,dates,6,,,, +-98.0439682,26.1640396,"Dollar General-Donna,TX",1600 S Salinas Blvd,Donna,TX,78537,(956) 377-2568,weekly,TRUE,1,4,,,,,, +-98.055542,26.169187,"Dollar General-Donna,TX",209 S 8Th St # 227,Donna,TX,78537-3136,(956) 464-1032,weekly,TRUE,1,4,,,,,, +-98.037577,26.200959,"Dollar General-Donna,TX",4215 N FM 493,Donna,TX,78537,(956) 377-2566,weekly,TRUE,1,4,,,,,, +-98.073184,26.184194,"Dollar General-Donna,TX",717 W Bus Hwy 83,Donna,TX,78537,(956) 377-1222,weekly,TRUE,1,4,,,,,, +-98.03685,26.218897,"Dollar General-Donna,TX",7900 N Fm 493,Donna,TX,78537-5082,(956) 461-5778,weekly,TRUE,1,4,,,,,, +-100.473765,28.692537,"Dollar General-Eagle Pass,TX",1651 S Veterans Blvd,Eagle Pass,TX,78852-6480,(830) 773-9004,monthly,TRUE,1,,dates,6,,,, +-100.49672,28.729023,"Dollar General-Eagle Pass,TX",1910 Paso Del Rio Blvd,Eagle Pass,TX,78852-3488,(830) 773-5778,monthly,TRUE,1,,dates,6,,,, +-100.481548,28.733608,"Dollar General-Eagle Pass,TX",2743 N Veterans Blvd,Eagle Pass,TX,78852-6635,(830) 758-0384,monthly,TRUE,1,,dates,6,,,, +-100.4950634,28.7548947,"Dollar General-Eagle Pass,TX",3245 Del Rio Blvd,Eagle Pass,TX,78852,(830) 319-3422,monthly,TRUE,1,,dates,6,,,, +-100.439446,28.656635,"Dollar General-Eagle Pass,TX",5819 Fm 1021,Eagle Pass,TX,78852-1236,(830) 758-7628,monthly,TRUE,1,,dates,6,,,, +-98.138385,26.2908,"Dollar General-Edinburg,TX",1121 S Raul Longoria Rd,Edinburg,TX,78539-2716,(956) 318-3539,weekly,TRUE,1,5,,,,,, +-98.190807,26.249614,"Dollar General-Edinburg,TX",1311 W Owassa Rd,Edinburg,TX,78539,(956) 787-7001,weekly,TRUE,1,5,,,,,, +-98.16967,26.338952,"Dollar General-Edinburg,TX",1406 W Monte Cristo Rd,Edinburg,TX,78541-7329,(956) 383-4534,weekly,TRUE,1,5,,,,,, +-98.136099,26.33436,"Dollar General-Edinburg,TX",1801 E Monte Cristo Rd,Edinburg,TX,78542,(956) 383-3636,weekly,TRUE,1,5,,,,,, +-98.107356,26.276674,"Dollar General-Edinburg,TX",1821 S Alamo Road,Edinburg,TX,78539,(956) 380-0066,weekly,TRUE,1,5,,,,,, +-98.182126,26.279268,"Dollar General-Edinburg,TX",3007 S Sugar Rd,Edinburg,TX,78539-2117,(956) 292-0993,weekly,TRUE,1,5,,,,,, +-98.160202,26.299903,"Dollar General-Edinburg,TX",302 E Cano St,Edinburg,TX,78539-4512,(956) 318-1787,weekly,TRUE,1,5,,,,,, +-98.142589,26.26516,"Dollar General-Edinburg,TX",4406 S Raul Longoria Rd,Edinburg,TX,78542-2026,(956) 283-1545,weekly,TRUE,1,5,,,,,, +-98.2080129,26.3446905,"Dollar General-Edinburg,TX",5107 W Monte Cristo Rd,Edinburg,TX,78541-8852,(956) 316-2217,weekly,TRUE,1,5,,,,,, +-98.096125,26.347815,"Dollar General-Edinburg,TX",5125 S Alamo Rd,Edinburg,TX,78539-8732,(956) 283-1357,weekly,TRUE,1,5,,,,,, +-98.0667952,26.2946599,"Dollar General-Edinburg,TX",8920 E Highway 107,Edinburg,TX,78542,(none listed),weekly,TRUE,1,5,,,,,, +-106.4034042,31.9061165,"Dollar General-El Paso,TX",10180 Dyer Street,El Paso,TX,79924,(915) 257-4686,monthly,TRUE,1,,dates,7,,,, +-106.407146,31.926805,"Dollar General-El Paso,TX",10810 Mccombs St,El Paso,TX,79924-1507,(915) 822-9728,monthly,TRUE,1,,dates,7,,,, +-106.424599,31.93841,"Dollar General-El Paso,TX",11100 Sean Haggerty Drive Bldg C,El Paso,TX,79934,(915) 822-2288,monthly,TRUE,1,,dates,7,,,, +-106.314813,31.679856,"Dollar General-El Paso,TX",115 S Americas Ave Ste B,El Paso,TX,79907-6906,(915) 859-3116,monthly,TRUE,1,,dates,7,,,, +-106.286404,31.782363,"Dollar General-El Paso,TX",11680 Pebble Hills Blvd,El Paso,TX,79936-0964,(915) 855-1969,monthly,TRUE,1,,dates,7,,,, +-106.298364,31.728897,"Dollar General-El Paso,TX",1348 N Zaragoza Rd,El Paso,TX,79936-7945,(915) 857-5092,monthly,TRUE,1,,dates,7,,,, +-106.527478,31.818654,"Dollar General-El Paso,TX",135 S Mesa Hills Dr,El Paso,TX,79912-5467,(915) 760-6836,monthly,TRUE,1,,dates,7,,,, +-106.179666,31.817924,"Dollar General-El Paso,TX",14392 Montana Ave,El Paso,TX,79938-7201,(915) 849-0491,monthly,TRUE,1,,dates,7,,,, +-106.570419,31.881267,"Dollar General-El Paso,TX",1550 N Resler Dr Ste M,El Paso,TX,79912-1437,(915) 760-5021,weekly,TRUE,1,3,,,,,, +-106.301578,31.748874,"Dollar General-El Paso,TX",1580 George Dieter Dr Ste 102,El Paso,TX,79936-7612,(915) 921-6910,weekly,TRUE,1,3,,,,,, +-106.279594,31.750738,"Dollar General-El Paso,TX",1700 N Zaragoza,El Paso,TX,79936-7965,(915) 855-1146,weekly,TRUE,1,3,,,,,, +-106.501112,31.774866,"Dollar General-El Paso,TX",2400 N Mesa,El Paso,TX,79902-3109,(915) 577-0214,weekly,TRUE,1,3,,,,,, +-106.35626,31.784216,"Dollar General-El Paso,TX",3017 Mcrae Blvd,El Paso,TX,79925-4533,(915) 599-1622,weekly,TRUE,1,3,,,,,, +-106.45941,31.784589,"Dollar General-El Paso,TX",3028 Pershing Dr,El Paso,TX,79903-2523,(915) 565-2927,weekly,TRUE,1,3,,,,,, +-106.302024,31.791044,"Dollar General-El Paso,TX",3350 George Deiter Dr,El Paso,TX,79936-2387,(915) 857-9114,monthly,TRUE,1,,dates,9,,,, +-106.444641,31.807465,"Dollar General-El Paso,TX",3440 Dyer St,El Paso,TX,79930-6318,(915) 566-8086,monthly,TRUE,1,,dates,9,,,, +-106.321711,31.702002,"Dollar General-El Paso,TX",500 N Zaragoza Rd Ste Ih,El Paso,TX,79907-4700,(915) 859-7932,monthly,TRUE,1,,dates,9,,,, +-106.364027,31.741785,"Dollar General-El Paso,TX",500C N Carolina Dr,El Paso,TX,79915-2608,(915) 593-3141,monthly,TRUE,1,,dates,9,,,, +-106.581384,31.845849,"Dollar General-El Paso,TX",5100 Doniphan Dr,El Paso,TX,79932-1602,(915) 585-2671,monthly,TRUE,1,,dates,9,,,, +-106.423874,31.90313,"Dollar General-El Paso,TX",5111 Fairbanks Dr,El Paso,TX,79924-3835,(915) 757-3002,monthly,TRUE,1,,dates,9,,,, +-106.425148,31.783792,"Dollar General-El Paso,TX",5421 Montana Ave Ste A,El Paso,TX,79903-4909,(915) 778-6841,weekly,TRUE,1,1,,,,,, +-106.610738,31.875601,"Dollar General-El Paso,TX",6225 Upper Valley Road,El Paso,TX,79922-4310,(915) 877-5060,weekly,TRUE,1,1,,,,,, +-106.547936,31.835406,"Dollar General-El Paso,TX",6910 N Mesa St Ste A,El Paso,TX,79912-4446,(915) 587-0097,weekly,TRUE,1,1,,,,,, +-106.395503,31.756516,"Dollar General-El Paso,TX",7021 Alameda Ave,El Paso,TX,79915-3454,(915) 778-7335,weekly,TRUE,1,1,,,,,, +-106.43586,31.857783,"Dollar General-El Paso,TX",8500 Dyer St Ste 61,El Paso,TX,79904-2800,(915) 755-4795,weekly,TRUE,1,1,,,,,, +-106.426928,31.872153,"Dollar General-El Paso,TX",9155 Dyer St Ste 21,El Paso,TX,79924-6401,(915) 751-6968,weekly,TRUE,1,1,,,,,, +-106.36354,31.765733,"Dollar General-El Paso,TX",9530 Viscount Blvd Ste 2A,El Paso,TX,79925-7000,(915) 633-8087,weekly,TRUE,1,1,,,,,, +-106.41329,31.892781,"Dollar General-El Paso,TX",9801 Dyer St,El Paso,TX,79924-4707,(915) 759-7020,weekly,TRUE,1,1,,,,,, +-76.285008,36.717454,"Dollar General-Chesapeake,VA",1249 Cedar Rd Ste 106,Chesapeake,VA,23322-7292,(757) 382-4244,monthly,TRUE,1,,dates,8,,,, +-76.203952,36.764009,"Dollar General-Chesapeake,VA",1367 Kempsville Rd,Chesapeake,VA,23320-1415,(757) 547-2223,monthly,TRUE,1,,dates,8,,,, +-76.277653,36.811068,"Dollar General-Chesapeake,VA",1435 Bainbridge Blvd,Chesapeake,VA,23324-2237,(757) 543-2279,monthly,TRUE,1,,dates,8,,,, +-76.34288,36.740494,"Dollar General-Chesapeake,VA",2617 Moses Grandy Trk Ste 112,Chesapeake,VA,23323-6711,(757) 485-5932,monthly,TRUE,1,,dates,8,,,, +-76.336139,36.772443,"Dollar General-Chesapeake,VA",3302 S Military Hwy,Chesapeake,VA,23323-3545,(757) 558-1124,monthly,TRUE,1,,dates,8,,,, +-76.243818,36.744362,"Dollar General-Chesapeake,VA",701-D North Battlefield Blvd,Chesapeake,VA,23320-0000,(757) 549-6653,monthly,TRUE,1,,dates,8,,,, +-79.414346,36.594194,"Dollar General-Danville,VA",109 Piney Forest Rd,Danville,VA,24540-4125,(434) 793-4988,weekly,TRUE,1,1,,,,,, +-79.343404,36.581105,"Dollar General-Danville,VA",1307 S Boston Road,Danville,VA,24540,(434) 688-0722,weekly,TRUE,1,1,,,,,, +-79.405342,36.559366,"Dollar General-Danville,VA",1424 S Main St,Danville,VA,24541,(434) 792-9438,weekly,TRUE,1,1,,,,,, +-79.449752,36.590457,"Dollar General-Danville,VA",1500 Westover Drive,Danville,VA,24541,(434) 688-3136,weekly,TRUE,1,1,,,,,, +-79.4131775,36.6028099,"Dollar General Market-Danville,VA",2001 Piney Forest Rd,Danville,VA,24540,(434) 688-4627,weekly,TRUE,1,1,,,,,, +-79.457823,36.558445,"Dollar General-Danville,VA",2398 W Main St,Danville,VA,24541,(434) 792-0121,weekly,TRUE,1,1,,,,,, +-79.415357,36.668839,"Dollar General-Danville,VA",3555 Franklin Turnpike,Danville,VA,24540,(434) 688-4624,weekly,TRUE,1,1,,,,,, +-79.419013,36.572353,"Dollar General-Danville,VA",649 W Main St,Danville,VA,24541-4201,(434) 797-2603,weekly,TRUE,1,1,,,,,, +-81.245663,37.804992,"Dollar General-Beckley,WV",2952 Harper Rd,Beckley,WV,25801-9470,(304) 252-4306,monthly,TRUE,1,,dates,10,,,, +-81.194417,37.777665,"Dollar General-Beckley,WV",2970 Robert C Byrd Dr,Beckley,WV,25801-4448,(304) 253-3172,monthly,TRUE,1,,dates,10,,,, +-81.183417,37.811951,"Dollar General-Beckley,WV",306 Beckley Plaza Ste 11,Beckley,WV,25801-2215,(304) 252-2079,monthly,TRUE,1,,dates,10,,,, +-81.160108,37.770066,"Dollar General-Beckley,WV",995 South Eisenhower Drive,Beckley,WV,25801,(304) 256-7560,monthly,TRUE,1,,dates,10,,,, +-81.619764,38.341847,"Dollar General-Charleston,WV",1555 Washington Street East,Charleston,WV,25311,(304) 344-4262,weekly,TRUE,1,4,,,,,, +-81.641115,38.361109,"Dollar General-Charleston,WV",222 Washington St W,Charleston,WV,25302-2346,(304) 346-7757,weekly,TRUE,1,4,,,,,, +-81.5610067,38.2896663,"Dollar General-Charleston,WV",4817 Midland Dr,Charleston,WV,25306-6354,(304) 553-7288,weekly,TRUE,1,4,,,,,, +-81.520236,38.317597,"Dollar General-Charleston,WV",504 Campbells Creek Dr,Charleston,WV,25306-6810,(304) 925-6137,weekly,TRUE,1,4,,,,,, +-81.67091,38.475049,"Dollar General-Charleston,WV",6283 Sissonville Dr,Charleston,WV,25312-9445,(304) 984-9073,weekly,TRUE,1,4,,,,,, +-79.9214706,37.271595,"Dollar General-Roanoke,VA",1302 Jamison Ave,Roanoke,VA,24013-2016,(540) 345-1890,monthly,TRUE,1,,dates,10,,,, +-79.919734,37.248741,"Dollar General-Roanoke,VA",2227 Garden City Blvd Se,Roanoke,VA,24014-3706,(540) 427-3153,monthly,TRUE,1,,dates,10,,,, +-79.909759,37.290763,"Dollar General-Roanoke,VA",2312 Orange Ave Ne # 4,Roanoke,VA,24012-8311,(540) 343-5204,monthly,TRUE,1,,dates,10,,,, +-80.003046,37.263328,"Dollar General-Roanoke,VA",3318 Brandon Ave Sw,Roanoke,VA,24018-1520,(540) 343-1108,monthly,TRUE,1,,dates,10,,,, +-79.990217,37.29136,"Dollar General-Roanoke,VA",3323 Melrose Ave Nw,Roanoke,VA,24017-1943,(540) 366-2726,monthly,TRUE,1,,dates,10,,,, +-82.407329,38.425847,"Dollar General-Huntington,WV",2620 5Th Ave,Huntington,WV,25702-1329,(304) 697-2875,weekly,TRUE,1,1,,,,,, +-82.5313721,38.375351,"Dollar General-Huntington,WV",2908 Spring Valley Drive,Huntington,WV,25704-9800,(681) 203-5591,weekly,TRUE,1,1,,,,,, +-82.4072584,38.4071081,"Dollar General-Huntington,WV",318 Norway Ave,Huntington,WV,25705-1308,(304) 908-5492,weekly,TRUE,1,1,,,,,, +-82.366162,38.411765,"Dollar General-Huntington,WV",4341 Us Route 60,Huntington,WV,25705-2942,(304) 733-5648,weekly,TRUE,1,1,,,,,, +-82.478302,38.408009,"Dollar General-Huntington,WV",914 14Th St W,Huntington,WV,25704-2309,(304) 697-6855,weekly,TRUE,1,1,,,,,, +-81.582299,39.24652,"Dollar General-Parkersburg,WV",1000 E Dupont Rd,Parkersburg,WV,26101-9724,(304) 422-4165,weekly,TRUE,1,1,,,,,, +-81.54168,39.234703,"Dollar General-Parkersburg,WV",2107 Pike St Ste 6,Parkersburg,WV,26101-6973,(304) 428-0054,weekly,TRUE,1,1,,,,,, +-81.536537,39.283769,"Dollar General-Parkersburg,WV",3001 Dudley Ave,Parkersburg,WV,26104-1812,(304) 422-3992,weekly,TRUE,1,1,,,,,, +-81.50492,39.221538,"Dollar General-Parkersburg,WV",3344 Staunton Turnpike,Parkersburg,WV,26104,(304) 422-1686,weekly,TRUE,1,1,,,,,, +-81.548757,39.26401,"Dollar General-Parkersburg,WV",835 7Th St,Parkersburg,WV,26101-5268,(304) 485-3195,weekly,TRUE,1,1,,,,,, +-79.125182,38.990592,"Dollar General-Petersburg,WV",1 Park St,Petersburg,WV,26847-1731,(304) 257-4050,weekly,TRUE,1,1,,,,,, +-76.108754,36.838998,"Dollar General-Virginia Beach,VA",100 S Lynn Shores Drive,Virginia Beach,VA,23452,(757) 463-3309,weekly,TRUE,1,1,,,,,, +-75.992868,36.84192,"Dollar General-Virginia Beach,VA",1021 Virginia Beach Blvd,Virginia Beach,VA,23451-5669,(757) 491-4891,weekly,TRUE,1,1,,,,,, +-76.099139,36.795664,"Dollar General-Virginia Beach,VA",1505 Lynnhaven Pkwy Ste 1355,Virginia Beach,VA,23453-2014,(757) 468-9760,weekly,TRUE,1,1,,,,,, +-76.191506,36.779129,"Dollar General-Virginia Beach,VA",1920 Centerville Tpke,Virginia Beach,VA,23464-6800,(757) 479-5114,weekly,TRUE,1,1,,,,,, +-76.179401,36.902395,"Dollar General-Virginia Beach,VA",1948 Diamond Springs Rd,Virginia Beach,VA,23455-2335,(757) 464-3902,weekly,TRUE,1,1,,,,,, +-76.08072,36.792793,"Dollar General-Virginia Beach,VA",3208 Holland Rd Ste 107,Virginia Beach,VA,23453-2864,(757) 468-2815,weekly,TRUE,1,1,,,,,, +-76.095627,36.840979,"Dollar General-Virginia Beach,VA",3600 S Plaza Trl,Virginia Beach,VA,23452-3310,(757) 498-4271,weekly,TRUE,1,1,,,,,, +-76.092157,36.83444,"Dollar General-Virginia Beach,VA",4239 Holand Rd -Suite #788,Virginia Beach,VA,23452-1941,(757) 495-5404,weekly,TRUE,1,1,,,,,, +-76.136089,36.904258,"Dollar General-Virginia Beach,VA",4807 Shore Dr,Virginia Beach,VA,23455-2714,(757) 363-2888,weekly,TRUE,1,1,,,,,, +-76.15179,36.843683,"Dollar General-Virginia Beach,VA",5013 Virginia Beach Blvd,Virginia Beach,VA,23462-6610,(757) 499-6450,weekly,TRUE,1,1,,,,,, +-76.167085,36.828006,"Dollar General-Virginia Beach,VA",5277 Princess Anne Rd,Virginia Beach,VA,23462-6398,(757) 490-0649,weekly,TRUE,1,1,,,,,, +-76.173324,36.861781,"Dollar General-Virginia Beach,VA",649 Newtown Rd,Virginia Beach,VA,23462-1600,(757) 497-2273,weekly,TRUE,1,1,,,,,, diff --git a/Route4MeSDKTest/bin/Debug/Data/Other files/addresses 1000.xlsx b/Route4MeSDKTest/bin/Debug/Data/Other files/addresses 1000.xlsx new file mode 100644 index 00000000..e163858d Binary files /dev/null and b/Route4MeSDKTest/bin/Debug/Data/Other files/addresses 1000.xlsx differ diff --git a/Route4MeSDKTest/bin/Debug/Data/Other files/new address data.json b/Route4MeSDKTest/bin/Debug/Data/Other files/new address data.json new file mode 100644 index 00000000..b2515750 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/Other files/new address data.json @@ -0,0 +1,21 @@ +{ + "member_id":177496, + "address_group":"", + "address_alias":"301 MARKET SHELL", + "address_1":"17205 RICHMOND TNPK, MILFORD, VA, 22514", + "first_name":"Gela", + "last_name":"Gorason", + "address_email":"ggora@gmail.com", + "address_phone_number":"8046335852", + "address_city":"Milford", + "address_state_id":"VA", + "address_country_id":"US", + "address_zip":"00167", + "cached_lat":"38.024654", + "cached_lng":"-77.338814", + "address_custom_data":{ + "sales rep id":"545", + "sales rep name":"Kellye Foster", + "retailer id":"173907" + } +} diff --git a/Route4MeSDKTest/bin/Debug/Data/Other files/orders 03-20-2017.csv b/Route4MeSDKTest/bin/Debug/Data/Other files/orders 03-20-2017.csv new file mode 100644 index 00000000..173fa576 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/Other files/orders 03-20-2017.csv @@ -0,0 +1,4 @@ +Longitude,Latitude,Address Alias,Address,City,State,Zip Code,Phone,Schedule Date +-85.948343,32.930977,"Dollar General-Alexander City,AL",1235 Cherokee Rd,Alexander City,AL,35010-3920,(256) 234-9012,3/9/2017 +-85.972485,32.936296,"Dollar General-Alexander City,AL",1538 Mill Sq,Alexander City,AL,35010-2674,(256) 215-5511,3/9/2017 +-85.9426244,33.0229598,"Dollar General-Alexander City,AL",6278 Alabama 63,Alexander City,AL,35771-7175,(256) 414-3086,3/9/2017 diff --git a/Route4MeSDKTest/bin/Debug/Data/Other files/orders.csv b/Route4MeSDKTest/bin/Debug/Data/Other files/orders.csv new file mode 100644 index 00000000..9b5abddc --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/Other files/orders.csv @@ -0,0 +1,21 @@ +id,order_id,address_1,cached_lat,cached_lng,color,curbside_lat,curbside_lng,day_scheduled_for_YYMMDD,address_alias,local_time_window_start,local_time_window_end,local_time_window_start_2,local_time_window_end_2,service_time,EXT_FIELD_first_name,EXT_FIELD_last_name,EXT_FIELD_email,EXT_FIELD_phone,order_icon +,,"1235 Cherokee Rd, Alexander City, AL",32.930977,-85.948343,,32.930977,-85.948343,,"Dollar General-Alexander City,AL",,,,,3,,,,(256) 234-9012, +,,"1538 Mill Sq, Alexander City, AL",32.936296,-85.972485,,32.936296,-85.972485,3/17/2017,"Dollar General-Alexander City,AL",,,,,3,,,,(256) 215-5511, +,,"6278 Alabama 63, Alexander City, AL",33.0229598,-85.9426244,,33.0229598,-85.9426244,,"Dollar General-Alexander City,AL",,,,,3,,,,(256) 414-3086, +,,"819 K St, Alexander City, AL",32.955069,-85.945398,,32.955069,-85.945398,,"Dollar General-Alexander City,AL",,,,,3,,,,(256) 409-1495, +,,"118 Shelby Street, Andalusia, AL",31.3196846,-86.4617237,,31.3196846,-86.4617237,,"Dollar General-Andalusia,AL",,,,,3,,,,(334) 222-5456, +,,"225 Church St, Andalusia, AL",31.308227,-86.484979,,31.308227,-86.484979,,"Dollar General-Andalusia,AL",,,,,3,,,,(334) 222-4642, +,,"28513 US Hwy 29, Andalusia, AL",31.3993549,-86.4794552,,31.3993549,-86.4794552,,"Dollar General-Andalusia,AL",,,,,3,,,,(334) 388-2771, +,,"925 River Fall St, Andalusia, AL",31.31455,-86.495167,,31.31455,-86.495167,,"Dollar General-Andalusia,AL",,,,,3,,,,(334) 222-1762, +,,"1421 Golden Springs Rd, Anniston, AL",33.627918,-85.78598,,33.627918,-85.78598,,"Dollar General-Anniston,AL",,,,,3,,,,(256) 831-8356, +,,"2363 Al Highway 202 Ste D, Anniston, AL",33.647234,-85.861063,,33.647234,-85.861063,,"Dollar General-Anniston,AL",,,,,3,,,,(256) 240-2939, +,,"2605 Us Highway 431 N, Anniston, AL",33.715829,-85.86024,,33.715829,-85.86024,,"Dollar General-Anniston,AL",,,,,3,,,,(256) 820-1110, +,,"3115 Noble Street, Anniston, AL",33.686131,-85.829786,,33.686131,-85.829786,,"Dollar General-Anniston,AL",,,,,3,,,,(256) 231-4895, +,,"3440 Choccolocco Rd, Anniston, AL",33.649725,-85.72774,,33.649725,-85.72774,,"Dollar General-Anniston,AL",,,,,3,,,,(256) 238-6112, +,,"704 S Quintard Ave, Anniston, AL",33.638181,-85.825559,,33.638181,-85.825559,,"Dollar General-Anniston,AL",,,,,3,,,,(256) 238-6802, +,,"1031 A Hwy 72 E, Athens, AL",34.785661,-86.954561,,34.785661,-86.954561,,"Dollar General-Athens,AL",,,,,3,,,,(256) 771-1577, +,,"1210 N Jefferson St, Athens, AL",34.8151,-86.971845,,34.8151,-86.971845,,"Dollar General-Athens,AL",,,,,3,,,,(256) 216-0902, +,,"1233 E Pryor St, Athens, AL",34.806887,-86.950568,,34.806887,-86.950568,,"Dollar General-Athens,AL",,,,,3,,,,(256) 233-5496, +,,"12375 Us Highway 72, Athens, AL",34.792682,-87.100288,,34.792682,-87.100288,,"Dollar General-Athens,AL",,,,,3,,,,(256) 729-0601, +,,"15297 Pike Road, Athens, AL",34.7760221,-86.9216368,,34.7760221,-86.9216368,,"Dollar General-Athens,AL",,,,,3,,,,(256) 434-8277, +,,"16521 Al Highway 251, Athens, AL",34.824273,-86.904476,,34.824273,-86.904476,,"Dollar General-Athens,AL",,,,,3,,,,(256) 233-2138, diff --git a/Route4MeSDKTest/bin/Debug/Data/Other files/orders_1000.csv b/Route4MeSDKTest/bin/Debug/Data/Other files/orders_1000.csv new file mode 100644 index 00000000..6224e415 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/Other files/orders_1000.csv @@ -0,0 +1,1000 @@ +-85.948343,32.930977,"Dollar General-Alexander City,AL",1235 Cherokee Rd,Alexander City,AL,35010-3920,(256) 234-9012,3/9/2017 +-85.972485,32.936296,"Dollar General-Alexander City,AL",1538 Mill Sq,Alexander City,AL,35010-2674,(256) 215-5511,3/9/2017 +-85.9426244,33.0229598,"Dollar General-Alexander City,AL",6278 Alabama 63,Alexander City,AL,35771-7175,(256) 414-3086,3/9/2017 +-85.945398,32.955069,"Dollar General-Alexander City,AL",819 K St,Alexander City,AL,35010-1325,(256) 409-1495,3/9/2017 +-86.4617237,31.3196846,"Dollar General-Andalusia,AL",118 Shelby Street,Andalusia,AL,36420-2403,(334) 222-5456,3/7/2017 +-86.484979,31.308227,"Dollar General-Andalusia,AL",225 Church St,Andalusia,AL,36420-3701,(334) 222-4642,3/7/2017 +-86.4794552,31.3993549,"Dollar General-Andalusia,AL",28513 US Hwy 29,Andalusia,AL,36421-1315,(334) 388-2771,3/7/2017 +-86.495167,31.31455,"Dollar General-Andalusia,AL",925 River Fall St,Andalusia,AL,36420-2557,(334) 222-1762,3/7/2017 +-85.78598,33.627918,"Dollar General-Anniston,AL",1421 Golden Springs Rd,Anniston,AL,36207-6923,(256) 831-8356,3/8/2017 +-85.861063,33.647234,"Dollar General-Anniston,AL",2363 Al Highway 202 Ste D,Anniston,AL,36201-5331,(256) 240-2939,3/8/2017 +-85.86024,33.715829,"Dollar General-Anniston,AL",2605 Us Highway 431 N,Anniston,AL,36206-1006,(256) 820-1110,3/8/2017 +-85.829786,33.686131,"Dollar General-Anniston,AL",3115 Noble Street,Anniston,AL,36201,(256) 231-4895,3/8/2017 +-85.72774,33.649725,"Dollar General-Anniston,AL",3440 Choccolocco Rd,Anniston,AL,36207-1640,(256) 238-6112,3/8/2017 +-85.825559,33.638181,"Dollar General-Anniston,AL",704 S Quintard Ave,Anniston,AL,36201-6677,(256) 238-6802,3/8/2017 +-86.954561,34.785661,"Dollar General-Athens,AL",1031 A Hwy 72 E,Athens,AL,35611-4330,(256) 771-1577,3/8/2017 +-86.971845,34.8151,"Dollar General-Athens,AL",1210 N Jefferson St,Athens,AL,35611-1615,(256) 216-0902,3/8/2017 +-86.950568,34.806887,"Dollar General-Athens,AL",1233 E Pryor St,Athens,AL,35611,(256) 233-5496,3/8/2017 +-87.100288,34.792682,"Dollar General-Athens,AL",12375 Us Highway 72,Athens,AL,35611-8577,(256) 729-0601,3/8/2017 +-86.9216368,34.7760221,"Dollar General-Athens,AL",15297 Pike Road,Athens,AL,35613-2863,(256) 434-8277,3/8/2017 +-86.904476,34.824273,"Dollar General-Athens,AL",16521 Al Highway 251,Athens,AL,35613-5047,(256) 233-2138,3/8/2017 +-87.003163,34.790973,"Dollar General-Athens,AL",17837 Us Highway 72,Athens,AL,35611-3903,(256) 771-0018,3/8/2017 +-87.018484,34.833503,"Dollar General-Athens,AL",19300 Al Highway 99,Athens,AL,35614-5473,(256) 233-4006,3/8/2017 +-86.97267,34.796979,"Dollar General-Athens,AL",600 S Jefferson St,Athens,AL,35611-3544,(256) 233-1255,3/8/2017 +-85.458874,32.6199874,"Dollar General-Auburn,AL",1106 Opelika Rd,Auburn,AL,36830-3312,(334) 246-5254,3/9/2017 +-85.4893036,32.5793457,"Dollar General-Auburn,AL",196 East University Dr,Auburn,AL,36832-6726,(334) 501-1319,3/9/2017 +-85.520149,32.5816083,"Dollar General-Auburn,AL",1961 Wire Rd,Auburn,AL,36832,(334) 246-0839,3/9/2017 +-85.5807904,32.600422,"Dollar General-Auburn,AL",5334 AL Hwy 14 W,Auburn,AL,36832-1861,(334) 521-3301,3/9/2017 +-86.994274,33.353238,"Dollar General-Bessemer,AL",1750 4Th Ave Sw,Bessemer,AL,35022-5223,(205) 424-9007,3/10/2017 +-86.981344,33.418536,"Dollar General-Bessemer,AL",2417 19th St N,Bessemer,AL,35020,(205) 428-6494,3/10/2017 +-86.949779,33.419247,"Dollar General-Bessemer,AL",3011 9th Ave N,Bessemer,AL,35020,(205) 424-4820,3/10/2017 +-87.0242453,33.4630995,"Dollar General-Bessemer,AL",3459 Warrior River Road,Bessemer,AL,35023-1039,(205) 461-1513,3/10/2017 +-86.960497,33.345268,"Dollar General-Bessemer,AL",3979 Parwood Rd-Ste#117,Bessemer,AL,35022-5627,(205) 424-8076,3/10/2017 +-86.98021,33.38575,"Dollar General-Bessemer,AL",671 9th Ave SW,Bessemer,AL,35022-4503,(205) 428-0906,3/10/2017 +-86.776885,33.580622,"Dollar General-Birmingham,AL",1200 Pinson Valley Pkwy,Birmingham,AL,35217-2327,(205) 841-0903,3/9/2017 +-86.8976,33.567022,"Dollar General-Birmingham,AL",1552 Forestdale Blvd,Birmingham,AL,35214-3018,(205) 791-6795,3/9/2017 +-86.684644,33.631809,"Dollar General-Birmingham,AL",1687 Center Point Pkwy Ste 121,Birmingham,AL,35215-5525,(205) 815-0132,3/9/2017 +-86.8943863,33.5101242,"Dollar General-Birmingham,AL",2007 Avenue H,Birmingham,AL,35218-1625,(205) 383-3862,3/9/2017 +-86.648151,33.653061,"Dollar General-Birmingham,AL",2260 Brewster Rd,Birmingham,AL,35235-3501,(205) 853-0113,3/9/2017 +-86.877031,33.498156,"Dollar General-Birmingham,AL",2314 Warrior Rd,Birmingham,AL,35208-3514,(205) 781-2035,3/9/2017 +-86.684017,33.646795,"Dollar General-Birmingham,AL",2328 Center Point Rd,Birmingham,AL,35215-3608,(205) 520-9502,3/9/2017 +-86.921604,33.580464,"Dollar General-Birmingham,AL",2419 Palomino Lane,Birmingham,AL,35214-1917,(205) 798-3835,3/9/2017 +-86.941233,33.52984,"Dollar General-Birmingham,AL",3150 Birmingport Rd,Birmingham,AL,35224-2861,(205) 785-6457,3/9/2017 +-86.7844162,33.6327591,"Dollar General-Birmingham,AL",3194 New Castle Rd,Birmingham,AL,36017-4127,(205) 386-3071,3/9/2017 +-86.819284,33.554852,"Dollar General-Birmingham,AL",3301 26th Street North,Birmingham,AL,35207,(205) 208-0290,3/9/2017 +-86.727789,33.634879,"Dollar General-Birmingham,AL",3931 Pinson Valley Pkwy,Birmingham,AL,35217-1857,(205) 856-6999,3/9/2017 +-86.7622907,33.5272989,"Dollar General-Birmingham,AL",4600 5th Avenue South,Birmingham,AL,35222-2904,(205) 206-4348,3/9/2017 +-86.70466,33.584619,"Dollar General-Birmingham,AL",9088 Parkway E,Birmingham,AL,35206-1505,(205) 836-3907,3/9/2017 +-86.851509,33.505408,"Dollar General-Birmingham,AL",915 3rd Ave West,Birmingham,AL,35204,(205) 623-3245,3/9/2017 +-86.843732,33.480477,"Dollar General-Birmingham,AL",917 Dennison Avenue,Birmingham,AL,35211,(205) 326-8007,3/9/2017 +-87.053871,34.20989,"Dollar General-Cullman,AL",11511 Us Highway 278 W,Cullman,AL,35057-6241,(256) 747-2506,3/7/2017 +-86.948499,34.23962,"Dollar General-Cullman,AL",11590 Al Highway 157,Cullman,AL,35057-6718,(256) 734-7998,3/7/2017 +-86.8812467,34.1696698,"Dollar General-Cullman,AL",120 Us Hwy 278,Cullman,AL,35057,(256) 841-3594,3/7/2017 +-86.683392,34.247595,"Dollar General-Cullman,AL",120 Wesley Avenue North,Cullman,AL,35058,(256) 796-5037,3/7/2017 +-86.851215,34.171909,"Dollar General-Cullman,AL",1208 4Th St Sw,Cullman,AL,35055-3923,(256) 735-0066,3/7/2017 +-86.828598,34.2099915,"Dollar General-Cullman,AL",121 CR 1435,Cullman,AL,35058-1474,(256) 841-4499,3/7/2017 +-86.815853,34.18211,"Dollar General-Cullman,AL",1600 3Rd St Se,Cullman,AL,35055-2074,(256) 734-5478,3/7/2017 +-86.836086,34.160263,"Dollar General-Cullman,AL",1642 Town Sq Sw,Cullman,AL,35055-5263,(256) 734-4392,3/7/2017 +-86.843341,34.176203,"Dollar General-Cullman,AL",203 1St Ave Sw,Cullman,AL,35055-3413,(256) 739-5456,3/7/2017 +-86.871628,34.106817,"Dollar General-Cullman,AL",31 Megan Ln,Cullman,AL,35057-3369,(256) 734-0560,3/7/2017 +-86.7406998,34.2638512,"Dollar General-Cullman,AL",6091 Cr 747,Cullman,AL,35038,(256) 615-4688,3/7/2017 +-86.84947,34.184465,"Dollar General-Cullman,AL",801 2Nd Ave Nw,Cullman,AL,35055-2401,(256) 775-1519,3/7/2017 +-87.001919,34.5603,"Dollar General-Decatur,AL",1000 Beltline Rd Sw Ste U,Decatur,AL,35601-6280,(256) 350-7377,3/6/2017 +-86.982764,34.523282,"Dollar General-Decatur,AL",1218 Mill Rd,Decatur,AL,35603-4817,(256) 308-2336,3/6/2017 +-86.98035,34.583979,"Dollar General-Decatur,AL",1502B 6Th Ave Se,Decatur,AL,35601-4918,(256) 350-6577,3/6/2017 +-87.012109,34.604216,"Dollar General-Decatur,AL",1731 Moulton St W,Decatur,AL,35601-7235,(256) 350-0494,3/6/2017 +-87.009244,34.574358,"Dollar General-Decatur,AL",2006 Danville Rd Sw,Decatur,AL,35601-4640,(256) 351-0022,3/6/2017 +-87.032933,34.588599,"Dollar General-Decatur,AL",2400 Old Moulton Rd Sw,Decatur,AL,35603-4474,(256) 353-4300,3/6/2017 +-85.405309,31.226458,"Dollar General-Dothan,AL",1060 W Main St Ste 4,Dothan,AL,36301-1469,(334) 678-6036,3/7/2017 +-85.398187,31.2373441,"Dollar General-Dothan,AL",1071 Montgomery Hwy 231,Dothan,AL,36303,(334) 803-8824,3/7/2017 +-85.375218,31.193269,"Dollar General-Dothan,AL",1702 E Cottonwood Rd,Dothan,AL,36301-5060,(334) 794-1543,3/7/2017 +-85.364248,31.218559,"Dollar General-Dothan,AL",1815 E Main St Ste 1,Dothan,AL,36301-3013,(334) 702-7897,3/7/2017 +-85.388274,31.255949,"Dollar General-Dothan,AL",2301 Reeves St,Dothan,AL,36303-5815,(334) 673-0926,3/7/2017 +-85.419088,31.243572,"Dollar General-Dothan,AL",2505 Montgomery Hwy,Dothan,AL,36303-2603,(334) 678-9865,3/7/2017 +-85.436193,31.199492,"Dollar General-Dothan,AL",2865 Hartford Hwy,Dothan,AL,36305-4901,(334) 702-7652,3/7/2017 +-85.430808,31.216803,"Dollar General-Dothan,AL",2890 Ross Clark Cir,Dothan,AL,36301-2017,(334) 671-7041,3/7/2017 +-85.402246,31.174393,"Dollar General-Dothan,AL",3600 S Oates St,Dothan,AL,36301-0604,(334) 671-4785,3/7/2017 +-85.524922,31.23867,"Dollar General-Dothan,AL",41 North Bay Springs Rd,Dothan,AL,36303,(334) 692-3038,3/7/2017 +-85.485463,31.210717,"Dollar General-Dothan,AL",6130 Fortner St,Dothan,AL,36305-6822,(334) 671-2715,3/7/2017 +-85.3311619,31.1239015,"Dollar General-Dothan,AL",670 Gene Terry Road,Dothan,AL,35022-4503,(334) 803-8223,3/7/2017 +-85.401197,31.20988,"Dollar General-Dothan,AL",767 W Selma St Unit 1,Dothan,AL,36301-3467,(334) 794-0660,3/7/2017 +-91.638237,35.73733,"Dollar General-Batesville,AR",12 Allen Chapel Rd,Batesville,AR,72501-9787,(870) 251-0210,3/9/2017 +-91.6247488,35.7001054,"Dollar General-Batesville,AR",1979 Batesville Blvd,Batesville,AR,72501-7896,(870) 376-4467,3/9/2017 +-91.659078,35.77586,"Dollar General-Batesville,AR",858 N Central Ave,Batesville,AR,72501-5411,(870) 793-7702,3/9/2017 +-91.625869,35.770097,"Dollar General-Batesville,AR",925 24Th St,Batesville,AR,72501-6106,(870) 612-5920,3/9/2017 +-92.588262,34.563625,"Dollar General-Benton,AR",102 N Market St,Benton,AR,72015-3769,(501) 778-2426,3/7/2017 +-92.57815,34.575527,"Dollar General-Benton,AR",1225 Military Rd,Benton,AR,72015-2908,(501) 778-8827,3/7/2017 +-92.560985,34.628886,"Dollar General-Benton,AR",1279 Salem Rd,Benton,AR,72019,(501) 794-2498,3/7/2017 +-92.5547082,34.5563149,"Dollar General-Benton,AR",2725 Edison Ave,Benton,AR,72015,(501) 303-6628,3/7/2017 +-92.5424827,34.5749865,"Dollar General-Benton,AR",3801 Benton Pkwy,Benton,AR,72015-8500,(501) 574-0279,3/7/2017 +-92.5662075,34.699448,"Dollar General-Benton,AR",3904 Congo Rd,Benton,AR,72019-1736,(501) 574-3233,3/7/2017 +-92.579613,34.557588,"Dollar General-Benton,AR",714 Edison Ave,Benton,AR,72015-4512,(501) 776-2747,3/7/2017 +-92.02754,34.976663,"Dollar General-Cabot,AR",14 Prospect Ct,Cabot,AR,72023-2899,(501) 843-9558,3/8/2017 +-92.0633396,34.9816006,"Dollar General-Cabot,AR",3520 W Main Street,Cabot,AR,72023,(501) 843-0614,3/8/2017 +-92.02111,34.970348,"Dollar General-Cabot,AR",524 S 2Nd St,Cabot,AR,72023-2542,(501) 941-2729,3/8/2017 +-92.008408,34.961368,"Dollar General-Cabot,AR",651 S Pine St,Cabot,AR,72023-3825,(501) 843-8404,3/8/2017 +-92.442963,35.067832,"Dollar General-Conway,AR",1305 Dave Ward Dr,Conway,AR,72034-6943,(501) 450-9474,3/8/2017 +-92.404837,35.091208,"Dollar General-Conway,AR",1600 E Oak St,Conway,AR,72032-4740,(501) 764-1828,3/8/2017 +-92.451316,35.111762,"Dollar General-Conway,AR",2560 Donaghey,Conway,AR,72032-2860,(501) 329-3036,3/8/2017 +-92.432007,35.112214,"Dollar General-Conway,AR",379 Highway 65 N,Conway,AR,72032,(501) 327-2020,3/8/2017 +-92.32789,35.083072,"Dollar General-Conway,AR",506 Hwy 64 East,Conway,AR,72032,(501) 358-4067,3/8/2017 +-92.49777,35.091086,"Dollar General-Conway,AR",816 Hogan Ln,Conway,AR,72034-7953,(501) 504-2464,3/8/2017 +-119.022464,35.408628,"Dollar General Market-Bakersfield,CA",111 Roberts Lane,Bakersfield,CA,93308,(661) 401-7837,3/8/2017 +-118.976076,35.378443,"Dollar General-Bakersfield,CA",1616 Niles Street,Bakersfield,CA,93306,(661) 369-7745,3/8/2017 +-119.021337,35.426923,"Dollar General-Bakersfield,CA",2317 N Chester Ave,Bakersfield,CA,93308,(661) 369-7564,3/8/2017 +-118.99496,35.39026,"Dollar General Market-Bakersfield,CA",258 Bernard Street,Bakersfield,CA,93305-3541,(661) 371-4562,3/8/2017 +-118.953877,35.37612,"Dollar General Market-Bakersfield,CA",2900 Niles Street,Bakersfield,CA,93306,(661) 369-7137,3/8/2017 +-119.037342,35.354119,"Dollar General Market-Bakersfield,CA",3030 Brundage Lane,Bakersfield,CA,93304,(661) 401-7867,3/8/2017 +-119.037353,35.332197,"Dollar General-Bakersfield,CA",3101 Wilson Road,Bakersfield,CA,93304,(661) 369-7401,3/8/2017 +-119.003069,35.36075,"Dollar General Market-Bakersfield,CA",401 Union Avenue,Bakersfield,CA,93308-1433,(661) 401-7839,3/8/2017 +-119.057709,35.318018,"Dollar General-Bakersfield,CA",5101 White Lane,Bakersfield,CA,93309-8925,(661) 371-4069,3/8/2017 +-82.546374,27.491642,"Dollar General-Bradenton,FL",1525 9Th Ave E,Bradenton,FL,34208-2204,(941) 746-6274,3/7/2017 +-82.591095,27.4950886,"Dollar General-Bradenton,FL",2923 W Manatee Ave,Bradenton,FL,34205-4238,(941) 348-6898,3/7/2017 +-82.562794,27.467982,"Dollar General Market-Bradenton,FL",3611 1St St Ste 1200,Bradenton,FL,34208-4432,(941) 747-1347,3/7/2017 +-82.608929,27.462707,"Dollar General-Bradenton,FL",4726 Cortez Rd West,Bradenton,FL,34210-2801,(941) 792-6192,3/7/2017 +-82.546847,27.450998,"Dollar General-Bradenton,FL",5102 15th St E # E,Bradenton,FL,34203-4858,(941) 727-1176,3/7/2017 +-82.521564,27.449452,"Dollar General-Bradenton,FL",5177 33rd St E # 11,Bradenton,FL,34203-4328,(941) 727-4557,3/7/2017 +-82.57551,27.42716,"Dollar General-Bradenton,FL",6414 14th St W Ste A,Bradenton,FL,34207-5329,(941) 752-0334,3/7/2017 +-82.626661,27.495887,"Dollar General-Bradenton,FL",6545 Manatee Ave W,Bradenton,FL,34209-2326,(941) 792-2752,3/7/2017 +-82.3755325,28.5791443,"Dollar General-Brooksville,FL",10395 Broad St,Brooksville,FL,34601,(352) 796-9690,3/8/2017 +-82.5124479,28.5337459,"Dollar General-Brooksville,FL",12983 Cortez Blvd,Brooksville,FL,34613-4884,(352) 597-3644,3/8/2017 +-82.455652,28.480822,"Dollar General-Brooksville,FL",16312 Spring Hill Dr # 6,Brooksville,FL,34604-0607,(352) 799-8056,3/8/2017 +-82.228374,28.524854,"Dollar General-Brooksville,FL",6336 Sherman Hills Blvd,Brooksville,FL,34602-7610,(352) 544-6276,3/8/2017 +-82.400221,28.546875,"Dollar General-Brooksville,FL",856 S Broad St,Brooksville,FL,34601-3105,(352) 799-0928,3/8/2017 +-82.005528,26.667106,"Dollar General-Cape Coral,FL",1523 Tropicana Parkway West,Cape Coral,FL,33993,(239) 242-0713,3/8/2017 +-81.9914402,26.6225995,"Dollar General-Cape Coral,FL",1612 Skyline Blvd,Cape Coral,FL,33991-2645,(239) 574-1959,3/8/2017 +-81.940984,26.609532,"Dollar General-Cape Coral,FL",2323 Del Prado Blvd S,Cape Coral,FL,33990-4615,(239) 772-4344,3/8/2017 +-81.9570348,26.6960645,"Dollar General-Cape Coral,FL",2328 Andalusia Blvd,Cape Coral,FL,33909-2301,(239) 677-4924,3/8/2017 +-82.00691,26.593465,"Dollar General-Cape Coral,FL",3123 Chiquita Blvd S,Cape Coral,FL,33914-4265,(239) 541-3077,3/8/2017 +-81.956883,26.659926,"Dollar General-Cape Coral,FL",924 Ne Pine Island Rd,Cape Coral,FL,33909-2552,(239) 574-5365,3/8/2017 +-82.796088,27.981018,"Dollar General-Clearwater,FL",1600 N Myrtle Ave,Clearwater,FL,33755-2549,(727) 443-1565,3/6/2017 +-82.775284,27.989291,"Dollar General-Clearwater,FL",1883 N Highland Ave,Clearwater,FL,33755-2156,(727) 442-1710,3/6/2017 +-82.746349,27.970962,"Dollar General-Clearwater,FL",422 N Belcher Rd,Clearwater,FL,33765-2606,(727) 446-7461,3/6/2017 +-82.705695,27.872082,"Dollar General-Clearwater,FL",5251 110th Ave N Ste 108,Clearwater,FL,33760-4816,(727) 592-9618,3/6/2017 +-86.549027,30.7598137,"Dollar General-Crestview,FL",1601 James Lee Blvd East,Crestview,FL,32539-3227,(850) 634-0879,3/9/2017 +-86.572807,30.726268,"Dollar General-Crestview,FL",225 Rasberry Rd,Crestview,FL,32536-6426,(850) 683-3550,3/9/2017 +-86.577188,30.762846,"Dollar General-Crestview,FL",318 W James Lee Blvd,Crestview,FL,32536,(850) 423-9707,3/9/2017 +-86.565313,30.771921,"Dollar General-Crestview,FL",783 N Ferdon Blvd,Crestview,FL,32536-2113,(850) 682-5752,3/9/2017 +-82.579906,28.865221,"Dollar General-Crystal River,FL",298 N Suncoast Blvd,Crystal River,FL,34429-5465,(352) 795-8854,3/10/2017 +-82.547598,28.890434,"Dollar General-Crystal River,FL",6798 W Gulf To Lake Hwy,Crystal River,FL,34429-9426,(352) 564-2010,3/10/2017 +-82.584748,28.890044,"Dollar General-Crystal River,FL",736 Se US Hwy 19,Crystal River,FL,34429-4810,(352) 564-0811,3/10/2017 +-82.5698013,28.9780426,"Dollar General-Crystal River,FL",7958 North Citrus Avenue,Crystal River,FL,34428-6943,(352) 364-4226,3/10/2017 +-81.281757,29.028086,"Dollar General-Deland,FL",1110 E New York Ave,Deland,FL,32724-5750,(386) 736-3344,3/10/2017 +-81.302785,29.002208,"Dollar General-Deland,FL",1512 S Woodland Blvd,Deland,FL,32720-7709,(386) 736-7022,3/10/2017 +-81.2624071,29.0634862,"Dollar General-Deland,FL",2110 E International Speedway,Deland,FL,32724-8709,(386) 736-7406,3/10/2017 +-81.313632,29.078242,"Dollar General-Deland,FL",2531 N Woodland Blvd,Deland,FL,32720-1301,(386) 736-0262,3/10/2017 +-81.324527,29.039557,"Dollar General-Deland,FL",745 N Spring Garden Ave,Deland,FL,32720,(386) 734-8664,3/10/2017 +-84.184788,31.587223,"Dollar General-Albany,GA",1411 Dawson Rd,Albany,GA,31707-3855,(229) 889-1686,3/6/2017 +-84.136963,31.549598,"Dollar General-Albany,GA",1515 Radium Springs Rd,Albany,GA,31705-4051,(229) 420-7774,3/6/2017 +-84.116107,31.632034,"Dollar General-Albany,GA",1775 Philema Rd S,Albany,GA,31701-4740,(229) 420-8747,3/6/2017 +-84.155141,31.555468,"Dollar General-Albany,GA",1824 Martin Luther King J,Albany,GA,31701,(229) 888-1169,3/6/2017 +-84.10289,31.570774,"Dollar General-Albany,GA",1906 E Oglethorpe Blvd,Albany,GA,31705-2935,(229) 436-5325,3/6/2017 +-84.161871,31.57608,"Dollar General-Albany,GA",2017 N Slappery Blvd,Albany,GA,31701-1008,(229) 446-8141,3/6/2017 +-84.207391,31.60661,"Dollar General-Albany,GA",2401 Dawson Rd Ste C,Albany,GA,31707-2381,(229) 435-2816,3/6/2017 +-84.118219,31.464175,"Dollar General-Albany,GA",2401 Liberty Expressway,Albany,GA,31705,(229) 888-7474,3/8/2017 +-84.1415558,31.5747318,"Dollar General-Albany,GA",300 East Oglethorpe Boulevard,Albany,GA,31705,(229) 255-3920,3/8/2017 +-84.177123,31.623373,"Dollar General-Albany,GA",3005 N Slappey Blvd,Albany,GA,31701-1021,(229) 639-1160,3/8/2017 +-84.220933,31.573665,"Dollar General-Albany,GA",327 S Westover Blvd,Albany,GA,31707-0609,(229) 888-1564,3/8/2017 +-84.1757965,31.5711479,"Dollar General-Albany,GA",408 South Slappy Blvd,Albany,GA,31701,(229) 432-2210,3/8/2017 +-84.0322606,31.5738165,"Dollar General-Albany,GA",4805 Hill Road,Albany,GA,31705,(229) 518-6226,3/8/2017 +-84.20059,31.5145,"Dollar General-Albany,GA",5731 Newton Road,Albany,GA,31701,(229) 420-7387,3/8/2017 +-83.338839,33.925919,"Dollar General-Athens,GA",1055 Gaines School Rd,Athens,GA,30605-3164,(706) 227-0844,3/7/2017 +-83.3911438,33.9538155,"Dollar General-Athens,GA",1125 West Broad Street,Athens,GA,30606,(706) 247-7861,3/7/2017 +-83.401819,34.03253,"Dollar General-Athens,GA",11325 Commerce Hwy,Athens,GA,30607-4321,(706) 227-0008,3/7/2017 +-83.3403499,33.9447653,"Dollar General-Athens,GA",2194 Lexington Road,Athens,GA,30605-2338,(706) 395-5876,3/7/2017 +-83.412977,33.972517,"Dollar General Market-Athens,GA",2411 Jefferson Rd,Athens,GA,30607-1202,(706) 354-4660,3/7/2017 +-83.360936,33.982984,"Dollar General-Athens,GA",800 Danielsville Rd,Athens,GA,30601,(706) 389-9632,3/7/2017 +-83.3647232,33.899395,"Dollar General-Athens,GA",880 Whitehall Road,Athens,GA,30605-4223,(706) 395-8426,3/7/2017 +-81.9463194,33.4681488,"Dollar General-Augusta,GA",101 Sand Bar Ferry Rd,Augusta,GA,30901,(706) 250-6129,3/9/2017 +-82.137887,33.495839,"Dollar General-Augusta,GA",210 S Belair Rd,Augusta,GA,30907-9301,(706) 863-3955,3/9/2017 +-82.011242,33.497197,"Dollar General-Augusta,GA",2344 Washington Rd,Augusta,GA,30904-3162,(706) 667-8028,3/9/2017 +-82.018253,33.44306,"Dollar General-Augusta,GA",2549 Deans Bridge Rd,Augusta,GA,30906,(706) 733-2778,3/9/2017 +-82.026068,33.41111,"Dollar General-Augusta,GA",3120 Peach Orchard Rd,Augusta,GA,30906-3564,(706) 796-7151,3/9/2017 +-82.053443,33.46999,"Dollar General-Augusta,GA",3134 Wrightsboro Rd,Augusta,GA,30909-0316,(706) 736-7556,3/9/2017 +-82.067501,33.420422,"Dollar General-Augusta,GA",3250 Deans Bridge Rd,Augusta,GA,30906-4218,(706) 790-7052,3/9/2017 +-84.0027161,34.8469162,"Dollar General-Blairsville,GA",36 Kiutuestia Creek Rd,Blairsville,GA,30512-4315,(706) 487-8036,3/10/2017 +-84.092959,34.87718,"Dollar General-Blairsville,GA",42 Copperhead Rd,Blairsville,GA,30512-3459,(706) 745-9826,3/10/2017 +-83.971603,34.87569,"Dollar General-Blairsville,GA",513 F Murphy Highway Po Box 1205,Blairsville,GA,30512-3168,(706) 781-1826,3/10/2017 +-83.895961,34.800221,"Dollar General-Blairsville,GA",5267 Gainesville Hwy,Blairsville,GA,30512,(706) 835-2019,3/10/2017 +-84.0587845,34.9629669,"Dollar General-Blairsville,GA",93 Ivy Log Road [Po Box 1205],Blairsville,GA,30512,(706) 781-1826,3/10/2017 +-84.003179,34.9342,"Dollar General-Blairsville,GA",93 Ivyl0G Rd,Blairsville,GA,30512-1456,(706) 745-6573,3/10/2017 +-81.4573856,31.2271699,"Dollar General-Brunswick,GA",20 Higginbotham Rd,Brunswick,GA,31525,(912) 217-5762,3/7/2017 +-81.5388412,31.2375393,"Dollar General-Brunswick,GA",25 Cornerstone Lane Llc,Brunswick,GA,31523-4224,(912) 262-1144,3/7/2017 +-81.481348,31.160203,"Dollar General-Brunswick,GA",2701 J St,Brunswick,GA,31520-6131,(912) 265-2230,3/7/2017 +-81.4983945,31.1689599,"Dollar General-Brunswick,GA",2915 Norwich St,Brunswick,GA,31520,(912) 267-1515,3/7/2017 +-81.507184,31.24678,"Dollar General-Brunswick,GA",315 Venture Dr,Brunswick,GA,31525-9723,(912) 267-9453,3/7/2017 +-81.584796,31.140119,"Dollar General-Brunswick,GA",375 Palisade Dr,Brunswick,GA,31523-8207,(912) 267-6066,3/7/2017 +-81.5117506,31.2098448,"Dollar General-Brunswick,GA",4440 New Jessup Highway,Brunswick,GA,31520,(912) 289-3100,3/7/2017 +-81.4811741,31.2109566,"Dollar General-Brunswick,GA",5598 Altama Ave,Brunswick,GA,31525,(912) 265-8200,3/7/2017 +-84.922393,34.475714,"Dollar General-Calhoun,GA",1284 Curtis Pkwy,Calhoun,GA,30701-3919,(706) 629-4642,3/10/2017 +-84.937986,34.52703,"Dollar General-Calhoun,GA",200 Williams St Se,Calhoun,GA,30701-4690,(706) 629-0604,3/10/2017 +-85.1095477,34.4381583,"Dollar General-Calhoun,GA",3168 New Rosedale Road Ne,Calhoun,GA,30701,(706) 403-4454,3/10/2017 +-84.959057,34.500505,"Dollar General-Calhoun,GA",634 Oothcalooga St,Calhoun,GA,30701-2342,(706) 625-2565,3/10/2017 +-84.84304,34.448327,"Dollar General-Calhoun,GA",6935 Fairmount Hwy Se,Calhoun,GA,30701-4022,(706) 625-9005,3/10/2017 +-84.945,34.517022,"Dollar General-Calhoun,GA",920 N Wall St,Calhoun,GA,30701-1734,(706) 624-0480,3/10/2017 +-84.844327,34.538892,"Dollar General-Calhoun,GA",926 Hunts Gin Rd Ne,Calhoun,GA,30701-9500,(706) 629-4466,3/10/2017 +-85.079294,33.594451,"Dollar General-Carrollton,GA",1003 N Park St,Carrollton,GA,30117-2226,(770) 836-0173,3/6/2017 +-85.0980625,33.5876291,"Dollar General-Carrollton,GA",1078 Alabama Street,Carrollton,GA,30117-2004,(678) 321-0996,3/6/2017 +-85.0664493,33.5802195,"Dollar General-Carrollton,GA",111 Newnan Rd,Carrollton,GA,30117,(678) 321-7904,3/6/2017 +-85.02674,33.602355,"Dollar General-Carrollton,GA",1515 Bankhead Hwy,Carrollton,GA,30117-1852,(770) 838-7966,3/6/2017 +-85.073878,33.54757,"Dollar General-Carrollton,GA",1561 S Highway 27,Carrollton,GA,30117-8927,(770) 836-1617,3/6/2017 +-84.971382,33.644236,"Dollar General-Carrollton,GA",3960 Carrollton Villa Rica Hw,Carrollton,GA,30116-5539,(770) 836-0447,3/6/2017 +-85.1792523,33.62736,"Dollar General-Carrollton,GA",4043 Mt Zion Rd,Carrollton,GA,30117,(770) 836-3994,3/6/2017 +-85.084267,33.574885,"Dollar General-Carrollton,GA",827 Maple St,Carrollton,GA,30117-3625,(678) 796-1988,3/6/2017 +-84.788869,34.174803,"Dollar General-Cartersville,GA",104 Market Sq,Cartersville,GA,30120-2854,(770) 386-5700,3/10/2017 +-84.856562,34.229306,"Dollar General-Cartersville,GA",1316 Cassville Rd Nw,Cartersville,GA,30120-4870,(770) 387-2252,3/10/2017 +-84.815537,34.180915,"Dollar General-Cartersville,GA",265 Cassville Rd,Cartersville,GA,30120-2541,(770) 607-7572,3/10/2017 +-84.8287882,34.1484093,"Dollar General-Cartersville,GA",4 Walnut Grove Rd,Cartersville,GA,30120,none listed,3/10/2017 +-84.79039,34.197127,"Dollar General-Cartersville,GA",916 Joe Frank Harris Pkwy,Cartersville,GA,30120-9024,(770) 607-5429,3/10/2017 +-84.780569,34.728812,"Dollar General-Chatsworth,GA",100 Smyrna Ramhurst Rd E,Chatsworth,GA,30705-6785,(706) 517-4115,3/6/2017 +-84.774968,34.754789,"Dollar General-Chatsworth,GA",169 Blackwell Rd,Chatsworth,GA,30705-3057,(706) 695-8836,3/6/2017 +-84.811447,34.782748,"Dollar General-Chatsworth,GA",2180 Highway 76,Chatsworth,GA,30705-7301,(706) 695-1951,3/6/2017 +-84.7672272,34.7450981,"Dollar General-Chatsworth,GA",2676 Springplace Smyrna Rd,Chatsworth,GA,30705,(706) 517-1508,3/6/2017 +-84.9590836,32.4481583,"Dollar General-Columbus,GA",2301 Cusseta Road,Columbus,GA,31903,(706) 405-2007,3/8/2017 +-84.9825363,32.4875717,"Dollar General-Columbus,GA",2500 Hamilton Road,Columbus,GA,31904,(706) 405-3371,3/8/2017 +-84.955451,32.506638,"Dollar General-Columbus,GA",2602 Manchester Expy,Columbus,GA,31904-5207,(706) 653-5191,3/8/2017 +-84.944655,32.418716,"Dollar General-Columbus,GA",3649 Victory Dr,Columbus,GA,31903-4553,(706) 687-0044,3/8/2017 +-84.931542,32.489446,"Dollar General-Columbus,GA",3729 Macon Rd,Columbus,GA,31907-2203,(706) 561-7299,3/8/2017 +-84.931065,32.446473,"Dollar General-Columbus,GA",3846 Saint Marys Rd Unit Sc 09,Columbus,GA,31906-4550,(706) 682-5409,3/8/2017 +-84.92526,32.539764,"Dollar General-Columbus,GA",3885 Millder Rd Ste B,Columbus,GA,31909-4778,(706) 569-6216,3/8/2017 +-84.982563,32.511217,"Dollar General-Columbus,GA",4900 River Rd,Columbus,GA,31904-5837,(706) 321-0027,3/8/2017 +-84.906241,32.534826,"Dollar General-Columbus,GA",5120 Warm Springs Rd,Columbus,GA,31909-6902,(706) 565-9028,3/8/2017 +-84.8880157,32.5132904,"Dollar General-Columbus,GA",6001 Crystal Drive,Columbus,GA,31907,(706) 405-2733,3/8/2017 +-84.954835,32.539127,"Dollar General-Columbus,GA",6499 Veterans Pkwy Ste C,Columbus,GA,31909-6209,(706) 653-1664,3/8/2017 +-84.892584,32.463628,"Dollar General-Columbus,GA",915 Amber Dr Ste A,Columbus,GA,31907-7387,(706) 569-8505,3/8/2017 +-83.849263,33.557473,"Dollar General-Covington,GA",10734 Highway 36,Covington,GA,30014-4067,(678) 342-4545,3/10/2017 +-83.850241,33.423792,"Dollar General-Covington,GA",15797 Highway 36,Covington,GA,30014-6021,(770) 786-7861,3/10/2017 +-83.920444,33.556856,"Dollar General-Covington,GA",2481 Highway 81 S,Covington,GA,30014-8605,(678) 342-9917,3/10/2017 +-83.972719,33.603844,"Dollar General-Covington,GA",3227 Salem Rd,Covington,GA,30016,(770)761-8939,3/10/2017 +-84.017267,33.549715,"Dollar General-Covington,GA",5321 Highway 20 S,Covington,GA,30016-4409,(770) 788-8880,3/10/2017 +-83.87428,33.605354,"Dollar General-Covington,GA",6185 Highway 278 Nw,Covington,GA,30014-2127,(770) 786-6214,3/10/2017 +-83.840165,33.601267,"Dollar General-Covington,GA",7118 Highway 278 Ne,Covington,GA,30014-2669,(770) 788-9583,3/10/2017 +-84.797862,33.910747,"Dollar General-Dallas,GA",1293 Merchants Dr,Dallas,GA,30132-5036,(770) 505-4322,3/9/2017 +-84.84048,33.878005,"Dollar General-Dallas,GA",2388 Villa Rica Hwy,Dallas,GA,30157-7063,(678) 363-7398,3/9/2017 +-84.835947,34.044408,"Dollar General-Dallas,GA",24 Williams Rd,Dallas,GA,30132,(678) 809-6050,3/9/2017 +-84.99071,33.923925,"Dollar General-Dallas,GA",2425 Gold Mine Rd,Dallas,GA,30157-1248,(770) 505-9703,3/9/2017 +-84.785013,33.955907,"Dollar General-Dallas,GA",263 E Paulding Dr,Dallas,GA,30157-2701,(770) 445-6165,3/9/2017 +-84.854602,33.920083,"Dollar General-Dallas,GA",640 W Memorial Dr,Dallas,GA,30132-4123,(678) 363-0343,3/9/2017 +-84.944432,34.801111,"Dollar General-Dalton,GA",1004 Riverburch Pkwy,Dalton,GA,30721-8630,(706) 270-5774,3/8/2017 +-84.968489,34.761384,"Dollar General-Dalton,GA",101 W Walnut Ave Ste 1,Dalton,GA,30720-8426,(706) 275-9039,3/8/2017 +-84.986631,34.693036,"Dollar General-Dalton,GA",113 Phelps Rd Se,Dalton,GA,30720-7613,(706) 277-0749,3/8/2017 +-84.887341,34.81625,"Dollar General-Dalton,GA",1214 Dawnville Rd Ne,Dalton,GA,30721-6805,(706) 217-3080,3/8/2017 +-84.9989624,34.7394104,"Dollar General-Dalton,GA",1902 Dug Gap Road,Dalton,GA,30720,(706) 229-4150,3/8/2017 +-84.953755,34.768442,"Dollar General-Dalton,GA",2308 E Morris St,Dalton,GA,30721,(706) 278-0086,3/8/2017 +-84.945129,34.822623,"Dollar General-Dalton,GA",2524 Cleveland Hwy,Dalton,GA,30721-8157,(706) 370-4981,3/8/2017 +-84.9176002,34.7562227,"Dollar General-Dalton,GA",3417 Airport Road,Dalton,GA,30721-6102,(706) 508-4457,3/8/2017 +-84.965037,34.778182,"Dollar General-Dalton,GA",511 N Glenwood Ave,Dalton,GA,30721-2814,(706) 278-7940,3/8/2017 +-82.849904,31.508905,"Dollar General-Douglas,GA",1201 Hwy 221,Douglas,GA,31533-6852,(912) 383-9963,3/6/2017 +-82.851045,31.480967,"Dollar General-Douglas,GA",1730 Peterson Ave S,Douglas,GA,31535-5008,(912) 384-9506,3/6/2017 +-82.885419,31.518125,"Dollar General-Douglas,GA",2489 Hwy 32 W,Douglas,GA,31533-9082,(912) 383-0582,3/6/2017 +-82.8878693,31.4388498,"Dollar General-Douglas,GA",4074 Willacooche Highway,Douglas,GA,31535,(none listed),3/6/2017 +-82.850406,31.503005,"Dollar General-Douglas,GA",518 Peterson Ave S,Douglas,GA,31533-5254,(912) 384-2999,3/6/2017 +-84.698168,33.74858,"Dollar General-Douglasville,GA",2190 Midway Rd,Douglasville,GA,30135-1055,(770) 942-5580,3/8/2017 +-84.701161,33.692777,"Dollar General-Douglasville,GA",4061 Anneewakee Rd,Douglasville,GA,30135-4307,(770) 949-6140,3/8/2017 +-84.804988,33.673461,"Dollar General-Douglasville,GA",4870 Highway 5,Douglasville,GA,30135-4536,(770) 489-6634,3/8/2017 +-84.772593,33.704014,"Dollar General-Douglasville,GA",6040 Central Church Rd,Douglasville,GA,30135-6901,(770) 489-9687,3/8/2017 +-84.733443,33.758839,"Dollar General-Douglasville,GA",6134 E Broad St,Douglasville,GA,30134-2372,(770) 920-7666,3/8/2017 +-84.78141,33.759052,"Dollar General-Douglasville,GA",6307 Cedar Mountain Road,Douglasville,GA,30134-3504,(678) 324-9563,3/8/2017 +-84.8507186,33.6194857,"Dollar General-Douglasville,GA",8427 Hwy 166,Douglasville,GA,30135,(678) 383-9320,3/8/2017 +-91.731796,41.969243,"Dollar General-Cedar Rapids,IA",151 Jacolyn Dr Nw,Cedar Rapids,IA,52405-5529,(319) 390-1164,3/7/2017 +-91.632728,42.034179,"Dollar General-Cedar Rapids,IA",266 Blairs Ferry Rd Ne,Cedar Rapids,IA,52402-3161,(319) 373-7040,3/7/2017 +-91.707131,41.962916,"Dollar General-Cedar Rapids,IA",2741 16Th Ave Sw,Cedar Rapids,IA,52404-1633,(319) 398-9402,3/7/2017 +-91.61771,41.976696,"Dollar General-Cedar Rapids,IA",3451 Mount Vernon Rd Se,Cedar Rapids,IA,52403-3736,(319) 364-6099,3/7/2017 +-91.715804,41.97593,"Dollar General-Cedar Rapids,IA",403 Edgewood Rd Nw,Cedar Rapids,IA,52405-3651,(319) 390-1050,3/7/2017 +-90.541609,41.5721,"Dollar General-Davenport,IA",109 E 50Th St,Davenport,IA,52806-3958,(563) 386-4112,3/9/2017 +-90.545886,41.557084,"Dollar General-Davenport,IA",2170 E Kimberly Rd Ste 350,Davenport,IA,52807-2230,(563) 344-0792,3/9/2017 +-90.609761,41.515693,"Dollar General-Davenport,IA",2217 Rockingham Rd,Davenport,IA,52802-2809,(563) 323-8255,3/9/2017 +-90.615221,41.53837,"Dollar General-Davenport,IA",2604 W Locust St,Davenport,IA,52804-3347,(563) 391-0747,3/9/2017 +-90.610616,41.56079,"Dollar General-Davenport,IA",3936 N Pine St,Davenport,IA,52806-4944,(563) 391-2153,3/9/2017 +-90.569476,41.538134,"Dollar General-Davenport,IA",403 E Locust St,Davenport,IA,52803-4328,(563) 322-4025,3/9/2017 +-93.60169,41.526492,"Dollar General-Des Moines,IA",1020 E Army Post Rd,Des Moines,IA,50315-5939,(515) 256-7168,3/8/2017 +-93.599932,41.625982,"Dollar General-Des Moines,IA",1428 E Ovid Ave,Des Moines,IA,50316-1323,(515) 263-7910,3/8/2017 +-93.703204,41.57606,"Dollar General-Des Moines,IA",221 Sw 63Rd St,Des Moines,IA,50312-1501,(515) 255-8070,3/8/2017 +-93.568996,41.610513,"Dollar General-Des Moines,IA",2570 Hubbell Ave,Des Moines,IA,50317-6102,(515) 265-8141,3/8/2017 +-93.652564,41.58547,"Dollar General-Des Moines,IA",2650 Ingersoll Ave,Des Moines,IA,50312-5238,(515) 283-9084,3/8/2017 +-93.697759,41.623633,"Dollar General-Des Moines,IA",3102 Merle Hay Rd,Des Moines,IA,50310,(515) 278-3005,3/8/2017 +-93.64955,41.624158,"Dollar General-Des Moines,IA",3220 Martin Luther King Jr,Des Moines,IA,50310,(515) 422-9038,3/8/2017 +-93.596637,41.555004,"Dollar General-Des Moines,IA",3223 Se 14Th St Ste C,Des Moines,IA,50320-1331,(515) 282-7307,3/8/2017 +-93.644794,41.546034,"Dollar General-Des Moines,IA",4213 Fleur Dr,Des Moines,IA,50321-2325,(515) 953-0203,3/8/2017 +-87.641226,41.664372,"Dollar General-Chicago,IL",12635 S Halsted St,Chicago,IL,60628-7012,(773) 568-7194,3/9/2017 +-87.673869,41.750052,"Dollar General-Chicago,IL",2019 W 79Th Street,Chicago,IL,60620,(773) 994-5614,3/9/2017 +-87.559917,41.75179,"Dollar General-Chicago,IL",2649 E 79Th St,Chicago,IL,60649-5227,(773) 356-6388,3/9/2017 +-87.6313782,41.7073402,"Dollar General-Chicago,IL",316 W 103rd Street,Chicago,IL,60628-2504,(773) 796-3865,3/9/2017 +-87.714531,41.917188,"Dollar General-Chicago,IL",3527 W Armitage Ave,Chicago,IL,60647-3602,(773) 489-1103,3/9/2017 +-87.726188,41.866287,"Dollar General-Chicago,IL",4046 W Roosevelt Rd,Chicago,IL,60624-3937,(773) 826-0382,3/9/2017 +-87.7615014,41.9094676,"Dollar General-Chicago,IL",5434 W N Ave,Chicago,IL,60639-4347,(773) 796-5109,3/9/2017 +-87.613488,41.823867,"Dollar General-Chicago,IL",549 E Pershing Rd,Chicago,IL,60653-1915,(773) 924-3785,3/9/2017 +-87.695905,41.983716,"Dollar General-Chicago,IL",5627 N Lincoln Ave,Chicago,IL,60659,(773) 989-6805,3/9/2017 +-87.769033,41.938531,"Dollar General-Chicago,IL",5701 W Belmont Ave,Chicago,IL,60634,(773) 622-5846,3/9/2017 +-87.703148,41.780102,"Dollar General-Chicago,IL",6225 S Kedzie Ave,Chicago,IL,60629,(706) 624-6584,3/9/2017 +-87.683413,41.772187,"Dollar General-Chicago,IL",6647 S Western Ave,Chicago,IL,60636-2412,(309) 582-5338,3/9/2017 +-87.653228,41.744743,"Dollar General-Chicago,IL",8201 S Racine Ave,Chicago,IL,60620-3117,(773) 966-2551,3/9/2017 +-87.6628,41.725834,"Dollar General-Chicago,IL",9244 S Ashland Ave,Chicago,IL,60620-5050,(773) 546-9202,3/9/2017 +-88.98033,39.848958,"Dollar General-Decatur,IL",1467 King Ave,Decatur,IL,62522-1444,(217) 429-1099,3/8/2017 +-88.9807874,39.8214148,"Dollar General-Decatur,IL",1736 S Taylorville Road,Decatur,IL,62521,(217) 615-0156,3/8/2017 +-88.956349,39.822043,"Dollar General-Decatur,IL",250 W 1St Dr,Decatur,IL,62521-5206,(217) 423-9308,3/8/2017 +-88.950307,39.875549,"Dollar General-Decatur,IL",2922 N Martin Luther King Jr D,Decatur,IL,62526-2428,(217) 875-5310,3/8/2017 +-88.894819,39.824754,"Dollar General-Decatur,IL",3797 E Rte 36,Decatur,IL,62521-5085,(217) 428-6653,3/8/2017 +-88.9443348,39.846018,"Dollar General-Decatur,IL",969 E Eldorado Street,Decatur,IL,62521-1913,(217) 615-2969,3/8/2017 +-88.97023,39.876188,"Dollar General-Decatur,IL",985 W Pershing Rd Unit 3A,Decatur,IL,62526-1573,(217) 877-7506,3/8/2017 +-85.664373,40.061674,"Dollar General-Anderson,IN",1211 E 53Rd St,Anderson,IN,46013-2817,(765) 641-0147,3/7/2017 +-85.69574,40.076105,"Dollar General-Anderson,IN",1315 W 38Th St,Anderson,IN,46013-1007,(765) 643-0514,3/7/2017 +-85.711009,40.097352,"Dollar General-Anderson,IN",1812 Raible Ave,Anderson,IN,46011-4136,(765) 643-0091,3/7/2017 +-85.653008,40.11185,"Dollar General-Anderson,IN",415 S Scatterfield Rd,Anderson,IN,46012-3602,(765) 642-6805,3/7/2017 +-85.900644,39.196211,"Dollar General-Columbus,IN",2150 State St,Columbus,IN,47201-7306,(812) 378-9641,3/7/2017 +-85.894859,39.22505,"Dollar General-Columbus,IN",2550 Eastbrook Plaza,Columbus,IN,47201-3738,(812) 372-3440,3/7/2017 +-85.877107,39.2236,"Dollar General-Columbus,IN",3880 25Th St,Columbus,IN,47203-3005,(812) 376-8781,3/7/2017 +-85.969884,39.199978,"Dollar General-Columbus,IN",4130 W Jonathan Moore Pike,Columbus,IN,47201-8667,(812) 342-2575,3/7/2017 +-85.954212,39.293203,"Dollar General-Columbus,IN",9620 N Us Highway 31,Columbus,IN,47201-8538,(812) 526-5737,3/7/2017 +-86.4428095,37.01177,"Dollar General-Bowling Green,KY",1464 Ky 185,Bowling Green,KY,42101-7619,(270) 842-4546,3/8/2017 +-86.447797,36.980276,"Dollar General-Bowling Green,KY",1554 Us 31W Byp,Bowling Green,KY,42101-3070,(270) 781-9787,3/8/2017 +-86.390328,37.008783,"Dollar General Market-Bowling Green,KY",180 River Place Ave,Bowling Green,KY,42101-7128,(270) 842-0701,3/8/2017 +-86.425718,36.945307,"Dollar General-Bowling Green,KY",1950 Cave Mill Rd,Bowling Green,KY,42104-6337,(270) 843-3427,3/8/2017 +-86.487599,36.963086,"Dollar General-Bowling Green,KY",2556 Russellville Rd,Bowling Green,KY,42101-5216,(270) 846-4413,3/8/2017 +-86.471769,36.957443,"Dollar General-Bowling Green,KY",2619 Nashville Rd,Bowling Green,KY,42101-4027,(270) 842-5952,3/8/2017 +-86.438591,36.9970588,"Dollar General-Bowling Green,KY",325 E 6th Avenue,Bowling Green,KY,42101,(270) 282-2216,3/8/2017 +-86.409357,36.922477,"Dollar General-Bowling Green,KY",5388 Scottsville Rd,Bowling Green,KY,42104-7911,(270) 796-2866,3/8/2017 +-86.474931,36.988544,"Dollar General-Bowling Green,KY",901 Morgantown Rd,Bowling Green,KY,42101,(270) 793-0069,3/8/2017 +-85.328033,37.332473,"Dollar General-Campbellsville,KY",1102 Elkhorn Rd,Campbellsville,KY,42718-1160,(270) 469-4938,3/6/2017 +-85.331022,37.352301,"Dollar General-Campbellsville,KY",1325 E Broadway St,Campbellsville,KY,42718-1599,(270) 465-3020,3/6/2017 +-85.364136,37.29021,"Dollar General-Campbellsville,KY",3400 New Columbia Road,Campbellsville,KY,42718,(270) 572-4081,3/6/2017 +-85.360322,37.338264,"Dollar General-Campbellsville,KY",732 West Broadway,Campbellsville,KY,42718-1595,(270) 789-0538,3/6/2017 +-84.131298,36.974822,"Dollar General-Corbin,KY",1242 Highway 770,Corbin,KY,40701-4767,(606) 258-0330,3/6/2017 +-84.067113,36.9554,"Dollar General-Corbin,KY",14397 N Us Highway 25E,Corbin,KY,40701,(606) 523-0341,3/6/2017 +-84.101499,36.93037,"Dollar General-Corbin,KY",1512 18Th Street,Corbin,KY,40701-2723,(606) 526-0399,3/6/2017 +-84.0880737,36.9073982,"Dollar General-Corbin,KY",2055 US Hwy 26,Corbin,KY,40701,(606) 620-9591,3/6/2017 +-84.154536,36.908427,"Dollar General-Corbin,KY",4005 Cumberland Falls Hwy,Corbin,KY,40701-8617,(606) 258-9970,3/6/2017 +-92.141327,29.956805,"Dollar General-Abbeville,LA",1912 S State St,Abbeville,LA,70510-8226,(337) 893-4359,3/6/2017 +-92.115609,29.972378,"Dollar General-Abbeville,LA",2030 Charity St,Abbeville,LA,70510-5411,(337) 893-0493,3/6/2017 +-92.144558,29.953308,"Dollar General-Abbeville,LA",2718 Rodeo Rd,Abbeville,LA,70510-4083,(337) 898-0100,3/6/2017 +-92.139354,29.982118,"Dollar General-Abbeville,LA",519 Park Ave,Abbeville,LA,70510-3503,(337) 898-1157,3/6/2017 +-92.450441,31.301834,"Dollar General-Alexandria,LA",1616 Bringhurst Street,Alexandria,LA,71301,(318) 709-9670,3/7/2017 +-92.472534,31.279282,"Dollar General-Alexandria,LA",1800 Macarthur Dr Ste A,Alexandria,LA,71301-3760,(318) 561-2932,3/7/2017 +-92.474117,31.320918,"Dollar General-Alexandria,LA",2108 N Bolton Ave,Alexandria,LA,71303-4405,(318) 487-1198,3/7/2017 +-92.438684,31.290513,"Dollar General-Alexandria,LA",2314 Broadway Ave,Alexandria,LA,71302-4825,(318) 442-2863,3/7/2017 +-92.480171,31.297952,"Dollar General-Alexandria,LA",305 Macarthur Dr,Alexandria,LA,71303-3106,(318) 442-0089,3/7/2017 +-92.449714,31.261257,"Dollar General-Alexandria,LA",5101 Horseshoe Dr,Alexandria,LA,71302-2720,(318) 445-2302,3/7/2017 +-92.527458,31.29611,"Dollar General-Alexandria,LA",7518A Coliseum Blvd,Alexandria,LA,71303-9752,(318) 443-6113,3/7/2017 +-91.053699,30.549429,"Dollar General-Baton Rouge,LA",11215 Joor Rd,Baton Rouge,LA,70818-3410,(225) 262-4406,3/8/2017 +-91.066445,30.365442,"Dollar General-Baton Rouge,LA",13738 Perkins Rd,Baton Rouge,LA,70810-3433,(225) 753-2340,3/8/2017 +-91.021789,30.408385,"Dollar General-Baton Rouge,LA",13965 Coursey Blvd,Baton Rouge,LA,70817-1310,(225) 755-3907,3/8/2017 +-91.020809,30.391544,"Dollar General-Baton Rouge,LA",14660 Tiger Bend Rd,Baton Rouge,LA,70817-4613,(225) 753-4454,3/8/2017 +-91.014863,30.456943,"Dollar General-Baton Rouge,LA",15363 Old Hammond Hwy,Baton Rouge,LA,70816-1250,(225) 275-3004,3/8/2017 +-91.065884,30.436507,"Dollar General-Baton Rouge,LA",1777 Sharp Rd,Baton Rouge,LA,70815-4857,(225) 274-8985,3/8/2017 +-91.111477,30.391458,"Dollar General-Baton Rouge,LA",1871B Staring Ln,Baton Rouge,LA,70810-1031,(225) 761-4163,3/8/2017 +-91.051124,30.458791,"Dollar General-Baton Rouge,LA",191 Little John Dr,Baton Rouge,LA,70815-6123,(225) 272-2978,3/8/2017 +-91.165273,30.465205,"Dollar General-Baton Rouge,LA",1931 Plank Rd,Baton Rouge,LA,70802-2942,(225) 358-4495,3/8/2017 +-91.005683,30.361148,"Dollar General-Baton Rouge,LA",20321 Highland Rd,Baton Rouge,LA,70817-7346,(225) 751-4436,3/8/2017 +-91.150632,30.470343,"Dollar General-Baton Rouge,LA",3939 Choctaw Dr,Baton Rouge,LA,70805,(225) 356-0039,3/8/2017 +-91.1579492,30.4860856,"Dollar General-Baton Rouge,LA",4017 Plank Road,Baton Rouge,LA,70809,(225) 228-0923,3/8/2017 +-91.1428919,30.4875507,"Dollar General-Baton Rouge,LA",4755 Prescott Road,Baton Rouge,LA,70809-5252,(225) 228-0999,3/8/2017 +-91.144178,30.523743,"Dollar General-Baton Rouge,LA",4770 Hooper Rd,Baton Rouge,LA,70811,(225) 355-3532,3/8/2017 +-91.136011,30.506717,"Dollar General-Baton Rouge,LA",5455 Airline Hwy,Baton Rouge,LA,70805-1712,(225) 356-0896,3/8/2017 +-91.13173,30.444669,"Dollar General-Baton Rouge,LA",5652 Government St,Baton Rouge,LA,70806-6034,(225) 926-0018,3/8/2017 +-91.151736,30.504065,"Dollar General-Baton Rouge,LA",5953 Plank Rd,Baton Rouge,LA,70805-1323,(225) 355-9830,3/8/2017 +-91.170758,30.506037,"Dollar General-Baton Rouge,LA",6315 Scenic Hwy,Baton Rouge,LA,70805,(225) 308-2192,3/8/2017 +-91.1190572,30.4738507,"Dollar General-Baton Rouge,LA",7055 Greenwell Springs Rd,Baton Rouge,LA,70805-7441,(225) 532-2522,3/8/2017 +-91.093702,30.442552,"Dollar General-Baton Rouge,LA",8656 Goodwood Blvd,Baton Rouge,LA,70806-7912,(225) 923-2235,3/8/2017 +-91.085014,30.485034,"Dollar General-Baton Rouge,LA",9355 Greenwell Springs Rd,Baton Rouge,LA,70814,(225) 928-3648,3/8/2017 +-91.123735,30.360223,"Dollar General-Baton Rouge,LA",9401 Burbank Dr,Baton Rouge,LA,70810-6177,(225) 768-7478,3/8/2017 +-89.851994,30.732197,"Dollar General-Bogalusa,LA",14287 Highway 21 S,Bogalusa,LA,70427-8025,(985) 732-2306,3/7/2017 +-89.876439,30.76721,"Dollar General-Bogalusa,LA",1620 Ave F,Bogalusa,LA,70427,(985) 205-3185,3/7/2017 +-89.864901,30.789768,"Dollar General-Bogalusa,LA",303 Shenandoah St,Bogalusa,LA,70427-3137,(985) 735-1571,3/7/2017 +-89.851476,30.7768652,"Dollar General-Bogalusa,LA",435 Sullivan Drive,Bogalusa,LA,70427,(985) 205-3184,3/7/2017 +-93.672108,32.541726,"Dollar General-Bossier City,LA",1310 Swan Lake Rd,Bossier City,LA,71111-2655,(318) 549-3838,3/6/2017 +-93.716496,32.518298,"Dollar General-Bossier City,LA",202 Benton Rd,Bossier City,LA,71111-4702,(318) 741-9195,3/6/2017 +-93.63804,32.562365,"Dollar General-Bossier City,LA",2100 Stockwell Rd,Bossier City,LA,71111-5754,(318) 742-8771,3/6/2017 +-93.704491,32.508581,"Dollar General-Bossier City,LA",2314 Barksdale Blvd,Bossier City,LA,71112-3202,(318) 742-8945,3/6/2017 +-93.667778,32.467187,"Dollar General-Bossier City,LA",4612 Barksdale Blvd,Bossier City,LA,71112-4504,(318) 752-4452,3/6/2017 +-93.71432,32.621797,"Dollar General-Bossier City,LA",5497 Airline Dr,Bossier City,LA,71111-6803,(318) 742-8757,3/6/2017 +-91.828357,30.313916,"Dollar General-Breaux Bridge,LA",1053B Henderson Hwy,Breaux Bridge,LA,70517-7728,(337) 228-1157,3/6/2017 +-91.8416,30.33849,"Dollar General-Breaux Bridge,LA",2310 Cecilia Sr High School H,Breaux Bridge,LA,70517,(337) 667-6462,3/6/2017 +-91.898421,30.278021,"Dollar General-Breaux Bridge,LA",254 Rees St,Breaux Bridge,LA,70517-4612,(337) 507-3574,3/6/2017 +-91.88053,30.235555,"Dollar General-Breaux Bridge,LA",4649 Main Hwy,Breaux Bridge,LA,70517,(337) 332-1352,3/6/2017 +-91.894943,30.269581,"Dollar General-Breaux Bridge,LA",625 S Main St,Breaux Bridge,LA,70517-5219,(337) 332-1562,3/6/2017 +-90.106319,30.478654,"Dollar General-Covington,LA",100 Tyler S/C,Covington,LA,70433-3060,(985) 871-0299,3/7/2017 +-90.085778,30.476569,"Dollar General-Covington,LA",1000 Business 190 Ste 28,Covington,LA,70433-3285,(985) 892-2013,3/7/2017 +-90.105708,30.497583,"Dollar General-Covington,LA",1823 N Columbia St,Covington,LA,70433-5648,(985) 893-0046,3/7/2017 +-90.075533,30.5709567,"Dollar General Market-Covington,LA",78258 Hwy 437,Covington,LA,70435,(985) 635-4146,3/7/2017 +-90.943336,30.501008,"Dollar General-Denham Springs,LA",1190 Hatchell Ln,Denham Springs,LA,70726-2625,(225) 667-6643,3/9/2017 +-90.956312,30.459106,"Dollar General-Denham Springs,LA",2330 S Range Ave Ste A,Denham Springs,LA,70726-5216,(225) 667-6322,3/9/2017 +-90.941971,30.439653,"Dollar General-Denham Springs,LA",25600 La Highway 16,Denham Springs,LA,70726-5700,(225) 664-7690,3/9/2017 +-90.862149,30.45405,"Dollar General-Denham Springs,LA",25815 Walker Road S,Denham Springs,LA,70726-6518,(225) 667-4244,3/9/2017 +-90.915473,30.455323,"Dollar General-Denham Springs,LA",26713 Juban Road,Denham Springs,LA,70726,(225) 372-7548,3/9/2017 +-90.955751,30.559939,"Dollar General-Denham Springs,LA",33835 La Highway 16,Denham Springs,LA,70706-0969,(225) 664-8994,3/9/2017 +-90.9128737,30.6410985,"Dollar General-Denham Springs,LA",39578 Hwy 16,Denham Springs,LA,70706-0204,(225) 304-6872,3/9/2017 +-90.972572,30.464707,"Dollar General-Denham Springs,LA",8583 Florida Blvd [Us Hwy 190],Denham Springs,LA,70726,(225) 667-9495,3/9/2017 +-76.634379,39.303152,"Dollar General-Baltimore,MD",1620 Pennsylvania Ave,Baltimore,MD,21217-3115,(410) 383-0567,3/10/2017 +-76.643997,39.250853,"Dollar General-Baltimore,MD",2115 W Patapsco Ave,Baltimore,MD,21230-2946,(410) 646-3247,3/10/2017 +-76.56681,39.36807,"Dollar General-Baltimore,MD",2311 N Northern Pkwy,Baltimore,MD,21214-1139,(410) 444-5745,3/10/2017 +-76.577967,39.317686,"Dollar General-Baltimore,MD",2401 Belair Rd Ste 116,Baltimore,MD,21213,(410) 537-5176,3/10/2017 +-76.6087875,39.3186188,"Dollar General-Baltimore,MD",2511 Greenmount Ave,Baltimore,MD,21217-4732,(443) 842-5699,3/10/2017 +-76.691617,39.293638,"Dollar General-Baltimore,MD",4500 Edmondson Ave,Baltimore,MD,21229-1506,(410) 566-0109,3/10/2017 +-76.558274,39.333686,"Dollar General-Baltimore,MD",4810 Belair Rd,Baltimore,MD,21206-5730,(410) 325-1740,3/10/2017 +-76.716638,39.29101,"Dollar General-Baltimore,MD",5405 Baltimore National Pike,Baltimore,MD,21229-2102,(410) 869-1406,3/10/2017 +-76.626654,39.283129,"Dollar General-Baltimore,MD",717 Washington Blvd,Baltimore,MD,21230,(410) 347-5230,3/10/2017 +-76.546033,39.370133,"Dollar General-Baltimore,MD",7350 Harford Rd,Baltimore,MD,21234,(410) 779-9312,3/10/2017 +-76.740459,39.347288,"Dollar General-Baltimore,MD",7405 Liberty Rd,Baltimore,MD,21207-3812,(410) 265-6395,3/10/2017 +-85.099115,42.306028,"Dollar General-Battle Creek,MI",1525 Michigan Ave,Battle Creek,MI,49017-1947,(269) 963-3981,3/9/2017 +-85.228358,42.297264,"Dollar General-Battle Creek,MI",1791 W Columbia Ave,Battle Creek,MI,49015-2856,(269) 565-2538,3/9/2017 +-85.182902,42.339184,"Dollar General-Battle Creek,MI",240 E Roosevelt,Battle Creek,MI,49037-2817,(269) 969-0634,3/9/2017 +-85.14407,42.309784,"Dollar General-Battle Creek,MI",2420 E Columbia Ave,Battle Creek,MI,49014-6379,(269) 968-5991,3/9/2017 +-85.157769,42.330442,"Dollar General-Battle Creek,MI",535 E Emmett St,Battle Creek,MI,49017-5682,(269) 962-0407,3/9/2017 +-85.19956,42.306324,"Dollar General-Battle Creek,MI",588 Southwest Capital Ave,Battle Creek,MI,49015,(269) 962-1312,3/9/2017 +-82.9743209,42.3651796,"Dollar General-Detroit,MI",10920 E Jefferson Ave,Detroit,MI,48214-3211,(313) 486-2805,3/10/2017 +-82.965055,42.421802,"Dollar General-Detroit,MI",12421 Hayes St,Detroit,MI,48205-4118,(313) 486-0648,3/10/2017 +-83.166726,42.379777,"Dollar General-Detroit,MI",12555 W Grand River Ave #900,Detroit,MI,48204-1867,(313) 931-0265,3/10/2017 +-82.988217,42.434867,"Dollar General-Detroit,MI",13341 E 7 Mile Rd,Detroit,MI,48205,(313) 483-7743,3/10/2017 +-83.190032,42.416164,"Dollar General-Detroit,MI",14611 W Mcnichols Rd,Detroit,MI,48235,(313) 327-1282,3/10/2017 +-83.032176,42.338264,"Dollar General-Detroit,MI",1559 E Lafayette St,Detroit,MI,48207-2958,(313) 656-2291,3/10/2017 +-83.21788,42.357544,"Dollar General-Detroit,MI",18209 Joy Rd,Detroit,MI,48228-3126,(313) 486-1976,3/10/2017 +-83.224179,42.401049,"Dollar General-Detroit,MI",18604 Fenkell Street,Detroit,MI,48223,(313) 493-1043,3/10/2017 +-83.024576,42.44433,"Dollar General-Detroit,MI",20164 Van Dyke,Detroit,MI,48234,(313) 312-8694,3/10/2017 +-83.12583,42.391615,"Dollar General-Detroit,MI",3000 W Davison,Detroit,MI,48238,(313) 312-8959,3/10/2017 +-83.061369,42.415544,"Dollar General-Detroit,MI",3812 E Davison St,Detroit,MI,48212-1702,(313) 366-0627,3/10/2017 +-83.177025,42.358856,"Dollar General-Detroit,MI",8800 Schaefer Hwy,Detroit,MI,48228-2516,(313) 406-8853,3/10/2017 +-83.082736,42.384382,"Dollar General-Detroit,MI",9350 Woodward,Detroit,MI,48202,(313) 872-6258,3/10/2017 +-88.992036,30.473032,"Dollar General-Biloxi,MS",13025 Lorraine Rd,Biloxi,MS,39532-9574,(662) 728-0300,3/6/2017 +-88.908816,30.49581,"Dollar General-Biloxi,MS",14495 Lamey Bridge Rd,Biloxi,MS,39532-8957,(228) 396-2765,3/6/2017 +-88.957782,30.402707,"Dollar General-Biloxi,MS",2040 Pass Rd,Biloxi,MS,39531,(228) 385-2256,3/6/2017 +-88.933782,30.444051,"Dollar General-Biloxi,MS",920 Cedar Lake Rd Ste D,Biloxi,MS,39532-2107,(601) 919-3530,3/6/2017 +-89.995699,32.297801,"Dollar General-Brandon,MS",1042 Highway 471,Brandon,MS,39042-8629,(601) 833-8845,3/10/2017 +-90.039852,32.381827,"Dollar General-Brandon,MS",1905 Spillway Rd,Brandon,MS,39047-8232,(601) 835-1104,3/10/2017 +-89.985245,32.272957,"Dollar General-Brandon,MS",208 E Government St,Brandon,MS,39042-3152,(601) 855-0073,3/10/2017 +-89.95971,32.244583,"Dollar General-Brandon,MS",3267 Hwy 18,Brandon,MS,39042,(601) 724-8868,3/10/2017 +-89.95229,32.399607,"Dollar General-Brandon,MS",643 Holly Bush Rd,Brandon,MS,39047-8801,(601) 605-4432,3/10/2017 +-90.031362,32.225061,"Dollar General-Brandon,MS",769 Highway 468,Brandon,MS,39042-7314,(601) 407-2555,3/10/2017 +-90.444339,31.580546,"Dollar General-Brookhaven,MS",125 N Jackson St,Brookhaven,MS,39601-3037,(601) 799-4090,3/7/2017 +-90.454819,31.574132,"Dollar General-Brookhaven,MS",1662 Caleb Dr Se,Brookhaven,MS,39601,(601) 833-2937,3/7/2017 +-90.456979,31.583416,"Dollar General-Brookhaven,MS",211 Highway 51 N,Brookhaven,MS,39601-2653,(662) 624-5791,3/7/2017 +-90.501194,31.534762,"Dollar General-Brookhaven,MS",345 hwy 84 West,Brookhaven,MS,39601,(601) 265-3016,3/7/2017 +-90.502311,31.60866,"Dollar General-Brookhaven,MS",975 Highway 550 Nw,Brookhaven,MS,39601,(601) 833-1368,3/7/2017 +-88.388996,33.481315,"Dollar General-Columbus,MS",1032 Highway 69 S,Columbus,MS,39702,(662) 368-2398,3/10/2017 +-88.418256,33.496611,"Dollar General-Columbus,MS",1311 Main St,Columbus,MS,39701-4965,(662) 287-8796,3/10/2017 +-88.434446,33.514736,"Dollar General-Columbus,MS",1731 Highway 45 N,Columbus,MS,39705-2117,(662) 241-4499,3/10/2017 +-88.384063,33.495879,"Dollar General-Columbus,MS",212 Alabama St,Columbus,MS,39702-5204,(662) 286-9676,3/10/2017 +-88.409281,33.52088,"Dollar General-Columbus,MS",2219 Military Rd,Columbus,MS,39705,(662) 368-8127,3/10/2017 +-88.437206,33.542241,"Dollar General-Columbus,MS",3277 Highway 45 N,Columbus,MS,39705-1634,(662) 286-8424,3/10/2017 +-88.338185,33.492863,"Dollar General-Columbus,MS",5302 Hwy 182 E,Columbus,MS,39702-8225,(662) 243-7071,3/10/2017 +-88.324144,33.443001,"Dollar General-Columbus,MS",60 Center St,Columbus,MS,39702-8573,(662) 287-4060,3/10/2017 +-88.4227786,33.6026582,"Dollar General-Columbus,MS",7624 Hwy 45 N,Columbus,MS,39705-3353,(662) 570-1535,3/10/2017 +-88.3662611,33.519955,"Dollar General-Columbus,MS",801 Tuscaloosa Rd,Columbus,MS,39702-1616,(662) 327-5711,3/10/2017 +-88.499106,34.94546,"Dollar General-Corinth,MS",2035 E Shiloh Rd,Corinth,MS,38834-3726,(228) 392-6522,3/9/2017 +-88.558752,34.930853,"Dollar General-Corinth,MS",3501 Highway 72 W,Corinth,MS,38834-8560,(601) 469-3344,3/9/2017 +-88.456983,34.93069,"Dollar General-Corinth,MS",4137 Country Road 200,Corinth,MS,38834-7500,(601) 469-4785,3/9/2017 +-88.519946,34.935808,"Dollar General-Corinth,MS",509 Foote St,Corinth,MS,38834-4832,(228) 497-4712,3/9/2017 +-88.516706,34.923753,"Dollar General-Corinth,MS",902 S Cass St,Corinth,MS,38834-6403,(228) 497-6006,3/9/2017 +-82.590591,35.58697,"Dollar General-Asheville,NC",1005 Patton Ave,Asheville,NC,28806-3622,(828) 225-4003,3/9/2017 +-82.623524,35.602044,"Dollar General-Asheville,NC",347 B Leicester Hwy,Asheville,NC,28806,(828) 258-2825,3/9/2017 +-82.5835224,35.6702605,"Dollar General-Asheville,NC",458 Weaverville Rd,Asheville,NC,28804-1121,(828) 398-4132,3/9/2017 +-82.505268,35.569755,"Dollar General-Asheville,NC",800 Fairview Rd Ste A5,Asheville,NC,28803-1173,(828) 299-1736,3/9/2017 +-82.53255,35.595027,"Dollar General-Asheville,NC",85 Tunnel Rd Ste 7,Asheville,NC,28805-1232,(828) 253-1168,3/9/2017 +-79.417815,36.07833,"Dollar General-Burlington,NC",1031 S Williamson Ave,Burlington,NC,27215-9726,(336) 586-9755,3/10/2017 +-79.431298,36.068109,"Dollar General-Burlington,NC",2091 Chapel Hill Rd,Burlington,NC,27215-7114,(336) 437-0160,3/10/2017 +-79.401042,36.094126,"Dollar General-Burlington,NC",2125 N Church St,Burlington,NC,27217-3003,(336) 229-1360,3/10/2017 +-79.470681,36.066438,"Dollar General-Burlington,NC",2631 Ramada Rd,Burlington,NC,27215-5469,(336) 226-0443,3/10/2017 +-79.4437071,36.0239681,"Dollar General-Burlington,NC",4070 S Nc Hwy 49,Burlington,NC,27215,(336) 223-8150,3/10/2017 +-79.434288,36.103663,"Dollar General-Burlington,NC",600 Rauhut Street,Burlington,NC,27217,(336) 278-1341,3/10/2017 +-80.674971,35.209118,"Dollar General-Charlotte,NC",10018 Albemarle Rd,Charlotte,NC,28227-3402,(704) 545-5146,3/10/2017 +-80.818483,35.212929,"Dollar General-Charlotte,NC",1949 E Seventh St,Charlotte,NC,28204-2417,(704) 347-1379,3/10/2017 +-80.76529,35.27288,"Dollar General-Charlotte,NC",221 Heathway Dr,Charlotte,NC,28213,(704) 597-9450,3/10/2017 +-80.9443436,35.1293449,"Dollar General-Charlotte,NC",2303 Westinghouse [Blvd #2],Charlotte,NC,28273-6515,(704) 583-5829,3/10/2017 +-80.801926,35.300857,"Dollar General-Charlotte,NC",2804 West Sugar Creek Rd,Charlotte,NC,28262,(704) 817-2192,3/10/2017 +-80.902487,35.32328,"Dollar General-Charlotte,NC",3708 Oakdale Road,Charlotte,NC,28216,(704) 469-5602,3/10/2017 +-80.760344,35.201613,"Dollar General-Charlotte,NC",5200 Albemarle Rd,Charlotte,NC,28212-3605,(704) 566-3639,3/10/2017 +-80.876184,35.150895,"Dollar General-Charlotte,NC",6217 South Blvd,Charlotte,NC,28217-4440,(704) 556-1223,3/10/2017 +-80.837769,35.311026,"Dollar General-Charlotte,NC",6445 Old Statesville Rd,Charlotte,NC,28269,(704) 598-0493,3/10/2017 +-80.717709,35.2554,"Dollar General-Charlotte,NC",7322 Plaza Road Ext,Charlotte,NC,28215-1924,(704) 567-9200,3/10/2017 +-80.738133,35.161674,"Dollar General-Charlotte,NC",7411 E Independence Blvd # 31,Charlotte,NC,28227-9451,(704) 531-9442,3/10/2017 +-80.938426,35.275473,"Dollar General-Charlotte,NC",8001-8050 Moores Chapel Road,Charlotte,NC,28214-1551,(704) 398-0713,3/10/2017 +-80.725843,35.200505,"Dollar General-Charlotte,NC",8825 E. Wt Harris Blvd,Charlotte,NC,28227,(704) 531-0844,3/10/2017 +-81.199348,35.702743,"Dollar General-Conover,NC",1304 Conover Blvd E,Conover,NC,28613,(828) 464-2023,3/6/2017 +-81.224144,35.697303,"Dollar General-Conover,NC",428 Conover Blvd W,Conover,NC,28613-2729,(828) 465-1185,3/6/2017 +-81.226563,35.717126,"Dollar General-Conover,NC",508 10Th St Nw Ste B,Conover,NC,28613-2339,(828) 466-0501,3/6/2017 +-81.189322,35.812166,"Dollar General-Conover,NC",6568 N Nc 16 Hwy,Conover,NC,28613-7413,(828) 431-2070,3/6/2017 +-78.834806,35.984489,"Dollar General-Durham,NC",101 Ganyard Farm Way,Durham,NC,27703,(919) 598-5300,3/9/2017 +-78.926766,35.987148,"Dollar General-Durham,NC",2000 Chapel Hill Rd Ste 1,Durham,NC,27707-1155,(919) 493-8205,3/9/2017 +-78.946584,36.019335,"Dollar General-Durham,NC",3427 Hillsborough Rd,Durham,NC,27705-3008,(919) 309-9199,3/9/2017 +-78.928804,36.059582,"Dollar General-Durham,NC",3830 Guess Rd,Durham,NC,27705-1506,(919) 477-5169,3/9/2017 +-78.978657,36.032856,"Dollar General-Durham,NC",4623 Hillsborough Rd,Durham,NC,27705-2343,(919) 382-0100,3/9/2017 +-78.909875,36.076132,"Dollar General-Durham,NC",5279 N Roxboro Rd,Durham,NC,27712-2800,(919) 479-5869,3/9/2017 +-78.919433,36.010139,"Dollar General-Durham,NC",800 Broad St,Durham,NC,27705-4138,(919) 416-1303,3/9/2017 +-79.701086,36.512534,"Dollar General-Eden,NC",1200 E Stadium Dr,Eden,NC,27288-3810,(336) 635-1486,3/9/2017 +-79.760852,36.515,"Dollar General-Eden,NC",519 Morgan Rd,Eden,NC,27288-2523,(336) 623-2737,3/9/2017 +-79.739756,36.491655,"Dollar General-Eden,NC",640 S Van Buren Rd Unit P,Eden,NC,27288-5365,(336) 623-3780,3/9/2017 +-79.79022,36.481086,"Dollar General-Eden,NC",7720 Nc Hwy 770 Bldg 2,Eden,NC,27288-7598,(336) 627-1034,3/9/2017 +-106.516314,35.070327,"Dollar General-Albuquerque,NM",11816 Central Ave Se,Albuquerque,NM,87123-2952,(505) 323-3728,3/10/2017 +-106.707436,35.051147,"Dollar General-Albuquerque,NM",1811 Coors Blvd Sw,Albuquerque,NM,87121,(505) 234-1948,3/10/2017 +-106.637243,35.138524,"Dollar General-Albuquerque,NM",201 Montano Rd Nw,Albuquerque,NM,87107-5257,(505) 344-0514,3/10/2017 +-106.577631,35.074553,"Dollar General-Albuquerque,NM",301 San Pedro Dr Se,Albuquerque,NM,87108-3089,(505) 265-0024,3/10/2017 +-106.589881,35.087334,"Dollar General-Albuquerque,NM",4910 Lomas Blvd Ne Ste A,Albuquerque,NM,87110-6382,(505) 266-3885,3/10/2017 +-106.694681,34.951998,"Dollar General-Albuquerque,NM",7615 Isletta Blvd. Sw,Albuquerque,NM,87105,(505) 877-1186,3/10/2017 +-106.51479,35.085175,"Dollar General-Albuquerque,NM",840 East Juan Tabo,Albuquerque,NM,87123-1427,(505) 332-3216,3/10/2017 +-78.838998,42.902454,"Dollar General-Buffalo,NY",1055 Genesee St,Buffalo,NY,14211-3006,(716) 895-1014,3/9/2017 +-78.858581,42.947872,"Dollar General-Buffalo,NY",1336 Hertel Ave,Buffalo,NY,14216-2833,(716) 877-0710,3/9/2017 +-78.862808,42.91748,"Dollar General-Buffalo,NY",1618 Main St,Buffalo,NY,14209,(716) 259-2738,3/9/2017 +-78.878071,42.946719,"Dollar General-Buffalo,NY",1833 Elmwood Ave,Buffalo,NY,14207-2409,(716) 875-4914,3/9/2017 +-78.80823,42.854043,"Dollar General-Buffalo,NY",2137 Seneca St,Buffalo,NY,14210,(716) 247-5324,3/9/2017 +-78.835044,42.938976,"Dollar General-Buffalo,NY",230 Holden St,Buffalo,NY,14214-2234,(716) 833-0878,3/9/2017 +-78.889823,42.927993,"Dollar General-Buffalo,NY",244 Forest Ave,Buffalo,NY,14213,(716) 954-8261,3/9/2017 +-78.813561,42.938526,"Dollar General-Buffalo,NY",3079 Bailey Ave,Buffalo,NY,14215-1618,(716) 833-3127,3/9/2017 +-78.88983,42.915169,"Dollar General-Buffalo,NY",315 W Ferry St,Buffalo,NY,14213-1911,(716) 885-1740,3/9/2017 +-78.871013,42.970633,"Dollar General-Buffalo,NY",3170 Delaware Ave,Buffalo,NY,14217-2023,(716) 447-4305,3/9/2017 +-78.830438,42.958142,"Dollar General-Buffalo,NY",338 Kenmore Ave,Buffalo,NY,14223-2922,(716) 837-0310,3/9/2017 +-78.898674,42.941433,"Dollar General-Buffalo,NY",437 Tonawanda Street,Buffalo,NY,14207,(716) 259-1339,3/9/2017 +-78.836654,42.914226,"Dollar General-Buffalo,NY",663 East Ferry Street,Buffalo,NY,14211,(716) 507-4837,3/9/2017 +-78.904375,42.951082,"Dollar General-Buffalo,NY",827 Tonawanda St,Buffalo,NY,14207-1449,(716) 875-1248,3/9/2017 +-78.794698,42.876703,"Dollar General-Buffalo,NY",93 S Rossler Ave,Buffalo,NY,14206-3433,(716) 822-1105,3/9/2017 +-78.824252,42.857178,"Dollar General-Buffalo,NY",942 Mckinley Pkwy,Buffalo,NY,14220-1016,(716) 824-3687,3/9/2017 +-81.559356,41.067803,"Dollar General-Akron,OH",1045 Vernon Odom Blvd,Akron,OH,44307-1073,(330) 252-2539,3/6/2017 +-81.491517,41.034521,"Dollar General-Akron,OH",1356 S Arlington St,Akron,OH,44306-3732,(330) 724-4495,3/6/2017 +-81.46625,41.10506,"Dollar General-Akron,OH",1551 Brittain Road,Akron,OH,44310-2763,(330) 630-3391,3/6/2017 +-81.5516786,41.1343065,"Dollar General-Akron,OH",1736 Merriman Rd,Akron,OH,44313-5252,(330) 835-4006,3/6/2017 +-81.4536928,41.0620511,"Dollar General-Akron,OH",2072 Mogadore Rd,Akron,OH,44312-1117,(330) 784-6512,3/6/2017 +-81.492074,40.995959,"Dollar General-Akron,OH",2765 S Arlington Rd,Akron,OH,44312-4713,(330) 645-1346,3/6/2017 +-81.554889,41.009359,"Dollar General-Akron,OH",3333 Manchester Rd,Akron,OH,44319-1434,(330) 644-5066,3/6/2017 +-81.522089,40.98153,"Dollar General-Akron,OH",3849 S Main St,Akron,OH,44319-3649,(330) 645-7029,3/6/2017 +-81.566186,40.959547,"Dollar General-Akron,OH",5235 Manchester Rd,Akron,OH,44319-4208,(330) 882-4049,3/6/2017 +-81.511118,41.10169,"Dollar General-Akron,OH",600 N Main St,Akron,OH,44310-3114,(330) 253-2821,3/6/2017 +-81.434368,41.040858,"Dollar General-Akron,OH",855 Canton Rd,Akron,OH,44312-3314,(330) 733-1054,3/6/2017 +-81.554321,41.083923,"Dollar General-Akron,OH",901 Copley Rd,Akron,OH,44320-2906,(234) 200-0766,3/6/2017 +-81.510099,41.054687,"Dollar General-Akron,OH",994 Brown St,Akron,OH,44311-2262,(234) 200-5132,3/6/2017 +-81.42513,40.813597,"Dollar General-Canton,OH",1424 Whipple Ave Nw,Canton,OH,44708-2831,(330) 477-1031,3/7/2017 +-81.348965,40.793349,"Dollar General-Canton,OH",2103 Tuscarawas St E,Canton,OH,44707-2864,(330) 456-9719,3/7/2017 +-81.331919,40.873615,"Dollar General-Canton,OH",2682 Easton St Ne,Canton,OH,44721-2623,(330) 649-9127,3/7/2017 +-81.365928,40.830293,"Dollar General-Canton,OH",2976 Market Ave N,Canton,OH,44714-1658,(330) 456-2344,3/7/2017 +-81.388926,40.834891,"Dollar General-Canton,OH",3250 Cleveland Ave Nw,Canton,OH,44709-2868,(330) 493-9187,3/7/2017 +-81.377439,40.756916,"Dollar General-Canton,OH",3626 Cleveland Ave Sw,Canton,OH,44707-1448,(330) 484-4124,3/7/2017 +-81.448686,40.792133,"Dollar General-Canton,OH",5200 Tuscarawas St W,Canton,OH,44708-5055,(330) 479-9083,3/7/2017 +-81.450003,40.853262,"Dollar General-Canton,OH",5384 Fulton Dr Nw,Canton,OH,44718-1808,(330) 244-1990,3/7/2017 +-82.9521666,39.3377783,"Dollar General-Chillicothe,OH",1050 E Main St,Chillicothe,OH,45601-2848,(740) 772-6684,3/8/2017 +-82.976228,39.364331,"Dollar General-Chillicothe,OH",1400 N Bridge St,Chillicothe,OH,45601-4101,(740) 779-9948,3/8/2017 +-83.0490547,39.3497041,"Dollar General-Chillicothe,OH",19520 US Hwy 50,Chillicothe,OH,45601,(none listed),3/8/2017 +-83.003137,39.337126,"Dollar General-Chillicothe,OH",609 Central Ctr,Chillicothe,OH,45601-2249,(740) 779-1372,3/8/2017 +-84.464873,39.304307,"Dollar General-Cincinnati,OH",10152 Princeton Glendale Rd,Cincinnati,OH,45246-1212,(513) 874-0709,3/8/2017 +-84.487014,39.12696,"Dollar General-Cincinnati,OH",1027 William Howard Taft Road,Cincinnati,OH,45206-2011,(513) 815-5408,3/8/2017 +-84.563305,39.298467,"Dollar General-Cincinnati,OH",11850 Hamilton Ave,Cincinnati,OH,45231-1131,(513) 742-3482,3/8/2017 +-84.522632,39.268777,"Dollar General-Cincinnati,OH",24 E Eswin St,Cincinnati,OH,45218-1405,(513) 742-2632,3/8/2017 +-84.379567,39.149634,"Dollar General-Cincinnati,OH",4109 Plainville Rd,Cincinnati,OH,45227-3244,(513) 272-2671,3/8/2017 +-84.607536,39.095358,"Dollar General-Cincinnati,OH",4958 Delhi Pike,Cincinnati,OH,45238-5344,(513) 451-9046,3/8/2017 +-84.3011703,39.0856514,"Dollar General-Cincinnati,OH",545 Clough Pike,Cincinnati,OH,45244-2313,(513) 252-2731,3/8/2017 +-84.638665,39.171107,"Dollar General-Cincinnati,OH",5700 Harrison Ave,Cincinnati,OH,45248-1602,(513) 574-8800,3/8/2017 +-84.601221,39.198559,"Dollar General-Cincinnati,OH",5795 Cheviot Rd,Cincinnati,OH,45247-7079,(513) 741-3665,3/8/2017 +-84.548172,39.2142029,"Dollar General-Cincinnati,OH",6600 Hamilton Avenue,Cincinnati,OH,45224,(513) 729-7516,3/8/2017 +-84.325969,39.072726,"Dollar General-Cincinnati,OH",8251-c Beechmont Ave,Cincinnati,OH,45255-4210,(513) 474-3579,3/8/2017 +-84.552129,39.203281,"Dollar General-Cincinnati,OH",940 W North Bend Rd,Cincinnati,OH,45224-2220,(513) 542-4520,3/8/2017 +-84.5749614,39.2434779,"Dollar General-Cincinnati,OH",9517 Pippin Rd,Cincinnati,OH,45231-2221,(513) 252-2722,3/8/2017 +-81.798214,41.453425,"Dollar General-Cleveland,OH",14693 Lorain Avenue,Cleveland,OH,44111-3166,(216) 252-4334,3/7/2017 +-81.570285,41.557433,"Dollar General-Cleveland,OH",15707 St Clair Ave,Cleveland,OH,44110,(216) 273-8269,3/7/2017 +-81.651821,41.496929,"Dollar General-Cleveland,OH",2272 East 55th Street,Cleveland,OH,44103,(216) 551-9125,3/7/2017 +-81.602857,41.461587,"Dollar General-Cleveland,OH",2966 East 116th St,Cleveland,OH,44104-2626,(216) 206-7219,3/7/2017 +-81.564781,41.456533,"Dollar General-Cleveland,OH",3785 Lee Road,Cleveland,OH,44128-1463,(216) 359-1786,3/7/2017 +-81.525913,41.520722,"Dollar General-Cleveland,OH",4279 Mayfield Rd.,Cleveland,OH,44121,(216) 273-8568,3/7/2017 +-81.654625,41.516853,"Dollar General-Cleveland,OH",5133 Superior Ave,Cleveland,OH,44103,(216) 539-2154,3/7/2017 +-81.641682,41.460911,"Dollar General-Cleveland,OH",6815 Broadway Ave,Cleveland,OH,44105-1311,(216) 429-2856,3/7/2017 +-81.623435,41.445227,"Dollar General-Cleveland,OH",9111 Miles Ave,Cleveland,OH,44105-6136,(216) 539-0639,3/7/2017 +-81.746417,41.47721,"Dollar General-Cleveland,OH",9200 Madison Ave,Cleveland,OH,44102-2719,(216) 551-9124,3/7/2017 +-83.144076,39.927816,"Dollar General-Columbus,OH",1130 Norton Rd,Columbus,OH,43228-3250,(614) 878-0332,3/7/2017 +-83.090244,39.929112,"Dollar General-Columbus,OH",1260 Demorest Rd,Columbus,OH,43204-7003,(614) 308-0025,3/7/2017 +-82.962176,39.957689,"Dollar General-Columbus,OH",1391 East Main Street,Columbus,OH,43205,(614) 300-5619,3/7/2017 +-83.052544,39.929263,"Dollar General-Columbus,OH",1410 Harrisburg Pike,Columbus,OH,43223-3231,(614) 274-1663,3/7/2017 +-82.9573426,39.9491141,"Dollar General-Columbus,OH",1500 E Livingston Ave,Columbus,OH,43205-2925,(614) 930-6639,3/7/2017 +-82.983881,39.930706,"Dollar General-Columbus,OH",1596 Parsons Ave,Columbus,OH,43207-1217,(614) 653-6930,3/7/2017 +-82.973766,40.087456,"Dollar General-Columbus,OH",1660 E Dublin Granville Rd,Columbus,OH,43229-3503,(614) 899-7498,3/7/2017 +-82.966208,40.059784,"Dollar General-Columbus,OH",1959 Morse Rd,Columbus,OH,43229-6663,(614) 840-0588,3/7/2017 +-82.965118,39.923891,"Dollar General-Columbus,OH",2012 Lockbourne Rd.,Columbus,OH,43207,(614) 445-0723,3/7/2017 +-83.055303,39.94701,"Dollar General-Columbus,OH",2100 Sullivant Avenue,Columbus,OH,43223,(614) 328-8406,3/7/2017 +-82.920696,39.971322,"Dollar General-Columbus,OH",3000 E Broad St,Columbus,OH,43209-1965,(614) 237-0001,3/7/2017 +-82.910929,39.91713,"Dollar General-Columbus,OH",3349 Refugee Road,Columbus,OH,43232,(614) 452-4817,3/7/2017 +-82.963191,40.035639,"Dollar General-Columbus,OH",3350 Cleveland Ave,Columbus,OH,43224-3677,(614) 447-3134,3/7/2017 +-82.967885,39.888781,"Dollar General-Columbus,OH",3636 Lockbourne Rd,Columbus,OH,43207-5131,(614) 491-8889,3/7/2017 +-83.0006,39.883394,"Dollar General-Columbus,OH",3861 S High St,Columbus,OH,43207-4013,(614) 491-8955,3/7/2017 +-82.930304,39.885221,"Dollar General-Columbus,OH",4050 Alum Creek Thimbleberry Dr,Columbus,OH,43207,(614) 491-4124,3/7/2017 +-82.883086,39.923565,"Dollar General-Columbus,OH",4245 Macsway Ave,Columbus,OH,43232-4247,(614) 367-9012,3/7/2017 +-83.130944,39.952293,"Dollar General-Columbus,OH",4868 W Broad St,Columbus,OH,43228-1602,(614) 851-1563,3/7/2017 +-83.019322,40.063026,"Dollar General-Columbus,OH",4932 N High St,Columbus,OH,43214,(614) 781-9032,3/7/2017 +-82.861687,39.915495,"Dollar General-Columbus,OH",5001 Chatterton Rd,Columbus,OH,43232-5802,(614) 837-3034,3/7/2017 +-82.950772,40.086343,"Dollar General-Columbus,OH",5680 Cleveland Ave,Columbus,OH,43231-2879,(614) 891-9127,3/7/2017 +-83.113847,39.936298,"Dollar General-Columbus,OH",745 Georgesville Rd,Columbus,OH,43228-2826,(614) 276-5665,3/7/2017 +-84.172873,39.74801,"Dollar General-Dayton,OH",1431 Wayne Ave,Dayton,OH,45410-1411,(937) 222-2971,3/7/2017 +-84.121991,39.730601,"Dollar General-Dayton,OH",1714 Woodman Dr,Dayton,OH,45420-3662,(937) 252-4839,3/7/2017 +-84.22464,39.754271,"Dollar General-Dayton,OH",1819 W 3Rd St,Dayton,OH,45417-2536,(937) 263-6125,3/7/2017 +-84.253627,39.78405,"Dollar General-Dayton,OH",2228 N Gettysburg Ave,Dayton,OH,45406,(937) 278-0759,3/7/2017 +-84.143786,39.789258,"Dollar General-Dayton,OH",2300 Valley Pike,Dayton,OH,45404-2588,(937) 503-7526,3/7/2017 +-84.210555,39.785337,"Dollar General-Dayton,OH",2312 N Main St,Dayton,OH,45405-3439,(937) 276-3229,3/7/2017 +-84.140603,39.748239,"Dollar General-Dayton,OH",2821 Linden Ave,Dayton,OH,45410,(937) 660-6361,3/7/2017 +-84.209379,39.767129,"Dollar General-Dayton,OH",445 Salem Ave,Dayton,OH,45406-5815,(937) 225-3851,3/7/2017 +-84.225477,39.81014,"Dollar General-Dayton,OH",4600 N Main St,Dayton,OH,45405-5019,(937) 274-7559,3/7/2017 +-84.2234879,39.6562195,"Dollar General-Dayton,OH",4963 Springboro Pike,Dayton,OH,45449-2842,(937) 643-3136,3/7/2017 +-84.22352,39.685145,"Dollar General-Dayton,OH",5245 N Dixie Hwy,Dayton,OH,45414-3806,(937) 277-7052,3/7/2017 +-84.108026,39.771326,"Dollar General-Dayton,OH",5520 Airway Rd,Dayton,OH,45431-1505,(937) 254-6516,3/7/2017 +-84.290561,39.746458,"Dollar General-Dayton,OH",5997 W Third Street,Dayton,OH,45427,(937) 268-2186,3/7/2017 +-84.2605743,39.8420296,"Dollar General-Dayton,OH",8126 N Main St,Dayton,OH,45415-1748,(937) 890-2528,3/7/2017 +-84.252754,39.734368,"Dollar General-Dayton,OH",888 S Gettysburg Ave,Dayton,OH,45417-3518,(937) 503-7548,3/7/2017 +-97.1227798,34.1628227,"Dollar General-Ardmore,OK",702 Lake Murray Dr,Ardmore,OK,73401-3847,(580) 319-4029,3/7/2017 +-97.123963,34.184886,"Dollar General-Ardmore,OK",1213 N Washington St,Ardmore,OK,73401-6661,(580) 226-1421,3/7/2017 +-96.989957,34.187403,"Dollar General-Ardmore,OK",5030 State Highway 199,Ardmore,OK,73401-0578,(580) 226-2094,3/7/2017 +-97.143419,34.181747,"Dollar General-Ardmore,OK",601 N Commerce St Ste A,Ardmore,OK,73401-3912,(580) 490-9905,3/7/2017 +-97.134991,34.174846,"Dollar General-Ardmore,OK",617 1/2 W Broadway St,Ardmore,OK,73401-4522,(580) 223-7149,3/7/2017 +-95.753224,36.060934,"Dollar General-Broken Arrow,OK",6401 E Kenosha Street,Broken Arrow,OK,74014-8102,(918) 505-9484,3/10/2017 +-95.776851,36.060814,"Dollar General-Broken Arrow,OK",1201 E Kenosha St,Broken Arrow,OK,74012-2008,(918) 251-9223,3/10/2017 +-95.812169,36.017533,"Dollar General-Broken Arrow,OK",1904 W New Orleans St,Broken Arrow,OK,74011-1427,(918) 455-8694,3/10/2017 +-95.810051,35.993231,"Dollar General-Broken Arrow,OK",5000 North 37Th Street,Broken Arrow,OK,74011,(918) 355-1162,3/10/2017 +-95.851211,36.07487,"Dollar General-Broken Arrow,OK",6124 S Garnett Rd,Broken Arrow,OK,74012-1217,(918) 307-8136,3/10/2017 +-95.797607,36.046399,"Dollar General-Broken Arrow,OK",711 W Houston St,Broken Arrow,OK,74012-3759,(918) 251-1120,3/10/2017 +-95.5967215,36.3073234,"Dollar General-Claremore,OK",1111 E Will Rogers Blvd,Claremore,OK,74017,(918) 505-7031,3/6/2017 +-95.632794,36.314731,"Dollar General-Claremore,OK",1901 W 4th Street S,Claremore,OK,74017,(918) 379-9888,3/6/2017 +-95.640749,36.278407,"Dollar General-Claremore,OK",26083 S Dollar Dr,Claremore,OK,74019,(918) 266-9886,3/6/2017 +-95.60866,36.323649,"Dollar General-Claremore,OK",1620 N Lynn Riggs Blvd,Claremore,OK,74017-3054,(918) 342-0863,3/6/2017 +-95.531023,36.423591,"Dollar General-Claremore,OK",16413 E 410 Rd,Claremore,OK,74017-0446,(918) 283-2588,3/6/2017 +-95.628812,36.292822,"Dollar General-Claremore,OK",1685 W Country Club Rd,Claremore,OK,74017-5541,(918) 343-0414,3/6/2017 +-75.4981783,40.6058744,"Dollar General-Allentown,PA",1741 West Tilgham St,Allentown,PA,18104,(484) 602-2705,3/9/2017 +-75.430174,40.641139,"Dollar General-Allentown,PA",1866 Catasauqua Rd,Allentown,PA,18109-3128,(610) 231-0436,3/9/2017 +-75.424527,40.625672,"Dollar General-Allentown,PA",2106 Union Blvd,Allentown,PA,18109-1634,(610) 435-9740,3/9/2017 +-75.4789301,40.5613317,"Dollar General-Allentown,PA",2306 28th St Sw,Allentown,PA,18103,(484) 619-2913,3/9/2017 +-80.2869996,40.790688,"Dollar General-Beaver Falls,PA",105 Concord Church Road,Beaver Falls,PA,15010,(724) 359-0652,3/7/2017 +-80.374069,40.773155,"Dollar General-Beaver Falls,PA",2580 Constitution Blvd,Beaver Falls,PA,15010-1294,(724) 846-8233,3/7/2017 +-80.336937,40.786057,"Dollar General-Beaver Falls,PA",4801 4Th Ave,Beaver Falls,PA,15010-3308,(724) 846-4074,3/7/2017 +-80.329046,40.738781,"Dollar General-Beaver Falls,PA",618 7Th Ave,Beaver Falls,PA,15010-4626,(724) 843-1591,3/7/2017 +-79.89507,40.861377,"Dollar General-Butler,PA",119 N Main St,Butler,PA,16001-4902,(724) 282-1794,3/6/2017 +-79.913351,40.902372,"Dollar General-Butler,PA",1627 N Main Street,Butler,PA,16001-1543,(724) 282-0453,3/6/2017 +-79.918849,40.843588,"Dollar General-Butler,PA",230 Greater Butler Mart,Butler,PA,16001-3283,(724) 214-1035,3/6/2017 +-79.942388,40.876718,"Dollar General-Butler,PA",295 Butler Cmns,Butler,PA,16001-2485,(724) 284-3718,3/6/2017 +-79.929837,40.781703,"Dollar General-Butler,PA",379 Pittsburgh Rd,Butler,PA,16002-3962,(724) 256-4401,3/6/2017 +-81.705045,33.556157,"Dollar General-Aiken,SC",1110 Richland Ave E,Aiken,SC,29801-4761,(803) 502-0087,3/6/2017 +-81.70256,33.578268,"Dollar General-Aiken,SC",1151 York St Ne,Aiken,SC,29801-4119,(803) 641-9682,3/6/2017 +-81.725081,33.594376,"Dollar General-Aiken,SC",1307 Edgefield Hwy,Aiken,SC,29801,(803) 643-4824,3/6/2017 +-81.724329,33.532518,"Dollar General-Aiken,SC",1553 Whiskey Rd,Aiken,SC,29803-5311,(803) 643-3421,3/6/2017 +-81.741492,33.565417,"Dollar General-Aiken,SC",1652 Richland Ave W,Aiken,SC,29801-3236,(803) 642-5146,3/6/2017 +-81.632517,33.650747,"Dollar General-Aiken,SC",7011 Harvey Ct,Aiken,SC,29805-9331,(803) 642-1213,3/6/2017 +-82.695678,34.529002,"Dollar General-Anderson,SC",1475 Pearman Dairy Rd Ste B,Anderson,SC,29625-2081,(864) 964-9036,3/10/2017 +-82.65441,34.516188,"Dollar General-Anderson,SC",1525 N Main St,Anderson,SC,29621-4734,(864) 224-3224,3/10/2017 +-82.649377,34.47658,"Dollar General-Anderson,SC",2835 S Main St,Anderson,SC,29624-3741,(864) 225-0094,3/10/2017 +-82.6709,34.547051,"Dollar General-Anderson,SC",3420 Clemson Blvd,Anderson,SC,29621-1324,(864) 261-8405,3/10/2017 +-82.602899,34.482155,"Dollar General-Anderson,SC",3502 E River St,Anderson,SC,29621-7336,(864) 224-2341,3/10/2017 +-82.761732,34.511479,"Dollar General-Anderson,SC",4435 Highway 24,Anderson,SC,29626-5216,(864) 225-0035,3/10/2017 +-79.948975,32.727801,"Dollar General-Charleston,SC",1238 Camp Rd Ste B,Charleston,SC,29412-9206,(843) 406-0182,3/8/2017 +-79.992811,32.818222,"Dollar General-Charleston,SC",1722 Old Towne Rd,Charleston,SC,29407-5035,(843) 556-5477,3/8/2017 +-79.977003,32.762582,"Dollar General-Charleston,SC",1739 Maybank Hwy #2,Charleston,SC,29412-2103,(843) 795-8409,3/8/2017 +-80.037448,32.823372,"Dollar General-Charleston,SC",2346 Ashley River Rd,Charleston,SC,29414-4752,(843) 763-9476,3/8/2017 +-79.995557,32.87241,"Dollar General-Charleston,SC",4741 Rivers Ave,Charleston,SC,29405-6645,(843) 480-0370,3/8/2017 +-80.944107,34.113622,"Dollar General-Columbia,SC",103 William Hardin Rd,Columbia,SC,29223-7818,(803) 419-0507,3/9/2017 +-81.087686,34.032049,"Dollar General-Columbia,SC",1563B Broad River Rd,Columbia,SC,29210-7301,(803) 731-5175,3/9/2017 +-81.107699,34.05373,"Dollar General-Columbia,SC",1601 Shivers Rd,Columbia,SC,29210-5443,(803) 798-5310,3/9/2017 +-81.192515,34.082567,"Dollar General-Columbia,SC",1630 Lake Murray Blvd,Columbia,SC,29212-8623,(803) 781-1665,3/9/2017 +-81.027419,34.009115,"Dollar General-Columbia,SC",1720 Taylor St,Columbia,SC,29201-3453,(803) 254-4557,3/9/2017 +-80.999766,33.961071,"Dollar General-Columbia,SC",1905 Bluff Rd,Columbia,SC,29201,(803) 988-0297,3/9/2017 +-81.021221,34.018166,"Dollar General-Columbia,SC",2101 Oak St # 13,Columbia,SC,29204-1193,(803) 931-0031,3/9/2017 +-80.947553,34.054788,"Dollar General-Columbia,SC",2324 Decker Blvd,Columbia,SC,29206-2322,(803) 788-5375,3/9/2017 +-80.902721,33.982715,"Dollar General-Columbia,SC",2900 Leesburg Rd,Columbia,SC,29209-3242,(803) 783-6242,3/9/2017 +-80.981404,34.031835,"Dollar General-Columbia,SC",3724 Covenant Rd,Columbia,SC,29204-4218,(803) 782-0708,3/9/2017 +-81.008592,34.036807,"Dollar General-Columbia,SC",4015 W Beltline Blvd,Columbia,SC,29204-1506,(803) 765-0622,3/9/2017 +-81.128711,34.045452,"Dollar General-Columbia,SC",536 Saint Andrews Rd,Columbia,SC,29210-4516,(803) 772-3697,3/9/2017 +-81.013997,34.056589,"Dollar General-Columbia,SC",5807 N Main St,Columbia,SC,29203-6224,(803) 754-0126,3/9/2017 +-80.979984,33.992056,"Dollar General-Columbia,SC",619 Beltline Blvd,Columbia,SC,29209-3628,(803) 790-0108,3/9/2017 +-80.973262,34.056341,"Dollar General-Columbia,SC",6246 Two Notch Rd,Columbia,SC,29223,(803) 714-7859,3/9/2017 +-81.045047,34.061722,"Dollar General-Columbia,SC",6322 Monticello Rd,Columbia,SC,29203-2538,(803) 714-3203,3/9/2017 +-80.957171,33.975807,"Dollar General-Columbia,SC",6870 Garners Ferry Rd,Columbia,SC,29209-1609,(803) 695-5577,3/9/2017 +-80.9955628,34.0879677,"Dollar General-Columbia,SC",7925 Wilson Blvd,Columbia,SC,29203,(803) 470-5328,3/9/2017 +-80.923129,34.095194,"Dollar General-Columbia,SC",9221 Two Notch Rd,Columbia,SC,29223-6428,(803) 699-9129,3/9/2017 +-80.929267,34.160973,"Dollar General-Columbia,SC",931 Longtown Rd,Columbia,SC,29229-9420,(803) 865-8119,3/9/2017 +-79.054453,33.832963,"Dollar General-Conway,SC",1500 4Th Ave,Conway,SC,29526-5032,(843) 381-0838,3/10/2017 +-79.063593,33.846093,"Dollar General-Conway,SC",1610 Church St Ste V,Conway,SC,29526-2932,(843) 248-8946,3/10/2017 +-79.020165,33.761107,"Dollar General-Conway,SC",2069 Hwy 544,Conway,SC,29526-9202,(843) 347-4408,3/10/2017 +-78.989188,33.864493,"Dollar General-Conway,SC",2140 Highway 905,Conway,SC,29526-6845,(843) 369-0086,3/10/2017 +-79.052602,33.869149,"Dollar General-Conway,SC",2609 Main Street,Conway,SC,29526,(843) 488-1664,3/10/2017 +-78.961818,33.823139,"Dollar General-Conway,SC",2899 Lees Landing Cir,Conway,SC,29526-7917,(843) 347-9372,3/10/2017 +-79.118602,33.837968,"Dollar General-Conway,SC",3220 Hwy 378,Conway,SC,29527,(843) 279-0357,3/10/2017 +-79.077808,33.805908,"Dollar General-Conway,SC",3546 Highway 701 S,Conway,SC,29527-6043,(843) 397-0663,3/10/2017 +-79.131358,33.899326,"Dollar General-Conway,SC",4657 W Highway 501,Conway,SC,29526-4462,(843) 365-0208,3/10/2017 +-79.037727,33.927101,"Dollar General-Conway,SC",4745 Highway 701 N,Conway,SC,29526-5750,(843) 365-9329,3/10/2017 +-78.844861,33.904947,"Dollar General-Conway,SC",7130 Highway 905,Conway,SC,29526-6232,(843) 369-0335,3/10/2017 +-79.896697,34.224388,"Dollar General-Darlington,SC",2245 Timmonsville Hwy,Darlington,SC,29532-7513,(843) 395-8034,3/9/2017 +-79.8944081,34.4034109,"Dollar General-Darlington,SC",3530 N Governor Williams Hwy,Darlington,SC,29540,(843) 968-0014,3/9/2017 +-79.877577,34.299492,"Dollar General-Darlington,SC",504 Pearl St,Darlington,SC,29532-3817,(843) 393-3840,3/9/2017 +-79.893785,34.288892,"Dollar General-Darlington,SC",904 Lamar Hwy,Darlington,SC,29532-4929,(843) 639-5105,3/9/2017 +-79.861602,34.283376,"Dollar General-Darlington,SC",941 S Governor Williams Hwy,Darlington,SC,29532-5667,(843) 393-5085,3/9/2017 +-82.576695,34.829944,"Dollar General-Easley,SC",1520 E Main St,Easley,SC,29640-3758,(864) 859-1666,3/8/2017 +-82.5536641,34.9394082,"Dollar General-Easley,SC",2800 Earls Bridge Rd,Easley,SC,29640-9568,(864) 810-4107,3/8/2017 +-82.601872,34.807283,"Dollar General-Easley,SC",311 Pelzer Hwy,Easley,SC,29642-1668,(864) 442-0106,3/8/2017 +-82.56487,34.758998,"Dollar General-Easley,SC",3309 Pelzer Hwy,Easley,SC,29642-8373,(864) 306-8003,3/8/2017 +-82.538007,34.89117,"Dollar General-Easley,SC",3711 Farrs Bridge Rd,Easley,SC,29640-9323,(864) 294-0706,3/8/2017 +-82.612588,34.829283,"Dollar General-Easley,SC",504 West Main St,Easley,SC,29640,(864) 810-6822,3/8/2017 +-86.684674,36.070438,"Dollar General-Antioch,TN",1801 Antioch Pike,Antioch,TN,37013-3311,(615) 833-3820,3/9/2017 +-86.59668,36.059375,"Dollar General-Antioch,TN",2214 Hobson Pike,Antioch,TN,37013-1107,(615) 641-6098,3/9/2017 +-86.632012,36.068254,"Dollar General-Antioch,TN",2724 Murfreesboro Pike,Antioch,TN,37013-2004,(615) 361-6700,3/9/2017 +-86.7024765,36.012291,"Dollar General-Antioch,TN",6412 Nolensville Pike,Antioch,TN,37013-4605,(615) 208-5147,3/9/2017 +-85.365269,35.023321,"Dollar General-Chattanooga,TN",151 Browns Ferry Rd,Chattanooga,TN,37419,(423) 821-8426,3/7/2017 +-85.273035,35.035144,"Dollar General-Chattanooga,TN",2010 Mccallie Ave,Chattanooga,TN,37404-3139,(423) 624-6800,3/7/2017 +-85.276983,35.017036,"Dollar General-Chattanooga,TN",2303 E 23Rd St,Chattanooga,TN,37407-1110,(423) 622-5544,3/7/2017 +-85.249662,35.07312,"Dollar General-Chattanooga,TN",3101 Dodson Ave,Chattanooga,TN,37406,(423) 208-9167,3/7/2017 +-85.27214,35.106636,"Dollar General-Chattanooga,TN",3600 Hixson Pike Ste 106,Chattanooga,TN,37415-3561,(423) 875-4345,3/7/2017 +-85.245004,35.023695,"Dollar General-Chattanooga,TN",3635 Brainerd Rd,Chattanooga,TN,37411-3602,(423) 698-4349,3/7/2017 +-85.253172,34.997804,"Dollar General-Chattanooga,TN",3920 Ringgold Rd Ste A,Chattanooga,TN,37412-1643,(423) 624-7523,3/7/2017 +-85.290957,34.994447,"Dollar General-Chattanooga,TN",4211 Rossville Blvd,Chattanooga,TN,37407-2925,(423) 867-9300,3/7/2017 +-85.181793,35.091492,"Dollar General-Chattanooga,TN",4850 Highway 58,Chattanooga,TN,37416,(423) 208-9609,3/7/2017 +-85.266534,35.008587,"Dollar General-Chattanooga,TN",5707 Ringgold Rd,Chattanooga,TN,37412-3541,(423) 668-0019,3/7/2017 +-85.207662,35.0164,"Dollar General-Chattanooga,TN",5952 Brainerd Rd,Chattanooga,TN,37421-6800,(423) 499-5662,3/7/2017 +-85.146795,35.053968,"Dollar General-Chattanooga,TN",7331 Lee Hwy,Chattanooga,TN,37421-1404,(423) 499-2755,3/7/2017 +-85.32746,35.099808,"Dollar General-Chattanooga,TN",772 Mountain Creek Rd,Chattanooga,TN,37405-1631,(423) 876-1192,3/7/2017 +-85.148779,35.003551,"Dollar General-Chattanooga,TN",8126 E Brainerd Rd Ste B,Chattanooga,TN,37421-4364,(423) 499-5944,3/7/2017 +-87.4297564,36.5812996,"Dollar General-Clarksville,TN",1100 Ash Ridge Drive,Clarksville,TN,37042,(931) 266-0481,3/10/2017 +-87.369248,36.625123,"Dollar General-Clarksville,TN",1481a Tiny Town Road,Clarksville,TN,37042,(931) 553-8502,3/10/2017 +-87.3462177,36.5030368,"Dollar General-Clarksville,TN",155 Edmonson Ferry Road,Clarksville,TN,37040,(931) 538-3681,3/10/2017 +-87.408016,36.575686,"Dollar General-Clarksville,TN",1600 Fort Campbell Blvd,Clarksville,TN,37042-3695,(931) 552-3212,3/10/2017 +-87.298261,36.514601,"Dollar General Market-Clarksville,TN",1945 Madison St Ste B,Clarksville,TN,37043-8034,(931) 645-2789,3/10/2017 +-87.313261,36.56429,"Dollar General-Clarksville,TN",2105 Trenton Rd,Clarksville,TN,37040-6652,(931) 645-1228,3/10/2017 +-87.268567,36.50748,"Dollar General-Clarksville,TN",2410 Madison St,Clarksville,TN,37043-5455,(931) 552-6877,3/10/2017 +-87.370476,36.442706,"Dollar General-Clarksville,TN",2748 Hwy 48,Clarksville,TN,37040-7456,(931) 552-4189,3/10/2017 +-87.356614,36.525354,"Dollar General-Clarksville,TN",324 Madison St,Clarksville,TN,37040-3647,(931) 647-5673,3/10/2017 +-87.436116,36.637515,"Dollar General-Clarksville,TN",3315 Fort Campbell Blvd,Clarksville,TN,37042-5601,(931) 431-3467,3/10/2017 +-87.317953,36.623133,"Dollar General-Clarksville,TN",3855 Trenton Rd,Clarksville,TN,37040-5614,(931) 645-2888,3/10/2017 +-87.412585,36.55135,"Dollar General-Clarksville,TN",440 Dover Rd,Clarksville,TN,37042,(931) 444-5184,3/10/2017 +-87.205914,36.413413,"Dollar General-Clarksville,TN",5425 Ashland City Rd,Clarksville,TN,37043,(931) 362-3436,3/10/2017 +-87.2356644,36.5209948,"Dollar General-Clarksville,TN",898 Hwy 76,Clarksville,TN,37043,(931) 266-4541,3/10/2017 +-87.379649,36.54906,"Dollar General-Clarksville,TN",924 New Providence Blvd,Clarksville,TN,37042-4469,(931) 645-5033,3/10/2017 +-87.3338044,36.5795615,"Dollar General-Clarksville,TN",927 Tracy Lane,Clarksville,TN,37040,(931) 538-3997,3/10/2017 +-84.885397,35.161223,"Dollar General-Cleveland,TN",216 Grove Ave Sw,Cleveland,TN,37311-5717,(423) 479-9717,3/9/2017 +-84.854992,35.130046,"Dollar General-Cleveland,TN",2175 Spring Place Rd Se,Cleveland,TN,37323-3340,(423) 559-0080,3/9/2017 +-84.877896,35.130311,"Dollar General-Cleveland,TN",2430 Blackburn Rd Se,Cleveland,TN,37323-0619,(423) 479-5360,3/9/2017 +-84.838051,35.147683,"Dollar General-Cleveland,TN",3425 Waterlevel Hwy,Cleveland,TN,37323-6652,(423) 472-2533,3/9/2017 +-84.818068,35.181766,"Dollar General-Cleveland,TN",3690 Michigan Ave,Cleveland,TN,37312,(423) 476-0003,3/9/2017 +-84.887302,35.194407,"Dollar General-Cleveland,TN",4625 Georgetown Rd Nw,Cleveland,TN,37312-1634,(423) 244-0518,3/9/2017 +-84.83334,35.212791,"Dollar General-Cleveland,TN",4955 N Lee Hwy,Cleveland,TN,37312-4158,(423) 339-1178,3/9/2017 +-84.873899,35.183664,"Dollar General-Cleveland,TN",860 25Th St Nw,Cleveland,TN,37311-3713,(423) 479-7542,3/9/2017 +-87.01487,35.63528,"Dollar General-Columbia,TN",125 Bear Creek Pike,Columbia,TN,38401-2266,(931) 840-0575,3/6/2017 +-87.064249,35.601598,"Dollar General-Columbia,TN",1301 S James Campbell Blvd,Columbia,TN,38401-0102,(931) 381-8829,3/6/2017 +-86.9871597,35.5409737,"Dollar General-Columbia,TN",1314 Fountain Heights Road,Columbia,TN,38401-8167,(931) 398-5732,3/6/2017 +-87.081896,35.619838,"Dollar General-Columbia,TN",1390 Hampshire Pike Ste A,Columbia,TN,38401,(931) 381-1145,3/6/2017 +-87.033973,35.588297,"Dollar General-Columbia,TN",230 E James Campbell Blvd #14,Columbia,TN,38401-4597,(931) 381-4633,3/6/2017 +-86.976786,35.705522,"Dollar General-Columbia,TN",2490 Nashville Hwy,Columbia,TN,38401-7236,(931) 486-1953,3/6/2017 +-87.097122,35.590108,"Dollar General-Columbia,TN",5024 Trotwood Ave,Columbia,TN,38401-5074,(931) 840-4700,3/6/2017 +-86.969138,35.636236,"Dollar General-Columbia,TN",704 Bear Creek Pike,Columbia,TN,38401,(931) 381-6691,3/6/2017 +-85.385413,36.275029,"Dollar General-Cookeville,TN",101 Tommy Dodson Hwy,Cookeville,TN,38506-9014,(931) 498-2595,3/8/2017 +-85.481609,36.176267,"Dollar General-Cookeville,TN",1068 E 10Th St Ste F,Cookeville,TN,38501-2195,(931) 528-0201,3/8/2017 +-85.524793,36.269946,"Dollar General-Cookeville,TN",17666 Dodson Branch Hwy,Cookeville,TN,38501,(931) 400-2187,3/8/2017 +-85.506634,36.113373,"Dollar General-Cookeville,TN",1781 S Jefferson Ave,Cookeville,TN,38506,(931) 284-4828,3/8/2017 +-85.500586,36.159455,"Dollar General Market-Cookeville,TN",185 S Jefferson Ave,Cookeville,TN,38501-3424,(931) 528-1719,3/8/2017 +-85.496459,36.186112,"Dollar General-Cookeville,TN",1945 N Washington,Cookeville,TN,38501-1026,(931) 526-1884,3/8/2017 +-85.544407,36.119673,"Dollar General-Cookeville,TN",1999 Burgess Falls Rd,Cookeville,TN,38506-5638,(931) 432-6831,3/8/2017 +-85.452818,36.189617,"Dollar General-Cookeville,TN",379 W Main St,Cookeville,TN,38506-5391,(931) 537-9346,3/8/2017 +-85.515011,36.165737,"Dollar General-Cookeville,TN",403 W Broad St,Cookeville,TN,38501-2333,(931) 526-7584,3/8/2017 +-85.505691,36.05707,"Dollar General-Cookeville,TN",7020 Roberts Matthews Hwy,Cookeville,TN,38506,(931) 739-7020,3/8/2017 +-85.52448,36.159692,"Dollar General-Cookeville,TN",878 W Jackson St,Cookeville,TN,38501-7123,(931) 528-1169,3/8/2017 +-85.034666,35.94361,"Dollar General Market-Crossville,TN",1259 Miller Ave [Ste 104],Crossville,TN,38555-5272,(931) 484-1738,3/8/2017 +-85.030499,35.95762,"Dollar General-Crossville,TN",146 Woodmere Mall,Crossville,TN,38555-4230,(931) 456-8331,3/8/2017 +-85.006189,35.926712,"Dollar General-Crossville,TN",1846 S Main St,Crossville,TN,38555-5912,(931) 484-7546,3/8/2017 +-85.037942,35.973071,"Dollar General-Crossville,TN",1858 N Main St,Crossville,TN,38555-8763,(931) 456-7664,3/8/2017 +-85.049144,35.919341,"Dollar General-Crossville,TN",31 Kearney Dr,Crossville,TN,38572,(931) 707-9160,3/8/2017 +-85.0444324,36.0089812,"Dollar General-Crossville,TN",4518 Hwy 127 North,Crossville,TN,38571-7439,(931) 210-6497,3/8/2017 +-84.911574,36.005841,"Dollar General-Crossville,TN",5643 Peavine Rd,Crossville,TN,38571-7911,(931) 456-6611,3/8/2017 +-87.381556,36.062334,"Dollar General-Dickson,TN",188 Beasley Dr,Dickson,TN,37055-2840,(615) 740-8888,3/6/2017 +-87.3446446,36.0274187,"Dollar General-Dickson,TN",2106 Highway 46 S,Dickson,TN,37055-5953,(615) 229-6947,3/6/2017 +-87.386491,36.077533,"Dollar General-Dickson,TN",225 N Main St,Dickson,TN,37055-1801,(615) 446-8743,3/6/2017 +-87.517197,36.091295,"Dollar General-Dickson,TN",4610 Highway 70 W,Dickson,TN,37055-4540,(615) 441-8648,3/6/2017 +-87.390755,36.086338,"Dollar General-Dickson,TN",706 Henslee Dr,Dickson,TN,37055-1213,(615) 441-5918,3/6/2017 +-89.400236,36.035235,"Dollar General-Dyersburg,TN",1120 Forrest St,Dyersburg,TN,38024-3746,(731) 285-3627,3/10/2017 +-89.367223,36.052737,"Dollar General-Dyersburg,TN",1478 Us Highway 51 Byp E,Dyersburg,TN,38024-1249,(731) 287-1914,3/10/2017 +-89.395111,36.06053,"Dollar General-Dyersburg,TN",2450 Lake Rd Ste A,Dyersburg,TN,38024-1688,(731) 287-8503,3/10/2017 +-89.393124,35.984324,"Dollar General-Dyersburg,TN",55 Highway 210 N,Dyersburg,TN,38024-8213,(731) 286-0401,3/10/2017 +-89.37677,36.031405,"Dollar General-Dyersburg,TN",801 E Court St,Dyersburg,TN,38024-4830,(731) 285-4569,3/10/2017 +-99.705975,32.461639,"Dollar General-Abilene,TX",1091 N Judge Ely Blvd,Abilene,TX,79601-3853,(325) 670-0966,3/6/2017 +-99.757997,32.463389,"Dollar General-Abilene,TX",1202 N Mockingbird Ln,Abilene,TX,79603-4706,(325) 672-2712,3/6/2017 +-99.738704,32.434113,"Dollar General-Abilene,TX",1290 Butternut St,Abilene,TX,79602-3715,(325) 673-3651,3/6/2017 +-99.7447021,32.474395,"Dollar General-Abilene,TX",2017 Ambler Ave,Abilene,TX,79603-2239,(325) 603-2199,3/6/2017 +-99.757232,32.417496,"Dollar General-Abilene,TX",2926 S 27Th St,Abilene,TX,79605-6330,(325) 695-1182,3/6/2017 +-99.774853,32.40627,"Dollar General-Abilene,TX",3726 Catclaw Dr # 1,Abilene,TX,79606-8202,(325) 691-8869,3/6/2017 +-99.794531,32.443984,"Dollar General-Abilene,TX",5401 S 7th St,Abilene,TX,79605-2543,(325) 267-8951,3/6/2017 +-99.771204,32.444498,"Dollar General-Abilene,TX",630 S Leggett,Abilene,TX,79605-1636,(325) 677-8255,3/6/2017 +-99.777363,32.369312,"Dollar General-Abilene,TX",6617 Buffalo Gap Rd,Abilene,TX,79606-5944,(325) 692-1417,3/6/2017 +-98.1205655,26.1906291,"Dollar General-Alamo,TX",1011 E Frontage Rd Ste C,Alamo,TX,78516-2320,(956) 782-1187,3/7/2017 +-98.120453,26.190528,"Dollar General-Alamo,TX",1011 W Frontage Rd [Ste C],Alamo,TX,78516-2320,(956) 782-1187,3/7/2017 +-98.119513,26.204407,"Dollar General-Alamo,TX",1018 N Alamo Rd,Alamo,TX,78516-6800,(956) 783-8266,3/7/2017 +-98.116201,26.170834,"Dollar General-Alamo,TX",807 Ridge Rd,Alamo,TX,78516-9596,(956) 702-7927,3/7/2017 +-101.835288,35.221969,"Dollar General-Amarillo,TX",1430 W Amarillo Blvd,Amarillo,TX,79107-5505,(806) 223-2747,3/8/2017 +-101.820254,35.201172,"Dollar General-Amarillo,TX",1518 Se 10th Ave,Amarillo,TX,79102-4138,(806) 371-7988,3/8/2017 +-101.8296596,35.279985,"Dollar General-Amarillo,TX",203 East Willow Creek Rd,Amarillo,TX,79108,(806) 340-7873,3/8/2017 +-101.866709,35.205019,"Dollar General-Amarillo,TX",2726 W 10Th Street,Amarillo,TX,79102,(806) 373-8229,3/8/2017 +-101.8035278,35.090229,"Dollar General-Amarillo,TX",2950 E Fm 1151,Amarillo,TX,79118-4306,(806) 340-7878,3/8/2017 +-101.831081,35.251025,"Dollar General-Amarillo,TX",307 E Hastings Ave,Amarillo,TX,79108-5263,(806) 383-2826,3/8/2017 +-101.866381,35.17813,"Dollar General-Amarillo,TX",3412 S Georgia St,Amarillo,TX,79109-4842,(806) 468-7747,3/8/2017 +-101.90214,35.175973,"Dollar General-Amarillo,TX",3415 Bell St Ste C,Amarillo,TX,79109-4148,(806) 352-9533,3/8/2017 +-101.813048,35.17818,"Dollar General-Amarillo,TX",3510 S Osage St,Amarillo,TX,79118-6763,(806) 373-1343,3/8/2017 +-101.795117,35.236626,"Dollar General-Amarillo,TX",3611 Ne 24Th Ave,Amarillo,TX,79107-7242,(806) 381-0993,3/9/2017 +-101.883939,35.213149,"Dollar General-Amarillo,TX",403 S Western St,Amarillo,TX,79106-8555,(806) 467-0869,3/9/2017 +-101.884221,35.163965,"Dollar General-Amarillo,TX",4210 Sw 45Th Ave Ste A,Amarillo,TX,79109-0400,(806) 353-3244,3/9/2017 +-101.848664,35.166801,"Dollar General-Amarillo,TX",4308 S Washington St,Amarillo,TX,79110-2016,(806) 356-8879,3/9/2017 +-101.893987,35.195958,"Dollar General-Amarillo,TX",5131 Plains Blvd,Amarillo,TX,79106-4515,(806) 358-1636,3/9/2017 +-101.883676,35.148104,"Dollar General-Amarillo,TX",5811 S Western St,Amarillo,TX,79110-3644,(806) 359-5571,3/9/2017 +-101.914207,35.072513,"Dollar General-Amarillo,TX",7040 Mccormick Road,Amarillo,TX,79118,(806) 622-9337,3/9/2017 +-101.901761,35.133092,"Dollar General-Amarillo,TX",7125 Bell St,Amarillo,TX,79109-7004,(806) 356-0993,3/9/2017 +-97.094035,32.78475,"Dollar General-Arlington,TX",1001 Ne Green Oaks Blvd #151,Arlington,TX,76006-2316,(817) 460-8028,3/10/2017 +-97.092374,32.707799,"Dollar General-Arlington,TX",1200 E Pioneer Pkwy,Arlington,TX,76010-6410,(817) 795-6700,3/10/2017 +-97.080195,32.720524,"Dollar General-Arlington,TX",1525 New York Ave,Arlington,TX,76010-4723,(817) 548-7530,3/10/2017 +-97.149056,32.72102,"Dollar General-Arlington,TX",1527 S Bowen Rd,Arlington,TX,76013-3335,(817) 274-5757,3/10/2017 +-97.082589,32.69183,"Dollar General-Arlington,TX",1811 E Mayfield Rd,Arlington,TX,76014-2504,(817) 557-4445,3/10/2017 +-97.06535,32.706273,"Dollar General-Arlington,TX",2535 Arkansas Ln-Ste #333,Arlington,TX,76010-8702,(817) 860-8580,3/10/2017 +-97.131549,32.752328,"Dollar General-Arlington,TX",453 Fielder North Plz,Arlington,TX,76012-2308,(817) 274-8522,3/10/2017 +-97.181517,32.647535,"Dollar General-Arlington,TX",4651 West Sublett Road,Arlington,TX,76017,(817) 563-1874,3/10/2017 +-97.115183,32.660624,"Dollar General-Arlington,TX",5320 Matlock Rd,Arlington,TX,76018-1610,(817) 557-0484,3/10/2017 +-97.076864,32.656417,"Dollar General-Arlington,TX",5531 New York Ave,Arlington,TX,76018-1801,(817) 468-7998,3/10/2017 +-97.193023,32.673764,"Dollar General-Arlington,TX",5777 Sw Green Oaks Blvd,Arlington,TX,76017-1202,(817) 483-5955,3/10/2017 +-97.133522,32.643493,"Dollar General-Arlington,TX",6315 S Cooper St,Arlington,TX,76001-5616,(817) 557-1525,3/10/2017 +-97.097332,32.721111,"Dollar General-Arlington,TX",903 E Park Row Dr,Arlington,TX,76010-4508,(817) 801-5804,3/10/2017 +-97.116656,32.708707,"Dollar General-Arlington,TX",905 W Pioneer Pkwy,Arlington,TX,76013-6369,(817) 795-3344,3/10/2017 +-97.648414,30.38775,"Dollar General-Austin,TX",12320 Dessau Rd,Austin,TX,78754-1801,(512) 719-5155,3/7/2017 +-97.588641,30.250012,"Dollar General-Austin,TX",13712 webberville Rd,Austin,TX,78724,(512) 276-7211,3/7/2017 +-97.719323,30.239156,"Dollar General-Austin,TX",1401 S Pleasant Valley Rd,Austin,TX,78741,(512) 693-4147,3/7/2017 +-97.790297,30.230334,"Dollar General-Austin,TX",2101 West Ben White,Austin,TX,78704,(512) 326-1855,3/7/2017 +-97.67901,30.377867,"Dollar General-Austin,TX",405 E Braker Ln,Austin,TX,78753-2748,(512) 491-8455,3/7/2017 +-97.678389,30.292529,"Dollar General-Austin,TX",5000 Springdale Rd,Austin,TX,78723,(512) 898-9016,3/7/2017 +-97.738024,30.194853,"Dollar General-Austin,TX",5002 Nuckols Crossing Rd,Austin,TX,78744-3730,(512) 804-5244,3/7/2017 +-97.800274,30.214037,"Dollar General-Austin,TX",5738 Manchaca Rd # 2,Austin,TX,78745-3635,(512) 448-9600,3/7/2017 +-97.706867,30.226744,"Dollar General-Austin,TX",6010 E Riverside Dr,Austin,TX,78741-6512,(512) 385-4040,3/7/2017 +-97.657617,30.284346,"Dollar General-Austin,TX",6600 Fm 969,Austin,TX,78724,(512) 926-7762,3/7/2017 +-97.666327,30.310965,"Dollar General-Austin,TX",6729 Manor Road,Austin,TX,78723,(512) 354-2548,3/7/2017 +-97.814652,30.208712,"Dollar General-Austin,TX",6800 West Gate Blvd Ste 115,Austin,TX,78745-4868,(512) 447-4753,3/7/2017 +-97.717827,30.336064,"Dollar General-Austin,TX",6929 Airport Blvd Ste 160,Austin,TX,78752-3617,(512) 302-9085,3/7/2017 +-97.781975,30.208491,"Dollar General-Austin,TX",709 W Stassney Ln,Austin,TX,78745-3031,(512) 912-9487,3/7/2017 +-97.686387,30.357122,"Dollar General-Austin,TX",825 E Rundberg Ln Ste G1,Austin,TX,78753-4800,(512) 873-9288,3/7/2017 +-97.82254,30.176352,"Dollar General-Austin,TX",9600 Manchaca Rd,Austin,TX,78748-6207,(512) 291-8681,3/7/2017 +-97.695607,30.365907,"Dollar General-Austin,TX",9616 N Lamar Blvd Ste 120,Austin,TX,78753-4150,(512) 339-0533,3/7/2017 +-94.863678,29.854803,"Dollar General-Baytown,TX",11455 Eagle Dr,Baytown,TX,77520-9877,(281) 576-4925,3/10/2017 +-94.9779,29.744665,"Dollar General-Baytown,TX",1721 Garth Rd,Baytown,TX,77520-2411,(281) 427-3619,3/10/2017 +-94.963875,29.76165,"Dollar General-Baytown,TX",3606 N Main St,Baytown,TX,77521-3302,(281) 427-3606,3/10/2017 +-94.957598,29.731299,"Dollar General-Baytown,TX",400 N Alexander Dr,Baytown,TX,77520-5807,(281) 420-1892,3/10/2017 +-95.010562,29.768502,"Dollar General-Baytown,TX",4220 Decker Dr,Baytown,TX,77520-1640,(281) 424-8151,3/10/2017 +-94.981241,29.802265,"Dollar General-Baytown,TX",6930 Garth Rd,Baytown,TX,77521-9646,(281) 421-7394,3/10/2017 +-94.129521,30.078542,"Dollar General-Beaumont,TX",10 N 11Th St,Beaumont,TX,77702-2211,(409) 833-7358,3/9/2017 +-94.256458,29.928145,"Dollar General-Beaumont,TX",19797 Fm 365 Rd,Beaumont,TX,77705-8781,(409) 794-3033,3/9/2017 +-94.112121,30.099072,"Dollar General-Beaumont,TX",2210 Gulf St,Beaumont,TX,77703-5204,(409) 838-9037,3/9/2017 +-94.168146,30.102883,"Dollar General-Beaumont,TX",2602 Dowlen Rd,Beaumont,TX,77706-2543,(409) 860-0883,3/9/2017 +-94.1281161,30.1256651,"Dollar General-Beaumont,TX",2730 Lucas E Drive,Beaumont,TX,77703,(409) 242-6863,3/9/2017 +-94.086114,30.050362,"Dollar General-Beaumont,TX",3710 Highland Ave,Beaumont,TX,77705-3835,(409) 212-8801,3/9/2017 +-94.127071,30.046916,"Dollar General-Beaumont,TX",4050 Fannett Rd,Beaumont,TX,77705-2704,(409) 840-9331,3/9/2017 +-94.153889,30.068043,"Dollar General-Beaumont,TX",5468 College St,Beaumont,TX,77707-3634,(409) 842-4848,3/9/2017 +-94.188975,30.133022,"Dollar General-Beaumont,TX",7335 Highway 105,Beaumont,TX,77713-4525,(409) 895-0989,3/9/2017 +-94.192223,30.07647,"Dollar General-Beaumont,TX",8455 Phelan Rd,Beaumont,TX,77707-5616,(409) 866-0594,3/9/2017 +-97.536448,25.940821,"Dollar General-Brownsville,TX",1300 W Ruben M Torres Blvd,Brownsville,TX,78520-5040,(956) 554-0393,3/6/2017 +-97.511397,25.92473,"Dollar General-Brownsville,TX",1304 Central Blvd,Brownsville,TX,78523-7560,(956) 574-9376,3/6/2017 +-97.501396,25.898158,"Dollar General-Brownsville,TX",14 Sam Perl Blvd,Brownsville,TX,78520,(956) 284-0859,3/6/2017 +-97.498897,25.915865,"Dollar General-Brownsville,TX",1552 Palm Blvd Ste A,Brownsville,TX,78520-7264,(956) 548-2646,3/6/2017 +-97.454495,25.903497,"Dollar General-Brownsville,TX",235 Morningside Rd,Brownsville,TX,78521-4934,(956) 550-9978,3/6/2017 +-97.453778,25.928006,"Dollar General-Brownsville,TX",5444 S Padre Isld Hwy,Brownsville,TX,78521-4412,(956) 832-0832,3/6/2017 +-98.99215,31.70826,"Dollar General-Brownwood,TX",2000 Highway 377 S,Brownwood,TX,76801-4017,(325) 646-7766,3/9/2017 +-98.976009,31.729884,"Dollar General-Brownwood,TX",315 E Commerce St,Brownwood,TX,76801-1823,(325) 641-8054,3/9/2017 +-98.9591722,31.6842894,"Dollar General-Brownwood,TX",3706 Austin Ave,Brownwood,TX,76801,(none listed),3/9/2017 +-99.092938,31.8195813,"Dollar General-Brownwood,TX",8015 Highway 279,Brownwood,TX,76801-0025,(325) 784-5485,3/9/2017 +-96.383091,30.683437,"Dollar General-Bryan,TX",1201 W Martin Luther King Jr,Bryan,TX,77803,(979) 314-0682,3/8/2017 +-96.374107,30.632191,"Dollar General-Bryan,TX",1314 W Villa Maria Rd,Bryan,TX,77801-4236,(979) 823-7858,3/8/2017 +-96.354436,30.6729,"Dollar General-Bryan,TX",1576 E William J Bryan Parkway,Bryan,TX,77803,(979) 314-0683,3/8/2017 +-96.364767,30.654345,"Dollar General-Bryan,TX",1709 S Texas Ave,Bryan,TX,77802-1020,(979) 779-0864,3/8/2017 +-96.32474,30.67105,"Dollar General-Bryan,TX",2711 Boonville Rd,Bryan,TX,77808-2229,(979) 774-3753,3/8/2017 +-96.391181,30.70132,"Dollar General-Bryan,TX",3706 N Texas Ave,Bryan,TX,77803-0734,(979) 431-5998,3/8/2017 +-95.1448732,30.2841266,"Dollar General-Cleveland,TX",11025 Fostoria Road,Cleveland,TX,77328,(281) 622-4315,3/6/2017 +-95.095987,30.334275,"Dollar General-Cleveland,TX",116 Truly Plz,Cleveland,TX,77327-4889,(281) 659-0104,3/6/2017 +-95.245729,30.31166,"Dollar General-Cleveland,TX",18350 E Highway 105,Cleveland,TX,77328-2430,(281) 659-2915,3/6/2017 +-94.994213,30.317547,"Dollar General-Cleveland,TX",22880 Hwy 321,Cleveland,TX,77327,(281) 761-7014,3/6/2017 +-94.8383617,30.4509681,"Dollar General-Cleveland,TX",4775 Fm 787 W,Cleveland,TX,77327,(281) 761-2298,3/6/2017 +-95.082381,30.340894,"Dollar General-Cleveland,TX",640 East Houston Street,Cleveland,TX,77327-4689,(281) 592-1316,3/6/2017 +-95.300491,30.239344,"Dollar General-Conroe,TX",14515 Fm 1485 Rd,Conroe,TX,77306-8907,(936) 231-3881,3/6/2017 +-95.353425,30.205542,"Dollar General-Conroe,TX",16995 Fm 1314,Conroe,TX,77302,(281) 601-4553,3/6/2017 +-95.466724,30.332245,"Dollar General-Conroe,TX",2017 N Frazier St,Conroe,TX,77301-1233,(936) 539-5212,3/6/2017 +-95.495838,30.326923,"Dollar General-Conroe,TX",2495 N Loop 336 W,Conroe,TX,77304-3581,(936) 494-3344,3/6/2017 +-95.4179,30.32042,"Dollar General-Conroe,TX",2560 E Davis Hwy,Conroe,TX,77304,(936) 756-6064,3/6/2017 +-95.463883,30.312093,"Dollar General-Conroe,TX",733 W Davis St,Conroe,TX,77301-2704,(936) 539-5214,3/6/2017 +-97.271451,27.503095,"Dollar General-Corpus Christi,TX",10309 S Padre Island Dr Ste A2,Corpus Christi,TX,78418-4455,(361) 937-8892,3/6/2017 +-97.642536,27.857117,"Dollar General-Corpus Christi,TX",14102 Northwest Blvd,Corpus Christi,TX,78410-5121,(361) 241-5680,3/6/2017 +-97.298203,27.642943,"Dollar General-Corpus Christi,TX",2701 Waldron Rd,Corpus Christi,TX,78418-4823,(361) 937-7300,3/6/2017 +-97.4025469,27.7613126,"Dollar General-Corpus Christi,TX",2767 S Staples St,Corpus Christi,TX,78404-3619,(361) 855-3755,3/6/2017 +-97.424761,27.722129,"Dollar General-Corpus Christi,TX",2978 Holly Road,Corpus Christi,TX,78415,(361) 225-2120,3/6/2017 +-97.424882,27.778026,"Dollar General-Corpus Christi,TX",3130 Morgan Ave,Corpus Christi,TX,78405-2160,(361) 371-2384,3/6/2017 +-97.437857,27.797165,"Dollar General-Corpus Christi,TX",3928 Leopard St,Corpus Christi,TX,78408-2822,(361) 882-2380,3/6/2017 +-97.437338,27.749154,"Dollar General-Corpus Christi,TX",4714 Greenwood Dr,Corpus Christi,TX,78416-1773,(361) 806-0940,3/6/2017 +-97.388264,27.704544,"Dollar General-Corpus Christi,TX",4902 Holly Rd,Corpus Christi,TX,78411-4766,(361) 986-9285,3/6/2017 +-97.408236,27.706541,"Dollar General-Corpus Christi,TX",6057 Weber Rd,Corpus Christi,TX,78413-3970,(361) 814-3530,3/6/2017 +-97.402316,27.785583,"Dollar General-Corpus Christi,TX",609 S Staples St,Corpus Christi,TX,78401-3334,(361) 882-7070,3/6/2017 +-97.363286,27.675446,"Dollar General-Corpus Christi,TX",6726 Saratoga Blvd,Corpus Christi,TX,78414-3906,(361) 994-1337,3/6/2017 +-97.362308,27.717969,"Dollar General-Corpus Christi,TX",831 Airline Rd Ste B,Corpus Christi,TX,78412-3187,(361) 985-6914,3/6/2017 +-97.559172,27.83099,"Dollar General-Corpus Christi,TX",9850 Leopard St,Corpus Christi,TX,78410-1612,(361) 242-1613,3/6/2017 +-96.435069,32.06245,"Dollar General-Corsicana,TX",3600 S Us Hwy 287,Corsicana,TX,75109-8959,(903) 345-4639,3/9/2017 +-96.5188,32.087041,"Dollar General-Corsicana,TX",3811 W Highway 22,Corsicana,TX,75110-2465,(903) 872-4935,3/9/2017 +-96.471684,32.094326,"Dollar General-Corsicana,TX",615 W 2Nd Ave,Corsicana,TX,75110-2943,(903) 872-2752,3/9/2017 +-96.47123,32.087848,"Dollar General-Corsicana,TX",842 W 7Th Ave Ste G,Corsicana,TX,75110-6370,(903) 872-6640,3/9/2017 +-96.856429,32.882058,"Dollar General-Dallas,TX",10055 Marsh Ln,Dallas,TX,75229-6058,(214) 366-7621,3/10/2017 +-96.682837,32.84972,"Dollar General-Dallas,TX",11255 Garland Rd Ste 200,Dallas,TX,75218-2518,(214) 321-7959,3/10/2017 +-96.60035,32.677766,"Dollar General-Dallas,TX",1780 S Beltline Road,Dallas,TX,75253,(214) 613-1165,3/10/2017 +-96.648054,32.747298,"Dollar General-Dallas,TX",2020 N Masters Dr Ste 102,Dallas,TX,75217-3182,(972) 329-3272,3/10/2017 +-96.78867,32.741693,"Dollar General-Dallas,TX",2919 Cedar Crest Blvd,Dallas,TX,75203-4011,(214) 942-2889,3/10/2017 +-96.861284,32.858668,"Dollar General-Dallas,TX",3515 W Northwest Highway,Dallas,TX,75220,(469) 522-2516,3/10/2017 +-96.839964,32.696546,"Dollar General-Dallas,TX",3936 S Polk St Ste 114,Dallas,TX,75224-4483,(214) 374-7554,3/10/2017 +-96.899414,32.705951,"Dollar General-Dallas,TX",4627 W Kiest Blvd,Dallas,TX,75236-1168,(214) 337-0157,3/10/2017 +-96.703057,32.734542,"Dollar General-Dallas,TX",6905 Lake June Rd,Dallas,TX,75217-1325,(214) 391-7386,3/10/2017 +-96.689055,32.712645,"Dollar General-Dallas,TX",7771 S Loop 12,Dallas,TX,75217,(214) 391-7269,3/10/2017 +-96.698603,32.812691,"Dollar General-Dallas,TX",8786 Ferguson Rd,Dallas,TX,75228,(214) 324-8773,3/10/2017 +-96.748256,32.9094,"Dollar General-Dallas,TX",9035 Forest Ln Ste 101,Dallas,TX,75243-4160,(972) 783-9399,3/10/2017 +-97.150594,33.204798,"Dollar General-Denton,TX",1107 Avenue C,Denton,TX,76201-6501,(940) 591-9887,3/6/2017 +-97.110455,33.215849,"Dollar General-Denton,TX",1609 E Mckinney St,Denton,TX,76209-4539,(940) 591-9508,3/6/2017 +-97.145578,33.21556,"Dollar General-Denton,TX",1626 W Univeristy Dr Ste A,Denton,TX,76201-1760,(940) 383-2920,3/6/2017 +-97.102967,33.188659,"Dollar General-Denton,TX",2127 Sadau Ct,Denton,TX,76210-4941,(940) 243-2124,3/6/2017 +-97.13702,33.24231,"Dollar General-Denton,TX",3001 N Elm St Ste 100,Denton,TX,76207-7664,(940) 382-8434,3/6/2017 +-98.0439682,26.1640396,"Dollar General-Donna,TX",1600 S Salinas Blvd,Donna,TX,78537,(956) 377-2568,3/9/2017 +-98.055542,26.169187,"Dollar General-Donna,TX",209 S 8Th St # 227,Donna,TX,78537-3136,(956) 464-1032,3/9/2017 +-98.037577,26.200959,"Dollar General-Donna,TX",4215 N FM 493,Donna,TX,78537,(956) 377-2566,3/9/2017 +-98.073184,26.184194,"Dollar General-Donna,TX",717 W Bus Hwy 83,Donna,TX,78537,(956) 377-1222,3/9/2017 +-98.03685,26.218897,"Dollar General-Donna,TX",7900 N Fm 493,Donna,TX,78537-5082,(956) 461-5778,3/9/2017 +-100.473765,28.692537,"Dollar General-Eagle Pass,TX",1651 S Veterans Blvd,Eagle Pass,TX,78852-6480,(830) 773-9004,3/6/2017 +-100.49672,28.729023,"Dollar General-Eagle Pass,TX",1910 Paso Del Rio Blvd,Eagle Pass,TX,78852-3488,(830) 773-5778,3/6/2017 +-100.481548,28.733608,"Dollar General-Eagle Pass,TX",2743 N Veterans Blvd,Eagle Pass,TX,78852-6635,(830) 758-0384,3/6/2017 +-100.4950634,28.7548947,"Dollar General-Eagle Pass,TX",3245 Del Rio Blvd,Eagle Pass,TX,78852,(830) 319-3422,3/6/2017 +-100.439446,28.656635,"Dollar General-Eagle Pass,TX",5819 Fm 1021,Eagle Pass,TX,78852-1236,(830) 758-7628,3/6/2017 +-98.138385,26.2908,"Dollar General-Edinburg,TX",1121 S Raul Longoria Rd,Edinburg,TX,78539-2716,(956) 318-3539,3/10/2017 +-98.190807,26.249614,"Dollar General-Edinburg,TX",1311 W Owassa Rd,Edinburg,TX,78539,(956) 787-7001,3/10/2017 +-98.16967,26.338952,"Dollar General-Edinburg,TX",1406 W Monte Cristo Rd,Edinburg,TX,78541-7329,(956) 383-4534,3/10/2017 +-98.136099,26.33436,"Dollar General-Edinburg,TX",1801 E Monte Cristo Rd,Edinburg,TX,78542,(956) 383-3636,3/10/2017 +-98.107356,26.276674,"Dollar General-Edinburg,TX",1821 S Alamo Road,Edinburg,TX,78539,(956) 380-0066,3/10/2017 +-98.182126,26.279268,"Dollar General-Edinburg,TX",3007 S Sugar Rd,Edinburg,TX,78539-2117,(956) 292-0993,3/10/2017 +-98.160202,26.299903,"Dollar General-Edinburg,TX",302 E Cano St,Edinburg,TX,78539-4512,(956) 318-1787,3/10/2017 +-98.142589,26.26516,"Dollar General-Edinburg,TX",4406 S Raul Longoria Rd,Edinburg,TX,78542-2026,(956) 283-1545,3/10/2017 +-98.2080129,26.3446905,"Dollar General-Edinburg,TX",5107 W Monte Cristo Rd,Edinburg,TX,78541-8852,(956) 316-2217,3/10/2017 +-98.096125,26.347815,"Dollar General-Edinburg,TX",5125 S Alamo Rd,Edinburg,TX,78539-8732,(956) 283-1357,3/10/2017 +-98.0667952,26.2946599,"Dollar General-Edinburg,TX",8920 E Highway 107,Edinburg,TX,78542,(none listed),3/10/2017 +-106.4034042,31.9061165,"Dollar General-El Paso,TX",10180 Dyer Street,El Paso,TX,79924,(915) 257-4686,3/7/2017 +-106.407146,31.926805,"Dollar General-El Paso,TX",10810 Mccombs St,El Paso,TX,79924-1507,(915) 822-9728,3/7/2017 +-106.424599,31.93841,"Dollar General-El Paso,TX",11100 Sean Haggerty Drive Bldg C,El Paso,TX,79934,(915) 822-2288,3/7/2017 +-106.314813,31.679856,"Dollar General-El Paso,TX",115 S Americas Ave Ste B,El Paso,TX,79907-6906,(915) 859-3116,3/7/2017 +-106.286404,31.782363,"Dollar General-El Paso,TX",11680 Pebble Hills Blvd,El Paso,TX,79936-0964,(915) 855-1969,3/7/2017 +-106.298364,31.728897,"Dollar General-El Paso,TX",1348 N Zaragoza Rd,El Paso,TX,79936-7945,(915) 857-5092,3/7/2017 +-106.527478,31.818654,"Dollar General-El Paso,TX",135 S Mesa Hills Dr,El Paso,TX,79912-5467,(915) 760-6836,3/7/2017 +-106.179666,31.817924,"Dollar General-El Paso,TX",14392 Montana Ave,El Paso,TX,79938-7201,(915) 849-0491,3/7/2017 +-106.570419,31.881267,"Dollar General-El Paso,TX",1550 N Resler Dr Ste M,El Paso,TX,79912-1437,(915) 760-5021,3/8/2017 +-106.301578,31.748874,"Dollar General-El Paso,TX",1580 George Dieter Dr Ste 102,El Paso,TX,79936-7612,(915) 921-6910,3/8/2017 +-106.279594,31.750738,"Dollar General-El Paso,TX",1700 N Zaragoza,El Paso,TX,79936-7965,(915) 855-1146,3/8/2017 +-106.501112,31.774866,"Dollar General-El Paso,TX",2400 N Mesa,El Paso,TX,79902-3109,(915) 577-0214,3/8/2017 +-106.35626,31.784216,"Dollar General-El Paso,TX",3017 Mcrae Blvd,El Paso,TX,79925-4533,(915) 599-1622,3/8/2017 +-106.45941,31.784589,"Dollar General-El Paso,TX",3028 Pershing Dr,El Paso,TX,79903-2523,(915) 565-2927,3/8/2017 +-106.302024,31.791044,"Dollar General-El Paso,TX",3350 George Deiter Dr,El Paso,TX,79936-2387,(915) 857-9114,3/9/2017 +-106.444641,31.807465,"Dollar General-El Paso,TX",3440 Dyer St,El Paso,TX,79930-6318,(915) 566-8086,3/9/2017 +-106.321711,31.702002,"Dollar General-El Paso,TX",500 N Zaragoza Rd Ste Ih,El Paso,TX,79907-4700,(915) 859-7932,3/9/2017 +-106.364027,31.741785,"Dollar General-El Paso,TX",500C N Carolina Dr,El Paso,TX,79915-2608,(915) 593-3141,3/9/2017 +-106.581384,31.845849,"Dollar General-El Paso,TX",5100 Doniphan Dr,El Paso,TX,79932-1602,(915) 585-2671,3/9/2017 +-106.423874,31.90313,"Dollar General-El Paso,TX",5111 Fairbanks Dr,El Paso,TX,79924-3835,(915) 757-3002,3/9/2017 +-106.425148,31.783792,"Dollar General-El Paso,TX",5421 Montana Ave Ste A,El Paso,TX,79903-4909,(915) 778-6841,3/6/2017 +-106.610738,31.875601,"Dollar General-El Paso,TX",6225 Upper Valley Road,El Paso,TX,79922-4310,(915) 877-5060,3/6/2017 +-106.547936,31.835406,"Dollar General-El Paso,TX",6910 N Mesa St Ste A,El Paso,TX,79912-4446,(915) 587-0097,3/6/2017 +-106.395503,31.756516,"Dollar General-El Paso,TX",7021 Alameda Ave,El Paso,TX,79915-3454,(915) 778-7335,3/6/2017 +-106.43586,31.857783,"Dollar General-El Paso,TX",8500 Dyer St Ste 61,El Paso,TX,79904-2800,(915) 755-4795,3/6/2017 +-106.426928,31.872153,"Dollar General-El Paso,TX",9155 Dyer St Ste 21,El Paso,TX,79924-6401,(915) 751-6968,3/6/2017 +-106.36354,31.765733,"Dollar General-El Paso,TX",9530 Viscount Blvd Ste 2A,El Paso,TX,79925-7000,(915) 633-8087,3/6/2017 +-106.41329,31.892781,"Dollar General-El Paso,TX",9801 Dyer St,El Paso,TX,79924-4707,(915) 759-7020,3/6/2017 +-76.285008,36.717454,"Dollar General-Chesapeake,VA",1249 Cedar Rd Ste 106,Chesapeake,VA,23322-7292,(757) 382-4244,3/8/2017 +-76.203952,36.764009,"Dollar General-Chesapeake,VA",1367 Kempsville Rd,Chesapeake,VA,23320-1415,(757) 547-2223,3/8/2017 +-76.277653,36.811068,"Dollar General-Chesapeake,VA",1435 Bainbridge Blvd,Chesapeake,VA,23324-2237,(757) 543-2279,3/8/2017 +-76.34288,36.740494,"Dollar General-Chesapeake,VA",2617 Moses Grandy Trk Ste 112,Chesapeake,VA,23323-6711,(757) 485-5932,3/8/2017 +-76.336139,36.772443,"Dollar General-Chesapeake,VA",3302 S Military Hwy,Chesapeake,VA,23323-3545,(757) 558-1124,3/8/2017 +-76.243818,36.744362,"Dollar General-Chesapeake,VA",701-D North Battlefield Blvd,Chesapeake,VA,23320-0000,(757) 549-6653,3/8/2017 +-79.414346,36.594194,"Dollar General-Danville,VA",109 Piney Forest Rd,Danville,VA,24540-4125,(434) 793-4988,3/6/2017 +-79.343404,36.581105,"Dollar General-Danville,VA",1307 S Boston Road,Danville,VA,24540,(434) 688-0722,3/6/2017 +-79.405342,36.559366,"Dollar General-Danville,VA",1424 S Main St,Danville,VA,24541,(434) 792-9438,3/6/2017 +-79.449752,36.590457,"Dollar General-Danville,VA",1500 Westover Drive,Danville,VA,24541,(434) 688-3136,3/6/2017 +-79.4131775,36.6028099,"Dollar General Market-Danville,VA",2001 Piney Forest Rd,Danville,VA,24540,(434) 688-4627,3/6/2017 +-79.457823,36.558445,"Dollar General-Danville,VA",2398 W Main St,Danville,VA,24541,(434) 792-0121,3/6/2017 +-79.415357,36.668839,"Dollar General-Danville,VA",3555 Franklin Turnpike,Danville,VA,24540,(434) 688-4624,3/6/2017 +-79.419013,36.572353,"Dollar General-Danville,VA",649 W Main St,Danville,VA,24541-4201,(434) 797-2603,3/6/2017 +-81.245663,37.804992,"Dollar General-Beckley,WV",2952 Harper Rd,Beckley,WV,25801-9470,(304) 252-4306,3/10/2017 +-81.194417,37.777665,"Dollar General-Beckley,WV",2970 Robert C Byrd Dr,Beckley,WV,25801-4448,(304) 253-3172,3/10/2017 +-81.183417,37.811951,"Dollar General-Beckley,WV",306 Beckley Plaza Ste 11,Beckley,WV,25801-2215,(304) 252-2079,3/10/2017 +-81.160108,37.770066,"Dollar General-Beckley,WV",995 South Eisenhower Drive,Beckley,WV,25801,(304) 256-7560,3/10/2017 +-81.619764,38.341847,"Dollar General-Charleston,WV",1555 Washington Street East,Charleston,WV,25311,(304) 344-4262,3/9/2017 +-81.641115,38.361109,"Dollar General-Charleston,WV",222 Washington St W,Charleston,WV,25302-2346,(304) 346-7757,3/9/2017 +-81.5610067,38.2896663,"Dollar General-Charleston,WV",4817 Midland Dr,Charleston,WV,25306-6354,(304) 553-7288,3/9/2017 +-81.520236,38.317597,"Dollar General-Charleston,WV",504 Campbells Creek Dr,Charleston,WV,25306-6810,(304) 925-6137,3/9/2017 +-81.67091,38.475049,"Dollar General-Charleston,WV",6283 Sissonville Dr,Charleston,WV,25312-9445,(304) 984-9073,3/9/2017 +-79.9214706,37.271595,"Dollar General-Roanoke,VA",1302 Jamison Ave,Roanoke,VA,24013-2016,(540) 345-1890,3/10/2017 +-79.919734,37.248741,"Dollar General-Roanoke,VA",2227 Garden City Blvd Se,Roanoke,VA,24014-3706,(540) 427-3153,3/10/2017 +-79.909759,37.290763,"Dollar General-Roanoke,VA",2312 Orange Ave Ne # 4,Roanoke,VA,24012-8311,(540) 343-5204,3/10/2017 +-80.003046,37.263328,"Dollar General-Roanoke,VA",3318 Brandon Ave Sw,Roanoke,VA,24018-1520,(540) 343-1108,3/10/2017 +-79.990217,37.29136,"Dollar General-Roanoke,VA",3323 Melrose Ave Nw,Roanoke,VA,24017-1943,(540) 366-2726,3/10/2017 +-82.407329,38.425847,"Dollar General-Huntington,WV",2620 5Th Ave,Huntington,WV,25702-1329,(304) 697-2875,3/6/2017 +-82.5313721,38.375351,"Dollar General-Huntington,WV",2908 Spring Valley Drive,Huntington,WV,25704-9800,(681) 203-5591,3/6/2017 +-82.4072584,38.4071081,"Dollar General-Huntington,WV",318 Norway Ave,Huntington,WV,25705-1308,(304) 908-5492,3/6/2017 +-82.366162,38.411765,"Dollar General-Huntington,WV",4341 Us Route 60,Huntington,WV,25705-2942,(304) 733-5648,3/6/2017 +-82.478302,38.408009,"Dollar General-Huntington,WV",914 14Th St W,Huntington,WV,25704-2309,(304) 697-6855,3/6/2017 +-81.582299,39.24652,"Dollar General-Parkersburg,WV",1000 E Dupont Rd,Parkersburg,WV,26101-9724,(304) 422-4165,3/6/2017 +-81.54168,39.234703,"Dollar General-Parkersburg,WV",2107 Pike St Ste 6,Parkersburg,WV,26101-6973,(304) 428-0054,3/6/2017 +-81.536537,39.283769,"Dollar General-Parkersburg,WV",3001 Dudley Ave,Parkersburg,WV,26104-1812,(304) 422-3992,3/6/2017 +-81.50492,39.221538,"Dollar General-Parkersburg,WV",3344 Staunton Turnpike,Parkersburg,WV,26104,(304) 422-1686,3/6/2017 +-81.548757,39.26401,"Dollar General-Parkersburg,WV",835 7Th St,Parkersburg,WV,26101-5268,(304) 485-3195,3/6/2017 +-79.125182,38.990592,"Dollar General-Petersburg,WV",1 Park St,Petersburg,WV,26847-1731,(304) 257-4050,3/6/2017 +-76.108754,36.838998,"Dollar General-Virginia Beach,VA",100 S Lynn Shores Drive,Virginia Beach,VA,23452,(757) 463-3309,3/6/2017 +-75.992868,36.84192,"Dollar General-Virginia Beach,VA",1021 Virginia Beach Blvd,Virginia Beach,VA,23451-5669,(757) 491-4891,3/6/2017 +-76.099139,36.795664,"Dollar General-Virginia Beach,VA",1505 Lynnhaven Pkwy Ste 1355,Virginia Beach,VA,23453-2014,(757) 468-9760,3/6/2017 +-76.191506,36.779129,"Dollar General-Virginia Beach,VA",1920 Centerville Tpke,Virginia Beach,VA,23464-6800,(757) 479-5114,3/6/2017 +-76.179401,36.902395,"Dollar General-Virginia Beach,VA",1948 Diamond Springs Rd,Virginia Beach,VA,23455-2335,(757) 464-3902,3/6/2017 +-76.08072,36.792793,"Dollar General-Virginia Beach,VA",3208 Holland Rd Ste 107,Virginia Beach,VA,23453-2864,(757) 468-2815,3/6/2017 +-76.095627,36.840979,"Dollar General-Virginia Beach,VA",3600 S Plaza Trl,Virginia Beach,VA,23452-3310,(757) 498-4271,3/6/2017 +-76.092157,36.83444,"Dollar General-Virginia Beach,VA",4239 Holand Rd -Suite #788,Virginia Beach,VA,23452-1941,(757) 495-5404,3/6/2017 +-76.136089,36.904258,"Dollar General-Virginia Beach,VA",4807 Shore Dr,Virginia Beach,VA,23455-2714,(757) 363-2888,3/6/2017 +-76.15179,36.843683,"Dollar General-Virginia Beach,VA",5013 Virginia Beach Blvd,Virginia Beach,VA,23462-6610,(757) 499-6450,3/6/2017 +-76.167085,36.828006,"Dollar General-Virginia Beach,VA",5277 Princess Anne Rd,Virginia Beach,VA,23462-6398,(757) 490-0649,3/6/2017 +-76.173324,36.861781,"Dollar General-Virginia Beach,VA",649 Newtown Rd,Virginia Beach,VA,23462-1600,(757) 497-2273,3/6/2017 diff --git a/Route4MeSDKTest/bin/Debug/Data/Other files/orders_1000.xlsx b/Route4MeSDKTest/bin/Debug/Data/Other files/orders_1000.xlsx new file mode 100644 index 00000000..8d0ac477 Binary files /dev/null and b/Route4MeSDKTest/bin/Debug/Data/Other files/orders_1000.xlsx differ diff --git a/Route4MeSDKTest/bin/Debug/Data/Other files/schedules.csv b/Route4MeSDKTest/bin/Debug/Data/Other files/schedules.csv new file mode 100644 index 00000000..f4885cae --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/Other files/schedules.csv @@ -0,0 +1 @@ +schedule_id,"address_id",mode,enabled,daily_every,weekly_every,"weekdays",monthly_every,monthly_mode,"monthly_dates",monthly_nth_n,monthly_nth_what,annually_every,annually_use_nth,"annually_months",annually_nth_m,"annually_nth_what" diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/addressbook_v4.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/addressbook_v4.sql new file mode 100644 index 00000000..38febf77 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/addressbook_v4.sql @@ -0,0 +1,269 @@ +USE [r4me_db]; + +/* +Database : r4me_db +Target Server Type : MSSQL +Script Date : 3/28/2017 5:45:56 PM +*/ + +SET ANSI_NULLS ON; + +SET QUOTED_IDENTIFIER ON; + +IF OBJECT_ID('[dbo].[addressbook_v4]', 'U') IS NOT NULL + DROP TABLE [dbo].[addressbook_v4]; + +CREATE TABLE [dbo].[addressbook_v4]( + [id] [int] IDENTITY(1,1) NOT NULL, + [territory_name] [nvarchar](256) NULL, + [created_timestamp] [int] NULL, + [address_id] [int] NULL, + [address_1] [nvarchar](256) NULL, + [address_2] [nvarchar](256) NULL, + [address_alias] [nvarchar](256) NULL, + [address_group] [nvarchar](50) NULL, + [member_id] [int] NULL, + [first_name] [nvarchar](64) NULL, + [last_name] [nvarchar](64) NULL, + [address_email] [nvarchar](64) NULL, + [address_phone_number] [nvarchar](24) NULL, + [cached_lat] [float] NULL, + [cached_lng] [float] NULL, + [curbside_lat] [float] NULL, + [curbside_lng] [float] NULL, + [schedule] [nvarchar](max) NULL, + [address_city] [nvarchar](64) NULL, + [address_state_id] [nvarchar](10) NULL, + [address_country_id] [nvarchar](10) NULL, + [address_zip] [varchar](16) NULL, + [schedule_blacklist] [nvarchar](max) NULL, + [in_route_count] [int] NULL, + [last_visited_timestamp] [int] NULL, + [last_routed_timestamp] [int] NULL, + [local_time_window_start] [int] NULL, + [local_time_window_end] [int] NULL, + [local_time_window_start_2] [int] NULL, + [local_time_window_end_2] [int] NULL, + [service_time] [int] NULL, + [local_timezone_string] [varchar](64) NULL, + [color] [varchar](6) NULL, + [address_icon] [nvarchar](128) NULL, + [address_custom_data] [nvarchar](max) NULL, + CONSTRAINT [PK_addressbook_v4] PRIMARY KEY CLUSTERED + ([id] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'When addressbook contact was created (UNIX time)' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'created_timestamp'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Address book location ID in a Route4Me account', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'address_id'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Address 1', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'address_1'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Address 2', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'address_2'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'An user ID in a Route4Me account', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'member_id'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'A first name of a receiver at the location', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'first_name'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'A last name of a receiver at the location', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'last_name'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Location email', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'address_email'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Location phone number', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'address_phone_number'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Cached latitude', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'cached_lat'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Cached longitude', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'cached_lng'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Curbside latitude', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'curbside_lat'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Curbside longitude', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'curbside_lng'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Schedule object represented by JSON string', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'schedule'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'The city the location is located in', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'address_city'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'The state ID the address is located in', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'address_state_id'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'The country the address is located in', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'address_country_id'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'The zip code the address is located in', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'address_zip'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'comma-delimited list of the dates', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'schedule_blacklist'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'In how many route is included the location', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'in_route_count'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'UNIX time', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'service_time'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'e.g. fa573c', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'color'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'e.g. emoji/emoji-bank', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'address_icon'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Address custom data as dictionary', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'addressbook_v4', + @level2type=N'COLUMN', + @level2name=N'address_custom_data'; \ No newline at end of file diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/csv_to_api_dictionary_DDL.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/csv_to_api_dictionary_DDL.sql new file mode 100644 index 00000000..6e9a740b --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/csv_to_api_dictionary_DDL.sql @@ -0,0 +1,63 @@ +USE [r4me_db]; + +/* +Database : r4me_db +Target Server Type : MSSQL +Date: 3/29/2017 12:11:26 PM +*/ + +SET ANSI_NULLS ON; + +SET QUOTED_IDENTIFIER ON; + +IF OBJECT_ID('[dbo].[csv_to_api_dictionary]', 'U') IS NOT NULL + DROP TABLE [dbo].[csv_to_api_dictionary]; + +CREATE TABLE [dbo].[csv_to_api_dictionary]( + [id] [int] NOT NULL, + [csv_field_nom] [int] NULL, + [r4m_csv_field_name] [varchar](64) NULL, + [api_field_name] [varchar](64) NULL, + [table_name] [varchar](64) NULL, + [csv_field_type] [varchar](64) NULL, + [api_field_type] [varchar](64) NULL, + [comment] [varchar](32) NULL, + CONSTRAINT [PK_csv_to_api_dictionary] PRIMARY KEY CLUSTERED +( [id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY]; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'field order number in csv exported file' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'csv_to_api_dictionary', + @level2type=N'COLUMN', + @level2name=N'csv_field_nom'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Field name in the exported csv file from Route4Me web UI' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'csv_to_api_dictionary', + @level2type=N'COLUMN', + @level2name=N'r4m_csv_field_name'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'The field name in the Route4Me API' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'csv_to_api_dictionary', + @level2type=N'COLUMN', + @level2name=N'api_field_name'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'api_filed belongs to a table with table_name' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'csv_to_api_dictionary', + @level2type=N'COLUMN', + @level2name=N'table_name'; \ No newline at end of file diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/csv_to_api_dictionary_DML.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/csv_to_api_dictionary_DML.sql new file mode 100644 index 00000000..e68f9118 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/csv_to_api_dictionary_DML.sql @@ -0,0 +1,69 @@ +/* +Database : r4me_db +Target Server Type : MSSQL +Date: 2017-03-29 12:21 PM +*/ + +-- ---------------------------- +-- Records of csv_to_api_dictionary +-- ---------------------------- +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('1', '0', 'Territory Name', 'territory_name', 'addressbook_v4', 'string', 'string', 'not api'); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('2', '1', 'created_timestamp', 'created_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('3', '2', 'address_id', 'address_id', 'addressbook_v4', 'int', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('4', '3', 'group', 'address_group', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('5', '4', 'alias', 'address_alias', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('6', '5', 'address', 'address_1', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('7', '6', 'address_2', 'address_2', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('8', '7', 'member_id', 'member_id', 'addressbook_v4', 'int', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('9', '8', 'first_name', 'first_name', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('10', '9', 'last_name', 'last_name', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('11', '10', 'email', 'address_email', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('12', '11', 'phone', 'address_phone_number', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('13', '12', 'city', 'address_city', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('14', '13', 'state', 'address_state_id', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('15', '14', 'country_id', 'address_country_id', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('16', '15', 'zipcode', 'address_zip', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('17', '16', 'lat', 'cached_lat', 'addressbook_v4', 'double', 'double', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('18', '17', 'lng', 'cached_lng', 'addressbook_v4', 'double', 'double', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('19', '18', 'curbside_lat', 'curbside_lat', 'addressbook_v4', 'double', 'double', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('20', '19', 'curbside_lng', 'curbside_lng', 'addressbook_v4', 'double', 'double', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('21', '20', 'schedule', 'schedule', 'addressbook_v4', 'string', 'string', 'JSON string'); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('22', '21', 'schedule_blacklist', 'schedule_blacklist', 'addressbook_v4', 'string', 'string', 'date string array'); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('23', '22', 'in_route_count', 'in_route_count', 'addressbook_v4', 'int', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('24', '23', 'last_visited_timestamp', 'last_visited_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('25', '24', 'last_routed_timestamp', 'last_routed_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('26', '25', 'time_window_start', 'local_time_window_start', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('27', '26', 'time_window_end', 'local_time_window_end', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('28', '27', 'time_window_start_2', 'local_time_window_start_2', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('29', '28', 'time_window_end_2', 'local_time_window_end_2', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('30', '29', 'service_time', 'service_time', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('31', '30', 'timezone', 'local_timezone_string', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('32', '31', 'color', 'color', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('33', '32', 'address_icon', 'address_icon', 'addressbook_v4', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('34', null, 'order_id', 'order_id', 'orders', 'int', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('35', null, 'order_status_id', 'order_status_id', 'orders', 'int', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('36', '3', 'Address', 'address_1', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('37', null, 'address_2', 'address_2', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('38', null, 'member_id', 'member_id', 'orders', 'int', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('39', '1', 'Latitude', 'cached_lat', 'orders', 'double', 'double', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('40', '0', 'Longitude', 'cached_lng', 'orders', 'double', 'double', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('41', null, 'color', 'color', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('42', null, 'curbside_lat', 'curbside_lat', 'orders', 'double', 'double', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('43', null, 'curbside_lng', 'curbside_lng', 'orders', 'double', 'double', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('44', '8', 'Schedule Date', 'day_scheduled_for_YYMMDD', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('45', null, 'EXT_FIELD_custom_data', 'EXT_FIELD_custom_data', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('46', '2', 'Address Alias', 'address_alias', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('47', null, 'local_time_window_start', 'local_time_window_start', 'orders', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('48', null, 'local_time_window_end', 'local_time_window_end', 'orders', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('49', null, 'local_time_window_start_2', 'local_time_window_start_2', 'orders', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('50', null, 'local_time_window_end_2', 'local_time_window_end_2', 'orders', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('51', null, 'service_time', 'service_time', 'orders', 'datetime', 'int', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('52', '-1', 'EXT_FIELD_first_name', 'EXT_FIELD_first_name', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('53', '-1', 'EXT_FIELD_last_name', 'EXT_FIELD_last_name', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('54', '-1', 'EXT_FIELD_email', 'EXT_FIELD_email', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('55', '7', 'Phone', 'EXT_FIELD_phone', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('56', '4', 'City', 'address_city', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('57', '5', 'State', 'address_state_id', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('58', '-1', 'address_country_id', 'address_country_id', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('59', '6', 'Zip Code', 'address_zip', 'orders', 'string', 'string', null); +INSERT INTO [dbo].[csv_to_api_dictionary] VALUES ('60', '-1', 'order_icon', 'order_icon', 'orders', 'string', 'string', null); diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/orders.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/orders.sql new file mode 100644 index 00000000..0f20ad7c --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/MSSQL/orders.sql @@ -0,0 +1,291 @@ +USE [r4me_db]; + +/* +Database : r4me_db +Target Server Type : MSSQL +Script Date : 3/28/2017 5:45:56 PM +*/ + +SET ANSI_NULLS ON; + +SET QUOTED_IDENTIFIER ON; + +IF OBJECT_ID('[dbo].[orders]', 'U') IS NOT NULL + DROP TABLE [dbo].[orders]; + +CREATE TABLE [dbo].[orders]( + [id] [int] IDENTITY(1,1) NOT NULL, + [order_id] [int] NULL, + [order_status_id] [int] NULL, + [address_1] [nvarchar](256) NULL, + [address_2] [nvarchar](256) NULL, + [member_id] [int] NULL, + [cached_lat] [float] NULL, + [cached_lng] [float] NULL, + [color] [varchar](6) NULL, + [curbside_lat] [float] NULL, + [curbside_lng] [float] NULL, + [day_added_YYMMDD] [varchar](16) NULL, + [day_scheduled_for_YYMMDD] [varchar](16) NULL, + [EXT_FIELD_custom_data] [nvarchar](max) NULL, + [address_alias] [nvarchar](128) NULL, + [local_time_window_start] [int] NULL, + [local_time_window_end] [int] NULL, + [local_time_window_start_2] [int] NULL, + [local_time_window_end_2] [int] NULL, + [service_time] [int] NULL, + [EXT_FIELD_first_name] [nvarchar](64) NULL, + [EXT_FIELD_last_name] [nvarchar](64) NULL, + [EXT_FIELD_email] [varchar](128) NULL, + [EXT_FIELD_phone] [nvarchar](24) NULL, + [address_city] [varchar](128) NULL, + [address_state_id] [varchar](10) NULL, + [address_country_id] [varchar](10) NULL, + [address_zip] [varchar](10) NULL, + [order_icon] [varchar](128) NULL, + CONSTRAINT [PK_orders] PRIMARY KEY CLUSTERED +( [id] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Order ID in a Route4Me account' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'order_id'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Order status ID' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'order_status_id'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Address 1' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'address_1'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Address 2' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'address_2'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'An user ID in a Route4Me account' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'member_id'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Cached latitude' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'cached_lat'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Cached longitude' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'cached_lng'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'e.g. fa573c' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'color'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Curbside latitude' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'curbside_lat'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Curbside longitude' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'curbside_lng'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'When was inserted the order' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'day_added_YYMMDD'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Date order was scheduled for' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'day_scheduled_for_YYMMDD'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'A custom data of the order' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'EXT_FIELD_custom_data'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'UNIX time' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'local_time_window_start'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'UNIX time' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'local_time_window_end'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'UNIX time' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'local_time_window_start_2'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'UNIX time' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'local_time_window_end_2'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'UNIX time' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'service_time'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'A first name of an order owner' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'EXT_FIELD_first_name'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'A last name of an order owner' , + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'EXT_FIELD_last_name'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Order email', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'EXT_FIELD_email'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'Order phone number', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'EXT_FIELD_phone'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'The city the location is located in', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'address_city'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'The state ID the address is located in', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'address_state_id'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'The country the address is located in', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'address_country_id'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'The zip code the address is located in', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'address_zip'; + +EXEC sys.sp_addextendedproperty @name=N'MS_Description', + @value=N'e.g. emoji/emoji-bank', + @level0type=N'SCHEMA', + @level0name=N'dbo', + @level1type=N'TABLE', + @level1name=N'orders', + @level2type=N'COLUMN', + @level2name=N'order_icon'; \ No newline at end of file diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/addressbook_v4.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/addressbook_v4.sql new file mode 100644 index 00000000..5f7f7a8b --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/addressbook_v4.sql @@ -0,0 +1,54 @@ +/* +Database : r4me_db +Target Server Type : MySQL +Date: 2017-03-27 19:26:02 +*/ + +SET FOREIGN_KEY_CHECKS=0; +-- ---------------------------- +-- Table structure for `addressbook_v4` +-- ---------------------------- +DROP TABLE IF EXISTS `addressbook_v4`; +CREATE TABLE `addressbook_v4` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `territory_name` varchar(256) DEFAULT NULL, + `created_timestamp` bigint(11) DEFAULT NULL COMMENT 'When addressbook contact was created (UNIX time)', + `address_id` int(11) DEFAULT NULL COMMENT 'Address book location ID in a Route4Me account', + `address_1` varchar(256) DEFAULT NULL COMMENT 'Address 1', + `address_2` varchar(256) DEFAULT NULL COMMENT 'Address 2', + `address_alias` varchar(256) DEFAULT NULL, + `address_group` varchar(64) DEFAULT NULL, + `member_id` int(11) DEFAULT NULL COMMENT 'An user ID in a Route4Me account', + `first_name` varchar(64) DEFAULT NULL COMMENT 'A first name of a receiver at the location', + `last_name` varchar(64) DEFAULT NULL COMMENT 'A last name of a receiver at the location', + `address_email` varchar(64) DEFAULT NULL COMMENT 'Location email', + `address_phone_number` varchar(24) DEFAULT NULL COMMENT 'Location phone number', + `cached_lat` double DEFAULT NULL COMMENT 'Cached latitude', + `cached_lng` double DEFAULT NULL COMMENT 'Cached longitude', + `curbside_lat` double DEFAULT NULL COMMENT 'Curbside latitude', + `curbside_lng` double DEFAULT NULL COMMENT 'Curbside longitude', + `schedule` text COMMENT 'Schedule object represented by JSON string', + `address_city` varchar(4) DEFAULT NULL COMMENT 'The city the location is located in', + `address_state_id` varchar(10) DEFAULT NULL COMMENT 'The state ID the address is located in', + `address_country_id` varchar(10) DEFAULT NULL COMMENT 'The country the address is located in', + `address_zip` varchar(16) DEFAULT NULL COMMENT 'The zip code the address is located in', + `schedule_blacklist` text COMMENT 'comma-delimited list of the dates', + `in_route_count` int(11) DEFAULT NULL COMMENT 'In how many route is included the location', + `last_visited_timestamp` int(11) DEFAULT NULL, + `last_routed_timestamp` int(11) DEFAULT NULL, + `local_time_window_start` int(11) DEFAULT NULL, + `local_time_window_end` int(11) DEFAULT NULL, + `local_time_window_start_2` int(11) DEFAULT NULL, + `local_time_window_end_2` int(11) DEFAULT NULL, + `service_time` int(11) DEFAULT NULL COMMENT 'UNIX time', + `local_timezone_string` varchar(64) DEFAULT NULL, + `color` varchar(6) DEFAULT NULL COMMENT 'e.g. fa573c', + `address_icon` varchar(128) DEFAULT NULL COMMENT 'e.g. emoji/emoji-bank', + `address_custom_data` text COMMENT 'Address custom data as dictionary', + PRIMARY KEY (`id`), + KEY `contact_id` (`id`) +) AUTO_INCREMENT=0; + +-- ---------------------------- +-- Records of addressbook_v4 +-- ---------------------------- diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/csv_to_api_dictionary_DDL.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/csv_to_api_dictionary_DDL.sql new file mode 100644 index 00000000..220ec07e --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/csv_to_api_dictionary_DDL.sql @@ -0,0 +1,23 @@ +/* +Database : r4me_db +Target Server Type : SQL and MS Access +Date: 2017-03-27 19:27:10 +*/ + +SET FOREIGN_KEY_CHECKS=0; +-- ---------------------------- +-- Table structure for `csv_to_api_dictionary` +-- ---------------------------- +DROP TABLE IF EXISTS `csv_to_api_dictionary`; +CREATE TABLE `csv_to_api_dictionary` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `csv_field_nom` int(11) DEFAULT NULL COMMENT 'field order number in csv exported file', + `r4m_csv_field_name` varchar(64) DEFAULT NULL COMMENT 'Field name in the exported csv file from Route4Me web UI', + `api_field_name` varchar(64) DEFAULT NULL COMMENT 'The field name in the Route4Me API', + `table_name` varchar(64) DEFAULT NULL COMMENT 'api_filed belongs to a table with table_name', + `csv_field_type` varchar(64) DEFAULT NULL, + `api_field_type` varchar(64) DEFAULT NULL, + `comment` varchar(32) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `dict_id` (`id`) +) AUTO_INCREMENT=0; diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/csv_to_api_dictionary_DML.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/csv_to_api_dictionary_DML.sql new file mode 100644 index 00000000..ec02c1b0 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/csv_to_api_dictionary_DML.sql @@ -0,0 +1,69 @@ +/* +Database : r4me_db +Target Server Type : SQL and MS Access +Date: 2017-03-27 19:27:10 +*/ + +-- ---------------------------- +-- Records of csv_to_api_dictionary +-- ---------------------------- +INSERT INTO `csv_to_api_dictionary` VALUES ('1', '0', 'Territory Name', 'territory_name', 'addressbook_v4', 'string', 'string', 'not api'); +INSERT INTO `csv_to_api_dictionary` VALUES ('2', '1', 'created_timestamp', 'created_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('3', '2', 'address_id', 'address_id', 'addressbook_v4', 'int', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('4', '3', 'group', 'address_group', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('5', '4', 'alias', 'address_alias', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('6', '5', 'address', 'address_1', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('7', '6', 'address_2', 'address_2', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('8', '7', 'member_id', 'member_id', 'addressbook_v4', 'int', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('9', '8', 'first_name', 'first_name', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('10', '9', 'last_name', 'last_name', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('11', '10', 'email', 'address_email', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('12', '11', 'phone', 'address_phone_number', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('13', '12', 'city', 'address_city', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('14', '13', 'state', 'address_state_id', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('15', '14', 'country_id', 'address_country_id', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('16', '15', 'zipcode', 'address_zip', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('17', '16', 'lat', 'cached_lat', 'addressbook_v4', 'double', 'double', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('18', '17', 'lng', 'cached_lng', 'addressbook_v4', 'double', 'double', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('19', '18', 'curbside_lat', 'curbside_lat', 'addressbook_v4', 'double', 'double', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('20', '19', 'curbside_lng', 'curbside_lng', 'addressbook_v4', 'double', 'double', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('21', '20', 'schedule', 'schedule', 'addressbook_v4', 'string', 'string', 'JSON string'); +INSERT INTO `csv_to_api_dictionary` VALUES ('22', '21', 'schedule_blacklist', 'schedule_blacklist', 'addressbook_v4', 'string', 'string', 'date string array'); +INSERT INTO `csv_to_api_dictionary` VALUES ('23', '22', 'in_route_count', 'in_route_count', 'addressbook_v4', 'int', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('24', '23', 'last_visited_timestamp', 'last_visited_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('25', '24', 'last_routed_timestamp', 'last_routed_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('26', '25', 'time_window_start', 'local_time_window_start', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('27', '26', 'time_window_end', 'local_time_window_end', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('28', '27', 'time_window_start_2', 'local_time_window_start_2', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('29', '28', 'time_window_end_2', 'local_time_window_end_2', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('30', '29', 'service_time', 'service_time', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('31', '30', 'timezone', 'local_timezone_string', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('32', '31', 'color', 'color', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('33', '32', 'address_icon', 'address_icon', 'addressbook_v4', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('34', null, 'order_id', 'order_id', 'orders', 'int', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('35', null, 'order_status_id', 'order_status_id', 'orders', 'int', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('36', '3', 'Address', 'address_1', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('37', null, 'address_2', 'address_2', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('38', null, 'member_id', 'member_id', 'orders', 'int', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('39', '1', 'Latitude', 'cached_lat', 'orders', 'double', 'double', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('40', '0', 'Longitude', 'cached_lng', 'orders', 'double', 'double', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('41', null, 'color', 'color', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('42', null, 'curbside_lat', 'curbside_lat', 'orders', 'double', 'double', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('43', null, 'curbside_lng', 'curbside_lng', 'orders', 'double', 'double', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('44', '8', 'Schedule Date', 'day_scheduled_for_YYMMDD', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('45', null, 'EXT_FIELD_custom_data', 'EXT_FIELD_custom_data', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('46', '2', 'Address Alias', 'address_alias', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('47', null, 'local_time_window_start', 'local_time_window_start', 'orders', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('48', null, 'local_time_window_end', 'local_time_window_end', 'orders', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('49', null, 'local_time_window_start_2', 'local_time_window_start_2', 'orders', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('50', null, 'local_time_window_end_2', 'local_time_window_end_2', 'orders', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('51', null, 'service_time', 'service_time', 'orders', 'datetime', 'int', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('52', '-1', 'EXT_FIELD_first_name', 'EXT_FIELD_first_name', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('53', '-1', 'EXT_FIELD_last_name', 'EXT_FIELD_last_name', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('54', '-1', 'EXT_FIELD_email', 'EXT_FIELD_email', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('55', '7', 'Phone', 'EXT_FIELD_phone', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('56', '4', 'City', 'address_city', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('57', '5', 'State', 'address_state_id', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('58', '-1', 'address_country_id', 'address_country_id', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('59', '6', 'Zip Code', 'address_zip', 'orders', 'string', 'string', null); +INSERT INTO `csv_to_api_dictionary` VALUES ('60', '-1', 'order_icon', 'order_icon', 'orders', 'string', 'string', null); diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/orders.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/orders.sql new file mode 100644 index 00000000..8ac6d5c8 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/MySQL/orders.sql @@ -0,0 +1,48 @@ +/* +Database : r4me_db +Target Server Type : SQL and MS Access +Date: 2017-03-27 19:26:20 +*/ + +SET FOREIGN_KEY_CHECKS=0; +-- ---------------------------- +-- Table structure for `orders` +-- ---------------------------- +DROP TABLE IF EXISTS `orders`; +CREATE TABLE `orders` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `order_id` int(11) DEFAULT NULL COMMENT 'Order ID in a Route4Me account', + `order_status_id` int(11) DEFAULT NULL COMMENT 'Order status ID', + `address_1` varchar(512) DEFAULT NULL COMMENT 'Address 1', + `address_2` varchar(512) DEFAULT NULL COMMENT 'Address 2', + `member_id` int(11) DEFAULT NULL COMMENT 'An user ID in a Route4Me account', + `cached_lat` double DEFAULT NULL COMMENT 'Cached latitude', + `cached_lng` double DEFAULT NULL COMMENT 'Cached longitude', + `color` varchar(10) DEFAULT NULL COMMENT 'e.g. fa573c', + `curbside_lat` double DEFAULT NULL COMMENT 'Curbside latitude', + `curbside_lng` double DEFAULT NULL COMMENT 'Curbside longitude', + `day_added_YYMMDD` varchar(16) DEFAULT NULL COMMENT 'When was inserted the order', + `day_scheduled_for_YYMMDD` varchar(16) DEFAULT NULL COMMENT 'Date order was scheduled for', + `EXT_FIELD_custom_data` text COMMENT 'A custom data of the order', + `address_alias` varchar(128) DEFAULT NULL, + `local_time_window_start` int(11) DEFAULT NULL COMMENT 'UNIX time', + `local_time_window_end` int(11) DEFAULT NULL COMMENT 'UNIX time', + `local_time_window_start_2` int(11) DEFAULT NULL COMMENT 'UNIX time', + `local_time_window_end_2` int(11) DEFAULT NULL COMMENT 'UNIX time', + `service_time` int(11) DEFAULT NULL COMMENT 'UNIX time', + `EXT_FIELD_first_name` varchar(64) DEFAULT NULL COMMENT 'A first name of an order owner', + `EXT_FIELD_last_name` varchar(64) DEFAULT NULL COMMENT 'A last name of an order owner', + `EXT_FIELD_email` varchar(128) DEFAULT NULL COMMENT 'Order email', + `EXT_FIELD_phone` varchar(24) DEFAULT NULL COMMENT 'Order phone number', + `address_city` varchar(128) DEFAULT NULL COMMENT 'The city the location is located in', + `address_state_id` varchar(10) DEFAULT NULL COMMENT 'The state ID the address is located in', + `address_country_id` varchar(10) DEFAULT NULL COMMENT 'The country the address is located in', + `address_zip` varchar(20) DEFAULT NULL COMMENT 'The zip code the address is located in', + `order_icon` varchar(128) DEFAULT NULL COMMENT 'e.g. emoji/emoji-bank', + PRIMARY KEY (`id`), + KEY `ord_sql_id` (`id`) +) AUTO_INCREMENT=0; + +-- ---------------------------- +-- Records of orders +-- ---------------------------- diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/addressbook_v4.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/addressbook_v4.sql new file mode 100644 index 00000000..d7107406 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/addressbook_v4.sql @@ -0,0 +1,100 @@ +/* +Database : xe +Target Server Type : ORACLE +Date: 2017-04-04 12:10 PM +*/ + +BEGIN +FOR tt IN (SELECT table_name as tname + FROM all_tables WHERE TABLE_NAME='ADDRESSBOOK_V4' AND OWNER='R4ME') + LOOP + EXECUTE IMMEDIATE 'DROP TABLE ADDRESSBOOK_V4'; + END LOOP; +END; +/ + +CREATE TABLE "ADDRESSBOOK_V4" + ( "ID" NUMBER(7,0) NOT NULL ENABLE, + "territory_name" VARCHAR2(256), + "created_timestamp" NUMBER(7,0), + "address_id" NUMBER(7,0), + "address_1" VARCHAR2(256), + "address_2" VARCHAR2(256), + "address_alias" VARCHAR2(256), + "address_group" VARCHAR2(50), + "member_id" NUMBER(7,0), + "first_name" VARCHAR2(64), + "last_name" VARCHAR2(64), + "address_email" VARCHAR2(64), + "address_phone_number" VARCHAR2(24), + "cached_lat" NUMBER(10,7), + "cached_lng" NUMBER(10,7), + "curbside_lat" NUMBER(10,7), + "curbside_lng" NUMBER(10,7), + "schedule" CLOB, + "address_city" VARCHAR2(64), + "address_state_id" VARCHAR2(10), + "address_country_id" VARCHAR2(10), + "address_zip" VARCHAR2(16), + "schedule_blacklist" CLOB, + "in_route_count" NUMBER(7,0), + "last_visited_timestamp" NUMBER(7,0), + "last_routed_timestamp" NUMBER(7,0), + "local_time_window_start" NUMBER(7,0), + "local_time_window_end" NUMBER(7,0), + "local_time_window_start_2" NUMBER(7,0), + "local_time_window_end_2" NUMBER(7,0), + "service_time" NUMBER(7,0), + "local_timezone_string" VARCHAR2(64), + "color" VARCHAR2(6), + "address_icon" VARCHAR2(128), + "address_custom_data" NCLOB, + CONSTRAINT "ADDRESSBOOK_V4_PK" PRIMARY KEY ("ID") ENABLE + ) ; + +BEGIN +FOR cc IN (SELECT sequence_name as sequence_exists + FROM all_sequences + WHERE SEQUENCE_OWNER='R4ME' and sequence_name = 'ADDRESSBOOK_V4_SEQ') + LOOP + EXECUTE IMMEDIATE 'DROP SEQUENCE ADDRESSBOOK_V4_SEQ'; + END LOOP; +END; +/ + +CREATE SEQUENCE "ADDRESSBOOK_V4_SEQ" MINVALUE 1 MAXVALUE 9999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE NOORDER NOCYCLE ; + +CREATE OR REPLACE TRIGGER "ADDRESSBOOK_V4_T1" +AFTER +insert on "ADDRESSBOOK_V4" +begin +if "ID" is null then + select "ADDRESSBOOK_V4_SEQ".nextval into "ID" from dual; + end if; +end; +/ +ALTER TRIGGER "ADDRESSBOOK_V4_T1" ENABLE; + +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."created_timestamp" IS 'When addressbook contact was created (UNIX time)'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."address_id" IS 'Address book location ID in a Route4Me account'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."address_1" IS 'Address 1'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."address_2" IS 'Address 2'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."member_id" IS 'An user ID in a Route4Me account'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."first_name" IS 'A first name of a receiver at the location'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."last_name" IS 'A last name of a receiver at the location'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."address_email" IS 'Location email'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."address_phone_number" IS 'Location phone number'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."cached_lat" IS 'Cached latitude'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."cached_lng" IS 'Cached longitude'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."curbside_lat" IS 'Curbside latitude'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."curbside_lng" IS 'Curbside longitude'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."schedule" IS 'Schedule object represented by JSON string'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."address_city" IS 'The city the location is located in'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."address_state_id" IS 'The state ID the address is located in'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."address_country_id" IS 'The country the address is located in'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."address_zip" IS 'The zip code the address is located in'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."schedule_blacklist" IS 'comma-delimited list of the dates'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."in_route_count" IS 'In how many route is included the location'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."service_time" IS 'UNIX time'; +COMMENT ON COLUMN "R4ME"."ADDRESSBOOK_V4"."color" IS 'Location color on a map'; +/ \ No newline at end of file diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/csv_to_api_dictionary_DDL.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/csv_to_api_dictionary_DDL.sql new file mode 100644 index 00000000..254ab64c --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/csv_to_api_dictionary_DDL.sql @@ -0,0 +1,35 @@ +/* +Database : xe +Target Server Type : ORACLE +Date: 2017-04-04 4:05 PM +*/ + +BEGIN +FOR tt IN (SELECT table_name as tname + FROM all_tables WHERE TABLE_NAME='CSV_TO_API_DICTIONARY' AND OWNER='R4ME') + LOOP + EXECUTE IMMEDIATE 'DROP TABLE CSV_TO_API_DICTIONARY'; + END LOOP; +END; +/ + +-- ---------------------------- +-- Table structure for csv_to_api_dictionary +-- ---------------------------- + +CREATE TABLE CSV_TO_API_DICTIONARY ( + "ID" NUMBER(7,0) NOT NULL, + "csv_field_nom" NUMBER(7,0), + "r4m_csv_field_name" VARCHAR2(64), + "api_field_name" VARCHAR2(64), + "table_name" VARCHAR2(64), + "csv_field_type" VARCHAR2(64), + "api_field_type" VARCHAR2(64), + "comment" VARCHAR2(32), + CONSTRAINT "CSV_TO_API_DICTIONARY_PK" PRIMARY KEY ("ID") ENABLE +); + +COMMENT ON COLUMN "R4ME"."CSV_TO_API_DICTIONARY"."csv_field_nom" IS 'field order number in csv exported file'; +COMMENT ON COLUMN "R4ME"."CSV_TO_API_DICTIONARY"."r4m_csv_field_name" IS 'Field name in the exported csv file from Route4Me web UI'; +COMMENT ON COLUMN "R4ME"."CSV_TO_API_DICTIONARY"."api_field_name" IS 'The field name in the Route4Me API'; +COMMENT ON COLUMN "R4ME"."CSV_TO_API_DICTIONARY"."table_name" IS 'api_filed belongs to a table with table_name'; diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/csv_to_api_dictionary_DML.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/csv_to_api_dictionary_DML.sql new file mode 100644 index 00000000..f2fedb56 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/csv_to_api_dictionary_DML.sql @@ -0,0 +1,69 @@ +/* +Database : xe +Target Server Type : ORACLE +Date: 2017-04-04 4:17 PM +*/ + +-- ---------------------------- +-- Records of CSV_TO_API_DICTIONARY +-- ---------------------------- +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('1', '0', 'Territory Name', 'territory_name', 'addressbook_v4', 'string', 'string', 'not api'); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('2', '1', 'created_timestamp', 'created_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('3', '2', 'address_id', 'address_id', 'addressbook_v4', 'int', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('4', '3', 'group', 'address_group', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('5', '4', 'alias', 'address_alias', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('6', '5', 'address', 'address_1', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('7', '6', 'address_2', 'address_2', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('8', '7', 'member_id', 'member_id', 'addressbook_v4', 'int', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('9', '8', 'first_name', 'first_name', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('10', '9', 'last_name', 'last_name', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('11', '10', 'email', 'address_email', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('12', '11', 'phone', 'address_phone_number', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('13', '12', 'city', 'address_city', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('14', '13', 'state', 'address_state_id', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('15', '14', 'country_id', 'address_country_id', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('16', '15', 'zipcode', 'address_zip', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('17', '16', 'lat', 'cached_lat', 'addressbook_v4', 'double', 'double', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('18', '17', 'lng', 'cached_lng', 'addressbook_v4', 'double', 'double', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('19', '18', 'curbside_lat', 'curbside_lat', 'addressbook_v4', 'double', 'double', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('20', '19', 'curbside_lng', 'curbside_lng', 'addressbook_v4', 'double', 'double', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('21', '20', 'schedule', 'schedule', 'addressbook_v4', 'string', 'string', 'JSON string'); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('22', '21', 'schedule_blacklist', 'schedule_blacklist', 'addressbook_v4', 'string', 'string', 'date string array'); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('23', '22', 'in_route_count', 'in_route_count', 'addressbook_v4', 'int', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('24', '23', 'last_visited_timestamp', 'last_visited_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('25', '24', 'last_routed_timestamp', 'last_routed_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('26', '25', 'time_window_start', 'local_time_window_start', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('27', '26', 'time_window_end', 'local_time_window_end', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('28', '27', 'time_window_start_2', 'local_time_window_start_2', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('29', '28', 'time_window_end_2', 'local_time_window_end_2', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('30', '29', 'service_time', 'service_time', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('31', '30', 'timezone', 'local_timezone_string', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('32', '31', 'color', 'color', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('33', '32', 'address_icon', 'address_icon', 'addressbook_v4', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('34', null, 'order_id', 'order_id', 'orders', 'int', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('35', null, 'order_status_id', 'order_status_id', 'orders', 'int', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('36', '3', 'Address', 'address_1', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('37', null, 'address_2', 'address_2', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('38', null, 'member_id', 'member_id', 'orders', 'int', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('39', '1', 'Latitude', 'cached_lat', 'orders', 'double', 'double', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('40', '0', 'Longitude', 'cached_lng', 'orders', 'double', 'double', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('41', null, 'color', 'color', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('42', null, 'curbside_lat', 'curbside_lat', 'orders', 'double', 'double', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('43', null, 'curbside_lng', 'curbside_lng', 'orders', 'double', 'double', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('44', '8', 'Schedule Date', 'day_scheduled_for_YYMMDD', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('45', null, 'EXT_FIELD_custom_data', 'EXT_FIELD_custom_data', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('46', '2', 'Address Alias', 'address_alias', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('47', null, 'local_time_window_start', 'local_time_window_start', 'orders', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('48', null, 'local_time_window_end', 'local_time_window_end', 'orders', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('49', null, 'local_time_window_start_2', 'local_time_window_start_2', 'orders', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('50', null, 'local_time_window_end_2', 'local_time_window_end_2', 'orders', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('51', null, 'service_time', 'service_time', 'orders', 'datetime', 'int', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('52', '-1', 'EXT_FIELD_first_name', 'EXT_FIELD_first_name', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('53', '-1', 'EXT_FIELD_last_name', 'EXT_FIELD_last_name', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('54', '-1', 'EXT_FIELD_email', 'EXT_FIELD_email', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('55', '7', 'Phone', 'EXT_FIELD_phone', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('56', '4', 'City', 'address_city', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('57', '5', 'State', 'address_state_id', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('58', '-1', 'address_country_id', 'address_country_id', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('59', '6', 'Zip Code', 'address_zip', 'orders', 'string', 'string', null); +INSERT INTO "R4ME"."CSV_TO_API_DICTIONARY" VALUES ('60', '-1', 'order_icon', 'order_icon', 'orders', 'string', 'string', null); diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/orders.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/orders.sql new file mode 100644 index 00000000..c3370a0f --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/ORACLE/orders.sql @@ -0,0 +1,101 @@ +/* +Database : xe +Target Server Type : ORACLE +Date: 2017-04-04 12:10 PM +*/ + +BEGIN +FOR tt IN (SELECT table_name as tname + FROM all_tables WHERE TABLE_NAME='ORDERS' AND OWNER='R4ME') + LOOP + EXECUTE IMMEDIATE 'DROP TABLE ORDERS'; + END LOOP; +END; +/ + +-- ---------------------------- +-- Table structure for orders +-- ---------------------------- +CREATE TABLE orders ( + "ID" NUMBER(7,0) NOT NULL, + "order_id" NUMBER(7,0), + "order_status_id" NUMBER(7,0), + "address_1" VARCHAR2(256), + "address_2" VARCHAR2(256), + "member_id" NUMBER(7,0), + "cached_lat" NUMBER(10,7), + "cached_lng" NUMBER(10,7), + "color" VARCHAR2(10), + "curbside_lat" NUMBER(10,7), + "curbside_lng" NUMBER(10,7), + "day_added_YYMMDD" VARCHAR2(16), + "day_scheduled_for_YYMMDD" VARCHAR2(16), + "EXT_FIELD_custom_data" NCLOB, + "address_alias" VARCHAR2(128), + "local_time_window_start" NUMBER(7,0), + "local_time_window_end" NUMBER(7,0), + "local_time_window_start_2" NUMBER(7,0), + "local_time_window_end_2" NUMBER(7,0), + "service_time" NUMBER(7,0), + "EXT_FIELD_first_name" VARCHAR2(64), + "EXT_FIELD_last_name" VARCHAR2(64), + "EXT_FIELD_email" VARCHAR2(128), + "EXT_FIELD_phone" VARCHAR2(24), + "address_city" VARCHAR2(128), + "address_state_id" VARCHAR2(10), + "address_country_id" VARCHAR2(10), + "address_zip" VARCHAR2(20), + "order_icon" VARCHAR2(128), + CONSTRAINT "ORDERS_PK" PRIMARY KEY ("ID") ENABLE +); + +BEGIN +FOR cc IN (SELECT sequence_name as sequence_exists + FROM all_sequences + WHERE SEQUENCE_OWNER='R4ME' and sequence_name = 'ORDERS_SEQ') + LOOP + EXECUTE IMMEDIATE 'DROP SEQUENCE ORDERS_SEQ'; + END LOOP; +END; +/ + +CREATE SEQUENCE "ORDERS_SEQ" MINVALUE 1 MAXVALUE 9999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE NOORDER NOCYCLE ; + +CREATE OR REPLACE TRIGGER "ORDERS_T1" +AFTER +insert on "ORDERS" +begin +if "ID" is null then + select "ORDERS_SEQ".nextval into "ID" from dual; + end if; +end; +/ +ALTER TRIGGER "ORDERS_T1" ENABLE; + +COMMENT ON COLUMN "R4ME"."ORDERS"."order_id" IS 'Order ID in a Route4Me account'; +COMMENT ON COLUMN "R4ME"."ORDERS"."order_status_id" IS 'Order status ID'; +COMMENT ON COLUMN "R4ME"."ORDERS"."address_1" IS 'Address 1'; +COMMENT ON COLUMN "R4ME"."ORDERS"."address_2" IS 'Address 2'; +COMMENT ON COLUMN "R4ME"."ORDERS"."member_id" IS 'An user ID in a Route4Me account'; +COMMENT ON COLUMN "R4ME"."ORDERS"."cached_lat" IS 'Cached latitude'; +COMMENT ON COLUMN "R4ME"."ORDERS"."cached_lng" IS 'Cached longitude'; +COMMENT ON COLUMN "R4ME"."ORDERS"."color" IS 'e.g. fa573c'; +COMMENT ON COLUMN "R4ME"."ORDERS"."curbside_lat" IS 'Curbside latitude'; +COMMENT ON COLUMN "R4ME"."ORDERS"."curbside_lng" IS 'Curbside longitude'; +COMMENT ON COLUMN "R4ME"."ORDERS"."day_added_YYMMDD" IS 'When was inserted the order'; +COMMENT ON COLUMN "R4ME"."ORDERS"."day_scheduled_for_YYMMDD" IS 'Date order was scheduled for'; +COMMENT ON COLUMN "R4ME"."ORDERS"."EXT_FIELD_custom_data IS" 'A custom data of the order'; +COMMENT ON COLUMN "R4ME"."ORDERS"."local_time_window_start" IS 'UNIX time'; +COMMENT ON COLUMN "R4ME"."ORDERS"."local_time_window_end" IS 'UNIX time'; +COMMENT ON COLUMN "R4ME"."ORDERS"."local_time_window_start_2" IS 'UNIX time'; +COMMENT ON COLUMN "R4ME"."ORDERS"."local_time_window_end_2" IS 'UNIX time'; +COMMENT ON COLUMN "R4ME"."ORDERS"."service_time" IS 'UNIX time'; +COMMENT ON COLUMN "R4ME"."ORDERS"."EXT_FIELD_first_name" IS 'A first name of an order owner'; +COMMENT ON COLUMN "R4ME"."ORDERS"."EXT_FIELD_last_name" IS 'A last name of an order owner'; +COMMENT ON COLUMN "R4ME"."ORDERS"."EXT_FIELD_email" IS 'Order email'; +COMMENT ON COLUMN "R4ME"."ORDERS"."EXT_FIELD_phone" IS 'Order phone number'; +COMMENT ON COLUMN "R4ME"."ORDERS"."address_city" IS 'The city the location is located in'; +COMMENT ON COLUMN "R4ME"."ORDERS"."address_state_id" IS 'The state ID the address is located in'; +COMMENT ON COLUMN "R4ME"."ORDERS"."address_country_id" IS 'The country the address is located in'; +COMMENT ON COLUMN "R4ME"."ORDERS"."address_zip" IS 'The zip code the address is located in'; +COMMENT ON COLUMN "R4ME"."ORDERS"."order_icon" IS 'e.g. emoji/emoji-bank'; diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/addressbook_v4.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/addressbook_v4.sql new file mode 100644 index 00000000..605eea78 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/addressbook_v4.sql @@ -0,0 +1,79 @@ +/* +Database : r4me_db +Target Server Type : PostgreSQL +Script Date : 3/28/2017 3:54:56 PM +*/ + +DROP TABLE IF EXISTS addressbook_v4; +DROP SEQUENCE IF EXISTS addressbook_id_seq; + +CREATE TABLE addressbook_v4 +( + id integer NOT NULL, + territory_name character varying(256), + created_timestamp integer, + address_id integer, + address_1 character varying(256), + address_2 character varying(256), + address_alias character varying(256), + address_group character varying(50), + member_id integer, + first_name character varying(64), + last_name character varying(64), + address_email character varying(64), + address_phone_number character varying(24), + cached_lat double precision, + cached_lng double precision, + curbside_lat double precision, + curbside_lng double precision, + schedule text, + address_city character varying(64), + address_state_id character varying(10), + address_country_id character varying(10), + address_zip character varying(16), + schedule_blacklist text, + in_route_count integer, + last_visited_timestamp integer, + last_routed_timestamp integer, + local_time_window_start integer, + local_time_window_end integer, + local_time_window_start_2 integer, + local_time_window_end_2 integer, + service_time integer, + local_timezone_string character varying(64), + color character varying(6), + address_icon character varying(128), + address_custom_data text, + CONSTRAINT "PK_addressbook_id" PRIMARY KEY (id) +) +WITH ( + OIDS=FALSE +); + +CREATE SEQUENCE addressbook_id_seq; +ALTER TABLE addressbook_v4 ALTER id SET DEFAULT NEXTVAL('addressbook_id_seq'); + +ALTER TABLE addressbook_v4 + OWNER TO postgres; +COMMENT ON COLUMN addressbook_v4.created_timestamp IS 'When addressbook contact was created (UNIX time)'; +COMMENT ON COLUMN addressbook_v4.address_id IS 'Address book location ID in a Route4Me account'; +COMMENT ON COLUMN addressbook_v4.address_1 IS 'Address 1'; +COMMENT ON COLUMN addressbook_v4.address_2 IS 'Address 2'; +COMMENT ON COLUMN addressbook_v4.member_id IS 'An user ID in a Route4Me account'; +COMMENT ON COLUMN addressbook_v4.first_name IS 'A first name of a receiver at the location'; +COMMENT ON COLUMN addressbook_v4.last_name IS 'A last name of a receiver at the location'; +COMMENT ON COLUMN addressbook_v4.address_email IS 'Location email'; +COMMENT ON COLUMN addressbook_v4.address_phone_number IS 'Location phone number'; +COMMENT ON COLUMN addressbook_v4.cached_lat IS 'Cached latitude'; +COMMENT ON COLUMN addressbook_v4.cached_lng IS 'Cached longitude'; +COMMENT ON COLUMN addressbook_v4.curbside_lat IS 'Curbside latitude'; +COMMENT ON COLUMN addressbook_v4.curbside_lng IS 'Curbside longitude'; +COMMENT ON COLUMN addressbook_v4.schedule IS 'Schedule object represented by JSON string'; +COMMENT ON COLUMN addressbook_v4.address_city IS 'The city the location is located in'; +COMMENT ON COLUMN addressbook_v4.address_state_id IS 'The state ID the address is located in'; +COMMENT ON COLUMN addressbook_v4.address_country_id IS 'The country the address is located in'; +COMMENT ON COLUMN addressbook_v4.address_zip IS 'The zip code the address is located in'; +COMMENT ON COLUMN addressbook_v4.schedule_blacklist IS 'comma-delimited list of the dates'; +COMMENT ON COLUMN addressbook_v4.in_route_count IS 'In how many route is included the location'; +COMMENT ON COLUMN addressbook_v4.service_time IS 'UNIX time'; +COMMENT ON COLUMN addressbook_v4.color IS 'Location color on a map'; \ No newline at end of file diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/csv_to_api_dictionary_DDL.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/csv_to_api_dictionary_DDL.sql new file mode 100644 index 00000000..e5b1fc42 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/csv_to_api_dictionary_DDL.sql @@ -0,0 +1,37 @@ +/* +Database : r4me_db +Target Server Type : PostgreSQL +Date: 2017-03-29 5:26 PM +*/ + +-- ---------------------------- +-- Table structure for csv_to_api_dictionary +-- ---------------------------- + +DROP TABLE IF EXISTS csv_to_api_dictionary; +DROP SEQUENCE IF EXISTS dictionary_id_seq; + +CREATE TABLE csv_to_api_dictionary ( + id integer NOT NULL, + csv_field_nom integer, + r4m_csv_field_name character varying(64), + api_field_name character varying(64), + table_name character varying(64), + csv_field_type character varying(64), + api_field_type character varying(64), + comment character varying(32), + CONSTRAINT "PK_dictionary_id" PRIMARY KEY (id) +) +WITH ( + OIDS=FALSE +); + +CREATE SEQUENCE dictionary_id_seq; +ALTER TABLE csv_to_api_dictionary ALTER id SET DEFAULT NEXTVAL('dictionary_id_seq'); + +ALTER TABLE csv_to_api_dictionary + OWNER TO postgres; +COMMENT ON COLUMN csv_to_api_dictionary.csv_field_nom IS 'field order number in csv exported file'; +COMMENT ON COLUMN csv_to_api_dictionary.r4m_csv_field_name IS 'Field name in the exported csv file from Route4Me web UI'; +COMMENT ON COLUMN csv_to_api_dictionary.api_field_name IS 'The field name in the Route4Me API'; +COMMENT ON COLUMN csv_to_api_dictionary.table_name IS 'api_filed belongs to a table with table_name'; diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/csv_to_api_dictionary_DML.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/csv_to_api_dictionary_DML.sql new file mode 100644 index 00000000..e83549ea --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/csv_to_api_dictionary_DML.sql @@ -0,0 +1,69 @@ +/* +Database : r4me_db +Target Server Type : PostgreSQL +Date: 2017-03-29 5:34 PM +*/ + +-- ---------------------------- +-- Records of csv_to_api_dictionary +-- ---------------------------- +INSERT INTO csv_to_api_dictionary VALUES ('1', '0', 'Territory Name', 'territory_name', 'addressbook_v4', 'string', 'string', 'not api'); +INSERT INTO csv_to_api_dictionary VALUES ('2', '1', 'created_timestamp', 'created_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('3', '2', 'address_id', 'address_id', 'addressbook_v4', 'int', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('4', '3', 'group', 'address_group', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('5', '4', 'alias', 'address_alias', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('6', '5', 'address', 'address_1', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('7', '6', 'address_2', 'address_2', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('8', '7', 'member_id', 'member_id', 'addressbook_v4', 'int', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('9', '8', 'first_name', 'first_name', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('10', '9', 'last_name', 'last_name', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('11', '10', 'email', 'address_email', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('12', '11', 'phone', 'address_phone_number', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('13', '12', 'city', 'address_city', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('14', '13', 'state', 'address_state_id', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('15', '14', 'country_id', 'address_country_id', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('16', '15', 'zipcode', 'address_zip', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('17', '16', 'lat', 'cached_lat', 'addressbook_v4', 'double', 'double', null); +INSERT INTO csv_to_api_dictionary VALUES ('18', '17', 'lng', 'cached_lng', 'addressbook_v4', 'double', 'double', null); +INSERT INTO csv_to_api_dictionary VALUES ('19', '18', 'curbside_lat', 'curbside_lat', 'addressbook_v4', 'double', 'double', null); +INSERT INTO csv_to_api_dictionary VALUES ('20', '19', 'curbside_lng', 'curbside_lng', 'addressbook_v4', 'double', 'double', null); +INSERT INTO csv_to_api_dictionary VALUES ('21', '20', 'schedule', 'schedule', 'addressbook_v4', 'string', 'string', 'JSON string'); +INSERT INTO csv_to_api_dictionary VALUES ('22', '21', 'schedule_blacklist', 'schedule_blacklist', 'addressbook_v4', 'string', 'string', 'date string array'); +INSERT INTO csv_to_api_dictionary VALUES ('23', '22', 'in_route_count', 'in_route_count', 'addressbook_v4', 'int', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('24', '23', 'last_visited_timestamp', 'last_visited_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('25', '24', 'last_routed_timestamp', 'last_routed_timestamp', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('26', '25', 'time_window_start', 'local_time_window_start', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('27', '26', 'time_window_end', 'local_time_window_end', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('28', '27', 'time_window_start_2', 'local_time_window_start_2', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('29', '28', 'time_window_end_2', 'local_time_window_end_2', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('30', '29', 'service_time', 'service_time', 'addressbook_v4', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('31', '30', 'timezone', 'local_timezone_string', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('32', '31', 'color', 'color', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('33', '32', 'address_icon', 'address_icon', 'addressbook_v4', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('34', null, 'order_id', 'order_id', 'orders', 'int', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('35', null, 'order_status_id', 'order_status_id', 'orders', 'int', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('36', '3', 'Address', 'address_1', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('37', null, 'address_2', 'address_2', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('38', null, 'member_id', 'member_id', 'orders', 'int', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('39', '1', 'Latitude', 'cached_lat', 'orders', 'double', 'double', null); +INSERT INTO csv_to_api_dictionary VALUES ('40', '0', 'Longitude', 'cached_lng', 'orders', 'double', 'double', null); +INSERT INTO csv_to_api_dictionary VALUES ('41', null, 'color', 'color', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('42', null, 'curbside_lat', 'curbside_lat', 'orders', 'double', 'double', null); +INSERT INTO csv_to_api_dictionary VALUES ('43', null, 'curbside_lng', 'curbside_lng', 'orders', 'double', 'double', null); +INSERT INTO csv_to_api_dictionary VALUES ('44', '8', 'Schedule Date', 'day_scheduled_for_YYMMDD', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('45', null, 'EXT_FIELD_custom_data', 'EXT_FIELD_custom_data', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('46', '2', 'Address Alias', 'address_alias', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('47', null, 'local_time_window_start', 'local_time_window_start', 'orders', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('48', null, 'local_time_window_end', 'local_time_window_end', 'orders', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('49', null, 'local_time_window_start_2', 'local_time_window_start_2', 'orders', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('50', null, 'local_time_window_end_2', 'local_time_window_end_2', 'orders', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('51', null, 'service_time', 'service_time', 'orders', 'datetime', 'int', null); +INSERT INTO csv_to_api_dictionary VALUES ('52', '-1', 'EXT_FIELD_first_name', 'EXT_FIELD_first_name', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('53', '-1', 'EXT_FIELD_last_name', 'EXT_FIELD_last_name', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('54', '-1', 'EXT_FIELD_email', 'EXT_FIELD_email', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('55', '7', 'Phone', 'EXT_FIELD_phone', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('56', '4', 'City', 'address_city', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('57', '5', 'State', 'address_state_id', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('58', '-1', 'address_country_id', 'address_country_id', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('59', '6', 'Zip Code', 'address_zip', 'orders', 'string', 'string', null); +INSERT INTO csv_to_api_dictionary VALUES ('60', '-1', 'order_icon', 'order_icon', 'orders', 'string', 'string', null); diff --git a/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/orders.sql b/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/orders.sql new file mode 100644 index 00000000..a15f4e91 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Data/SQL/PostgreSQL/orders.sql @@ -0,0 +1,80 @@ +/* +Database : r4me_db +Target Server Type : PostgreSQL +Date: 2017-03-29 4:41 PM +*/ + +-- ---------------------------- +-- Table structure for orders +-- ---------------------------- +DROP TABLE IF EXISTS orders; +DROP SEQUENCE IF EXISTS orders_id_seq; + +CREATE TABLE orders ( + id integer NOT NULL, + order_id integer NULL, + order_status_id integer, + address_1 character varying(256), + address_2 character varying(256), + member_id integer, + cached_lat double precision, + cached_lng double precision, + color character varying(10), + curbside_lat double precision, + curbside_lng double precision, + day_added_YYMMDD character varying(16), + day_scheduled_for_YYMMDD character varying(16), + EXT_FIELD_custom_data text, + address_alias character varying(128), + local_time_window_start integer, + local_time_window_end integer, + local_time_window_start_2 integer, + local_time_window_end_2 integer, + service_time integer, + EXT_FIELD_first_name character varying(64), + EXT_FIELD_last_name character varying(64), + EXT_FIELD_email character varying(128), + EXT_FIELD_phone character varying(24), + address_city character varying(128), + address_state_id character varying(10), + address_country_id character varying(10), + address_zip character varying(20), + order_icon character varying(128), + CONSTRAINT "PK_orders_id" PRIMARY KEY (id) +) +WITH ( + OIDS=FALSE +); + +CREATE SEQUENCE orders_id_seq; +ALTER TABLE orders ALTER id SET DEFAULT NEXTVAL('orders_id_seq'); + +ALTER TABLE orders + OWNER TO postgres; +COMMENT ON COLUMN orders.order_id IS 'Order ID in a Route4Me account'; +COMMENT ON COLUMN orders.order_status_id IS 'Order status ID'; +COMMENT ON COLUMN orders.address_1 IS 'Address 1'; +COMMENT ON COLUMN orders.address_2 IS 'Address 2'; +COMMENT ON COLUMN orders.member_id IS 'An user ID in a Route4Me account'; +COMMENT ON COLUMN orders.cached_lat IS 'Cached latitude'; +COMMENT ON COLUMN orders.cached_lng IS 'Cached longitude'; +COMMENT ON COLUMN orders.color IS 'e.g. fa573c'; +COMMENT ON COLUMN orders.curbside_lat IS 'Curbside latitude'; +COMMENT ON COLUMN orders.curbside_lng IS 'Curbside longitude'; +COMMENT ON COLUMN orders.day_added_YYMMDD IS 'When was inserted the order'; +COMMENT ON COLUMN orders.day_scheduled_for_YYMMDD IS 'Date order was scheduled for'; +COMMENT ON COLUMN orders.EXT_FIELD_custom_data IS 'A custom data of the order'; +COMMENT ON COLUMN orders.local_time_window_start IS 'UNIX time'; +COMMENT ON COLUMN orders.local_time_window_end IS 'UNIX time'; +COMMENT ON COLUMN orders.local_time_window_start_2 IS 'UNIX time'; +COMMENT ON COLUMN orders.local_time_window_end_2 IS 'UNIX time'; +COMMENT ON COLUMN orders.service_time IS 'UNIX time'; +COMMENT ON COLUMN orders.EXT_FIELD_first_name IS 'A first name of an order owner'; +COMMENT ON COLUMN orders.EXT_FIELD_last_name IS 'A last name of an order owner'; +COMMENT ON COLUMN orders.EXT_FIELD_email IS 'Order email'; +COMMENT ON COLUMN orders.EXT_FIELD_phone IS 'Order phone number'; +COMMENT ON COLUMN orders.address_city IS 'The city the location is located in'; +COMMENT ON COLUMN orders.address_state_id IS 'The state ID the address is located in'; +COMMENT ON COLUMN orders.address_country_id IS 'The country the address is located in'; +COMMENT ON COLUMN orders.address_zip IS 'The zip code the address is located in'; +COMMENT ON COLUMN orders.order_icon IS 'e.g. emoji/emoji-bank'; diff --git a/Route4MeSDKTest/bin/Debug/Route4MeSDKLibrary.dll b/Route4MeSDKTest/bin/Debug/Route4MeSDKLibrary.dll new file mode 100644 index 00000000..1014e3c6 Binary files /dev/null and b/Route4MeSDKTest/bin/Debug/Route4MeSDKLibrary.dll differ diff --git a/Route4MeSDKTest/bin/Debug/Route4MeSDKLibrary.pdb b/Route4MeSDKTest/bin/Debug/Route4MeSDKLibrary.pdb new file mode 100644 index 00000000..03b71c80 Binary files /dev/null and b/Route4MeSDKTest/bin/Debug/Route4MeSDKLibrary.pdb differ diff --git a/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.exe b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.exe new file mode 100644 index 00000000..14209543 Binary files /dev/null and b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.exe differ diff --git a/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.exe.config b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.exe.config new file mode 100644 index 00000000..c734aec0 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.exe.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.pdb b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.pdb new file mode 100644 index 00000000..0edc9bb7 Binary files /dev/null and b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.pdb differ diff --git a/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.vshost.exe b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.vshost.exe new file mode 100644 index 00000000..8c845174 Binary files /dev/null and b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.vshost.exe differ diff --git a/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.vshost.exe.config b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.vshost.exe.config new file mode 100644 index 00000000..c734aec0 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.vshost.exe.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.vshost.exe.manifest b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.vshost.exe.manifest new file mode 100644 index 00000000..061c9ca9 --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/Route4MeSDKTest.vshost.exe.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Route4MeSDKTest/bin/Debug/nunit.framework.dll b/Route4MeSDKTest/bin/Debug/nunit.framework.dll new file mode 100644 index 00000000..a467965e Binary files /dev/null and b/Route4MeSDKTest/bin/Debug/nunit.framework.dll differ diff --git a/Route4MeSDKTest/bin/Debug/nunit.framework.xml b/Route4MeSDKTest/bin/Debug/nunit.framework.xml new file mode 100644 index 00000000..ca0f4f4a --- /dev/null +++ b/Route4MeSDKTest/bin/Debug/nunit.framework.xml @@ -0,0 +1,18812 @@ + + + + nunit.framework + + + + + The different targets a test action attribute can be applied to + + + + + Default target, which is determined by where the action attribute is attached + + + + + Target a individual test case + + + + + Target a suite of test cases + + + + + DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite + containing test fixtures present in the assembly. + + + + + The default suite builder used by the test assembly builder. + + + + + Initializes a new instance of the class. + + + + + Build a suite of tests from a provided assembly + + The assembly from which tests are to be built + A dictionary of options to use in building the suite + + A TestSuite containing the tests found in the assembly + + + + + Build a suite of tests given the filename of an assembly + + The filename of the assembly from which tests are to be built + A dictionary of options to use in building the suite + + A TestSuite containing the tests found in the assembly + + + + + FrameworkController provides a facade for use in loading, browsing + and running tests without requiring a reference to the NUnit + framework. All calls are encapsulated in constructors for + this class and its nested classes, which only require the + types of the Common Type System as arguments. + + The controller supports four actions: Load, Explore, Count and Run. + They are intended to be called by a driver, which should allow for + proper sequencing of calls. Load must be called before any of the + other actions. The driver may support other actions, such as + reload on run, by combining these calls. + + + + + Construct a FrameworkController using the default builder and runner. + + The AssemblyName or path to the test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + + + + Construct a FrameworkController using the default builder and runner. + + The test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + + + + Construct a FrameworkController, specifying the types to be used + for the runner and builder. This constructor is provided for + purposes of development. + + The full AssemblyName or the path to the test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + The Type of the test runner + The Type of the test builder + + + + Construct a FrameworkController, specifying the types to be used + for the runner and builder. This constructor is provided for + purposes of development. + + The test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + The Type of the test runner + The Type of the test builder + + + + Gets the ITestAssemblyBuilder used by this controller instance. + + The builder. + + + + Gets the ITestAssemblyRunner used by this controller instance. + + The runner. + + + + Gets the AssemblyName or the path for which this FrameworkController was created + + + + + Gets the Assembly for which this + + + + + Gets a dictionary of settings for the FrameworkController + + + + + Loads the tests in the assembly + + + + + + Returns info about the tests in an assembly + + A string containing the XML representation of the filter to use + The XML result of exploring the tests + + + + Runs the tests in an assembly + + A string containing the XML representation of the filter to use + The XML result of the test run + + + + Runs the tests in an assembly synchronously reporting back the test results through the callback + or through the return value + + The callback that receives the test results + A string containing the XML representation of the filter to use + The XML result of the test run + + + + Runs the tests in an assembly asynchronously reporting back the test results through the callback + + The callback that receives the test results + A string containing the XML representation of the filter to use + + + + Stops the test run + + True to force the stop, false for a cooperative stop + + + + Counts the number of test cases in the loaded TestSuite + + A string containing the XML representation of the filter to use + The number of tests + + + + Inserts environment element + + Target node + The new node + + + + Inserts settings element + + Target node + Settings dictionary + The new node + + + + FrameworkControllerAction is the base class for all actions + performed against a FrameworkController. + + + + + LoadTestsAction loads a test into the FrameworkController + + + + + LoadTestsAction loads the tests in an assembly. + + The controller. + The callback handler. + + + + ExploreTestsAction returns info about the tests in an assembly + + + + + Initializes a new instance of the class. + + The controller for which this action is being performed. + Filter used to control which tests are included (NYI) + The callback handler. + + + + CountTestsAction counts the number of test cases in the loaded TestSuite + held by the FrameworkController. + + + + + Construct a CountsTestAction and perform the count of test cases. + + A FrameworkController holding the TestSuite whose cases are to be counted + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + RunTestsAction runs the loaded TestSuite held by the FrameworkController. + + + + + Construct a RunTestsAction and run all tests in the loaded TestSuite. + + A FrameworkController holding the TestSuite to run + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + RunAsyncAction initiates an asynchronous test run, returning immediately + + + + + Construct a RunAsyncAction and run all tests in the loaded TestSuite. + + A FrameworkController holding the TestSuite to run + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + StopRunAction stops an ongoing run. + + + + + Construct a StopRunAction and stop any ongoing run. If no + run is in process, no error is raised. + + The FrameworkController for which a run is to be stopped. + True the stop should be forced, false for a cooperative stop. + >A callback handler used to report results + A forced stop will cause threads and processes to be killed as needed. + + + + The ITestAssemblyBuilder interface is implemented by a class + that is able to build a suite of tests given an assembly or + an assembly filename. + + + + + Build a suite of tests from a provided assembly + + The assembly from which tests are to be built + A dictionary of options to use in building the suite + A TestSuite containing the tests found in the assembly + + + + Build a suite of tests given the filename of an assembly + + The filename of the assembly from which tests are to be built + A dictionary of options to use in building the suite + A TestSuite containing the tests found in the assembly + + + + The ITestAssemblyRunner interface is implemented by classes + that are able to execute a suite of tests loaded + from an assembly. + + + + + Gets the tree of loaded tests, or null if + no tests have been loaded. + + + + + Gets the tree of test results, if the test + run is completed, otherwise null. + + + + + Indicates whether a test has been loaded + + + + + Indicates whether a test is currently running + + + + + Indicates whether a test run is complete + + + + + Loads the tests found in an Assembly, returning an + indication of whether or not the load succeeded. + + File name of the assembly to load + Dictionary of options to use in loading the test + An ITest representing the loaded tests + + + + Loads the tests found in an Assembly, returning an + indication of whether or not the load succeeded. + + The assembly to load + Dictionary of options to use in loading the test + An ITest representing the loaded tests + + + + Count Test Cases using a filter + + The filter to apply + The number of test cases found + + + + Run selected tests and return a test result. The test is run synchronously, + and the listener interface is notified as it progresses. + + Interface to receive ITestListener notifications. + A test filter used to select tests to be run + + + + Run selected tests asynchronously, notifying the listener interface as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + + + + Wait for the ongoing run to complete. + + Time to wait in milliseconds + True if the run completed, otherwise false + + + + Signal any test run that is in process to stop. Return without error if no test is running. + + If true, kill any test-running threads + + + + Implementation of ITestAssemblyRunner + + + + + Initializes a new instance of the class. + + The builder. + + + + Gets the default level of parallel execution (worker threads) + + + + + The tree of tests that was loaded by the builder + + + + + The test result, if a run has completed + + + + + Indicates whether a test is loaded + + + + + Indicates whether a test is running + + + + + Indicates whether a test run is complete + + + + + Our settings, specified when loading the assembly + + + + + The top level WorkItem created for the assembly as a whole + + + + + The TestExecutionContext for the top level WorkItem + + + + + Loads the tests found in an Assembly + + File name of the assembly to load + Dictionary of option settings for loading the assembly + True if the load was successful + + + + Loads the tests found in an Assembly + + The assembly to load + Dictionary of option settings for loading the assembly + True if the load was successful + + + + Count Test Cases using a filter + + The filter to apply + The number of test cases found + + + + Run selected tests and return a test result. The test is run synchronously, + and the listener interface is notified as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + + + + + Run selected tests asynchronously, notifying the listener interface as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + + RunAsync is a template method, calling various abstract and + virtual methods to be overridden by derived classes. + + + + + Wait for the ongoing run to complete. + + Time to wait in milliseconds + True if the run completed, otherwise false + + + + Signal any test run that is in process to stop. Return without error if no test is running. + + If true, kill any tests that are currently running + + + + Initiate the test run. + + + + + Create the initial TestExecutionContext used to run tests + + The ITestListener specified in the RunAsync call + + + + Handle the the Completed event for the top level work item + + + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + + + Verifies that the first int is greater than the second + int. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first int is greater than the second + int. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + + + + Asserts that an int is zero. + + The number to be examined + + + + Asserts that an int is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is zero. + + The number to be examined + + + + Asserts that an unsigned int is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is zero. + + The number to be examined + + + + Asserts that a Long is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is zero. + + The number to be examined + + + + Asserts that an unsigned Long is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is zero. + + The number to be examined + + + + Asserts that a decimal is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is zero. + + The number to be examined + + + + Asserts that a double is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is zero. + + The number to be examined + + + + Asserts that a float is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is not zero. + + The number to be examined + + + + Asserts that an int is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is not zero. + + The number to be examined + + + + Asserts that an unsigned int is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is not zero. + + The number to be examined + + + + Asserts that a Long is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is not zero. + + The number to be examined + + + + Asserts that an unsigned Long is not zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is zero. + + The number to be examined + + + + Asserts that a decimal is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is zero. + + The number to be examined + + + + Asserts that a double is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is zero. + + The number to be examined + + + + Asserts that a float is zero. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is negative. + + The number to be examined + + + + Asserts that an int is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is negative. + + The number to be examined + + + + Asserts that an unsigned int is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is negative. + + The number to be examined + + + + Asserts that a Long is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is negative. + + The number to be examined + + + + Asserts that an unsigned Long is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is negative. + + The number to be examined + + + + Asserts that a decimal is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is negative. + + The number to be examined + + + + Asserts that a double is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is negative. + + The number to be examined + + + + Asserts that a float is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is negative. + + The number to be examined + + + + Asserts that an int is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is negative. + + The number to be examined + + + + Asserts that an unsigned int is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is negative. + + The number to be examined + + + + Asserts that a Long is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is negative. + + The number to be examined + + + + Asserts that an unsigned Long is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is negative. + + The number to be examined + + + + Asserts that a decimal is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is negative. + + The number to be examined + + + + Asserts that a double is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is negative. + + The number to be examined + + + + Asserts that a float is negative. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. + + + + + DO NOT USE! Use Assert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + + + + Throws an with the message and arguments + that are passed in. This is used by the other Assert functions. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This is used by the other Assert functions. + + The message to initialize the with. + + + + Throws an . + This is used by the other Assert functions. + + + + + Issues a warning using the message and arguments provided. + + The message to display. + Arguments to be used in formatting the message + + + + Issues a warning using the message provided. + + The message to display. + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as ignored. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as Inconclusive. + + + + + Asserts that an object is contained in a collection. + + The expected object + The collection to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is contained in a collection. + + The expected object + The collection to be examined + + + + Wraps code containing a series of assertions, which should all + be executed, even if they fail. Failed results are saved and + reported at the end of the code block. + + A TestDelegate to be executed in Multiple Assertion mode. + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + + + + Helper for Assert.AreEqual(double expected, double actual, ...) + allowing code generation to work consistently. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that an async delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + + + + Verifies that an async delegate throws a particular exception when called. + + The exception Type expected + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws a particular exception when called. + + The exception Type expected + A TestDelegate + + + + Verifies that an async delegate throws a particular exception when called. + + Type of the expected exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws a particular exception when called. + + Type of the expected exception + A TestDelegate + + + + Verifies that an async delegate throws an exception when called + and returns it. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws an exception when called + and returns it. + + A TestDelegate + + + + Verifies that an async delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + + + + Verifies that an async delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + A TestDelegate + + + + Verifies that an async delegate does not throw an exception + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate does not throw an exception. + + A TestDelegate + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestDelegate + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestDelegate + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + A TestDelegate + + + + Verifies that a delegate does not throw an exception + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate does not throw an exception. + + A TestDelegate + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + + + This method is provided for use by VB developers needing to test + the value of properties with private setters. + + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Delegate used by tests that execute code and + capture any thrown exception. + + + + + Delegate used by tests that execute async code and + capture any thrown exception. + + + + + AssertionHelper is an optional base class for user tests, + allowing the use of shorter ids for constraints and + asserts and avoiding conflict with the definition of + , from which it inherits much of its + behavior, in certain mock object frameworks. + + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to + . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to . + + The evaluated condition + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Returns a ListMapper based on a collection. + + The original collection + + + + + The NonTestAssemblyAttribute may be used by third-party frameworks + or other software that references the nunit framework but does not + contain tests. Applying the attribute indicates that the assembly + is not a test assembly and may prevent errors if certain runners + attempt to load the assembly. Note that recognition of the attribute + depends on each individual runner. + + + + + Provides static methods to express conditions + that must be met for the test to succeed. If + any test fails, a warning is issued. + + + + + DO NOT USE! + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + Not applicable + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false a warning is issued. + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false a warning is issued. + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false a warning is issued. + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint to be applied + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on success. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on success. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false a warning is issued. + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false a warning is issued. + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false a warning is issued. + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is false. If the condition is true a warning is issued. + + A lambda that returns a Boolean + The message to display if the condition is true + Arguments to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true a warning is issued. + + A lambda that returns a Boolean + + + + Asserts that a condition is false. If the condition is true a warning is issued. + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning if it succeeds. + + The Type being compared. + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning if it succeeds. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint to be applied + A function to build the message included with the Exception + + + + Provides static methods to express the assumptions + that must be met for a test to give a meaningful + result. If an assumption is not met, the test + should produce an inconclusive result. + + + + + DO NOT USE! + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + Not applicable + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the + method throws an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint to be applied + A function to build the message included with the Exception + + + + Marks a test that must run in a particular threading apartment state, causing it + to run in a separate thread if necessary. + + + + + Construct an ApartmentAttribute + + The apartment state that this test must be run under. You must pass in a valid apartment state. + + + + Provides the Author of a test or test fixture. + + + + + Initializes a new instance of the class. + + The name of the author. + + + + Initializes a new instance of the class. + + The name of the author. + The email address of the author. + + + + Attribute used to apply a category to a test + + + + + The name of the category + + + + + Construct attribute for a given category based on + a name. The name may not contain the characters ',', + '+', '-' or '!'. However, this is not checked in the + constructor since it would cause an error to arise at + as the test was loaded without giving a clear indication + of where the problem is located. The error is handled + in NUnitFramework.cs by marking the test as not + runnable. + + The name of the category + + + + Protected constructor uses the Type name as the name + of the category. + + + + + The name of the category + + + + + Modifies a test by adding a category to it. + + The test to modify + + + + Marks a test to use a combinatorial join of any argument + data provided. Since this is the default, the attribute is + optional. + + + + + Default constructor + + + + + Marks a test to use a particular CombiningStrategy to join + any parameter data provided. Since this is the default, the + attribute is optional. + + + + + Construct a CombiningStrategyAttribute incorporating an + ICombiningStrategy and an IParameterDataProvider. + + Combining strategy to be used in combining data + An IParameterDataProvider to supply data + + + + Construct a CombiningStrategyAttribute incorporating an object + that implements ICombiningStrategy and an IParameterDataProvider. + This constructor is provided for CLS compliance. + + Combining strategy to be used in combining data + An IParameterDataProvider to supply data + + + + Construct one or more TestMethods from a given MethodInfo, + using available parameter data. + + The MethodInfo for which tests are to be constructed. + The suite to which the tests will be added. + One or more TestMethods + + + + Modify the test by adding the name of the combining strategy + to the properties. + + The test to modify + + + + CultureAttribute is used to mark a test fixture or an + individual method as applying to a particular Culture only. + + + + + Constructor with no cultures specified, for use + with named property syntax. + + + + + Constructor taking one or more cultures + + Comma-deliminted list of cultures + + + + Causes a test to be skipped if this CultureAttribute is not satisfied. + + The test to modify + + + + Tests to determine if the current culture is supported + based on the properties of this attribute. + + True, if the current culture is supported + + + + Test to determine if the a particular culture or comma- + delimited set of cultures is in use. + + Name of the culture or comma-separated list of culture ids + True if the culture is in use on the system + + + + Test to determine if one of a collection of cultures + is being used currently. + + + + + + + The abstract base class for all data-providing attributes + defined by NUnit. Used to select all data sources for a + method, class or parameter. + + + + + Default constructor + + + + + Used to mark a field for use as a datapoint when executing a theory + within the same fixture that requires an argument of the field's Type. + + + + + Used to mark a field, property or method providing a set of datapoints to + be used in executing any theories within the same fixture that require an + argument of the Type provided. The data source may provide an array of + the required Type or an . + Synonymous with DatapointSourceAttribute. + + + + + Used to mark a field, property or method providing a set of datapoints to + be used in executing any theories within the same fixture that require an + argument of the Type provided. The data source may provide an array of + the required Type or an . + Synonymous with DatapointsAttribute. + + + + + Attribute used to provide descriptive text about a + test case or fixture. + + + + + Construct a description Attribute + + The text of the description + + + + ExplicitAttribute marks a test or test fixture so that it will + only be run if explicitly executed from the gui or command line + or if it is included by use of a filter. The test will not be + run simply because an enclosing suite is run. + + + + + Default constructor + + + + + Constructor with a reason + + The reason test is marked explicit + + + + Modifies a test by marking it as explicit. + + The test to modify + + + + Attribute used to mark a test that is to be ignored. + Ignored tests result in a warning message when the + tests are run. + + + + + Constructs the attribute giving a reason for ignoring the test + + The reason for ignoring the test + + + + The date in the future to stop ignoring the test as a string in UTC time. + For example for a date and time, "2014-12-25 08:10:00Z" or for just a date, + "2014-12-25". If just a date is given, the Ignore will expire at midnight UTC. + + + Once the ignore until date has passed, the test will be marked + as runnable. Tests with an ignore until date will have an IgnoreUntilDate + property set which will appear in the test results. + + The string does not contain a valid string representation of a date and time. + + + + Modifies a test by marking it as Ignored. + + The test to modify + + + + Abstract base for Attributes that are used to include tests + in the test run based on environmental settings. + + + + + Constructor with no included items specified, for use + with named property syntax. + + + + + Constructor taking one or more included items + + Comma-delimited list of included items + + + + Name of the item that is needed in order for + a test to run. Multiple items may be given, + separated by a comma. + + + + + Name of the item to be excluded. Multiple items + may be given, separated by a comma. + + + + + The reason for including or excluding the test + + + + + SingleThreadedAttribute applies to a test fixture and indicates + that all the child tests must be run on the same thread as the + OneTimeSetUp and OneTimeTearDown. It sets a flag in the + TestExecutionContext and forces all tests to be run sequentially + on the current thread. Any ParallelScope setting is ignored. + + + + + Apply changes to the TestExecutionContext + + The TestExecutionContext + + + + TestAssemblyDirectoryResolveAttribute is used to mark a test assembly as needing a + special assembly resolution hook that will explicitly search the test assembly's + directory for dependent assemblies. This works around a conflict between mixed-mode + assembly initialization and tests running in their own AppDomain in some cases. + + + + + LevelOfParallelismAttribute is used to set the number of worker threads + that may be allocated by the framework for running tests. + + + + + Construct a LevelOfParallelismAttribute. + + The number of worker threads to be created by the framework. + + + + Summary description for MaxTimeAttribute. + + + + + Construct a MaxTimeAttribute, given a time in milliseconds. + + The maximum elapsed time in milliseconds + + + + The abstract base class for all custom attributes defined by NUnit. + + + + + Default constructor + + + + + Attribute used to identify a method that is called once + to perform setup before any child tests are run. + + + + + Attribute used to identify a method that is called once + after all the child tests have run. The method is + guaranteed to be called, even if an exception is thrown. + + + + + Defines the order that the test will run in + + + + + Defines the order that the test will run in + + + + + Defines the order that the test will run in + + + + + + Modifies a test as defined for the specific attribute. + + The test to modify + + + + Marks a test to use a pairwise join of any argument + data provided. Arguments will be combined in such a + way that all possible pairs of arguments are used. + + + + + Default constructor + + + + + ParallelizableAttribute is used to mark tests that may be run in parallel. + + + + + Construct a ParallelizableAttribute using default ParallelScope.Self. + + + + + Construct a ParallelizableAttribute with a specified scope. + + The ParallelScope associated with this attribute. + + + + Modify the context to be used for child tests + + The current TestExecutionContext + + + + The ParallelScope enumeration permits specifying the degree to + which a test and its descendants may be run in parallel. + + + + + No Parallelism is permitted + + + + + The test itself may be run in parallel with others at the same level + + + + + Descendants of the test may be run in parallel with one another + + + + + Descendants of the test down to the level of TestFixtures may be run in parallel + + + + + PlatformAttribute is used to mark a test fixture or an + individual method as applying to a particular platform only. + + + + + Constructor with no platforms specified, for use + with named property syntax. + + + + + Constructor taking one or more platforms + + Comma-delimited list of platforms + + + + Causes a test to be skipped if this PlatformAttribute is not satisfied. + + The test to modify + + + + PropertyAttribute is used to attach information to a test as a name/value pair.. + + + + + Construct a PropertyAttribute with a name and string value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and int value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and double value + + The name of the property + The property value + + + + Constructor for derived classes that set the + property dictionary directly. + + + + + Constructor for use by derived classes that use the + name of the type as the property name. Derived classes + must ensure that the Type of the property value is + a standard type supported by the BCL. Any custom + types will cause a serialization Exception when + in the client. + + + + + Gets the property dictionary for this attribute + + + + + Modifies a test by adding properties to it. + + The test to modify + + + + RandomAttribute is used to supply a set of random _values + to a single parameter of a parameterized test. + + + + + Construct a random set of values appropriate for the Type of the + parameter on which the attribute appears, specifying only the count. + + + + + + Construct a set of ints within a specified range + + + + + Construct a set of unsigned ints within a specified range + + + + + Construct a set of longs within a specified range + + + + + Construct a set of unsigned longs within a specified range + + + + + Construct a set of shorts within a specified range + + + + + Construct a set of unsigned shorts within a specified range + + + + + Construct a set of doubles within a specified range + + + + + Construct a set of floats within a specified range + + + + + Construct a set of bytes within a specified range + + + + + Construct a set of sbytes within a specified range + + + + + Get the collection of _values to be used as arguments. + + + + + RangeAttribute is used to supply a range of _values to an + individual parameter of a parameterized test. + + + + + Construct a range of ints using default step of 1 + + + + + + + Construct a range of ints specifying the step size + + + + + + + + Construct a range of unsigned ints using default step of 1 + + + + + + + Construct a range of unsigned ints specifying the step size + + + + + + + + Construct a range of longs using a default step of 1 + + + + + + + Construct a range of longs + + + + + + + + Construct a range of unsigned longs using default step of 1 + + + + + + + Construct a range of unsigned longs specifying the step size + + + + + + + + Construct a range of doubles + + + + + + + + Construct a range of floats + + + + + + + + RepeatAttribute may be applied to test case in order + to run it multiple times. + + + + + Construct a RepeatAttribute + + The number of times to run the test + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + The test command for the RepeatAttribute + + + + + Initializes a new instance of the class. + + The inner command. + The number of repetitions + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Marks a test that must run in the MTA, causing it + to run in a separate thread if necessary. + + On methods, you may also use MTAThreadAttribute + to serve the same purpose. + + + + + Construct a RequiresMTAAttribute + + + + + Marks a test that must run in the STA, causing it + to run in a separate thread if necessary. + + + + + Construct a RequiresSTAAttribute + + + + + Marks a test that must run on a separate thread. + + + + + Construct a RequiresThreadAttribute + + + + + Construct a RequiresThreadAttribute, specifying the apartment + + + + + RepeatAttribute may be applied to test case in order + to run it multiple times. + + + + + Construct a RepeatAttribute + + The number of times to run the test + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + The test command for the RetryAttribute + + + + + Initializes a new instance of the class. + + The inner command. + The number of repetitions + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Marks a test to use a Sequential join of any argument + data provided. Arguments will be combined into test cases, + taking the next value of each argument until all are used. + + + + + Default constructor + + + + + Summary description for SetCultureAttribute. + + + + + Construct given the name of a culture + + + + + + Summary description for SetUICultureAttribute. + + + + + Construct given the name of a culture + + + + + + Attribute used to mark a class that contains one-time SetUp + and/or TearDown methods that apply to all the tests in a + namespace or an assembly. + + + + + Attribute used to mark a class that contains one-time SetUp + and/or TearDown methods that apply to all the tests in a + namespace or an assembly. + + + + + Attribute used to mark a class that contains one-time SetUp + and/or TearDown methods that apply to all the tests in a + namespace or an assembly. + + + + + SetUpFixtureAttribute is used to identify a SetUpFixture + + + + + Build a SetUpFixture from type provided. Normally called for a Type + on which the attribute has been placed. + + The type info of the fixture to be used. + A SetUpFixture object as a TestSuite. + + + + Attribute used to identify a method that is called + immediately after each test is run. The method is + guaranteed to be called, even if an exception is thrown. + + + + + Provide actions to execute before and after tests. + + + + + Executed before each test is run + + The test that is going to be run. + + + + Executed after each test is run + + The test that has just been run. + + + + Provides the target for the action attribute + + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + public void TestDescriptionMethod() + {} + } + + + + + + Descriptive text for this test + + + + + The author of this test + + + + + The type that this test is testing + + + + + Modifies a test by adding a description, if not already set. + + The test to modify + + + + Gets or sets the expected result. + + The result. + + + + Returns true if an expected result has been set + + + + + Construct a TestMethod from a given method. + + The method for which a test is to be constructed. + The suite to which the test will be added. + A TestMethod + + + + TestCaseAttribute is used to mark parameterized test cases + and provide them with their arguments. + + + + + Construct a TestCaseAttribute with a list of arguments. + This constructor is not CLS-Compliant + + + + + + Construct a TestCaseAttribute with a single argument + + + + + + Construct a TestCaseAttribute with a two arguments + + + + + + + Construct a TestCaseAttribute with a three arguments + + + + + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the RunState of this test case. + + + + + Gets the list of arguments to a test case + + + + + Gets the properties of the test case + + + + + Gets or sets the expected result. + + The result. + + + + Returns true if the expected result has been set + + + + + Gets or sets the description. + + The description. + + + + The author of this test + + + + + The type that this test is testing + + + + + Gets or sets the reason for ignoring the test + + + + + Gets or sets a value indicating whether this is explicit. + + + true if explicit; otherwise, false. + + + + + Gets or sets the reason for not running the test. + + The reason. + + + + Gets or sets the ignore reason. When set to a non-null + non-empty value, the test is marked as ignored. + + The ignore reason. + + + + Comma-delimited list of platforms to run the test for + + + + + Comma-delimited list of platforms to not run the test for + + + + + Gets and sets the category for this test case. + May be a comma-separated list of categories. + + + + + Performs several special conversions allowed by NUnit in order to + permit arguments with types that cannot be used in the constructor + of an Attribute such as TestCaseAttribute or to simplify their use. + + The arguments to be converted + The ParameterInfo array for the method + + + + Construct one or more TestMethods from a given MethodInfo, + using available parameter data. + + The MethodInfo for which tests are to be constructed. + The suite to which the tests will be added. + One or more TestMethods + + + + TestCaseSourceAttribute indicates the source to be used to + provide test cases for a test method. + + + + + Construct with the name of the method, property or field that will provide data + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + Construct with a name + + The name of a static method, property or field that will provide data. + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. + + + + Construct with a Type + + The type that will provide data + + + + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. + + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + Gets or sets the category associated with every fixture created from + this attribute. May be a single category or a comma-separated list. + + + + + Construct one or more TestMethods from a given MethodInfo, + using available parameter data. + + The IMethod for which tests are to be constructed. + The suite to which the tests will be added. + One or more TestMethods + + + + Returns a set of ITestCaseDataItems for use as arguments + to a parameterized test method. + + The method for which data is needed. + + + + + TestFixtureAttribute is used to mark a class that represents a TestFixture. + + + + + Default constructor + + + + + Construct with a object[] representing a set of arguments. + In .NET 2.0, the arguments may later be separated into + type arguments and constructor arguments. + + + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the RunState of this test fixture. + + + + + The arguments originally provided to the attribute + + + + + Properties pertaining to this fixture + + + + + Get or set the type arguments. If not set + explicitly, any leading arguments that are + Types are taken as type arguments. + + + + + Descriptive text for this fixture + + + + + The author of this fixture + + + + + The type that this fixture is testing + + + + + Gets or sets the ignore reason. May set RunState as a side effect. + + The ignore reason. + + + + Gets or sets the reason for not running the fixture. + + The reason. + + + + Gets or sets the ignore reason. When set to a non-null + non-empty value, the test is marked as ignored. + + The ignore reason. + + + + Gets or sets a value indicating whether this is explicit. + + + true if explicit; otherwise, false. + + + + + Gets and sets the category for this fixture. + May be a comma-separated list of categories. + + + + + Build a fixture from type provided. Normally called for a Type + on which the attribute has been placed. + + The type info of the fixture to be used. + A an IEnumerable holding one TestFixture object. + + + + Attribute used to identify a method that is + called before any tests in a fixture are run. + + + + + TestCaseSourceAttribute indicates the source to be used to + provide test fixture instances for a test class. + + + + + Error message string is public so the tests can use it + + + + + Construct with the name of the method, property or field that will provide data + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + Construct with a Type + + The type that will provide data + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + Gets or sets the category associated with every fixture created from + this attribute. May be a single category or a comma-separated list. + + + + + Construct one or more TestFixtures from a given Type, + using available parameter data. + + The TypeInfo for which fixtures are to be constructed. + One or more TestFixtures as TestSuite + + + + Returns a set of ITestFixtureData items for use as arguments + to a parameterized test fixture. + + The type for which data is needed. + + + + + Attribute used to identify a method that is called after + all the tests in a fixture have run. The method is + guaranteed to be called, even if an exception is thrown. + + + + + Indicates which class the test or test fixture is testing + + + + + Initializes a new instance of the class. + + The type that is being tested. + + + + Initializes a new instance of the class. + + The type that is being tested. + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + public void TestDescriptionMethod() + {} + } + + + + + + Construct the attribute, specifying a combining strategy and source of parameter data. + + + + + Used on a method, marks the test with a timeout value in milliseconds. + The test will be run in a separate thread and is cancelled if the timeout + is exceeded. Used on a class or assembly, sets the default timeout + for all contained test methods. + + + + + Construct a TimeoutAttribute given a time in milliseconds + + The timeout value in milliseconds + + + + ValuesAttribute is used to provide literal arguments for + an individual parameter of a test. + + + + + The collection of data to be returned. Must + be set by any derived attribute classes. + We use an object[] so that the individual + elements may have their type changed in GetData + if necessary + + + + + Constructs for use with an Enum parameter. Will pass every enum + value in to the test. + + + + + Construct with one argument + + + + + + Construct with two arguments + + + + + + + Construct with three arguments + + + + + + + + Construct with an array of arguments + + + + + + Get the collection of _values to be used as arguments + + + + + ValueSourceAttribute indicates the source to be used to + provide data for one parameter of a test method. + + + + + Construct with the name of the factory - for use with languages + that don't support params arrays. + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name - for use with languages + that don't support params arrays. + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + Gets an enumeration of data items for use as arguments + for a test method parameter. + + The parameter for which data is needed + + An enumeration containing individual data items + + + + + A set of Assert methods operating on one or more collections + + + + + DO NOT USE! Use CollectionAssert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable containing objects to be considered + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the superset does not contain the subset + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + + + + Asserts that the superset does not contain the subset + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the superset contains the subset. + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + + + + Asserts that the superset contains the subset. + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the subset does not contain the superset + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that the subset does not contain the superset + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the subset contains the superset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that the subset contains the superset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + + + + AllItemsConstraint applies another constraint to each + item in a collection, succeeding if they all succeed. + + + + + Construct an AllItemsConstraint on top of an existing constraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + AndConstraint succeeds only if both members succeed. + + + + + Create an AndConstraint from two other constraints + + The first constraint + The second constraint + + + + Gets text describing a constraint + + + + + Apply both member constraints to an actual value, succeeding + succeeding only if both of them succeed. + + The actual value + True if the constraints both succeeded + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + AssignableFromConstraint is used to test that an object + can be assigned from a given Type. + + + + + Construct an AssignableFromConstraint for the type provided + + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + AssignableToConstraint is used to test that an object + can be assigned to a given Type. + + + + + Construct an AssignableToConstraint for the type provided + + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + AttributeConstraint tests that a specified attribute is present + on a Type or other provider and that the value of the attribute + satisfies some other constraint. + + + + + Constructs an AttributeConstraint for a specified attribute + Type and base constraint. + + + + + + + Determines whether the Type or other provider has the + expected attribute and if its value matches the + additional constraint specified. + + + + + Returns a string representation of the constraint. + + + + + AttributeExistsConstraint tests for the presence of a + specified attribute on a Type. + + + + + Constructs an AttributeExistsConstraint for a specific attribute Type + + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Tests whether the object provides the expected attribute. + + A Type, MethodInfo, or other ICustomAttributeProvider + True if the expected attribute is present, otherwise false + + + + BinaryConstraint is the abstract base of all constraints + that combine two other constraints in some fashion. + + + + + The first constraint being combined + + + + + The second constraint being combined + + + + + Construct a BinaryConstraint from two other constraints + + The first constraint + The second constraint + + + + BinarySerializableConstraint tests whether + an object is serializable in binary format. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns the string representation + + + + + CollectionConstraint is the abstract base class for + constraints that operate on collections. + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Determines whether the specified enumerable is empty. + + The enumerable. + + true if the specified enumerable is empty; otherwise, false. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Protected method to be implemented by derived classes + + + + + + + CollectionContainsConstraint is used to test whether a collection + contains an expected object as a member. + + + + + Construct a CollectionContainsConstraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Gets the expected object + + + + + Test whether the expected item is contained in the collection + + + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + CollectionEquivalentConstraint is used to determine whether two + collections are equivalent. + + + + + Construct a CollectionEquivalentConstraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether two collections are equivalent + + + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + CollectionItemsEqualConstraint is the abstract base class for all + collection constraints that apply some notion of item equality + as a part of their operation. + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Compares two collection members for equality + + + + + Return a new CollectionTally for use in making tests + + The collection to be included in the tally + + + + CollectionOrderedConstraint is used to test whether a collection is ordered. + + + + + Construct a CollectionOrderedConstraint + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + If used performs a default ascending comparison + + + + + If used performs a reverse comparison + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use a and returns self. + + + + + Modifies the constraint to test ordering by the value of + a specified property and returns self. + + + + + Then signals a break between two ordering steps + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the collection is ordered + + + + + + + Returns the string representation of the constraint. + + + + + + An OrderingStep represents one stage of the sort + + + + + CollectionSubsetConstraint is used to determine whether + one collection is a subset of another + + + + + Construct a CollectionSubsetConstraint + + The collection that the actual value is expected to be a subset of + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the actual collection is a subset of + the expected collection provided. + + + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + CollectionSupersetConstraint is used to determine whether + one collection is a superset of another + + + + + Construct a CollectionSupersetConstraint + + The collection that the actual value is expected to be a superset of + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the actual collection is a superset of + the expected collection provided. + + + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + CollectionTally counts (tallies) the number of + occurrences of each object in one or more enumerations. + + + + + Construct a CollectionTally object from a comparer and a collection + + + + + The number of objects remaining in the tally + + + + + Try to remove an object from the tally + + The object to remove + True if successful, false if the object was not found + + + + Try to remove a set of objects from the tally + + The objects to remove + True if successful, false if any object was not found + + + + ComparisonAdapter class centralizes all comparisons of + _values in NUnit, adapting to the use of any provided + , + or . + + + + + Gets the default ComparisonAdapter, which wraps an + NUnitComparer object. + + + + + Returns a ComparisonAdapter that wraps an + + + + + Returns a ComparisonAdapter that wraps an + + + + + Returns a ComparisonAdapter that wraps a + + + + + Compares two objects + + + + + Construct a default ComparisonAdapter + + + + + Construct a ComparisonAdapter for an + + + + + Compares two objects + + + + + + + + ComparerAdapter extends and + allows use of an or + to actually perform the comparison. + + + + + Construct a ComparisonAdapter for an + + + + + Compare a Type T to an object + + + + + Construct a ComparisonAdapter for a + + + + + Compare a Type T to an object + + + + + Abstract base class for constraints that compare _values to + determine if one is greater than, equal to or less than + the other. + + + + + The value against which a comparison is to be made + + + + + If true, less than returns success + + + + + if true, equal returns success + + + + + if true, greater than returns success + + + + + ComparisonAdapter to be used in making the comparison + + + + + Initializes a new instance of the class. + + The value against which to make a comparison. + if set to true less succeeds. + if set to true equal succeeds. + if set to true greater succeeds. + String used in describing the constraint. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Modifies the constraint to use an and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Modifies the constraint to use an and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Modifies the constraint to use a and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Delegate used to delay evaluation of the actual value + to be used in evaluating a constraint + + + + + The Constraint class is the base of all built-in constraints + within NUnit. It provides the operator overloads used to combine + constraints. + + + + + Construct a constraint with optional arguments + + Arguments to be saved + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Arguments provided to this Constraint, for use in + formatting the description. + + + + + The ConstraintBuilder holding this constraint + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + + A reference to the value to be tested + A ConstraintResult + + + + Retrieves the value to be tested from an ActualValueDelegate. + The default implementation simply evaluates the delegate but derived + classes may override it to provide for delayed processing. + + An ActualValueDelegate + Delegate evaluation result + + + + Default override of ToString returns the constraint DisplayName + followed by any arguments within angle brackets. + + + + + + Returns the string representation of this constraint + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending Or + to the current constraint. + + + + + Returns a DelayedConstraint.WithRawDelayInterval with the specified delay time. + + The delay, which defaults to milliseconds. + + + + + Returns a DelayedConstraint with the specified delay time + and polling interval. + + The delay in milliseconds. + The interval at which to test the constraint. + + + + + Resolves any pending operators and returns the resolved constraint. + + + + + ConstraintBuilder maintains the stacks that are used in + processing a ConstraintExpression. An OperatorStack + is used to hold operators that are waiting for their + operands to be reorganized. a ConstraintStack holds + input constraints as well as the results of each + operator applied. + + + + + OperatorStack is a type-safe stack for holding ConstraintOperators + + + + + Initializes a new instance of the class. + + The ConstraintBuilder using this stack. + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + Gets the topmost operator without modifying the stack. + + + + + Pushes the specified operator onto the stack. + + The operator to put onto the stack. + + + + Pops the topmost operator from the stack. + + The topmost operator on the stack + + + + ConstraintStack is a type-safe stack for holding Constraints + + + + + Initializes a new instance of the class. + + The ConstraintBuilder using this stack. + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + Pushes the specified constraint. As a side effect, + the constraint's Builder field is set to the + ConstraintBuilder owning this stack. + + The constraint to put onto the stack + + + + Pops this topmost constraint from the stack. + As a side effect, the constraint's Builder + field is set to null. + + The topmost contraint on the stack + + + + Initializes a new instance of the class. + + + + + Appends the specified operator to the expression by first + reducing the operator stack and then pushing the new + operator on the stack. + + The operator to push. + + + + Appends the specified constraint to the expression by pushing + it on the constraint stack. + + The constraint to push. + + + + Sets the top operator right context. + + The right context. + + + + Reduces the operator stack until the topmost item + precedence is greater than or equal to the target precedence. + + The target precedence. + + + + Resolves this instance, returning a Constraint. If the Builder + is not currently in a resolvable state, an exception is thrown. + + The resolved constraint + + + + Gets a value indicating whether this instance is resolvable. + + + true if this instance is resolvable; otherwise, false. + + + + + ConstraintExpression represents a compound constraint in the + process of being constructed from a series of syntactic elements. + + Individual elements are appended to the expression as they are + reorganized. When a constraint is appended, it is returned as the + value of the operation so that modifiers may be applied. However, + any partially built expression is attached to the constraint for + later resolution. When an operator is appended, the partial + expression is returned. If it's a self-resolving operator, then + a ResolvableConstraintExpression is returned. + + + + + The ConstraintBuilder holding the elements recognized so far + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. + + The builder. + + + + Returns a string representation of the expression as it + currently stands. This should only be used for testing, + since it has the side-effect of resolving the expression. + + + + + + Appends an operator to the expression and returns the + resulting expression itself. + + + + + Appends a self-resolving operator to the expression and + returns a new ResolvableConstraintExpression. + + + + + Appends a constraint to the expression and returns that + constraint, which is associated with the current state + of the expression being built. Note that the constraint + is not reduced at this time. For example, if there + is a NotOperator on the stack we don't reduce and + return a NotConstraint. The original constraint must + be returned because it may support modifiers that + are yet to be applied. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + With is currently a NOP - reserved for future use. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests if item is equal to zero + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the Dictionary key collection. + + The key to be matched in the Dictionary key collection + + + + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the Dictionary value collection. + + The value to be matched in the Dictionary value collection + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the a subpath of the expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a constraint that succeeds if the value + is a file or directory and it exists. + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for equality with zero + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is a subpath of the expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + ConstraintStatus represents the status of a ConstraintResult + returned by a Constraint being applied to an actual value. + + + + + The status has not yet been set + + + + + The constraint succeeded + + + + + The constraint failed + + + + + An error occured in applying the constraint (reserved for future use) + + + + + Contain the result of matching a against an actual value. + + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + The status of the new ConstraintResult. + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + If true, applies a status of Success to the result, otherwise Failure. + + + + The actual value that was passed to the method. + + + + + Gets and sets the ResultStatus for this result. + + + + + True if actual value meets the Constraint criteria otherwise false. + + + + + Display friendly name of the constraint. + + + + + Description of the constraint may be affected by the state the constraint had + when was performed against the actual value. + + + + + Write the failure message to the MessageWriter provided + as an argument. The default implementation simply passes + the result and the actual value to the writer, which + then displays the constraint description and the value. + + Constraints that need to provide additional details, + such as where the error occured can override this. + + The MessageWriter on which to display the message + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + ContainsConstraint tests a whether a string contains a substring + or a collection contains an object. It postpones the decision of + which test to use until the type of the actual argument is known. + This allows testing whether a string is contained in a collection + or as a substring of another string using the same syntax. + + + + + Initializes a new instance of the class. + + The _expected. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Flag the constraint to ignore case and return self. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Applies a delay to the match so that a match can be evaluated in the future. + + + + + Allows only changing the time dimension of delay interval and setting a polling interval of a DelayedConstraint + + + + + Creates a new DelayedConstraint.WithRawDelayInterval + + Parent DelayedConstraint on which delay interval dimension is required to be set + + + + Changes delay interval dimension to minutes + + + + + Changes delay interval dimension to seconds + + + + + Changes delay interval dimension to milliseconds + + + + + Set polling interval, in milliseconds + + A time interval, in milliseconds + + + + + Allows only setting the polling interval of a DelayedConstraint + + + + + Creates a new DelayedConstraint.WithDimensionedDelayInterval + + Parent DelayedConstraint on which polling interval is required to be set + + + + Set polling interval, in milliseconds + + A time interval, in milliseconds + + + + + Allows only changing the time dimension of the polling interval of a DelayedConstraint + + + + + Creates a new DelayedConstraint.WithRawPollingInterval + + Parent DelayedConstraint on which polling dimension is required to be set + + + + Changes polling interval dimension to minutes + + + + + Changes polling interval dimension to seconds + + + + + Changes polling interval dimension to milliseconds + + + + + Delay value store as an Interval object + + + + + Polling value stored as an Interval object + + + + + Creates a new DelayedConstraint + + The inner constraint to decorate + The time interval after which the match is performed + If the value of is less than 0 + + + + Creates a new DelayedConstraint + + The inner constraint to decorate + The time interval after which the match is performed, in milliseconds + The time interval used for polling, in milliseconds + If the value of is less than 0 + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + Test whether the constraint is satisfied by a delegate + + The delegate whose value is to be tested + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + Overridden to wait for the specified delay period before + calling the base constraint with the dereferenced value. + + A reference to the value to be tested + True for success, false for failure + + + + Returns the string representation of the constraint. + + + + + Adjusts a Timestamp by a given TimeSpan + + + + + + + + Returns the difference between two Timestamps as a TimeSpan + + + + + + + + DictionaryContainsKeyConstraint is used to test whether a dictionary + contains an expected object as a key. + + + + + Construct a DictionaryContainsKeyConstraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the expected key is contained in the dictionary + + + + + DictionaryContainsValueConstraint is used to test whether a dictionary + contains an expected object as a value. + + + + + Construct a DictionaryContainsValueConstraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the expected value is contained in the dictionary + + + + + EmptyCollectionConstraint tests whether a collection is empty. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Check that the collection is empty + + + + + + + EmptyConstraint tests a whether a string or collection is empty, + postponing the decision about which test is applied until the + type of the actual argument is known. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + EmptyDirectoryConstraint is used to test that a directory is empty + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + EmptyStringConstraint tests whether a string is empty. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + EndsWithConstraint can test whether a string ends + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + EqualConstraint is able to compare an actual value with the + expected value provided in its constructor. Two objects are + considered equal if both are null, or if both have the same + value. NUnit has special semantics for some object types. + + + + + NUnitEqualityComparer used to test equality. + + + + + Initializes a new instance of the class. + + The expected value. + + + + Gets the tolerance for this comparison. + + + The tolerance. + + + + + Gets a value indicating whether to compare case insensitive. + + + true if comparing case insensitive; otherwise, false. + + + + + Gets a value indicating whether or not to clip strings. + + + true if set to clip strings otherwise, false. + + + + + Gets the failure points. + + + The failure points. + + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to suppress string clipping + and return self. + + + + + Flag the constraint to compare arrays as collections + and return self. + + + + + Flag the constraint to use a tolerance when determining equality. + + Tolerance value to be used + Self. + + + + Flags the constraint to include + property in comparison of two values. + + + Using this modifier does not allow to use the + constraint modifier. + + + + + Switches the .Within() modifier to interpret its tolerance as + a distance in representable _values (see remarks). + + Self. + + Ulp stands for "unit in the last place" and describes the minimum + amount a given value can change. For any integers, an ulp is 1 whole + digit. For floating point _values, the accuracy of which is better + for smaller numbers and worse for larger numbers, an ulp depends + on the size of the number. Using ulps for comparison of floating + point results instead of fixed tolerances is safer because it will + automatically compensate for the added inaccuracy of larger numbers. + + + + + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual _values is allowed to deviate from + the expected value. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in days. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in hours. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in minutes. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in seconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in milliseconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in clock ticks. + + Self + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + EqualityAdapter class handles all equality comparisons + that use an , + or a . + + + + + Compares two objects, returning true if they are equal + + + + + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. + + + + + Returns an that wraps an . + + + + + that wraps an . + + + + + Returns an that wraps an . + + + + + Returns an EqualityAdapter that uses a predicate function for items comparison. + + + + + + + + + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. + + + + + Compares two objects, returning true if they are equal + + + + + Returns true if the two objects can be compared by this adapter. + Generic adapter requires objects of the specified type. + + + + + Returns an that wraps an . + + + + + Returns an that wraps an . + + + + + that wraps an . + + + + + Returns an that wraps a . + + + + + ExactTypeConstraint is used to test that an object + is of the exact type provided in the constructor + + + + + Construct an ExactTypeConstraint for a given Type + + The expected Type. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + FalseConstraint tests that the actual value is false + + + + + Initializes a new instance of the class. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + FileExistsConstraint is used to determine if a file exists + + + + + Initializes a new instance of the class. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + FileOrDirectoryExistsConstraint is used to determine if a file or directory exists + + + + + If true, the constraint will only check if files exist, not directories + + + + + If true, the constraint will only check if directories exist, not files + + + + + Initializes a new instance of the class that + will check files and directories. + + + + + Initializes a new instance of the class that + will only check files if ignoreDirectories is true. + + if set to true [ignore directories]. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + Helper routines for working with floating point numbers + + + The floating point comparison code is based on this excellent article: + http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm + + + "ULP" means Unit in the Last Place and in the context of this library refers to + the distance between two adjacent floating point numbers. IEEE floating point + numbers can only represent a finite subset of natural numbers, with greater + accuracy for smaller numbers and lower accuracy for very large numbers. + + + If a comparison is allowed "2 ulps" of deviation, that means the _values are + allowed to deviate by up to 2 adjacent floating point _values, which might be + as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. + + + + + Union of a floating point variable and an integer + + + The union's value as a floating point variable + + + The union's value as an integer + + + The union's value as an unsigned integer + + + Union of a double precision floating point variable and a long + + + The union's value as a double precision floating point variable + + + The union's value as a long + + + The union's value as an unsigned long + + + Compares two floating point _values for equality + First floating point value to be compared + Second floating point value t be compared + + Maximum number of representable floating point _values that are allowed to + be between the left and the right floating point _values + + True if both numbers are equal or close to being equal + + + Floating point _values can only represent a finite subset of natural numbers. + For example, the _values 2.00000000 and 2.00000024 can be stored in a float, + but nothing inbetween them. + + + This comparison will count how many possible floating point _values are between + the left and the right number. If the number of possible _values between both + numbers is less than or equal to maxUlps, then the numbers are considered as + being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + Compares two double precision floating point _values for equality + First double precision floating point value to be compared + Second double precision floating point value t be compared + + Maximum number of representable double precision floating point _values that are + allowed to be between the left and the right double precision floating point _values + + True if both numbers are equal or close to being equal + + + Double precision floating point _values can only represent a limited series of + natural numbers. For example, the _values 2.0000000000000000 and 2.0000000000000004 + can be stored in a double, but nothing inbetween them. + + + This comparison will count how many possible double precision floating point + _values are between the left and the right number. If the number of possible + _values between both numbers is less than or equal to maxUlps, then the numbers + are considered as being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + + Reinterprets the memory contents of a floating point value as an integer value + + + Floating point value whose memory contents to reinterpret + + + The memory contents of the floating point value interpreted as an integer + + + + + Reinterprets the memory contents of a double precision floating point + value as an integer value + + + Double precision floating point value whose memory contents to reinterpret + + + The memory contents of the double precision floating point value + interpreted as an integer + + + + + Reinterprets the memory contents of an integer as a floating point value + + Integer value whose memory contents to reinterpret + + The memory contents of the integer value interpreted as a floating point value + + + + + Reinterprets the memory contents of an integer value as a double precision + floating point value + + Integer whose memory contents to reinterpret + + The memory contents of the integer interpreted as a double precision + floating point value + + + + + Tests whether a value is greater than the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Tests whether a value is greater than or equal to the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Interface for all constraints + + + + + The display name of this Constraint for use by ToString(). + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Arguments provided to this Constraint, for use in + formatting the description. + + + + + The ConstraintBuilder holding this constraint + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + + A reference to the value to be tested + A ConstraintResult + + + + InstanceOfTypeConstraint is used to test that an object + is of the same type provided or derived from it. + + + + + Construct an InstanceOfTypeConstraint for the type provided + + The expected Type + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + Keeps track of an interval time which can be represented in + Minutes, Seconds or Milliseconds + + + + + Constructs a interval given an value in milliseconds + + + + + Gets Interval value represented as a TimeSpan object + + + + + Returns the interval with the current value as a number of minutes. + + + + + Returns the interval with the current value as a number of seconds. + + + + + Returns the interval with the current value as a number of milliseconds. + + + + + Is true for intervals created with a non zero value + + + + + Returns a string that represents the current object. + + + A string that represents the current object. + + + + + IntervalUnit provides the semantics to the value stored in Interval class. + + + + + Unit representing an Interval in minutes + + + + + Unit representing an Interval in seconds + + + + + Unit representing an Interval in milliseconds + + + + + The IResolveConstraint interface is implemented by all + complete and resolvable constraints and expressions. + + + + + Return the top-level constraint for this expression + + + + + + An extension of ResolvableConstraintExpression that adds a no-op Items property for readability. + + + + + Create a new instance of ItemsConstraintExpression + + + + + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. + + + + + + No-op property for readability. + + + + + Tests whether a value is less than the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Tests whether a value is less than or equal to the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + MessageWriter is the abstract base for classes that write + constraint descriptions and messages in some form. The + class has separate methods for writing various components + of a message, allowing implementations to tailor the + presentation as needed. + + + + + Construct a MessageWriter given a culture + + + + + Abstract method to get the max line length + + + + + Method to write single line message with optional args, usually + written to precede the general failure message. + + The message to be written + Any arguments used in formatting the message + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a given + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The failing constraint result + + + + Display Expected and Actual lines for given _values. This + method may be called by constraints that need more control over + the display of actual and expected _values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given _values, including + a tolerance value on the Expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string _values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in locating the point where the strings differ + If true, the strings should be clipped to fit the line + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Custom value formatter function + + The value + + + + + Custom value formatter factory function + + The next formatter function + ValueFormatter + If the given formatter is unable to handle a certain format, it must call the next formatter in the chain + + + + Static methods used in creating messages + + + + + Static string used when strings are clipped + + + + + Formatting strings used for expected and actual _values + + + + + Current head of chain of value formatters. Public for testing. + + + + + Add a formatter to the chain of responsibility. + + + + + + Formats text to represent a generalized value. + + The value + The formatted text + + + + Formats text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Returns the representation of a type as used in NUnitLite. + This is the same as Type.ToString() except for arrays, + which are displayed with their declared sizes. + + + + + + + Converts any control characters in a string + to their escaped representation. + + The string to be converted + The converted string + + + + Converts any null characters in a string + to their escaped representation. + + The string to be converted + The converted string + + + + Return the a string representation for a set of indices into an array + + Array of indices for which a string is needed + + + + Get an array of indices representing the point in a collection or + array corresponding to a single int index into the collection. + + The collection to which the indices apply + Index in the collection + Array of indices + + + + Clip a string to a given length, starting at a particular offset, returning the clipped + string with ellipses representing the removed parts + + The string to be clipped + The maximum permitted length of the result string + The point at which to start clipping + The clipped string + + + + Clip the expected and actual strings in a coordinated fashion, + so that they may be displayed together. + + + + + + + + + Shows the position two strings start to differ. Comparison + starts at the start index. + + The expected string + The actual string + The index in the strings at which comparison should start + Boolean indicating whether case should be ignored + -1 if no mismatch found, or the index where mismatch found + + + + NaNConstraint tests that the actual value is a double or float NaN + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test that the actual value is an NaN + + + + + + + NoItemConstraint applies another constraint to each + item in a collection, failing if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + NotConstraint negates the effect of some other constraint + + + + + Initializes a new instance of the class. + + The base constraint to be negated. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + NullConstraint tests that the actual value is null + + + + + Initializes a new instance of the class. + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + The Numerics class contains common operations on numeric _values. + + + + + Checks the type of the object, returning true if + the object is a numeric type. + + The object to check + true if the object is a numeric type + + + + Checks the type of the object, returning true if + the object is a floating point numeric type. + + The object to check + true if the object is a floating point numeric type + + + + Checks the type of the object, returning true if + the object is a fixed point numeric type. + + The object to check + true if the object is a fixed point numeric type + + + + Test two numeric _values for equality, performing the usual numeric + conversions and using a provided or default tolerance. If the tolerance + provided is Empty, this method may set it to a default tolerance. + + The expected value + The actual value + A reference to the tolerance in effect + True if the _values are equal + + + + Compare two numeric _values, performing the usual numeric conversions. + + The expected value + The actual value + The relationship of the _values to each other + + + + NUnitComparer encapsulates NUnit's default behavior + in comparing two objects. + + + + + Returns the default NUnitComparer. + + + + + Compares two objects + + + + + + + + NUnitEqualityComparer encapsulates NUnit's handling of + equality tests between objects. + + + + + If true, all string comparisons will ignore case + + + + + If true, arrays will be treated as collections, allowing + those of different dimensions to be compared + + + + + Comparison objects used in comparisons for some constraints. + + + + + List of points at which a failure occurred. + + + + + Returns the default NUnitEqualityComparer + + + + + Gets and sets a flag indicating whether case should + be ignored in determining equality. + + + + + Gets and sets a flag indicating that arrays should be + compared as collections, without regard to their shape. + + + + + Gets the list of external comparers to be used to + test for equality. They are applied to members of + collections, in place of NUnit's own logic. + + + + + Gets the list of failure points for the last Match performed. + The list consists of objects to be interpreted by the caller. + This generally means that the caller may only make use of + objects it has placed on the list at a particular depth. + + + + + Flags the comparer to include + property in comparison of two values. + + + Using this modifier does not allow to use the + modifier. + + + + + Compares two objects for equality within a tolerance. + + + + + Helper method to compare two arrays + + + + + Method to compare two DirectoryInfo objects + + first directory to compare + second directory to compare + true if equivalent, false if not + + + + FailurePoint class represents one point of failure + in an equality test. + + + + + The location of the failure + + + + + The expected value + + + + + The actual value + + + + + Indicates whether the expected value is valid + + + + + Indicates whether the actual value is valid + + + + + Represents a constraint that succeeds if all the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + they all succeed. + + + + + Operator that requires both it's arguments to succeed + + + + + Construct an AndOperator + + + + + Apply the operator to produce an AndConstraint + + + + + Operator that tests for the presence of a particular attribute + on a type and optionally applies further tests to the attribute. + + + + + Construct an AttributeOperator for a particular Type + + The Type of attribute tested + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Abstract base class for all binary operators + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Gets the left precedence of the operator + + + + + Gets the right precedence of the operator + + + + + Abstract method that produces a constraint by applying + the operator to its left and right constraint arguments. + + + + + Abstract base for operators that indicate how to + apply a constraint to items in a collection. + + + + + Constructs a CollectionOperator + + + + + The ConstraintOperator class is used internally by a + ConstraintBuilder to represent an operator that + modifies or combines constraints. + + Constraint operators use left and right precedence + _values to determine whether the top operator on the + stack should be reduced before pushing a new operator. + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + The syntax element preceding this operator + + + + + The syntax element following this operator + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Represents a constraint that succeeds if none of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. + + + + + Negates the test of the constraint it wraps. + + + + + Constructs a new NotOperator + + + + + Returns a NotConstraint applied to its argument. + + + + + Operator that requires at least one of it's arguments to succeed + + + + + Construct an OrOperator + + + + + Apply the operator to produce an OrConstraint + + + + + PrefixOperator takes a single constraint and modifies + it's action in some way. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Returns the constraint created by applying this + prefix to another constraint. + + + + + + + Operator used to test for the presence of a named Property + on an object and optionally apply further tests to the + value of that property. + + + + + Gets the name of the property to which the operator applies + + + + + Constructs a PropOperator for a particular named property + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Abstract base class for operators that are able to reduce to a + constraint whether or not another syntactic element follows. + + + + + Represents a constraint that succeeds if any of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + any of them succeed. + + + + + Operator that tests that an exception is thrown and + optionally applies further tests to the exception. + + + + + Construct a ThrowsOperator + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Represents a constraint that simply wraps the + constraint provided as an argument, without any + further functionality, but which modifies the + order of evaluation because of its precedence. + + + + + Constructor for the WithOperator + + + + + Returns a constraint that wraps its argument + + + + + OrConstraint succeeds if either member succeeds + + + + + Create an OrConstraint from two other constraints + + The first constraint + The second constraint + + + + Gets text describing a constraint + + + + + Apply the member constraints to an actual value, succeeding + succeeding as soon as one of them succeeds. + + The actual value + True if either constraint succeeded + + + + PathConstraint serves as the abstract base of constraints + that operate on paths and provides several helper methods. + + + + + Construct a PathConstraint for a give expected path + + The expected path + + + + Modifies the current instance to be case-sensitive + and returns it. + + + + + Returns the string representation of this constraint + + + + + Canonicalize the provided path + + + The path in standardized form + + + + Test whether one path in canonical form is a subpath of another path + + The first path - supposed to be the parent path + The second path - supposed to be the child path + + + + + Predicate constraint wraps a Predicate in a constraint, + returning success if the predicate is true. + + + + + Construct a PredicateConstraint from a predicate + + + + + Gets text describing a constraint + + + + + Determines whether the predicate succeeds when applied + to the actual value. + + + + + Abstract base class used for prefixes + + + + + The base constraint + + + + + Prefix used in forming the constraint description + + + + + Construct given a base constraint + + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Formats a prefix constraint's description. + + + + + PropertyConstraint extracts a named property and uses + its value as the actual value for a chained constraint. + + + + + Initializes a new instance of the class. + + The name. + The constraint to apply to the property. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns the string representation of the constraint. + + + + + + PropertyExistsConstraint tests that a named property + exists on the object provided through Match. + + Originally, PropertyConstraint provided this feature + in addition to making optional tests on the value + of the property. The two constraints are now separate. + + + + + Initializes a new instance of the class. + + The name of the property. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the property exists for a given object + + The object to be tested + True for success, false for failure + + + + Returns the string representation of the constraint. + + + + + + RangeConstraint tests whether two _values are within a + specified range. + + + + + Initializes a new instance of the class. + + from must be less than or equal to true + Inclusive beginning of the range. Must be less than or equal to to. + Inclusive end of the range. Must be greater than or equal to from. + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use a and returns self. + + + + + RegexConstraint can test whether a string matches + the pattern provided. + + + + + Initializes a new instance of the class. + + The pattern. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + ResolvableConstraintExpression is used to represent a compound + constraint being constructed at a point where the last operator + may either terminate the expression or may have additional + qualifying constraints added to it. + + It is used, for example, for a Property element or for + an Exception element, either of which may be optionally + followed by constraints that apply to the property or + exception. + + + + + Create a new instance of ResolvableConstraintExpression + + + + + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. + + + + + Appends an And Operator to the expression + + + + + Appends an Or operator to the expression. + + + + + Resolve the current expression to a Constraint + + + + + ReusableConstraint wraps a constraint expression after + resolving it so that it can be reused consistently. + + + + + Construct a ReusableConstraint from a constraint expression + + The expression to be resolved and reused + + + + Converts a constraint to a ReusableConstraint + + The constraint to be converted + A ReusableConstraint + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Return the top-level constraint for this expression + + + + + + SameAsConstraint tests whether an object is identical to + the object passed to its constructor + + + + + Initializes a new instance of the class. + + The expected object. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Summary description for SamePathConstraint. + + + + + Initializes a new instance of the class. + + The expected path + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + SamePathOrUnderConstraint tests that one path is under another + + + + + Initializes a new instance of the class. + + The expected path + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + SomeItemsConstraint applies another constraint to each + item in a collection, succeeding if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the item constraint to each item in the collection, + succeeding if any item succeeds. + + + + + + + The EqualConstraintResult class is tailored for formatting + and displaying the result of an EqualConstraint. + + + + + Construct an EqualConstraintResult + + + + + Write a failure message. Overridden to provide custom + failure messages for EqualConstraint. + + The MessageWriter to write to + + + + Display the failure information for two collections that did not match. + + The MessageWriter on which to display + The expected collection. + The actual collection + The depth of this failure in a set of nested collections + + + + Displays a single line showing the types and sizes of the expected + and actual collections or arrays. If both are identical, the value is + only shown once. + + The MessageWriter on which to display + The expected collection or array + The actual collection or array + The indentation level for the message line + + + + Displays a single line showing the point in the expected and actual + arrays at which the comparison failed. If the arrays have different + structures or dimensions, both _values are shown. + + The MessageWriter on which to display + The expected array + The actual array + Index of the failure point in the underlying collections + The indentation level for the message line + + + + Display the failure information for two IEnumerables that did not match. + + The MessageWriter on which to display + The expected enumeration. + The actual enumeration + The depth of this failure in a set of nested collections + + + + StartsWithConstraint can test whether a string starts + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + StringConstraint is the abstract base for constraints + that operate on strings. It supports the IgnoreCase + modifier for string operations. + + + + + The expected value + + + + + Indicates whether tests should be case-insensitive + + + + + Description of this constraint + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Constructs a StringConstraint without an expected value + + + + + Constructs a StringConstraint given an expected value + + The expected value + + + + Modify the constraint to ignore case in matching. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Test whether the constraint is satisfied by a given string + + The string to be tested + True for success, false for failure + + + + SubPathConstraint tests that the actual path is under the expected path + + + + + Initializes a new instance of the class. + + The expected path + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + SubstringConstraint can test whether a string contains + the expected substring. + + + + + Initializes a new instance of the class. + + The expected. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + ThrowsConstraint is used to test the exception thrown by + a delegate by applying a constraint to it. + + + + + Initializes a new instance of the class, + using a constraint to be applied to the exception. + + A constraint to apply to the caught exception. + + + + Get the actual exception thrown - used by Assert.Throws. + + + + + Gets text describing a constraint + + + + + Executes the code of the delegate and captures any exception. + If a non-null base constraint was provided, it applies that + constraint to the exception. + + A delegate representing the code to be tested + True if an exception is thrown and the constraint succeeds, otherwise false + + + + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. + + + + + + + Write the actual value for a failing constraint test to a + MessageWriter. This override only handles the special message + used when an exception is expected but none is thrown. + + The writer on which the actual value is displayed + + + + ThrowsExceptionConstraint tests that an exception has + been thrown, without any further tests. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Executes the code and returns success if an exception is thrown. + + A delegate representing the code to be tested + True if an exception is thrown, otherwise false + + + + Returns the ActualValueDelegate itself as the value to be tested. + + A delegate representing the code to be tested + The delegate itself + + + + ThrowsNothingConstraint tests that a delegate does not + throw an exception. + + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True if no exception is thrown, otherwise false + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + The Tolerance class generalizes the notion of a tolerance + within which an equality test succeeds. Normally, it is + used with numeric types, but it can be used with any + type that supports taking a difference between two + objects and comparing that difference to a value. + + + + + Returns a default Tolerance object, equivalent to + specifying an exact match unless + is set, in which case, the + will be used. + + + + + Returns an empty Tolerance object, equivalent to + specifying an exact match even if + is set. + + + + + Constructs a linear tolerance of a specified amount + + + + + Constructs a tolerance given an amount and + + + + + Gets the for the current Tolerance + + + + + Tests that the current Tolerance is linear with a + numeric value, throwing an exception if it is not. + + + + + Gets the value of the current Tolerance instance. + + + + + Returns a new tolerance, using the current amount as a percentage. + + + + + Returns a new tolerance, using the current amount in Ulps + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of days. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of hours. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of minutes. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of seconds. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of milliseconds. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of clock ticks. + + + + + Returns true if the current tolerance has not been set or is using the . + + + + + Modes in which the tolerance value for a comparison can be interpreted. + + + + + The tolerance was created with a value, without specifying + how the value would be used. This is used to prevent setting + the mode more than once and is generally changed to Linear + upon execution of the test. + + + + + The tolerance is used as a numeric range within which + two compared _values are considered to be equal. + + + + + Interprets the tolerance as the percentage by which + the two compared _values my deviate from each other. + + + + + Compares two _values based in their distance in + representable numbers. + + + + + TrueConstraint tests that the actual value is true + + + + + Initializes a new instance of the class. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + TypeConstraint is the abstract base for constraints + that take a Type as their expected value. + + + + + The expected Type used by the constraint + + + + + The type of the actual argument to which the constraint was applied + + + + + Construct a TypeConstraint for a given Type + + The expected type for the constraint + Prefix used in forming the constraint description + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + UniqueItemsConstraint tests whether all the items in a + collection are unique. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Check that all items are unique. + + + + + + + XmlSerializableConstraint tests whether + an object is serializable in xml format. + + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns the string representation of this constraint + + + + + ExactCountConstraint applies another constraint to each + item in a collection, succeeding only if a specified + number of items succeed. + + + + + Construct a standalone ExactCountConstraint + + + + + + Construct an ExactCountConstraint on top of an existing constraint + + + + + + + Apply the item constraint to each item in the collection, + succeeding only if the expected number of items pass. + + + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Represents a constraint that succeeds if the specified + count of members of a collection match a base constraint. + + + + + Construct an ExactCountOperator for a specified count + + The expected count + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + ExceptionTypeConstraint is a special version of ExactTypeConstraint + used to provided detailed info about the exception thrown in + an error message. + + + + + Constructs an ExceptionTypeConstraint + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the dictionary. + + + + + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the dictionary. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Asserts on Directories + + + + + DO NOT USE! Use DirectoryAssert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both point to the same directory. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if the directories are not equal + Arguments to be used in formatting the message + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both point to the same directory. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + A directory containing the actual value + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + The path to a directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + The path to a directory containing the actual value + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + A directory containing the actual value + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + The path to a directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + The path to a directory containing the actual value + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a constraint that succeeds if the value + is a file or directory and it exists. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the Dictionary key collection. + + The key to be matched in the Dictionary key collection + + + + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the Dictionary value collection. + + The value to be matched in the Dictionary value collection + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Thrown when an assertion failed. + + + + + Default Constructor (normally used) + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when an assertion failed. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when a test executes inconclusively. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Abstract base for Exceptions that terminate a test and provide a ResultState. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Asserts on Files + + + + + DO NOT USE! Use FileAssert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + The message to be displayed when the two Stream are the same. + Arguments to be used in formatting the message + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + Asserts that the file exists. If it does not exist + an is thrown. + + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file exists. If it does not exist + an is thrown. + + A file containing the actual value + + + + Asserts that the file exists. If it does not exist + an is thrown. + + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file exists. If it does not exist + an is thrown. + + The path to a file containing the actual value + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + A file containing the actual value + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + The path to a file containing the actual value + + + + GlobalSettings is a place for setting default values used + by the framework in performing asserts. Anything set through + this class applies to the entire test run. It should not normally + be used from within a test, since it is not thread-safe. + + + + + Default tolerance for floating point equality + + + + + Class used to guard against unexpected argument values + or operations by throwing an appropriate exception. + + + + + Throws an exception if an argument is null + + The value to be tested + The name of the argument + + + + Throws an exception if a string argument is null or empty + + The value to be tested + The name of the argument + + + + Throws an ArgumentOutOfRangeException if the specified condition is not met. + + The condition that must be met + The exception message to be used + The name of the argument + + + + Throws an ArgumentException if the specified condition is not met. + + The condition that must be met + The exception message to be used + The name of the argument + + + + Throws an InvalidOperationException if the specified condition is not met. + + The condition that must be met + The exception message to be used + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + The AssertionResult class represents the result of a single assertion. + + + + + Construct an AssertionResult + + + + The pass/fail status of the assertion + + + The message produced by the assertion, or null + + + The stacktrace associated with the assertion, or null + + + + ToString Override + + + + + Override GetHashCode + + + + + Override Equals + + + + + + AssertionStatus enumeration represents the possible outcomes of an assertion. + The order of definition is significant, higher level values override lower + ones in determining the overall result of a test. + + + + + An assumption failed + + + + + The assertion succeeded + + + + + A warning message was issued + + + + + The assertion failed + + + + + An unexpected exception was thrown + + + + + The IApplyToContext interface is implemented by attributes + that want to make changes to the execution context before + a test is run. + + + + + Apply changes to the execution context + + The execution context + + + + The IApplyToTest interface is implemented by self-applying + attributes that modify the state of a test in some way. + + + + + Modifies a test as defined for the specific attribute. + + The test to modify + + + + ICommandWrapper is implemented by attributes and other + objects able to wrap a TestCommand with another command. + + + Attributes or other objects should implement one of the + derived interfaces, rather than this one, since they + indicate in which part of the command chain the wrapper + should be applied. + + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + Objects implementing this interface are used to wrap + the TestMethodCommand itself. They apply after SetUp + has been run and before TearDown. + + + + + Objects implementing this interface are used to wrap + the entire test, including SetUp and TearDown. + + + + + Any ITest that implements this interface is at a level that the implementing + class should be disposed at the end of the test run + + + + + The IFixtureBuilder interface is exposed by a class that knows how to + build a TestFixture from one or more Types. In general, it is exposed + by an attribute, but may be implemented in a helper class used by the + attribute in some cases. + + + + + Build one or more TestFixtures from type provided. At least one + non-null TestSuite must always be returned, since the method is + generally called because the user has marked the target class as + a fixture. If something prevents the fixture from being used, it + will be returned nonetheless, labelled as non-runnable. + + The type info of the fixture to be used. + A TestSuite object or one derived from TestSuite. + + + + IImplyFixture is an empty marker interface used by attributes like + TestAttribute that cause the class where they are used to be treated + as a TestFixture even without a TestFixtureAttribute. + + Marker interfaces are not usually considered a good practice, but + we use it here to avoid cluttering the attribute hierarchy with + classes that don't contain any extra implementation. + + + + + The IMethodInfo class is used to encapsulate information + about a method in a platform-independent manner. + + + + + Gets the Type from which this method was reflected. + + + + + Gets the MethodInfo for this method. + + + + + Gets the name of the method. + + + + + Gets a value indicating whether the method is abstract. + + + + + Gets a value indicating whether the method is public. + + + + + Gets a value indicating whether the method contains unassigned generic type parameters. + + + + + Gets a value indicating whether the method is a generic method. + + + + + Gets a value indicating whether the MethodInfo represents the definition of a generic method. + + + + + Gets the return Type of the method. + + + + + Gets the parameters of the method. + + + + + + Returns the Type arguments of a generic method or the Type parameters of a generic method definition. + + + + + Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. + + The type arguments to be used + A new IMethodInfo with the type arguments replaced + + + + Invokes the method, converting any TargetInvocationException to an NUnitException. + + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + The IDataPointProvider interface is used by extensions + that provide data for a single test parameter. + + + + + Determine whether any data is available for a parameter. + + An IParameterInfo representing one + argument to a parameterized test + True if any data is available, otherwise false. + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + An IParameterInfo representing one + argument to a parameterized test + An IEnumerable providing the required data + + + + The IParameterDataSource interface is implemented by types + that can provide data for a test method parameter. + + + + + Gets an enumeration of data items for use as arguments + for a test method parameter. + + The parameter for which data is needed + An enumeration containing individual data items + + + + The IParameterInfo interface is an abstraction of a .NET parameter. + + + + + Gets a value indicating whether the parameter is optional + + + + + Gets an IMethodInfo representing the method for which this is a parameter + + + + + Gets the underlying .NET ParameterInfo + + + + + Gets the Type of the parameter + + + + + A PropertyBag represents a collection of name/value pairs + that allows duplicate entries with the same key. Methods + are provided for adding a new pair as well as for setting + a key to a single value. All keys are strings but _values + may be of any type. Null _values are not permitted, since + a null entry represents the absence of the key. + + The entries in a PropertyBag are of two kinds: those that + take a single value and those that take multiple _values. + However, the PropertyBag has no knowledge of which entries + fall into each category and the distinction is entirely + up to the code using the PropertyBag. + + When working with multi-valued properties, client code + should use the Add method to add name/value pairs and + indexing to retrieve a list of all _values for a given + key. For example: + + bag.Add("Tag", "one"); + bag.Add("Tag", "two"); + Assert.That(bag["Tag"], + Is.EqualTo(new string[] { "one", "two" })); + + When working with single-valued properties, client code + should use the Set method to set the value and Get to + retrieve the value. The GetSetting methods may also be + used to retrieve the value in a type-safe manner while + also providing default. For example: + + bag.Set("Priority", "low"); + bag.Set("Priority", "high"); // replaces value + Assert.That(bag.Get("Priority"), + Is.EqualTo("high")); + Assert.That(bag.GetSetting("Priority", "low"), + Is.EqualTo("high")); + + + + + Adds a key/value pair to the property bag + + The key + The value + + + + Sets the value for a key, removing any other + _values that are already in the property set. + + + + + + + Gets a single value for a key, using the first + one if multiple _values are present and returning + null if the value is not found. + + + + + Gets a flag indicating whether the specified key has + any entries in the property set. + + The key to be checked + True if their are _values present, otherwise false + + + + Gets or sets the list of _values for a particular key + + The key for which the _values are to be retrieved or set + + + + Gets a collection containing all the keys in the property set + + + + + The IReflectionInfo interface is implemented by NUnit wrapper objects that perform reflection. + + + + + Returns an array of custom attributes of the specified type applied to this object + + + + + Returns a value indicating whether an attribute of the specified type is defined on this object. + + + + + The ISimpleTestBuilder interface is exposed by a class that knows how to + build a single TestMethod from a suitable MethodInfo Types. In general, + it is exposed by an attribute, but may be implemented in a helper class + used by the attribute in some cases. + + + + + Build a TestMethod from the provided MethodInfo. + + The method to be used as a test + The TestSuite to which the method will be added + A TestMethod object + + + + The ISuiteBuilder interface is exposed by a class that knows how to + build a suite from one or more Types. + + + + + Examine the type and determine if it is suitable for + this builder to use in building a TestSuite. + + Note that returning false will cause the type to be ignored + in loading the tests. If it is desired to load the suite + but label it as non-runnable, ignored, etc., then this + method must return true. + + The type of the fixture to be used + True if the type can be used to build a TestSuite + + + + Build a TestSuite from type provided. + + The type of the fixture to be used + A TestSuite + + + + Common interface supported by all representations + of a test. Only includes informational fields. + The Run method is specifically excluded to allow + for data-only representations of a test. + + + + + Gets the id of the test + + + + + Gets the name of the test + + + + + Gets the fully qualified name of the test + + + + + Gets the name of the class containing this test. Returns + null if the test is not associated with a class. + + + + + Gets the name of the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Gets the Type of the test fixture, if applicable, or + null if no fixture type is associated with this test. + + + + + Gets an IMethod for the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Gets the RunState of the test, indicating whether it can be run. + + + + + Count of the test cases ( 1 if this is a test case ) + + + + + Gets the properties of the test + + + + + Gets the parent test, if any. + + The parent test or null if none exists. + + + + Returns true if this is a test suite + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets this test's child tests + + A list of child tests + + + + Gets a fixture object for running this test. + + + + + The ITestCaseBuilder interface is exposed by a class that knows how to + build a test case from certain methods. + + + This interface is not the same as the ITestCaseBuilder interface in NUnit 2.x. + We have reused the name because the two products don't interoperate at all. + + + + + Examine the method and determine if it is suitable for + this builder to use in building a TestCase to be + included in the suite being populated. + + Note that returning false will cause the method to be ignored + in loading the tests. If it is desired to load the method + but label it as non-runnable, ignored, etc., then this + method must return true. + + The test method to examine + The suite being populated + True is the builder can use this method + + + + Build a TestCase from the provided MethodInfo for + inclusion in the suite being constructed. + + The method to be used as a test case + The test suite being populated, or null + A TestCase or null + + + + The ITestCaseData interface is implemented by a class + that is able to return complete testcases for use by + a parameterized test method. + + + + + Gets the expected result of the test case + + + + + Returns true if an expected result has been set + + + + + The ITestData interface is implemented by a class that + represents a single instance of a parameterized test. + + + + + Gets the name to be used for the test + + + + + Gets the RunState for this test case. + + + + + Gets the argument list to be provided to the test + + + + + Gets the property dictionary for the test case + + + + + Interface to be implemented by filters applied to tests. + The filter applies when running the test, after it has been + loaded, since this is the only time an ITest exists. + + + + + Determine if a particular test passes the filter criteria. Pass + may examine the parents and/or descendants of a test, depending + on the semantics of the particular filter + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of it's children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + The ITestCaseData interface is implemented by a class + that is able to return the data required to create an + instance of a parameterized test fixture. + + + + + Get the TypeArgs if separately set + + + + + The ITestListener interface is used internally to receive + notifications of significant events while a test is being + run. The events are propagated to clients by means of an + AsyncCallback. NUnit extensions may also monitor these events. + + + + + Called when a test has just started + + The test that is starting + + + + Called when a test has finished + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + The ITestBuilder interface is exposed by a class that knows how to + build one or more TestMethods from a MethodInfo. In general, it is exposed + by an attribute, which has additional information available to provide + the necessary test parameters to distinguish the test cases built. + + + + + Build one or more TestMethods from the provided MethodInfo. + + The method to be used as a test + The TestSuite to which the method will be added + A TestMethod object + + + + The ITestResult interface represents the result of a test. + + + + + Gets the ResultState of the test result, which + indicates the success or failure of the test. + + + + + Gets the name of the test result + + + + + Gets the full name of the test result + + + + + Gets the elapsed time for running the test in seconds + + + + + Gets or sets the time the test started running. + + + + + Gets or sets the time the test finished running. + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stacktrace associated with an + error or failure. Not available in + the Compact Framework 1.0. + + + + + Gets the number of asserts executed + when running the test and all its children. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + Accessing HasChildren should not force creation of the + Children collection in classes implementing this interface. + + + + + Gets the collection of child results. + + + + + Gets the Test to which this result applies. + + + + + Gets any text output written to this result. + + + + + Gets a list of AssertionResults associated with the test + + + + + The ITypeInfo interface is an abstraction of a .NET Type + + + + + Gets the underlying Type on which this ITypeInfo is based + + + + + Gets the base type of this type as an ITypeInfo + + + + + Returns true if the Type wrapped is equal to the argument + + + + + Gets the Name of the Type + + + + + Gets the FullName of the Type + + + + + Gets the assembly in which the type is declared + + + + + Gets the Namespace of the Type + + + + + Gets a value indicating whether the type is abstract. + + + + + Gets a value indicating whether the Type is a generic Type + + + + + Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. + + + + + Gets a value indicating whether the Type is a generic Type definition + + + + + Gets a value indicating whether the type is sealed. + + + + + Gets a value indicating whether this type is a static class. + + + + + Get the display name for this typeInfo. + + + + + Get the display name for an object of this type, constructed with specific arguments + + + + + Returns a Type representing a generic type definition from which this Type can be constructed. + + + + + Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments + + + + + Returns a value indicating whether this type has a method with a specified public attribute + + + + + Returns an array of IMethodInfos for methods of this Type + that match the specified flags. + + + + + Gets the public constructor taking the specified argument Types + + + + + Returns a value indicating whether this Type has a public constructor taking the specified argument Types. + + + + + Construct an object of this Type, using the specified arguments. + + + + + An object implementing IXmlNodeBuilder is able to build + an XML representation of itself and any children. + + + + + Returns a TNode representing the current object. + + If true, children are included where applicable + A TNode representing the result + + + + Returns a TNode representing the current object after + adding it as a child of the supplied parent node. + + The parent node. + If true, children are included, where applicable + + + + + The ResultState class represents the outcome of running a test. + It contains two pieces of information. The Status of the test + is an enum indicating whether the test passed, failed, was + skipped or was inconclusive. The Label provides a more + detailed breakdown for use by client runners. + + + + + Initializes a new instance of the class. + + The TestStatus. + + + + Initializes a new instance of the class. + + The TestStatus. + The label. + + + + Initializes a new instance of the class. + + The TestStatus. + The stage at which the result was produced + + + + Initializes a new instance of the class. + + The TestStatus. + The label. + The stage at which the result was produced + + + + The result is inconclusive + + + + + The test has been skipped. + + + + + The test has been ignored. + + + + + The test was skipped because it is explicit + + + + + The test succeeded + + + + + The test issued a warning + + + + + The test failed + + + + + The test encountered an unexpected exception + + + + + The test was cancelled by the user + + + + + The test was not runnable. + + + + + A suite failed because one or more child tests failed or had errors + + + + + A suite failed in its OneTimeSetUp + + + + + A suite had an unexpected exception in its OneTimeSetUp + + + + + A suite had an unexpected exception in its OneTimeDown + + + + + Gets the TestStatus for the test. + + The status. + + + + Gets the label under which this test result is + categorized, if any. + + + + + Gets the stage of test execution in which + the failure or other result took place. + + + + + Get a new ResultState, which is the same as the current + one but with the FailureSite set to the specified value. + + The FailureSite to use + A new ResultState + + + + Test whether this ResultState has the same Status and Label + as another one. In other words, the whether two are equal + ignoring the Site. + + + + + + + Determines whether the specified , is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + The FailureSite enum indicates the stage of a test + in which an error or failure occurred. + + + + + Failure in the test itself + + + + + Failure in the SetUp method + + + + + Failure in the TearDown method + + + + + Failure of a parent test + + + + + Failure of a child test + + + + + The RunState enum indicates whether a test can be executed. + + + + + The test is not runnable. + + + + + The test is runnable. + + + + + The test can only be run explicitly + + + + + The test has been skipped. This value may + appear on a Test when certain attributes + are used to skip the test. + + + + + The test has been ignored. May appear on + a Test, when the IgnoreAttribute is used. + + + + + The TestOutput class holds a unit of output from + a test to a specific output stream + + + + + Construct with text, output destination type and + the name of the test that produced the output. + + Text to be output + Name of the stream or channel to which the text should be written + FullName of test that produced the output + + + + Return string representation of the object for debugging + + + + + + Get the text + + + + + Get the output type + + + + + Get the name of the test that created the output + + + + + Convert the TestOutput object to an XML string + + + + + The TestStatus enum indicates the result of running a test + + + + + The test was inconclusive + + + + + The test has skipped + + + + + The test succeeded + + + + + There was a warning + + + + + The test failed + + + + + TNode represents a single node in the XML representation + of a Test or TestResult. It replaces System.Xml.XmlNode and + System.Xml.Linq.XElement, providing a minimal set of methods + for operating on the XML in a platform-independent manner. + + + + + Constructs a new instance of TNode + + The name of the node + + + + Constructs a new instance of TNode with a value + + The name of the node + The text content of the node + + + + Constructs a new instance of TNode with a value + + The name of the node + The text content of the node + Flag indicating whether to use CDATA when writing the text + + + + Gets the name of the node + + + + + Gets the value of the node + + + + + Gets a flag indicating whether the value should be output using CDATA. + + + + + Gets the dictionary of attributes + + + + + Gets a list of child nodes + + + + + Gets the first ChildNode + + + + + Gets the XML representation of this node. + + + + + Create a TNode from it's XML text representation + + The XML text to be parsed + A TNode + + + + Adds a new element as a child of the current node and returns it. + + The element name. + The newly created child element + + + + Adds a new element with a value as a child of the current node and returns it. + + The element name + The text content of the new element + The newly created child element + + + + Adds a new element with a value as a child of the current node and returns it. + The value will be output using a CDATA section. + + The element name + The text content of the new element + The newly created child element + + + + Adds an attribute with a specified name and value to the XmlNode. + + The name of the attribute. + The value of the attribute. + + + + Finds a single descendant of this node matching an xpath + specification. The format of the specification is + limited to what is needed by NUnit and its tests. + + + + + + + Finds all descendants of this node matching an xpath + specification. The format of the specification is + limited to what is needed by NUnit and its tests. + + + + + Writes the XML representation of the node to an XmlWriter + + + + + + Class used to represent a list of XmlResults + + + + + Class used to represent the attributes of a node + + + + + Gets or sets the value associated with the specified key. + Overridden to return null if attribute is not found. + + The key. + Value of the attribute or null + + + + CombiningStrategy is the abstract base for classes that + know how to combine values provided for individual test + parameters to create a set of test cases. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + AssemblyHelper provides static methods for working + with assemblies. + + + + + Gets the path from which an assembly was loaded. + For builds where this is not possible, returns + the name of the assembly. + + The assembly. + The path. + + + + Gets the path to the directory from which an assembly was loaded. + + The assembly. + The path. + + + + Gets the AssemblyName of an assembly. + + The assembly + An AssemblyName + + + + Loads an assembly given a string, which may be the + path to the assembly or the AssemblyName + + + + + + + Gets the assembly path from code base. + + Public for testing purposes + The code base. + + + + + CombinatorialStrategy creates test cases by using all possible + combinations of the parameter data. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + Provides data from fields marked with the DatapointAttribute or the + DatapointsAttribute. + + + + + Determine whether any data is available for a parameter. + + A ParameterInfo representing one + argument to a parameterized test + + True if any data is available, otherwise false. + + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + A ParameterInfo representing one + argument to a parameterized test + + An IEnumerable providing the required data + + + + + Built-in SuiteBuilder for all types of test classes. + + + + + Checks to see if the provided Type is a fixture. + To be considered a fixture, it must be a non-abstract + class with one or more attributes implementing the + IFixtureBuilder interface or one or more methods + marked as tests. + + The fixture type to check + True if the fixture can be built, false if not + + + + Build a TestSuite from TypeInfo provided. + + The fixture type to build + A TestSuite built from that type + + + + We look for attributes implementing IFixtureBuilder at one level + of inheritance at a time. Attributes on base classes are not used + unless there are no fixture builder attributes at all on the derived + class. This is by design. + + The type being examined for attributes + A list of the attributes found. + + + + Class to build ether a parameterized or a normal NUnitTestMethod. + There are four cases that the builder must deal with: + 1. The method needs no params and none are provided + 2. The method needs params and they are provided + 3. The method needs no params but they are provided in error + 4. The method needs params but they are not provided + This could have been done using two different builders, but it + turned out to be simpler to have just one. The BuildFrom method + takes a different branch depending on whether any parameters are + provided, but all four cases are dealt with in lower-level methods + + + + + Determines if the method can be used to build an NUnit test + test method of some kind. The method must normally be marked + with an identifying attribute for this to be true. + + Note that this method does not check that the signature + of the method for validity. If we did that here, any + test methods with invalid signatures would be passed + over in silence in the test run. Since we want such + methods to be reported, the check for validity is made + in BuildFrom rather than here. + + An IMethodInfo for the method being used as a test method + True if the builder can create a test case from this method + + + + Build a Test from the provided MethodInfo. Depending on + whether the method takes arguments and on the availability + of test case data, this method may return a single test + or a group of tests contained in a ParameterizedMethodSuite. + + The method for which a test is to be built + A Test representing one or more method invocations + + + + Determines if the method can be used to build an NUnit test + test method of some kind. The method must normally be marked + with an identifying attribute for this to be true. + + Note that this method does not check that the signature + of the method for validity. If we did that here, any + test methods with invalid signatures would be passed + over in silence in the test run. Since we want such + methods to be reported, the check for validity is made + in BuildFrom rather than here. + + An IMethodInfo for the method being used as a test method + The test suite being built, to which the new test would be added + True if the builder can create a test case from this method + + + + Build a Test from the provided MethodInfo. Depending on + whether the method takes arguments and on the availability + of test case data, this method may return a single test + or a group of tests contained in a ParameterizedMethodSuite. + + The method for which a test is to be built + The test fixture being populated, or null + A Test representing one or more method invocations + + + + Builds a ParameterizedMethodSuite containing individual test cases. + + The method for which a test is to be built. + The list of test cases to include. + A ParameterizedMethodSuite populated with test cases + + + + Build a simple, non-parameterized TestMethod for this method. + + The MethodInfo for which a test is to be built + The test suite for which the method is being built + A TestMethod. + + + + Class that can build a tree of automatic namespace + suites from a group of fixtures. + + + + + NamespaceDictionary of all test suites we have created to represent + namespaces. Used to locate namespace parent suites for fixtures. + + + + + The root of the test suite being created by this builder. + + + + + Initializes a new instance of the class. + + The root suite. + + + + Gets the root entry in the tree created by the NamespaceTreeBuilder. + + The root suite. + + + + Adds the specified fixtures to the tree. + + The fixtures to be added. + + + + Adds the specified fixture to the tree. + + The fixture to be added. + + + + NUnitTestCaseBuilder is a utility class used by attributes + that build test cases. + + + + + Constructs an + + + + + Builds a single NUnitTestMethod, either as a child of the fixture + or as one of a set of test cases under a ParameterizedTestMethodSuite. + + The MethodInfo from which to construct the TestMethod + The suite or fixture to which the new test will be added + The ParameterSet to be used, or null + + + + + Helper method that checks the signature of a TestMethod and + any supplied parameters to determine if the test is valid. + + Currently, NUnitTestMethods are required to be public, + non-abstract methods, either static or instance, + returning void. They may take arguments but the _values must + be provided or the TestMethod is not considered runnable. + + Methods not meeting these criteria will be marked as + non-runnable and the method will return false in that case. + + The TestMethod to be checked. If it + is found to be non-runnable, it will be modified. + Parameters to be used for this test, or null + True if the method signature is valid, false if not + + The return value is no longer used internally, but is retained + for testing purposes. + + + + + NUnitTestFixtureBuilder is able to build a fixture given + a class marked with a TestFixtureAttribute or an unmarked + class containing test methods. In the first case, it is + called by the attribute and in the second directly by + NUnitSuiteBuilder. + + + + + Build a TestFixture from type provided. A non-null TestSuite + must always be returned, since the method is generally called + because the user has marked the target class as a fixture. + If something prevents the fixture from being used, it should + be returned nonetheless, labelled as non-runnable. + + An ITypeInfo for the fixture to be used. + A TestSuite object or one derived from TestSuite. + + + + Overload of BuildFrom called by tests that have arguments. + Builds a fixture using the provided type and information + in the ITestFixtureData object. + + The TypeInfo for which to construct a fixture. + An object implementing ITestFixtureData or null. + + + + + Method to add test cases to the newly constructed fixture. + + The fixture to which cases should be added + + + + Method to create a test case from a MethodInfo and add + it to the fixture being built. It first checks to see if + any global TestCaseBuilder addin wants to build the + test case. If not, it uses the internal builder + collection maintained by this fixture builder. + + The default implementation has no test case builders. + Derived classes should add builders to the collection + in their constructor. + + The method for which a test is to be created + The test suite being built. + A newly constructed Test + + + + PairwiseStrategy creates test cases by combining the parameter + data so that all possible pairs of data items are used. + + + + The number of test cases that cover all possible pairs of test function + parameters values is significantly less than the number of test cases + that cover all possible combination of test function parameters values. + And because different studies show that most of software failures are + caused by combination of no more than two parameters, pairwise testing + can be an effective ways to test the system when it's impossible to test + all combinations of parameters. + + + The PairwiseStrategy code is based on "jenny" tool by Bob Jenkins: + http://burtleburtle.net/bob/math/jenny.html + + + + + + FleaRand is a pseudo-random number generator developed by Bob Jenkins: + http://burtleburtle.net/bob/rand/talksmall.html#flea + + + + + Initializes a new instance of the FleaRand class. + + The seed. + + + + FeatureInfo represents coverage of a single value of test function + parameter, represented as a pair of indices, Dimension and Feature. In + terms of unit testing, Dimension is the index of the test parameter and + Feature is the index of the supplied value in that parameter's list of + sources. + + + + + Initializes a new instance of FeatureInfo class. + + Index of a dimension. + Index of a feature. + + + + A FeatureTuple represents a combination of features, one per test + parameter, which should be covered by a test case. In the + PairwiseStrategy, we are only trying to cover pairs of features, so the + tuples actually may contain only single feature or pair of features, but + the algorithm itself works with triplets, quadruples and so on. + + + + + Initializes a new instance of FeatureTuple class for a single feature. + + Single feature. + + + + Initializes a new instance of FeatureTuple class for a pair of features. + + First feature. + Second feature. + + + + TestCase represents a single test case covering a list of features. + + + + + Initializes a new instance of TestCaseInfo class. + + A number of features in the test case. + + + + PairwiseTestCaseGenerator class implements an algorithm which generates + a set of test cases which covers all pairs of possible values of test + function. + + + + The algorithm starts with creating a set of all feature tuples which we + will try to cover (see method). This set + includes every single feature and all possible pairs of features. We + store feature tuples in the 3-D collection (where axes are "dimension", + "feature", and "all combinations which includes this feature"), and for + every two feature (e.g. "A" and "B") we generate both ("A", "B") and + ("B", "A") pairs. This data structure extremely reduces the amount of + time needed to calculate coverage for a single test case (this + calculation is the most time-consuming part of the algorithm). + + + Then the algorithm picks one tuple from the uncovered tuple, creates a + test case that covers this tuple, and then removes this tuple and all + other tuples covered by this test case from the collection of uncovered + tuples. + + + Picking a tuple to cover + + + There are no any special rules defined for picking tuples to cover. We + just pick them one by one, in the order they were generated. + + + Test generation + + + Test generation starts from creating a completely random test case which + covers, nevertheless, previously selected tuple. Then the algorithm + tries to maximize number of tuples which this test covers. + + + Test generation and maximization process repeats seven times for every + selected tuple and then the algorithm picks the best test case ("seven" + is a magic number which provides good results in acceptable time). + + Maximizing test coverage + + To maximize tests coverage, the algorithm walks thru the list of mutable + dimensions (mutable dimension is a dimension that are not included in + the previously selected tuple). Then for every dimension, the algorithm + walks thru the list of features and checks if this feature provides + better coverage than randomly selected feature, and if yes keeps this + feature. + + + This process repeats while it shows progress. If the last iteration + doesn't improve coverage, the process ends. + + + In addition, for better results, before start every iteration, the + algorithm "scrambles" dimensions - so for every iteration dimension + probes in a different order. + + + + + + Creates a set of test cases for specified dimensions. + + + An array which contains information about dimensions. Each element of + this array represents a number of features in the specific dimension. + + + A set of test cases. + + + + + Gets the test cases generated by this strategy instance. + + A set of test cases. + + + + The ParameterDataProvider class implements IParameterDataProvider + and hosts one or more individual providers. + + + + + Construct with a collection of individual providers + + + + + Determine whether any data is available for a parameter. + + An IParameterInfo representing one + argument to a parameterized test + True if any data is available, otherwise false. + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + An IParameterInfo representing one + argument to a parameterized test + An IEnumerable providing the required data + + + + ParameterDataSourceProvider supplies individual argument _values for + single parameters using attributes implementing IParameterDataSource. + + + + + Determine whether any data is available for a parameter. + + A ParameterInfo representing one + argument to a parameterized test + + True if any data is available, otherwise false. + + + + + Return an IEnumerable providing data for use with the + supplied parameter. + + An IParameterInfo representing one + argument to a parameterized test + + An IEnumerable providing the required data + + + + + SequentialStrategy creates test cases by using all of the + parameter data sources in parallel, substituting null + when any of them run out of data. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + Waits for pending asynchronous operations to complete, if appropriate, + and returns a proper result of the invocation by unwrapping task results + + The raw result of the method invocation + The unwrapped result, if necessary + + + + OneTimeSetUpCommand runs any one-time setup methods for a suite, + constructing the user test object if necessary. + + + + + Constructs a OneTimeSetUpCommand for a suite + + The suite to which the command applies + A SetUpTearDownList for use by the command + A List of TestActionItems to be run after Setup + + + + Overridden to run the one-time setup for a suite. + + The TestExecutionContext to be used. + A TestResult + + + + OneTimeTearDownCommand performs any teardown actions + specified for a suite and calls Dispose on the user + test object, if any. + + + + + Construct a OneTimeTearDownCommand + + The test suite to which the command applies + A SetUpTearDownList for use by the command + A List of TestActionItems to be run before teardown. + + + + Overridden to run the teardown methods specified on the test. + + The TestExecutionContext to be used. + A TestResult + + + + ContextSettingsCommand applies specified changes to the + TestExecutionContext prior to running a test. No special + action is needed after the test runs, since the prior + context will be restored automatically. + + + + + The CommandStage enumeration represents the defined stages + of execution for a series of TestCommands. The int _values + of the enum are used to apply decorators in the proper + order. Lower _values are applied first and are therefore + "closer" to the actual test execution. + + + No CommandStage is defined for actual invocation of the test or + for creation of the context. Execution may be imagined as + proceeding from the bottom of the list upwards, with cleanup + after the test running in the opposite order. + + + + + Use an application-defined default value. + + + + + Make adjustments needed before and after running + the raw test - that is, after any SetUp has run + and before TearDown. + + + + + Run SetUp and TearDown for the test. This stage is used + internally by NUnit and should not normally appear + in user-defined decorators. + + + + + Make adjustments needed before and after running + the entire test - including SetUp and TearDown. + + + + + TODO: Documentation needed for class + + + + TODO: Documentation needed for field + + + + TODO: Documentation needed for constructor + + + + + + TODO: Documentation needed for class + + + + + Initializes a new instance of the class. + + The inner command. + The max time allowed in milliseconds + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext + + The context in which the test should run. + A TestResult + + + + SetUpTearDownCommand runs any SetUp methods for a suite, + runs the test and then runs any TearDown methods. + + + + + Initializes a new instance of the class. + + The inner command. + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + SetUpTearDownItem holds the setup and teardown methods + for a single level of the inheritance hierarchy. + + + + + Construct a SetUpTearDownNode + + A list of setup methods for this level + A list teardown methods for this level + + + + Returns true if this level has any methods at all. + This flag is used to discard levels that do nothing. + + + + + Run SetUp on this level. + + The execution context to use for running. + + + + Run TearDown for this level. + + + + + + TODO: Documentation needed for class + + + + + Initializes a new instance of the class. + + The test being skipped. + + + + Overridden to simply set the CurrentResult to the + appropriate Skipped state. + + The execution context for the test + A TestResult + + + + TestActionCommand runs the BeforeTest actions for a test, + then runs the test and finally runs the AfterTestActions. + + + + + Initializes a new instance of the class. + + The inner command. + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + TestActionItem represents a single execution of an + ITestAction. It is used to track whether the BeforeTest + method has been called and suppress calling the + AfterTest method if it has not. + + + + + Construct a TestActionItem + + The ITestAction to be included + + + + Run the BeforeTest method of the action and remember that it has been run. + + The test to which the action applies + + + + Run the AfterTest action, but only if the BeforeTest + action was actually run. + + The test to which the action applies + + + + TestCommand is the abstract base class for all test commands + in the framework. A TestCommand represents a single stage in + the execution of a test, e.g.: SetUp/TearDown, checking for + Timeout, verifying the returned result from a method, etc. + + TestCommands may decorate other test commands so that the + execution of a lower-level command is nested within that + of a higher level command. All nested commands are executed + synchronously, as a single unit. Scheduling test execution + on separate threads is handled at a higher level, using the + task dispatcher. + + + + + Construct a TestCommand for a test. + + The test to be executed + + + + Gets the test associated with this command. + + + + + Runs the test in a specified context, returning a TestResult. + + The TestExecutionContext to be used for running the test. + A TestResult + + + + TestMethodCommand is the lowest level concrete command + used to run actual test cases. + + + + + Initializes a new instance of the class. + + The test. + + + + Runs the test, saving a TestResult in the execution context, as + well as returning it. If the test has an expected result, it + is asserts on that value. Since failed tests and errors throw + an exception, this command must be wrapped in an outer command, + will handle that exception and records the failure. This role + is usually played by the SetUpTearDown command. + + The execution context + + + + TheoryResultCommand adjusts the result of a Theory so that + it fails if all the results were inconclusive. + + + + + Constructs a TheoryResultCommand + + The command to be wrapped by this one + + + + Overridden to call the inner command and adjust the result + in case all chlid results were inconclusive. + + + + + + + EventListenerTextWriter sends text output to the currently active + ITestEventListener in the form of a TestOutput object. If no event + listener is active in the contet, or if there is no context, + the output is forwarded to the supplied default writer. + + + + + Construct an EventListenerTextWriter + + The name of the stream to use for events + The default writer to use if no listener is available + + + + Write a single char + + + + + Write a string + + + + + Write a string followed by a newline + + + + + Get the Encoding for this TextWriter + + + + + A utility class to create TestCommands + + + + + Gets the command to be executed before any of + the child tests are run. + + A TestCommand + + + + Gets the command to be executed after all of the + child tests are run. + + A TestCommand + + + + Creates a test command for use in running this test. + + + + + + Creates a command for skipping a test. The result returned will + depend on the test RunState. + + + + + Builds the set up tear down list. + + Type of the fixture. + Type of the set up attribute. + Type of the tear down attribute. + A list of SetUpTearDownItems + + + + A CompositeWorkItem represents a test suite and + encapsulates the execution of the suite as well + as all its child tests. + + + + + List of Child WorkItems + + + + + A count of how many tests in the work item have a value for the Order Property + + + + + Construct a CompositeWorkItem for executing a test suite + using a filter to select child tests. + + The TestSuite to be executed + A filter used to select child tests + + + + Method that actually performs the work. Overridden + in CompositeWorkItem to do setup, run all child + items and then do teardown. + + + + + Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other. + + + A signed integer that indicates the relative values of and , as shown in the following table.Value Meaning Less than zero is less than .Zero equals .Greater than zero is greater than . + + The first object to compare.The second object to compare. + + + + Sorts tests under this suite. + + + + + Cancel (abort or stop) a CompositeWorkItem and all of its children + + true if the CompositeWorkItem and all of its children should be aborted, false if it should allow all currently running tests to complete + + + + The EventPumpState enum represents the state of an + EventPump. + + + + + The pump is stopped + + + + + The pump is pumping events with no stop requested + + + + + The pump is pumping events but a stop has been requested + + + + + EventPump pulls events out of an EventQueue and sends + them to a listener. It is used to send events back to + the client without using the CallContext of the test + runner thread. + + + + + The downstream listener to which we send events + + + + + The queue that holds our events + + + + + Thread to do the pumping + + + + + The current state of the eventpump + + + + + Constructor + + The EventListener to receive events + The event queue to pull events from + + + + Gets or sets the current state of the pump + + + + + Gets or sets the name of this EventPump + (used only internally and for testing). + + + + + Dispose stops the pump + Disposes the used WaitHandle, too. + + + + + Start the pump + + + + + Tell the pump to stop after emptying the queue. + + + + + Our thread proc for removing items from the event + queue and sending them on. Note that this would + need to do more locking if any other thread were + removing events from the queue. + + + + + NUnit.Core.Event is the abstract base for all stored events. + An Event is the stored representation of a call to the + ITestListener interface and is used to record such calls + or to queue them for forwarding on another thread or at + a later time. + + + + + The Send method is implemented by derived classes to send the event to the specified listener. + + The listener. + + + + TestStartedEvent holds information needed to call the TestStarted method. + + + + + Initializes a new instance of the class. + + The test. + + + + Calls TestStarted on the specified listener. + + The listener. + + + + TestFinishedEvent holds information needed to call the TestFinished method. + + + + + Initializes a new instance of the class. + + The result. + + + + Calls TestFinished on the specified listener. + + The listener. + + + + TestOutputEvent holds information needed to call the TestOutput method. + + + + + Initializes a new instance of the class. + + The output object. + + + + Calls TestOutput on the specified listener. + + The listener. + + + + Implements a queue of work items each of which + is queued as a WaitCallback. + + + + + Gets the count of items in the queue. + + + + + Enqueues the specified event + + The event to enqueue. + + + + Removes the first element from the queue and returns it (or null). + + + If true and the queue is empty, the calling thread is blocked until + either an element is enqueued, or is called. + + + + + If the queue not empty + the first element. + + + otherwise, if ==false + or has been called + null. + + + + + + + Stop processing of the queue + + + + + An IWorkItemDispatcher handles execution of work items. + + + + + Dispatch a single work item for execution. The first + work item dispatched is saved as the top-level + work item and used when stopping the run. + + The item to dispatch + + + + Cancel the ongoing run completely. + If no run is in process, the call has no effect. + + true if the IWorkItemDispatcher should abort all currently running WorkItems, false if it should allow all currently running WorkItems to complete + + + + ParallelWorkItemDispatcher handles execution of work items by + queuing them for worker threads to process. + + + + + Construct a ParallelWorkItemDispatcher + + Number of workers to use + + + + Enumerates all the shifts supported by the dispatcher + + + + + Dispatch a single work item for execution. The first + work item dispatched is saved as the top-level + work item and used when stopping the run. + + The item to dispatch + + + + Cancel the ongoing run completely. + If no run is in process, the call has no effect. + + + + + QueuingEventListener uses an EventQueue to store any + events received on its EventListener interface. + + + + + The EventQueue created and filled by this listener + + + + + Construct a QueuingEventListener + + + + + A test has started + + The test that is starting + + + + A test case finished + + Result of the test case + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + A SimpleWorkItem represents a single test case and is + marked as completed immediately upon execution. This + class is also used for skipped or ignored test suites. + + + + + Construct a simple work item for a test. + + The test to be executed + The filter used to select this test + + + + Method that performs actually performs the work. + + + + + SimpleWorkItemDispatcher handles execution of WorkItems by + directly executing them. It is provided so that a dispatcher + is always available in the context, thereby simplifying the + code needed to run child tests. + + + + + Dispatch a single work item for execution. The first + work item dispatched is saved as the top-level + work item and a thread is created on which to + run it. Subsequent calls come from the top level + item or its descendants on the proper thread. + + The item to dispatch + + + + Cancel (abort or stop) the ongoing run. + If no run is in process, the call has no effect. + + true if the run should be aborted, false if it should allow its currently running test to complete + + + + A TestWorker pulls work items from a queue + and executes them. + + + + + Event signaled immediately before executing a WorkItem + + + + + Event signaled immediately after executing a WorkItem + + + + + Construct a new TestWorker. + + The queue from which to pull work items + The name of this worker + The apartment state to use for running tests + + + + The name of this worker - also used for the thread + + + + + Indicates whether the worker thread is running + + + + + Our ThreadProc, which pulls and runs tests in a loop + + + + + Start processing work items. + + + + + Stop the thread, either immediately or after finishing the current WorkItem + + true if the thread should be aborted, false if it should allow the currently running test to complete + + + + The TextCapture class intercepts console output and writes it + to the current execution context, if one is present on the thread. + If no execution context is found, the output is written to a + default destination, normally the original destination of the + intercepted output. + + + + + Construct a TextCapture object + + The default destination for non-intercepted output + + + + Gets the Encoding in use by this TextWriter + + + + + Writes a single character + + The char to write + + + + Writes a string + + The string to write + + + + Writes a string followed by a line terminator + + The string to write + + + + A WorkItem may be an individual test case, a fixture or + a higher level grouping of tests. All WorkItems inherit + from the abstract WorkItem class, which uses the template + pattern to allow derived classes to perform work in + whatever way is needed. + + A WorkItem is created with a particular TestExecutionContext + and is responsible for re-establishing that context in the + current thread before it begins or resumes execution. + + + + + Creates a work item. + + The test for which this WorkItem is being created. + The filter to be used in selecting any child Tests. + + + + + Construct a WorkItem for a particular test. + + The test that the WorkItem will run + + + + Initialize the TestExecutionContext. This must be done + before executing the WorkItem. + + + Originally, the context was provided in the constructor + but delaying initialization of the context until the item + is about to be dispatched allows changes in the parent + context during OneTimeSetUp to be reflected in the child. + + The TestExecutionContext to use + + + + Event triggered when the item is complete + + + + + Gets the current state of the WorkItem + + + + + The test being executed by the work item + + + + + The execution context + + + + + The unique id of the worker executing this item. + + + + + The test actions to be performed before and after this test + + + + + Indicates whether this WorkItem may be run in parallel + + + + + The test result + + + + + Execute the current work item, including any + child work items. + + + + + Cancel (abort or stop) a WorkItem + + true if the WorkItem should be aborted, false if it should run to completion + + + + Method that performs actually performs the work. It should + set the State to WorkItemState.Complete when done. + + + + + Method called by the derived class when all work is complete + + + + + WorkItemQueueState indicates the current state of a WorkItemQueue + + + + + The queue is paused + + + + + The queue is running + + + + + The queue is stopped + + + + + A WorkItemQueue holds work items that are ready to + be run, either initially or after some dependency + has been satisfied. + + + + + Initializes a new instance of the class. + + The name of the queue. + + + + Gets the name of the work item queue. + + + + + Gets the total number of items processed so far + + + + + Gets the maximum number of work items. + + + + + Gets the current state of the queue + + + + + Get a bool indicating whether the queue is empty. + + + + + Enqueue a WorkItem to be processed + + The WorkItem to process + + + + Dequeue a WorkItem for processing + + A WorkItem or null if the queue has stopped + + + + Start or restart processing of items from the queue + + + + + Signal the queue to stop + + + + + Pause the queue for restarting later + + + + + The current state of a work item + + + + + Ready to run or continue + + + + + Work Item is executing + + + + + Complete + + + + + The dispatcher needs to do different things at different, + non-overlapped times. For example, non-parallel tests may + not be run at the same time as parallel tests. We model + this using the metaphor of a working shift. The WorkShift + class associates one or more WorkItemQueues with one or + more TestWorkers. + + Work in the queues is processed until all queues are empty + and all workers are idle. Both tests are needed because a + worker that is busy may end up adding more work to one of + the queues. At that point, the shift is over and another + shift may begin. This cycle continues until all the tests + have been run. + + + + + Construct a WorkShift + + + + + Event that fires when the shift has ended + + + + + Gets a flag indicating whether the shift is currently active + + + + + Gets a list of the queues associated with this shift. + + Used for testing + + + + Gets the list of workers associated with this shift. + + + + + Gets a bool indicating whether this shift has any work to do + + + + + Add a WorkItemQueue to the shift, starting it if the + shift is currently active. + + + + + Assign a worker to the shift. + + + + + + Start or restart processing for the shift + + + + + End the shift, pausing all queues and raising + the EndOfShift event. + + + + + Shut down the shift. + + + + + Cancel (abort or stop) the shift without completing all work + + true if the WorkShift should be aborted, false if it should allow its currently running tests to complete + + + + ClassName filter selects tests based on the class FullName + + + + + Construct a FullNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + A base class for multi-part filters + + + + + Constructs an empty CompositeFilter + + + + + Constructs a CompositeFilter from an array of filters + + + + + + Adds a filter to the list of filters + + The filter to be added + + + + Return a list of the composing filters. + + + + + Checks whether the CompositeFilter is matched by a test. + + The test to be matched + + + + Checks whether the CompositeFilter is matched by a test. + + The test to be matched + + + + Checks whether the CompositeFilter is explicit matched by a test. + + The test to be matched + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + FullName filter selects tests based on their FullName + + + + + Construct a FullNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + FullName filter selects tests based on their FullName + + + + + Construct a MethodNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + PropertyFilter is able to select or exclude tests + based on their properties. + + + + + + Construct a PropertyFilter using a property name and expected value + + A property name + The expected value of the property + + + + Check whether the filter matches a test + + The test to be matched + + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + TestName filter selects tests based on their Name + + + + + Construct a TestNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + Combines multiple filters so that a test must pass all + of them in order to pass this filter. + + + + + Constructs an empty AndFilter + + + + + Constructs an AndFilter from an array of filters + + + + + + Checks whether the AndFilter is matched by a test + + The test to be matched + True if all the component filters pass, otherwise false + + + + Checks whether the AndFilter is matched by a test + + The test to be matched + True if all the component filters match, otherwise false + + + + Checks whether the AndFilter is explicit matched by a test. + + The test to be matched + True if all the component filters explicit match, otherwise false + + + + Gets the element name + + Element name + + + + CategoryFilter is able to select or exclude tests + based on their categories. + + + + + + Construct a CategoryFilter using a single category name + + A category name + + + + Check whether the filter matches a test + + The test to be matched + + + + + Gets the element name + + Element name + + + + IdFilter selects tests based on their id + + + + + Construct an IdFilter for a single value + + The id the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + NotFilter negates the operation of another filter + + + + + Construct a not filter on another filter + + The filter to be negated + + + + Gets the base filter + + + + + Determine if a particular test passes the filter criteria. The default + implementation checks the test itself, its parents and any descendants. + + Derived classes may override this method or any of the Match methods + to change the behavior of the filter. + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Check whether the filter matches a test + + The test to be matched + True if it matches, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of it's children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Combines multiple filters so that a test must pass one + of them in order to pass this filter. + + + + + Constructs an empty OrFilter + + + + + Constructs an AndFilter from an array of filters + + + + + + Checks whether the OrFilter is matched by a test + + The test to be matched + True if any of the component filters pass, otherwise false + + + + Checks whether the OrFilter is matched by a test + + The test to be matched + True if any of the component filters match, otherwise false + + + + Checks whether the OrFilter is explicit matched by a test + + The test to be matched + True if any of the component filters explicit match, otherwise false + + + + Gets the element name + + Element name + + + + ValueMatchFilter selects tests based on some value, which + is expected to be contained in the test. + + + + + Returns the value matched by the filter - used for testing + + + + + Indicates whether the value is a regular expression + + + + + Construct a ValueMatchFilter for a single value. + + The value to be included. + + + + Match the input provided by the derived class + + The value to be matchedT + True for a match, false otherwise. + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + GenericMethodHelper is able to deduce the Type arguments for + a generic method from the actual arguments provided. + + + + + Construct a GenericMethodHelper for a method + + MethodInfo for the method to examine + + + + Return the type arguments for the method, deducing them + from the arguments actually provided. + + The arguments to the method + An array of type arguments. + + + + InvalidTestFixtureException is thrown when an appropriate test + fixture constructor using the provided arguments cannot be found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + CultureDetector is a helper class used by NUnit to determine + whether a test should be run based on the current culture. + + + + + Default constructor uses the current culture. + + + + + Construct a CultureDetector for a particular culture for testing. + + The culture to be used + + + + Test to determine if one of a collection of cultures + is being used currently. + + + + + + + Tests to determine if the current culture is supported + based on a culture attribute. + + The attribute to examine + + + + + Test to determine if the a particular culture or comma- + delimited set of cultures is in use. + + Name of the culture or comma-separated list of culture ids + True if the culture is in use on the system + + + + Return the last failure reason. Results are not + defined if called before IsSupported( Attribute ) + is called. + + + + + ExceptionHelper provides static methods for working with exceptions + + + + + Rethrows an exception, preserving its stack trace + + The exception to rethrow + + + + Builds up a message, using the Message field of the specified exception + as well as any InnerExceptions. + + The exception. + A combined message string. + + + + Builds up a message, using the Message field of the specified exception + as well as any InnerExceptions. + + The exception. + A combined stack trace. + + + + Gets the stack trace of the exception. + + The exception. + A string representation of the stack trace. + + + + TextMessageWriter writes constraint descriptions and messages + in displayable form as a text stream. It tailors the display + of individual message components to form the standard message + format of NUnit assertion failure messages. + + + + + Prefix used for the expected value line of a message + + + + + Prefix used for the actual value line of a message + + + + + Length of a message prefix + + + + + Construct a TextMessageWriter + + + + + Construct a TextMessageWriter, specifying a user message + and optional formatting arguments. + + + + + + + Gets or sets the maximum line length for this writer + + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a given + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The result of the constraint that failed + + + + Gets the unique type name between expected and actual. + + The expected value + The actual value causing the failure + Output of the unique type name for expected + Output of the unique type name for actual + + + + Display Expected and Actual lines for given _values. This + method may be called by constraints that need more control over + the display of actual and expected _values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given _values, including + a tolerance value on the expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string _values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in string comparisons + If true, clip the strings to fit the max line length + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Write the generic 'Expected' line for a constraint + + The constraint that failed + + + + Write the generic 'Expected' line for a given value + + The expected value + + + + Write the generic 'Expected' line for a given value + and tolerance. + + The expected value + The tolerance within which the test was made + + + + Write the generic 'Actual' line for a constraint + + The ConstraintResult for which the actual value is to be written + + + + Write the generic 'Actual' line for a given value + + The actual value causing a failure + + + + InvalidTestFixtureException is thrown when an appropriate test + fixture constructor using the provided arguments cannot be found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + Interface for logging within the engine + + + + + Logs the specified message at the error level. + + The message. + + + + Logs the specified message at the error level. + + The message. + The arguments. + + + + Logs the specified message at the warning level. + + The message. + + + + Logs the specified message at the warning level. + + The message. + The arguments. + + + + Logs the specified message at the info level. + + The message. + + + + Logs the specified message at the info level. + + The message. + The arguments. + + + + Logs the specified message at the debug level. + + The message. + + + + Logs the specified message at the debug level. + + The message. + The arguments. + + + + InternalTrace provides facilities for tracing the execution + of the NUnit framework. Tests and classes under test may make use + of Console writes, System.Diagnostics.Trace or various loggers and + NUnit itself traps and processes each of them. For that reason, a + separate internal trace is needed. + + Note: + InternalTrace uses a global lock to allow multiple threads to write + trace messages. This can easily make it a bottleneck so it must be + used sparingly. Keep the trace Level as low as possible and only + insert InternalTrace writes where they are needed. + TODO: add some buffering and a separate writer thread as an option. + TODO: figure out a way to turn on trace in specific classes only. + + + + + Gets a flag indicating whether the InternalTrace is initialized + + + + + Initialize the internal trace facility using the name of the log + to be written to and the trace level. + + The log name + The trace level + + + + Initialize the internal trace using a provided TextWriter and level + + A TextWriter + The InternalTraceLevel + + + + Get a named Logger + + + + + + Get a logger named for a particular Type. + + + + + InternalTraceLevel is an enumeration controlling the + level of detailed presented in the internal log. + + + + + Use the default settings as specified by the user. + + + + + Do not display any trace messages + + + + + Display Error messages only + + + + + Display Warning level and higher messages + + + + + Display informational and higher messages + + + + + Display debug messages and higher - i.e. all messages + + + + + Display debug messages and higher - i.e. all messages + + + + + A trace listener that writes to a separate file per domain + and process using it. + + + + + Construct an InternalTraceWriter that writes to a file. + + Path to the file to use + + + + Construct an InternalTraceWriter that writes to a + TextWriter provided by the caller. + + + + + + Returns the character encoding in which the output is written. + + The character encoding in which the output is written. + + + + Writes a character to the text string or stream. + + The character to write to the text stream. + + + + Writes a string to the text string or stream. + + The string to write. + + + + Writes a string followed by a line terminator to the text string or stream. + + The string to write. If is null, only the line terminator is written. + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Clears all buffers for the current writer and causes any buffered data to be written to the underlying device. + + + + + Provides internal logging to the NUnit framework + + + + + Initializes a new instance of the class. + + The name. + The log level. + The writer where logs are sent. + + + + Logs the message at error level. + + The message. + + + + Logs the message at error level. + + The message. + The message arguments. + + + + Logs the message at warm level. + + The message. + + + + Logs the message at warning level. + + The message. + The message arguments. + + + + Logs the message at info level. + + The message. + + + + Logs the message at info level. + + The message. + The message arguments. + + + + Logs the message at debug level. + + The message. + + + + Logs the message at debug level. + + The message. + The message arguments. + + + + The MethodWrapper class wraps a MethodInfo so that it may + be used in a platform-independent manner. + + + + + Construct a MethodWrapper for a Type and a MethodInfo. + + + + + Construct a MethodInfo for a given Type and method name. + + + + + Gets the Type from which this method was reflected. + + + + + Gets the MethodInfo for this method. + + + + + Gets the name of the method. + + + + + Gets a value indicating whether the method is abstract. + + + + + Gets a value indicating whether the method is public. + + + + + Gets a value indicating whether the method contains unassigned generic type parameters. + + + + + Gets a value indicating whether the method is a generic method. + + + + + Gets a value indicating whether the MethodInfo represents the definition of a generic method. + + + + + Gets the return Type of the method. + + + + + Gets the parameters of the method. + + + + + + Returns the Type arguments of a generic method or the Type parameters of a generic method definition. + + + + + Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. + + The type arguments to be used + A new IMethodInfo with the type arguments replaced + + + + Returns an array of custom attributes of the specified type applied to this method + + + + + Gets a value indicating whether one or more attributes of the specified type are defined on the method. + + + + + Invokes the method, converting any TargetInvocationException to an NUnitException. + + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + Override ToString() so that error messages in NUnit's own tests make sense + + + + + Thrown when an assertion failed. Here to preserve the inner + exception and hence its stack trace. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The error message that explains + the reason for the exception + + + + Initializes a new instance of the class. + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + OSPlatform represents a particular operating system platform + + + + + Platform ID for Unix as defined by Microsoft .NET 2.0 and greater + + + + + Platform ID for Unix as defined by Mono + + + + + Platform ID for XBox as defined by .NET and Mono + + + + + Platform ID for MacOSX as defined by .NET and Mono + + + + + Get the OSPlatform under which we are currently running + + + + + Gets the actual OS Version, not the incorrect value that might be + returned for Win 8.1 and Win 10 + + + If an application is not manifested as Windows 8.1 or Windows 10, + the version returned from Environment.OSVersion will not be 6.3 and 10.0 + respectively, but will be 6.2 and 6.3. The correct value can be found in + the registry. + + The original version + The correct OS version + + + + Product Type Enumeration used for Windows + + + + + Product type is unknown or unspecified + + + + + Product type is Workstation + + + + + Product type is Domain Controller + + + + + Product type is Server + + + + + Construct from a platform ID and version + + + + + Construct from a platform ID, version and product type + + + + + Get the platform ID of this instance + + + + + Get the Version of this instance + + + + + Get the Product Type of this instance + + + + + Return true if this is a windows platform + + + + + Return true if this is a Unix or Linux platform + + + + + Return true if the platform is Win32S + + + + + Return true if the platform is Win32Windows + + + + + Return true if the platform is Win32NT + + + + + Return true if the platform is Windows CE + + + + + Return true if the platform is Xbox + + + + + Return true if the platform is MacOSX + + + + + Return true if the platform is Windows 95 + + + + + Return true if the platform is Windows 98 + + + + + Return true if the platform is Windows ME + + + + + Return true if the platform is NT 3 + + + + + Return true if the platform is NT 4 + + + + + Return true if the platform is NT 5 + + + + + Return true if the platform is Windows 2000 + + + + + Return true if the platform is Windows XP + + + + + Return true if the platform is Windows 2003 Server + + + + + Return true if the platform is NT 6 + + + + + Return true if the platform is NT 6.0 + + + + + Return true if the platform is NT 6.1 + + + + + Return true if the platform is NT 6.2 + + + + + Return true if the platform is NT 6.3 + + + + + Return true if the platform is Vista + + + + + Return true if the platform is Windows 2008 Server (original or R2) + + + + + Return true if the platform is Windows 2008 Server (original) + + + + + Return true if the platform is Windows 2008 Server R2 + + + + + Return true if the platform is Windows 2012 Server (original or R2) + + + + + Return true if the platform is Windows 2012 Server (original) + + + + + Return true if the platform is Windows 2012 Server R2 + + + + + Return true if the platform is Windows 7 + + + + + Return true if the platform is Windows 8 + + + + + Return true if the platform is Windows 8.1 + + + + + Return true if the platform is Windows 10 + + + + + Return true if the platform is Windows Server. This is named Windows + Server 10 to distinguish it from previous versions of Windows Server. + + + + + The ParameterWrapper class wraps a ParameterInfo so that it may + be used in a platform-independent manner. + + + + + Construct a ParameterWrapper for a given method and parameter + + + + + + + Gets a value indicating whether the parameter is optional + + + + + Gets an IMethodInfo representing the method for which this is a parameter. + + + + + Gets the underlying ParameterInfo + + + + + Gets the Type of the parameter + + + + + Returns an array of custom attributes of the specified type applied to this method + + + + + Gets a value indicating whether one or more attributes of the specified type are defined on the parameter. + + + + + PlatformHelper class is used by the PlatformAttribute class to + determine whether a platform is supported. + + + + + Comma-delimited list of all supported OS platform constants + + + + + Comma-delimited list of all supported Runtime platform constants + + + + + Default constructor uses the operating system and + common language runtime of the system. + + + + + Construct a PlatformHelper for a particular operating + system and common language runtime. Used in testing. + + RuntimeFramework to be used + OperatingSystem to be used + + + + Test to determine if one of a collection of platforms + is being used currently. + + + + + + + Tests to determine if the current platform is supported + based on a platform attribute. + + The attribute to examine + + + + + Tests to determine if the current platform is supported + based on a platform attribute. + + The attribute to examine + + + + + Test to determine if the a particular platform or comma- + delimited set of platforms is in use. + + Name of the platform or comma-separated list of platform ids + True if the platform is in use on the system + + + + Return the last failure reason. Results are not + defined if called before IsSupported( Attribute ) + is called. + + + + + A PropertyBag represents a collection of name value pairs + that allows duplicate entries with the same key. Methods + are provided for adding a new pair as well as for setting + a key to a single value. All keys are strings but _values + may be of any type. Null _values are not permitted, since + a null entry represents the absence of the key. + + + + + Adds a key/value pair to the property set + + The key + The value + + + + Sets the value for a key, removing any other + _values that are already in the property set. + + + + + + + Gets a single value for a key, using the first + one if multiple _values are present and returning + null if the value is not found. + + + + + + + Gets a flag indicating whether the specified key has + any entries in the property set. + + The key to be checked + + True if their are _values present, otherwise false + + + + + Gets a collection containing all the keys in the property set + + + + + + Gets or sets the list of _values for a particular key + + + + + Returns an XmlNode representing the current PropertyBag. + + Not used + An XmlNode representing the PropertyBag + + + + Returns an XmlNode representing the PropertyBag after + adding it as a child of the supplied parent node. + + The parent node. + Not used + + + + + The PropertyNames class provides static constants for the + standard property ids that NUnit uses on tests. + + + + + The FriendlyName of the AppDomain in which the assembly is running + + + + + The selected strategy for joining parameter data into test cases + + + + + The process ID of the executing assembly + + + + + The stack trace from any data provider that threw + an exception. + + + + + The reason a test was not run + + + + + The author of the tests + + + + + The ApartmentState required for running the test + + + + + The categories applying to a test + + + + + The Description of a test + + + + + The number of threads to be used in running tests + + + + + The maximum time in ms, above which the test is considered to have failed + + + + + The ParallelScope associated with a test + + + + + The number of times the test should be repeated + + + + + Indicates that the test should be run on a separate thread + + + + + The culture to be set for a test + + + + + The UI culture to be set for a test + + + + + The type that is under test + + + + + The timeout value for the test + + + + + The test will be ignored until the given date + + + + + The optional Order the test will run in + + + + + Randomizer returns a set of random _values in a repeatable + way, to allow re-running of tests if necessary. It extends + the .NET Random class, providing random values for a much + wider range of types. + + The class is used internally by the framework to generate + test case data and is also exposed for use by users through + the TestContext.Random property. + + + For consistency with the underlying Random Type, methods + returning a single value use the prefix "Next..." Those + without an argument return a non-negative value up to + the full positive range of the Type. Overloads are provided + for specifying a maximum or a range. Methods that return + arrays or strings use the prefix "Get..." to avoid + confusion with the single-value methods. + + + + + Initial seed used to create randomizers for this run + + + + + Get a Randomizer for a particular member, returning + one that has already been created if it exists. + This ensures that the same _values are generated + each time the tests are reloaded. + + + + + Get a randomizer for a particular parameter, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Create a new Randomizer using the next seed + available to ensure that each randomizer gives + a unique sequence of values. + + + + + + Default constructor + + + + + Construct based on seed value + + + + + + Returns a random unsigned int. + + + + + Returns a random unsigned int less than the specified maximum. + + + + + Returns a random unsigned int within a specified range. + + + + + Returns a non-negative random short. + + + + + Returns a non-negative random short less than the specified maximum. + + + + + Returns a non-negative random short within a specified range. + + + + + Returns a random unsigned short. + + + + + Returns a random unsigned short less than the specified maximum. + + + + + Returns a random unsigned short within a specified range. + + + + + Returns a random long. + + + + + Returns a random long less than the specified maximum. + + + + + Returns a non-negative random long within a specified range. + + + + + Returns a random ulong. + + + + + Returns a random ulong less than the specified maximum. + + + + + Returns a non-negative random long within a specified range. + + + + + Returns a random Byte + + + + + Returns a random Byte less than the specified maximum. + + + + + Returns a random Byte within a specified range + + + + + Returns a random SByte + + + + + Returns a random sbyte less than the specified maximum. + + + + + Returns a random sbyte within a specified range + + + + + Returns a random bool + + + + + Returns a random bool based on the probability a true result + + + + + Returns a random double between 0.0 and the specified maximum. + + + + + Returns a random double within a specified range. + + + + + Returns a random float. + + + + + Returns a random float between 0.0 and the specified maximum. + + + + + Returns a random float within a specified range. + + + + + Returns a random enum value of the specified Type as an object. + + + + + Returns a random enum value of the specified Type. + + + + + Default characters for random functions. + + Default characters are the English alphabet (uppercase & lowercase), arabic numerals, and underscore + + + + Generate a random string based on the characters from the input string. + + desired length of output string. + string representing the set of characters from which to construct the resulting string + A random string of arbitrary length + + + + Generate a random string based on the characters from the input string. + + desired length of output string. + A random string of arbitrary length + Uses DefaultStringChars as the input character set + + + + Generate a random string based on the characters from the input string. + + A random string of the default length + Uses DefaultStringChars as the input character set + + + + Returns a random decimal. + + + + + Returns a random decimal between positive zero and the specified maximum. + + + + + Returns a random decimal within a specified range, which is not + permitted to exceed decimal.MaxVal in the current implementation. + + + A limitation of this implementation is that the range from min + to max must not exceed decimal.MaxVal. + + + + + Helper methods for inspecting a type by reflection. + + Many of these methods take ICustomAttributeProvider as an + argument to avoid duplication, even though certain attributes can + only appear on specific types of members, like MethodInfo or Type. + + In the case where a type is being examined for the presence of + an attribute, interface or named member, the Reflect methods + operate with the full name of the member being sought. This + removes the necessity of the caller having a reference to the + assembly that defines the item being sought and allows the + NUnit core to inspect assemblies that reference an older + version of the NUnit framework. + + + + + Examine a fixture type and return an array of methods having a + particular attribute. The array is order with base methods first. + + The type to examine + The attribute Type to look for + Specifies whether to search the fixture type inheritance chain + The array of methods found + + + + Examine a fixture type and return true if it has a method with + a particular attribute. + + The type to examine + The attribute Type to look for + True if found, otherwise false + + + + Invoke the default constructor on a Type + + The Type to be constructed + An instance of the Type + + + + Invoke a constructor on a Type with arguments + + The Type to be constructed + Arguments to the constructor + An instance of the Type + + + + Returns an array of types from an array of objects. + Used because the compact framework doesn't support + Type.GetTypeArray() + + An array of objects + An array of Types + + + + Invoke a parameterless method returning void on an object. + + A MethodInfo for the method to be invoked + The object on which to invoke the method + + + + Invoke a method, converting any TargetInvocationException to an NUnitException. + + A MethodInfo for the method to be invoked + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + The TestResult class represents the result of a test. + + + + + Error message for when child tests have errors + + + + + Error message for when child tests have warnings + + + + + Error message for when child tests are ignored + + + + + The minimum duration for tests + + + + + Aggregate assertion count + + + + + ReaderWriterLock + + + + + Construct a test result given a Test + + The test to be used + + + + Gets the test with which this result is associated. + + + + + Gets the ResultState of the test result, which + indicates the success or failure of the test. + + + + + Gets the name of the test result + + + + + Gets the full name of the test result + + + + + Gets or sets the elapsed time for running the test in seconds + + + + + Gets or sets the time the test started running. + + + + + Gets or sets the time the test finished running. + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stacktrace associated with an + error or failure. + + + + + Gets or sets the count of asserts executed + when running the test. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + Gets a TextWriter, which will write output to be included in the result. + + + + + Gets any text output written to this result. + + + + + Gets a list of assertion results associated with the test. + + + + + Returns the Xml representation of the result. + + If true, descendant results are included + An XmlNode representing the result + + + + Adds the XML representation of the result as a child of the + supplied parent node.. + + The parent node. + If true, descendant results are included + + + + + Gets a count of pending failures (from Multiple Assert) + + + + + Gets the worst assertion status (highest enum) in all the assertion results + + + + + Set the result of the test + + The ResultState to use in the result + + + + Set the result of the test + + The ResultState to use in the result + A message associated with the result state + + + + Set the result of the test + + The ResultState to use in the result + A message associated with the result state + Stack trace giving the location of the command + + + + Set the test result based on the type of exception thrown + + The exception that was thrown + + + + Set the test result based on the type of exception thrown + + The exception that was thrown + The FailureSite to use in the result + + + + RecordTearDownException appends the message and stacktrace + from an exception arising during teardown of the test + to any previously recorded information, so that any + earlier failure information is not lost. Note that + calling Assert.Ignore, Assert.Inconclusive, etc. during + teardown is treated as an error. If the current result + represents a suite, it may show a teardown error even + though all contained tests passed. + + The Exception to be recorded + + + + Determine result after test has run to completion. + + + + + Record an assertion result + + + + + Record an assertion result + + + + + Record an assertion result + + + + + Adds a reason element to a node and returns it. + + The target node. + The new reason element. + + + + Adds a failure element to a node and returns it. + + The target node. + The new failure element. + + + + Creates a failure message incorporating failures + from a Multiple Assert block for use by runners + that don't know about AssertionResults. + + Message as a string + + + + Enumeration identifying a common language + runtime implementation. + + + + Any supported runtime framework + + + Microsoft .NET Framework + + + Microsoft Shared Source CLI + + + Mono + + + MonoTouch + + + + RuntimeFramework represents a particular version + of a common language runtime implementation. + + + + + DefaultVersion is an empty Version, used to indicate that + NUnit should select the CLR version to use for the test. + + + + + Construct from a runtime type and version. If the version has + two parts, it is taken as a framework version. If it has three + or more, it is taken as a CLR version. In either case, the other + version is deduced based on the runtime type and provided version. + + The runtime type of the framework + The version of the framework + + + + Static method to return a RuntimeFramework object + for the framework that is currently in use. + + + + + The type of this runtime framework + + + + + The framework version for this runtime framework + + + + + The CLR version for this runtime framework + + + + + Return true if any CLR version may be used in + matching this RuntimeFramework object. + + + + + Returns the Display name for this framework + + + + + Parses a string representing a RuntimeFramework. + The string may be just a RuntimeType name or just + a Version or a hyphenated RuntimeType-Version or + a Version prefixed by 'versionString'. + + + + + + + Overridden to return the short name of the framework + + + + + + Returns true if the current framework matches the + one supplied as an argument. Two frameworks match + if their runtime types are the same or either one + is RuntimeType.Any and all specified version components + are equal. Negative (i.e. unspecified) version + components are ignored. + + The RuntimeFramework to be matched. + True on match, otherwise false + + + + StackFilter class is used to remove internal NUnit + entries from a stack trace so that the resulting + trace provides better information about the test. + + + + + Single instance of our default filter + + + + + Construct a stack filter instance + + Regex pattern used to delete lines from the top of the stack + Regex pattern used to delete lines from the bottom of the stack + + + + Construct a stack filter instance + + Regex pattern used to delete lines from the top of the stack + + + + Construct a stack filter instance + + + + + Filters a raw stack trace and returns the result. + + The original stack trace + A filtered stack trace + + + + Provides methods to support legacy string comparison methods. + + + + + Compares two strings for equality, ignoring case if requested. + + The first string. + The second string.. + if set to true, the case of the letters in the strings is ignored. + Zero if the strings are equivalent, a negative number if strA is sorted first, a positive number if + strB is sorted first + + + + Compares two strings for equality, ignoring case if requested. + + The first string. + The second string.. + if set to true, the case of the letters in the strings is ignored. + True if the strings are equivalent, false if not. + + + + The TestCaseParameters class encapsulates method arguments and + other selected parameters needed for constructing + a parameterized test case. + + + + + The expected result to be returned + + + + + Default Constructor creates an empty parameter set + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a ParameterSet from an object implementing ITestCaseData + + + + + + The expected result of the test, which + must match the method return type. + + + + + Gets a value indicating whether an expected result was specified. + + + + + Helper class used to save and restore certain static or + singleton settings in the environment that affect tests + or which might be changed by the user tests. + + An internal class is used to hold settings and a stack + of these objects is pushed and popped as Save and Restore + are called. + + + + + Link to a prior saved context + + + + + Indicates that a stop has been requested + + + + + The event listener currently receiving notifications + + + + + The number of assertions for the current test + + + + + The current culture + + + + + The current UI culture + + + + + The current test result + + + + + The current Principal. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + An existing instance of TestExecutionContext. + + + + Gets and sets the current context. + + + + + Get the current context or return null if none is found. + + + + + + Clear the current context. This is provided to + prevent "leakage" of the CallContext containing + the current context back to any runners. + + + + + Gets or sets the current test + + + + + The time the current test started execution + + + + + The time the current test started in Ticks + + + + + Gets or sets the current test result + + + + + Gets a TextWriter that will send output to the current test result. + + + + + The current test object - that is the user fixture + object on which tests are being executed. + + + + + Get or set the working directory + + + + + Get or set indicator that run should stop on the first error + + + + + Gets an enum indicating whether a stop has been requested. + + + + + The current test event listener + + + + + The current WorkItemDispatcher. Made public for + use by nunitlite.tests + + + + + The ParallelScope to be used by tests running in this context. + For builds with out the parallel feature, it has no effect. + + + + + The unique name of the worker that spawned the context. + For builds with out the parallel feature, it is null. + + + + + Gets the RandomGenerator specific to this Test + + + + + Gets the assert count. + + The assert count. + + + + The current nesting level of multiple assert blocks + + + + + Gets or sets the test case timeout value + + + + + Gets a list of ITestActions set by upstream tests + + + + + Saves or restores the CurrentCulture + + + + + Saves or restores the CurrentUICulture + + + + + Gets or sets the current for the Thread. + + + + + The current head of the ValueFormatter chain, copied from MsgUtils.ValueFormatter + + + + + If true, all tests must run on the same thread. No new thread may be spawned. + + + + + Record any changes in the environment made by + the test code in the execution context so it + will be passed on to lower level tests. + + + + + Set up the execution environment to match a context. + Note that we may be running on the same thread where the + context was initially created or on a different thread. + + + + + Increments the assert count by one. + + + + + Increments the assert count by a specified amount. + + + + + Adds a new ValueFormatterFactory to the chain of formatters + + The new factory + + + + Obtain lifetime service object + + + + + + An IsolatedContext is used when running code + that may effect the current result in ways that + should not impact the final result of the test. + A new TestExecutionContext is created with an + initially clear result, which is discarded on + exiting the context. + + + using (new TestExecutionContext.IsolatedContext()) + { + // Code that should not impact the result + } + + + + + Save the original current TestExecutionContext and + make a new isolated context current. + + + + + Restore the original TestExecutionContext. + + + + + Enumeration indicating whether the tests are + running normally or being cancelled. + + + + + Running normally with no stop requested + + + + + A graceful stop has been requested + + + + + A forced stop has been requested + + + + + Interface to be implemented by filters applied to tests. + The filter applies when running the test, after it has been + loaded, since this is the only time an ITest exists. + + + + + Unique Empty filter. + + + + + Indicates whether this is the EmptyFilter + + + + + Indicates whether this is a top-level filter, + not contained in any other filter. + + + + + Determine if a particular test passes the filter criteria. The default + implementation checks the test itself, its parents and any descendants. + + Derived classes may override this method or any of the Match methods + to change the behavior of the filter. + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of it's children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + Determine whether the test itself matches the filter criteria, without + examining either parents or descendants. This is overridden by each + different type of filter to perform the necessary tests. + + The test to which the filter is applied + True if the filter matches the any parent of the test + + + + Determine whether any ancestor of the test matches the filter criteria + + The test to which the filter is applied + True if the filter matches the an ancestor of the test + + + + Determine whether any descendant of the test matches the filter criteria. + + The test to be matched + True if at least one descendant matches the filter criteria + + + + Create a TestFilter instance from an xml representation. + + + + + Create a TestFilter from it's TNode representation + + + + + Nested class provides an empty filter - one that always + returns true when called. It never matches explicitly. + + + + + Adds an XML node + + True if recursive + The added XML node + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + The TestCaseParameters class encapsulates method arguments and + other selected parameters needed for constructing + a parameterized test case. + + + + + Default Constructor creates an empty parameter set + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a ParameterSet from an object implementing ITestCaseData + + + + + + Type arguments used to create a generic fixture instance + + + + + TestListener provides an implementation of ITestListener that + does nothing. It is used only through its NULL property. + + + + + Called when a test has just started + + The test that is starting + + + + Called when a test case has finished + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Construct a new TestListener - private so it may not be used. + + + + + Get a listener that does nothing + + + + + TestNameGenerator is able to create test names according to + a coded pattern. + + + + + Default pattern used to generate names + + + + + Construct a TestNameGenerator + + + + + Construct a TestNameGenerator + + The pattern used by this generator. + + + + Get the display name for a TestMethod and it's arguments + + A TestMethod + The display name + + + + Get the display name for a TestMethod and it's arguments + + A TestMethod + Arguments to be used + The display name + + + + TestParameters is the abstract base class for all classes + that know how to provide data for constructing a test. + + + + + Default Constructor creates an empty parameter set + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a ParameterSet from an object implementing ITestData + + + + + + The RunState for this set of parameters. + + + + + The arguments to be used in running the test, + which must match the method signature. + + + + + A name to be used for this test case in lieu + of the standard generated name containing + the argument list. + + + + + Gets the property dictionary for this test + + + + + Applies ParameterSet _values to the test itself. + + A test. + + + + The original arguments provided by the user, + used for display purposes. + + + + + TestProgressReporter translates ITestListener events into + the async callbacks that are used to inform the client + software about the progress of a test run. + + + + + Initializes a new instance of the class. + + The callback handler to be used for reporting progress. + + + + Called when a test has just started + + The test that is starting + + + + Called when a test has finished. Sends a result summary to the callback. + to + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Returns the parent test item for the targer test item if it exists + + + parent test item + + + + Makes a string safe for use as an attribute, replacing + characters characters that can't be used with their + corresponding xml representations. + + The string to be used + A new string with the _values replaced + + + + ParameterizedFixtureSuite serves as a container for the set of test + fixtures created from a given Type using various parameters. + + + + + Initializes a new instance of the class. + + The ITypeInfo for the type that represents the suite. + + + + Gets a string representing the type of test + + + + + + ParameterizedMethodSuite holds a collection of individual + TestMethods with their arguments applied. + + + + + Construct from a MethodInfo + + + + + + Gets a string representing the type of test + + + + + + SetUpFixture extends TestSuite and supports + Setup and TearDown methods. + + + + + Initializes a new instance of the class. + + The type. + + + + The Test abstract class represents a test within the framework. + + + + + Static value to seed ids. It's started at 1000 so any + uninitialized ids will stand out. + + + + + The SetUp methods. + + + + + The teardown methods + + + + + Used to cache the declaring type for this MethodInfo + + + + + Method property backing field + + + + + Constructs a test given its name + + The name of the test + + + + Constructs a test given the path through the + test hierarchy to its parent and a name. + + The parent tests full name + The name of the test + + + + TODO: Documentation needed for constructor + + + + + + Construct a test from a MethodInfo + + + + + + Gets or sets the id of the test + + + + + + Gets or sets the name of the test + + + + + Gets or sets the fully qualified name of the test + + + + + + Gets the name of the class where this test was declared. + Returns null if the test is not associated with a class. + + + + + Gets the name of the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Gets the TypeInfo of the fixture used in running this test + or null if no fixture type is associated with it. + + + + + Gets a MethodInfo for the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Whether or not the test should be run + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Gets a string representing the type of test. Used as an attribute + value in the XML representation of a test and has no other + function in the framework. + + + + + Gets a count of test cases represented by + or contained under this test. + + + + + Gets the properties for this test + + + + + Returns true if this is a TestSuite + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets the parent as a Test object. + Used by the core to set the parent. + + + + + Gets this test's child tests + + A list of child tests + + + + Gets or sets a fixture object for running this test. + + + + + Static prefix used for ids in this AppDomain. + Set by FrameworkController. + + + + + Gets or Sets the Int value representing the seed for the RandomGenerator + + + + + + Creates a TestResult for this test. + + A TestResult suitable for this type of test. + + + + Modify a newly constructed test by applying any of NUnit's common + attributes, based on a supplied ICustomAttributeProvider, which is + usually the reflection element from which the test was constructed, + but may not be in some instances. The attributes retrieved are + saved for use in subsequent operations. + + An object implementing ICustomAttributeProvider + + + + Add standard attributes and members to a test node. + + + + + + + Returns the Xml representation of the test + + If true, include child tests recursively + + + + + Returns an XmlNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Compares this test to another test for sorting purposes + + The other test + Value of -1, 0 or +1 depending on whether the current test is less than, equal to or greater than the other test + + + + TestAssembly is a TestSuite that represents the execution + of tests in a managed assembly. + + + + + Initializes a new instance of the class + specifying the Assembly and the path from which it was loaded. + + The assembly this test represents. + The path used to load the assembly. + + + + Initializes a new instance of the class + for a path which could not be loaded. + + The path used to load the assembly. + + + + Gets the Assembly represented by this instance. + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + TestFixture is a surrogate for a user test fixture class, + containing one or more tests. + + + + + Initializes a new instance of the class. + + Type of the fixture. + + + + The TestMethod class represents a Test implemented as a method. + + + + + The ParameterSet used to create this test method + + + + + Initializes a new instance of the class. + + The method to be used as a test. + + + + Initializes a new instance of the class. + + The method to be used as a test. + The suite or fixture to which the new test will be added + + + + Overridden to return a TestCaseResult. + + A TestResult for this test. + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Returns a TNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Gets this test's child tests + + A list of child tests + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Returns the name of the method + + + + + TestSuite represents a composite test, which contains other tests. + + + + + Our collection of child tests + + + + + Initializes a new instance of the class. + + The name of the suite. + + + + Initializes a new instance of the class. + + Name of the parent suite. + The name of the suite. + + + + Initializes a new instance of the class. + + Type of the fixture. + + + + Initializes a new instance of the class. + + Type of the fixture. + + + + Sorts tests under this suite. + + + + + Adds a test to the suite. + + The test. + + + + Gets this test's child tests + + The list of child tests + + + + Gets a count of test cases represented by + or contained under this test. + + + + + + The arguments to use in creating the fixture + + + + + Set to true to suppress sorting this suite's contents + + + + + Overridden to return a TestSuiteResult. + + A TestResult for this test. + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Returns an XmlNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Check that setup and teardown methods marked by certain attributes + meet NUnit's requirements and mark the tests not runnable otherwise. + + The attribute type to check for + + + + ThreadUtility provides a set of static methods convenient + for working with threads. + + + + + Do our best to Kill a thread + + The thread to kill + + + + Do our best to kill a thread, passing state info + + The thread to kill + Info for the ThreadAbortException handler + + + + TypeHelper provides static methods that operate on Types. + + + + + A special value, which is used to indicate that BestCommonType() method + was unable to find a common type for the specified arguments. + + + + + Gets the display name for a Type as used by NUnit. + + The Type for which a display name is needed. + The display name for the Type + + + + Gets the display name for a Type as used by NUnit. + + The Type for which a display name is needed. + The arglist provided. + The display name for the Type + + + + Returns the best fit for a common type to be used in + matching actual arguments to a methods Type parameters. + + The first type. + The second type. + Either type1 or type2, depending on which is more general. + + + + Determines whether the specified type is numeric. + + The type to be examined. + + true if the specified type is numeric; otherwise, false. + + + + + Convert an argument list to the required parameter types. + Currently, only widening numeric conversions are performed. + + An array of args to be converted + A ParameterInfo[] whose types will be used as targets + + + + Determines whether this instance can deduce type args for a generic type from the supplied arguments. + + The type to be examined. + The arglist. + The type args to be used. + + true if this the provided args give sufficient information to determine the type args to be used; otherwise, false. + + + + + Gets the _values for an enumeration, using Enum.GetTypes + where available, otherwise through reflection. + + + + + + + Gets the ids of the _values for an enumeration, + using Enum.GetNames where available, otherwise + through reflection. + + + + + + + The TypeWrapper class wraps a Type so it may be used in + a platform-independent manner. + + + + + Construct a TypeWrapper for a specified Type. + + + + + Gets the underlying Type on which this TypeWrapper is based. + + + + + Gets the base type of this type as an ITypeInfo + + + + + Gets the Name of the Type + + + + + Gets the FullName of the Type + + + + + Gets the assembly in which the type is declared + + + + + Gets the namespace of the Type + + + + + Gets a value indicating whether the type is abstract. + + + + + Gets a value indicating whether the Type is a generic Type + + + + + Returns true if the Type wrapped is T + + + + + Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. + + + + + Gets a value indicating whether the Type is a generic Type definition + + + + + Gets a value indicating whether the type is sealed. + + + + + Gets a value indicating whether this type represents a static class. + + + + + Get the display name for this type + + + + + Get the display name for an object of this type, constructed with the specified args. + + + + + Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments + + + + + Returns a Type representing a generic type definition from which this Type can be constructed. + + + + + Returns an array of custom attributes of the specified type applied to this type + + + + + Returns a value indicating whether the type has an attribute of the specified type. + + + + + + + + Returns a flag indicating whether this type has a method with an attribute of the specified type. + + + + + + + Returns an array of IMethodInfos for methods of this Type + that match the specified flags. + + + + + Gets the public constructor taking the specified argument Types + + + + + Returns a value indicating whether this Type has a public constructor taking the specified argument Types. + + + + + Construct an object of this Type, using the specified arguments. + + + + + Override ToString() so that error messages in NUnit's own tests make sense + + + + + Represents the result of running a single test case. + + + + + Construct a TestCaseResult based on a TestMethod + + A TestMethod to which the result applies. + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + Represents the result of running a test suite + + + + + Construct a TestSuiteResult base on a TestSuite + + The TestSuite to which the result applies + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + Adds a child result to this result, setting this result's + ResultState to Failure if the child result failed. + + The result to be added + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for equality with zero + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable to the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable to the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is a subpath of the expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + inclusively within a specified range. + + from must be less than or equal to true + Inclusive beginning of the range. Must be less than or equal to to. + Inclusive end of the range. Must be greater than or equal to from. + + + + + When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. + + + + + Executed before each test is run + + The test that is going to be run. + + + + Executed after each test is run + + The test that has just been run. + + + + Provides the target for the action attribute + + The target for the action attribute + + + + The Iz class is a synonym for Is intended for use in VB, + which regards Is as a keyword. + + + + + The List class is a helper class with properties and methods + that supply a number of constraints used with lists and collections. + + + + + List.Map returns a ListMapper, which can be used to map + the original collection to another collection. + + + + + + + ListMapper is used to transform a collection used as an actual argument + producing another collection to be used in the assertion. + + + + + Construct a ListMapper based on a collection + + The collection to be transformed + + + + Produces a collection containing all the _values of a property + + The collection of property _values + + + + + The SpecialValue enum is used to represent TestCase arguments + that cannot be used as arguments to an Attribute. + + + + + Null represents a null value, which cannot be used as an + argument to an attribute under .NET 1.x + + + + + Basic Asserts on strings. + + + + + DO NOT USE! Use StringAssert.AreEqualIgnoringCase(...) or Assert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string is not found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + + + + The TestCaseData class represents a set of arguments + and other parameter info to be used for a parameterized + test case. It is derived from TestCaseParameters and adds a + fluent syntax for use in initializing the test case. + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Sets the expected result for the test + + The expected result + A modified TestCaseData + + + + Sets the name of the test case + + The modified TestCaseData instance + + + + Sets the description for the test case + being constructed. + + The description. + The modified TestCaseData instance. + + + + Applies a category to the test + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Marks the test case as explicit. + + + + + Marks the test case as explicit, specifying the reason. + + + + + Ignores this TestCase, specifying the reason. + + The reason. + + + + + Provide the context information of the current test. + This is an adapter for the internal ExecutionContext + class, hiding the internals from the user test. + + + + + Construct a TestContext for an ExecutionContext + + The ExecutionContext to adapt + + + + Get the current test context. This is created + as needed. The user may save the context for + use within a test, but it should not be used + outside the test for which it is created. + + + + + Gets a TextWriter that will send output to the current test result. + + + + + Gets a TextWriter that will send output directly to Console.Error + + + + + Gets a TextWriter for use in displaying immediate progress messages + + + + + TestParameters object holds parameters for the test run, if any are specified + + + + + Get a representation of the current test. + + + + + Gets a Representation of the TestResult for the current test. + + + + + Gets the unique name of the Worker that is executing this test. + + + + + Gets the directory containing the current test assembly. + + + + + Gets the directory to be used for outputting files created + by this test run. + + + + + Gets the random generator. + + + The random generator. + + + + Write the string representation of a boolean value to the current result + + + Write a char to the current result + + + Write a char array to the current result + + + Write the string representation of a double to the current result + + + Write the string representation of an Int32 value to the current result + + + Write the string representation of an Int64 value to the current result + + + Write the string representation of a decimal value to the current result + + + Write the string representation of an object to the current result + + + Write the string representation of a Single value to the current result + + + Write a string to the current result + + + Write the string representation of a UInt32 value to the current result + + + Write the string representation of a UInt64 value to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a line terminator to the current result + + + Write the string representation of a boolean value to the current result followed by a line terminator + + + Write a char to the current result followed by a line terminator + + + Write a char array to the current result followed by a line terminator + + + Write the string representation of a double to the current result followed by a line terminator + + + Write the string representation of an Int32 value to the current result followed by a line terminator + + + Write the string representation of an Int64 value to the current result followed by a line terminator + + + Write the string representation of a decimal value to the current result followed by a line terminator + + + Write the string representation of an object to the current result followed by a line terminator + + + Write the string representation of a Single value to the current result followed by a line terminator + + + Write a string to the current result followed by a line terminator + + + Write the string representation of a UInt32 value to the current result followed by a line terminator + + + Write the string representation of a UInt64 value to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + + This method adds the a new ValueFormatterFactory to the + chain of responsibility used for formatting values in messages. + The scope of the change is the current TestContext. + + The factory delegate + + + + This method provides a simplified way to add a ValueFormatter + delegate to the chain of responsibility, creating the factory + delegate internally. It is useful when the Type of the object + is the only criterion for selection of the formatter, since + it can be used without getting involved with a compound function. + + The type supported by this formatter + The ValueFormatter delegate + + + + TestAdapter adapts a Test for consumption by + the user test code. + + + + + Construct a TestAdapter for a Test + + The Test to be adapted + + + + Gets the unique Id of a test + + + + + The name of the test, which may or may not be + the same as the method name. + + + + + The name of the method representing the test. + + + + + The FullName of the test + + + + + The ClassName of the test + + + + + The properties of the test. + + + + + ResultAdapter adapts a TestResult for consumption by + the user test code. + + + + + Construct a ResultAdapter for a TestResult + + The TestResult to be adapted + + + + Gets a ResultState representing the outcome of the test. + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stacktrace associated with an + error or failure. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + The TestFixtureData class represents a set of arguments + and other parameter info to be used for a parameterized + fixture. It is derived from TestFixtureParameters and adds a + fluent syntax for use in initializing the fixture. + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Marks the test fixture as explicit. + + + + + Marks the test fixture as explicit, specifying the reason. + + + + + Ignores this TestFixture, specifying the reason. + + The reason. + + + + + TestParameters class holds any named parameters supplied to the test run + + + + + Gets the number of test parameters + + + + + Gets a collection of the test parameter names + + + + + Gets a flag indicating whether a parameter with the specified name exists.N + + Name of the parameter + True if it exists, otherwise false + + + + Indexer provides access to the internal dictionary + + Name of the parameter + Value of the parameter or null if not present + + + + Get method is a simple alternative to the indexer + + Name of the parameter + Value of the parameter or null if not present + + + + Get the value of a parameter or a default string + + Name of the parameter + Default value of the parameter + Value of the parameter or default value if not present + + + + Get the value of a parameter or return a default + + The return Type + Name of the parameter + Default value of the parameter + Value of the parameter or default value if not present + + + + Adds a parameter to the list + + Name of the parameter + Value of the parameter + + + + Helper class with properties and methods that supply + constraints that operate on exceptions. + + + + + Creates a constraint specifying an expected exception + + + + + Creates a constraint specifying an exception with a given InnerException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying an expected ArgumentException + + + + + Creates a constraint specifying an expected ArgumentNUllException + + + + + Creates a constraint specifying an expected InvalidOperationException + + + + + Creates a constraint specifying that no exception is thrown + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + FrameworkPackageSettings is a static class containing constant values that + are used as keys in setting up a TestPackage. These values are used in + the framework, and set in the runner. Setting values may be a string, int or bool. + + + + + Flag (bool) indicating whether tests are being debugged. + + + + + Flag (bool) indicating whether to pause execution of tests to allow + the user to attache a debugger. + + + + + The InternalTraceLevel for this run. Values are: "Default", + "Off", "Error", "Warning", "Info", "Debug", "Verbose". + Default is "Off". "Debug" and "Verbose" are synonyms. + + + + + Full path of the directory to be used for work and result files. + This path is provided to tests by the framework TestContext. + + + + + Integer value in milliseconds for the default timeout value + for test cases. If not specified, there is no timeout except + as specified by attributes on the tests themselves. + + + + + A TextWriter to which the internal trace will be sent. + + + + + A list of tests to be loaded. + + + + + The number of test threads to run for the assembly. If set to + 1, a single queue is used. If set to 0, tests are executed + directly, without queuing. + + + + + The random seed to be used for this assembly. If specified + as the value reported from a prior run, the framework should + generate identical random values for tests as were used for + that run, provided that no change has been made to the test + assembly. Default is a random value itself. + + + + + If true, execution stops after the first error or failure. + + + + + If true, use of the event queue is suppressed and test events are synchronous. + + + + + The default naming pattern used in generating test names + + + + + Parameters to be passed on to the tests, serialized to a single string which needs parsing. Obsoleted by ; kept for backward compatibility. + + + + + Parameters to be passed on to the tests, already parsed into an IDictionary<string, string>. Replaces . + + + + + Provides a platform-independent methods for getting attributes + for use by AttributeConstraint and AttributeExistsConstraint. + + + + + Gets the custom attributes from the given object. + + Portable libraries do not have an ICustomAttributeProvider, so we need to cast to each of + it's direct subtypes and try to get attributes off those instead. + The actual. + Type of the attribute. + if set to true [inherit]. + A list of the given attribute on the given object. + + + + A MarshalByRefObject that lives forever + + + + + Obtains a lifetime service object to control the lifetime policy for this instance. + + + + + Type extensions that apply to all target frameworks + + + + + Determines if the given array is castable/matches the array. + + + + + + + + Determines if one type can be implicitly converted from another + + + + + + + + This class is used as a flag when we get a parameter list for a method/constructor, but + we do not know one of the types because null was passed in. + + + + diff --git a/Route4MeSDKTest/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/Route4MeSDKTest/obj/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 00000000..a4807714 Binary files /dev/null and b/Route4MeSDKTest/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ diff --git a/Route4MeSDKTest/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/Route4MeSDKTest/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 00000000..d5d9e1d8 Binary files /dev/null and b/Route4MeSDKTest/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.Properties.Resources.resources b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.Properties.Resources.resources new file mode 100644 index 00000000..242803de Binary files /dev/null and b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.Properties.Resources.resources differ diff --git a/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.csproj.FileListAbsolute.txt b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.csproj.FileListAbsolute.txt new file mode 100644 index 00000000..52313c7a --- /dev/null +++ b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.csproj.FileListAbsolute.txt @@ -0,0 +1,28 @@ +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\Route4MeSDKTest.exe.config +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\obj\Debug\Route4MeSDKTest.csprojResolveAssemblyReference.cache +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\obj\Debug\Route4MeSDKTest.Properties.Resources.resources +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\obj\Debug\Route4MeSDKTest.csproj.GenerateResource.Cache +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\Route4MeSDKTest.exe +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\Route4MeSDKTest.pdb +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\nunit.framework.dll +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\Route4MeSDKLibrary.dll +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\Route4MeSDKLibrary.pdb +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\nunit.framework.xml +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\obj\Debug\Route4MeSDKTest.exe +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\obj\Debug\Route4MeSDKTest.pdb +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\CsvHelper.dll +C:\Oleg_Route4Me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\CsvHelper.xml +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\Route4MeSDKTest.exe.config +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\obj\Debug\Route4MeSDKTest.exe +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\obj\Debug\Route4MeSDKTest.pdb +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\Route4MeSDKTest.exe +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\Route4MeSDKTest.pdb +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\CsvHelper.dll +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\nunit.framework.dll +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\Route4MeSDKLibrary.dll +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\Route4MeSDKLibrary.pdb +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\CsvHelper.xml +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\bin\Debug\nunit.framework.xml +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\obj\Debug\Route4MeSDKTest.csprojResolveAssemblyReference.cache +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\obj\Debug\Route4MeSDKTest.Properties.Resources.resources +C:\Users\Odin641\Documents\GitHub\route4me\route4me-csharp-sdk\Route4MeSDKTest\obj\Debug\Route4MeSDKTest.csproj.GenerateResource.Cache diff --git a/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.csproj.GenerateResource.Cache b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.csproj.GenerateResource.Cache new file mode 100644 index 00000000..562eb1c6 Binary files /dev/null and b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.csproj.GenerateResource.Cache differ diff --git a/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.csprojResolveAssemblyReference.cache b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.csprojResolveAssemblyReference.cache new file mode 100644 index 00000000..bde5cdac Binary files /dev/null and b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.csprojResolveAssemblyReference.cache differ diff --git a/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.exe b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.exe new file mode 100644 index 00000000..14209543 Binary files /dev/null and b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.exe differ diff --git a/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.pdb b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.pdb new file mode 100644 index 00000000..0edc9bb7 Binary files /dev/null and b/Route4MeSDKTest/obj/Debug/Route4MeSDKTest.pdb differ diff --git a/Route4MeSDKTest/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/Route4MeSDKTest/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll new file mode 100644 index 00000000..d92f10e7 Binary files /dev/null and b/Route4MeSDKTest/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll differ diff --git a/Route4MeSDKTest/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/Route4MeSDKTest/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs new file mode 100644 index 00000000..e69de29b diff --git a/Route4MeSDKTest/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/Route4MeSDKTest/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs new file mode 100644 index 00000000..e69de29b diff --git a/Route4MeSDKTest/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/Route4MeSDKTest/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs new file mode 100644 index 00000000..e69de29b diff --git a/Route4MeSDKTest/packages.config b/Route4MeSDKTest/packages.config new file mode 100644 index 00000000..63df72d2 --- /dev/null +++ b/Route4MeSDKTest/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Route4MeSDKTest/shortTest.cs b/Route4MeSDKTest/shortTest.cs new file mode 100644 index 00000000..0dcc411a --- /dev/null +++ b/Route4MeSDKTest/shortTest.cs @@ -0,0 +1,372 @@ +using Route4MeSDK.DataTypes; +using Route4MeSDK.QueryTypes; +using Route4MeSDK.Examples; +using System; +using System.Collections.Generic; + +namespace Route4MeSDKTest +{ + public class shortTest + { + public static void TestRun() + { + Route4MeExamples examples = new Route4MeExamples(); + + // Note run an example by uncommenting code lines between appropriate //=======.... lines + + // ======== COnverting XML file to JSON string ================ + //Dictionary customData = new Dictionary(); + //customData.Add("BatchId","e7c672b1-a356-4a97-803e-97db88fdcf99"); + //customData.Add("CustomerNumber", "2718500"); + //customData.Add("DeliveryId", "2c71f6d9-c1aa-4672-a682-3e9f12badac9"); + //customData.Add("DeliveryInvoices", "\u000d\u000a\u000d\u000a\u000d\u000a \u000d\u000a 945822\u000d\u000a \u000d\u000a 1790908\u000d\u000a \u000d\u000a false\u000d\u000a false\u000d\u000a true\u000d\u000a false\u000d\u000a false\u000d\u000a \u000d\u000a"); + //customData.Add("DeliveryNotes", ""); + //customData.Add("RouteId", "20191"); + examples.UpdateRouteDestination(); + // + + // ======== Converting XML file to JSON string ================ + //examples.GetActivities("824CA521E3A8DE9F1C684C8BAE90CF07"); + //examples.GetRouteTeamActivities(); + //examples.LogCustomActivity("Custom message", "824CA521E3A8DE9F1C684C8BAE90CF07"); + //examples.SearchAreaUpdated(); + //examples.SearchAreaAdded(); + //examples.SearchAreaRemoved(); + //examples.SearchDestinationDeleted(); + //examples.SearchDestinationInserted(); + //examples.SearchDestinationMarkedAsDeparted(); + //examples.SearchDestinationOutSequence(); + //examples.SearchDestinationUpdated(); + //examples.SearchDriverArrivedEarly(); + //examples.SearchDriverArrivedLate(); + //examples.SearchDriverArrivedOnTime(); + //examples.SearchGeofenceEntered(); + //examples.SearchGeofenceLeft(); + //examples.SearchInsertDestinationAll(); + //examples.SearchMarkDestinationDepartedAll(); + //examples.SearchMarkDestinationVisited(); + //examples.SearchMemberCreated(); + //examples.SearchMemberDeleted(); + //examples.SearchMemberModified(); + //examples.SearchMoveDestination(); + //examples.SearchNoteInserted(); + //examples.SearchNoteInsertedAll(); + //examples.SearchRouteDeleted(); + //examples.SearchRouteOptimized(); + //examples.SearchRouteOwnerChanged(); + // + + // ======== COnverting XML file to JSON string ================ + // examples.convertXMLtoJSON(); + // + + // ======== Generating the SQL server tables ================ + //examples.GenerateSqlDatabase(DB_Type.MySQL); + //examples.GenerateSqlDatabase(DB_Type.MSSQL); + //examples.GenerateSqlDatabase(DB_Type.PostgreSQL); + // + + // ======== Upload orders csv file to the SQL server ================ + //examples.UploadCsvToOrders(DB_Type.MySQL); + //examples.UploadCsvToOrders(DB_Type.MSSQL); + //examples.UploadCsvToOrders(DB_Type.PostgreSQL); + // + + // ======== Upload orders JSON file to the SQL server ============================= + //examples.UploadOrdersJSONtoSQL(DB_Type.MySQL); + //examples.UploadOrdersJSONtoSQL(DB_Type.MSSQL); + //examples.UploadOrdersJSONtoSQL(DB_Type.PostgreSQL); + // + + // ======== Add address book contact to an acoount ============================ + // examples.AddAddressBookContact(); + // + + // ======== Upload addressbook loactions JSON file to the SQL server ========== + //examples.UploadAddressbookJSONtoSQL(DB_Type.MySQL); + //examples.UploadAddressbookJSONtoSQL(DB_Type.MSSQL); + //examples.UploadAddressbookJSONtoSQL(DB_Type.PostgreSQL); + // + + // ======== Upload addressbook loactions csv file to the SQL server ================ + //examples.UploadCsvToAddressbookV4(DB_Type.MySQL); + //examples.UploadCsvToAddressbookV4(DB_Type.MSSQL); + //examples.UploadCsvToAddressbookV4(DB_Type.PostgreSQL); + // + + // ======== Export SQL server addressbook_v4 table to csv file ======================= + //examples.MakeAddressbookCSVsample(DB_Type.MySQL); + //examples.MakeAddressbookCSVsample(DB_Type.MySQL); + //examples.MakeAddressbookCSVsample(DB_Type.MySQL); + // + + // ======== Get Hybrid Optimization =================================== + // examples.HybridOptimizationFrom1000Orders(); + // + + // ======== Get Hybrid Optimization =================================== + // examples.HybridOptimizationFrom1000Addresses(); + // ============================================================== + + // ======== Update Configuration Key =================================== + // examples.UpdateConfigurationKey(); + // ============================================================== + + // ======== Remove Configuration Key =================================== + // examples.RemoveConfigurationKey(); + // ============================================================== + + // ======== Get Specific Configuration Key Data ================= + // examples.GetSpecificConfigurationKeyData(); + // ============================================================== + + // ======== Get All Configuration Data ========================= + // examples.GetAllConfigurationData(); + // ============================================================== + + // ======== Create New Configuration Key ======================= + // examples.AddNewConfigurationKey(); + // ============================================================== + + // ======== Update Territory =================================== + // examples.UpdateTerritory(); + // ============================================================== + + // ======== Remove Territory =================================== + // examples.RemoveTerritory(); + // ============================================================= + + // ======== Get Territory =================================== + // examples.GetTerritory(); + // ====================================================================== + + // ======== Get Territories =================================== + // examples.GetTerritories(); + // ====================================================================== + + // ======== Create a Territory with Rectangular Shape =================== + // examples.CreateRectTerritory(); + // ====================================================================== + + // ======== Create a Territory with Polygon Shape =========================== + // examples.CreatePolygonTerritory(); + // ====================================================================== + + // ======== Create a Territory with Circular Shape =========================== + // examples.CreateTerritory(); + // ====================================================================== + + // ======== Add Rectangular Avoidance Zone =========================== + // examples.AddRectAvoidanceZone(); + // ====================================================================== + + // ======== Add Polygon Avoidance Zone =========================== + // examples.AddPolygonAvoidanceZone(); + // ====================================================================== + + // ======== Search Routed Locations =========================== + // examples.SearchRoutedLocations(); + // ====================================================================== + + // ======== Search Locations By IDs =========================== + // examples.SearchLocationsByIDs(); + // ====================================================================== + + // ======== Get Addressbook Specified Fields Filtered by Text in Any Field =========================== + // examples.GetSpecifiedFieldsSearchText(); + // ====================================================================== + + // ======== Get Addressbook Locations By Text In Any Field =========================== + // examples.GetAddressbookLocation(); + // ====================================================================== + + // ======== Get Team Activities on a Route =========================== + // examples.GetRouteTeamActivities(); + // ====================================================================== + + // ======== Search Area Added Activiities =========================== + // examples.SearchAreaAdded(); + // ====================================================================== + + // ======== Get Vehicles =========================== + // examples.GetVehicles(); + // ====================================================================== + + // ======== Validate Session =========================== + // examples.ValidateSession(); + // ====================================================================== + + // ======== User Registratin =========================== + //examples.UserRegistration(); + // ====================================================================== + + // ======== User Authentication =========================== + //examples.UserAuthentication(); + // ====================================================================== + + // ======== Update an User =========================== + //examples.UpdateUser(); + // ====================================================================== + + // ======== Get USer By ID =========================== + //examples.GetUserById(); + // ====================================================================== + + // ======== Delete an User =========================== + //examples.DeleteUser(); + // ====================================================================== + + // ======== Create an User =========================== + //examples.CreateUser(); + // ====================================================================== + + // ======== Get Device History from Time Range ============ + //examples.GetDeviceHistoryTimeRange("814FB49CEA8188D134E9D4D4B8B0DAF7"); + // ====================================================================== + + // ======== Find Asset (Asset Tracking) =========================== + //examples.FindAsset(); + // ====================================================================== + + // ======== Rapid Stret Service Limited =========================== + //examples.RapidStreetServiceLimited(); + // ===================================================================== + + // ======== Rapid Stret Service All =========================== + //examples.RapidStreetServiceAll(); + // ====================================================================== + + // ======== Rapid Stret Zipcode Limited =========================== + //examples.RapidStreetZipcodeLimited(); + // ====================================================================== + + // ======== Rapid Stret Zipcode All =========================== + //examples.RapidStreetZipcodeAll(); + // ====================================================================== + + // ======== Rapid Stret Data Single =========================== + //examples.RapidStreetDataSingle(); + // ====================================================================== + + // ======== Rapid Stret Data Limited =========================== + //examples.RapidStreetDataLimited(); + // ====================================================================== + + // ======== Rapid Stret Data All =========================== + //examples.RapidStreetDataAll(); + //====================================================================== + + // ======== Reverse Geocoding =========================== + //xexamples.ReverseGeocoding(); + //======================================================= + + // ======== Forward Geocoding =========================== + //GeocodingParameters geoParams = new GeocodingParameters + //{ + // Addresses = "Los20%Angeles20%International20%Airport,20%CA", + // Format = "xml" + //}; + //examples.GeocodingForward(geoParams); + //====================================================================== + + // ======== Mark Address As Marked As Departed =========================== + //AddressParameters aParams = new AddressParameters + //{ + // RouteId = "241466F15515D67D3F951E2DA38DE76D", + // RouteDestinationId = 167899269, + // IsDeparted = true + //}; + //examples.MarkAddressAsMarkedAsDeparted(aParams); + //====================================================================== + + // ======== Mark Address As Marked As Visited =========================== + //AddressParameters aParams = new AddressParameters + //{ + // RouteId = "241466F15515D67D3F951E2DA38DE76D", + // RouteDestinationId = 167899269, + // IsVisited = true + //}; + //examples.MarkAddressAsMarkedAsVisited(aParams); + //====================================================================== + + // ======== Mark Address As Departed =========================== + //AddressParameters aParams = new AddressParameters + //{ + // RouteId = "DD376C7148E7FEE36CFABE2BD9978BDD", + // AddressId = 183045808, + // IsDeparted = true + //}; + //examples.MarkAddressDeparted(aParams); + //====================================================================== + + // ======== Mark Address As Visited =========================== + //AddressParameters aParams = new AddressParameters + //{ + // RouteId = "DD376C7148E7FEE36CFABE2BD9978BDD", + // AddressId = 183045808, + // IsVisited = true + //}; + //examples.MarkAddressVisited(aParams); + //====================================================================== + + //======== Get the Orders by containing specified text in any field ======= + //string query = "Luzerne"; + //examples.GetOrdersBySpecifiedText(query); + //====================================================================== + + //======== Show the Orders using values of the specified fields ======= + //string CustomFields = "order_id,member_id"; + //examples.GetOrdersByCustomFields(CustomFields); + //====================================================================== + + //======== Get the Orders by Scheduled Date =========================== + //string scheduledDate = "2016-12-20"; + //examples.GetOrderByScheduledDate(scheduledDate); + //====================================================================== + + //======== Get the Orders by Inserted Date =========================== + //string InsertedDate = "2016-12-18"; + //examples.GetOrderByInsertedDate(InsertedDate); + //====================================================================== + + //======== Get an Order Details by order_id =========================== + //string OrderIds = "437,438,439"; + //examples.GetOrderByID(OrderIds); + //====================================================================== + + //======== Add Orders To a Route =========================== + //examples.AddOrdersToOptimization(); + //====================================================================== + + //======== Add Orders To a Route =========================== + //examples.AddOrdersToRoute(); + //====================================================================== + + //======== Search Routes For Text ============ + //examples.SearchRoutesForText("Tbilisi"); + //=================================================================== + + //======== Update Route Custom Data ============ + //string RouteId = "CA902292134DBC134EAF8363426BD247"; + //int RouteDestinationId = 174405640; + + //Dictionary CustomData = new Dictionary(); + //CustomData.Add("animal", "tiger"); + //CustomData.Add("bird", "canary"); + //examples.UpdateRouteCustomData(RouteId, RouteDestinationId, CustomData); + //=================================================================== + + //======== Route Sharing ============ + //examples.RouteSharing("56E8F6BF949670F0C0BBAC00590FD116", "ooooooo@yahoo.com"); + //=================================================================== + + //======== Routes Merging ============ + // examples.MergeRoutes(new string[2] { "56E8F6BF949670F0C0BBAC00590FD116", "A6DAA07A7D4737723A9C85E7C3BA2351" }); + //=================================================================== + + System.Console.WriteLine(""); + System.Console.WriteLine("Press any key"); + System.Console.ReadKey(); + } + } +}