freight_kit 0.1.20 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -2
  3. data/README.md +6 -5
  4. data/Rakefile +4 -0
  5. data/VERSION +1 -1
  6. data/configuration/locations/amazon_warehouses.yml +3330 -0
  7. data/freight_kit-0.1.21.gem +0 -0
  8. data/freight_kit.gemspec +11 -22
  9. data/lib/freight_kit/address_normalizer.rb +24 -0
  10. data/lib/freight_kit/amazon_warehouse.rb +33 -0
  11. data/lib/freight_kit/api_clients/soap_client.rb +33 -10
  12. data/lib/freight_kit/carrier.rb +248 -302
  13. data/lib/freight_kit/carriers/a1_express.rb +25 -0
  14. data/lib/freight_kit/carriers/a_duie_pyle.rb +30 -0
  15. data/lib/freight_kit/carriers/aaa_cooper.rb +11 -0
  16. data/lib/freight_kit/carriers/aaa_expedited_services.rb +10 -0
  17. data/lib/freight_kit/carriers/ab_brothers_usa_inc.rb +12 -0
  18. data/lib/freight_kit/carriers/aberdeen_express_inc.rb +28 -0
  19. data/lib/freight_kit/carriers/abf_freight_system.rb +475 -0
  20. data/lib/freight_kit/carriers/access_transport.rb +10 -0
  21. data/lib/freight_kit/carriers/action_express.rb +10 -0
  22. data/lib/freight_kit/carriers/adams_and_companies.rb +10 -0
  23. data/lib/freight_kit/carriers/advance_distribution.rb +28 -0
  24. data/lib/freight_kit/carriers/alcon_transport.rb +10 -0
  25. data/lib/freight_kit/carriers/all_freight.rb +10 -0
  26. data/lib/freight_kit/carriers/alliance_transportation_group.rb +10 -0
  27. data/lib/freight_kit/carriers/allstate_transport.rb +10 -0
  28. data/lib/freight_kit/carriers/aloha_freight_forwarders.rb +31 -0
  29. data/lib/freight_kit/carriers/amado_trucking.rb +31 -0
  30. data/lib/freight_kit/carriers/american_fast_freight.rb +28 -0
  31. data/lib/freight_kit/carriers/amigos_service_transportation.rb +10 -0
  32. data/lib/freight_kit/carriers/anderson_towing_and_transport.rb +10 -0
  33. data/lib/freight_kit/carriers/apex_transporting.rb +10 -0
  34. data/lib/freight_kit/carriers/archer_cargo.rb +35 -0
  35. data/lib/freight_kit/carriers/armstrong_transport_group.rb +10 -0
  36. data/lib/freight_kit/carriers/autobahn_logistics.rb +10 -0
  37. data/lib/freight_kit/carriers/averitt_express.rb +30 -0
  38. data/lib/freight_kit/carriers/ba_transportation.rb +10 -0
  39. data/lib/freight_kit/carriers/balkin_express.rb +10 -0
  40. data/lib/freight_kit/carriers/bay_area_express.rb +10 -0
  41. data/lib/freight_kit/carriers/bc_freightways.rb +11 -0
  42. data/lib/freight_kit/carriers/benjamin_best_freight_inc.rb +37 -0
  43. data/lib/freight_kit/carriers/bennett_trucking.rb +10 -0
  44. data/lib/freight_kit/carriers/best_overnite_express.rb +78 -0
  45. data/lib/freight_kit/carriers/best_trucking.rb +10 -0
  46. data/lib/freight_kit/carriers/bestway_transport.rb +10 -0
  47. data/lib/freight_kit/carriers/bryan_systems.rb +10 -0
  48. data/lib/freight_kit/carriers/c_and_w_express.rb +10 -0
  49. data/lib/freight_kit/carriers/campbell_trucking.rb +10 -0
  50. data/lib/freight_kit/carriers/carde_transportation.rb +10 -0
  51. data/lib/freight_kit/carriers/cardinal_logistics.rb +28 -0
  52. data/lib/freight_kit/carriers/cdc_transport.rb +10 -0
  53. data/lib/freight_kit/carriers/cdo_express_diversified.rb +10 -0
  54. data/lib/freight_kit/carriers/cedar_supply_trucking.rb +10 -0
  55. data/lib/freight_kit/carriers/central_freight_lines.rb +12 -0
  56. data/lib/freight_kit/carriers/central_transport.rb +12 -0
  57. data/lib/freight_kit/carriers/chicago_suburban_express.rb +28 -0
  58. data/lib/freight_kit/carriers/city_logistics.rb +11 -0
  59. data/lib/freight_kit/carriers/clear_lane_freight_systems.rb +474 -0
  60. data/lib/freight_kit/carriers/cleopatra_trucking.rb +10 -0
  61. data/lib/freight_kit/carriers/clifford_transportation.rb +10 -0
  62. data/lib/freight_kit/carriers/cms_domestic.rb +25 -0
  63. data/lib/freight_kit/carriers/cnd_logistics.rb +10 -0
  64. data/lib/freight_kit/carriers/coast_to_coast_transport.rb +27 -0
  65. data/lib/freight_kit/carriers/countrywide_carriers.rb +10 -0
  66. data/lib/freight_kit/carriers/cpl_express.rb +31 -0
  67. data/lib/freight_kit/carriers/crosby_trucking_service.rb +29 -0
  68. data/lib/freight_kit/carriers/cross_country_freight_solutions.rb +408 -0
  69. data/lib/freight_kit/carriers/crowley.rb +10 -0
  70. data/lib/freight_kit/carriers/csa_transportation.rb +40 -0
  71. data/lib/freight_kit/carriers/csx_transportation.rb +40 -0
  72. data/lib/freight_kit/carriers/custom_global_logistics.rb +14 -0
  73. data/lib/freight_kit/carriers/d_and_a_transport.rb +10 -0
  74. data/lib/freight_kit/carriers/dak_transport.rb +10 -0
  75. data/lib/freight_kit/carriers/dash_courier_and_logistics_north_carolina.rb +10 -0
  76. data/lib/freight_kit/carriers/daylight_transport.rb +29 -0
  77. data/lib/freight_kit/carriers/dayton_freight_lines.rb +30 -0
  78. data/lib/freight_kit/carriers/dbr_logistics.rb +10 -0
  79. data/lib/freight_kit/carriers/deep_south_freight.rb +27 -0
  80. data/lib/freight_kit/carriers/delta_express.rb +10 -0
  81. data/lib/freight_kit/carriers/delta_transport.rb +10 -0
  82. data/lib/freight_kit/carriers/delta_trucking_logistics.rb +10 -0
  83. data/lib/freight_kit/carriers/demco_express.rb +10 -0
  84. data/lib/freight_kit/carriers/dependable_global_express.rb +10 -0
  85. data/lib/freight_kit/carriers/dependable_hawaiian_express.rb +24 -0
  86. data/lib/freight_kit/carriers/dependable_highway_express.rb +573 -0
  87. data/lib/freight_kit/carriers/desert_coastal_transport.rb +10 -0
  88. data/lib/freight_kit/carriers/dhl.rb +11 -0
  89. data/lib/freight_kit/carriers/diamond_line_delivery.rb +174 -0
  90. data/lib/freight_kit/carriers/ding_tai_trucking.rb +10 -0
  91. data/lib/freight_kit/carriers/diversified_transfer_and_storage.rb +29 -0
  92. data/lib/freight_kit/carriers/dohrn_transfer_company.rb +30 -0
  93. data/lib/freight_kit/carriers/dot_line_transportation.rb +29 -0
  94. data/lib/freight_kit/carriers/drt_transportation.rb +13 -0
  95. data/lib/freight_kit/carriers/dugan_truck_line.rb +29 -0
  96. data/lib/freight_kit/carriers/dupont.rb +10 -0
  97. data/lib/freight_kit/carriers/e_transport_carriers.rb +29 -0
  98. data/lib/freight_kit/carriers/echo_global_logistics.rb +13 -0
  99. data/lib/freight_kit/carriers/ecklund_logistics.rb +10 -0
  100. data/lib/freight_kit/carriers/el_emplumado_transport.rb +10 -0
  101. data/lib/freight_kit/carriers/elite_carriers.rb +28 -0
  102. data/lib/freight_kit/carriers/emerald_express.rb +10 -0
  103. data/lib/freight_kit/carriers/era_transport.rb +10 -0
  104. data/lib/freight_kit/carriers/estes_express_lines.rb +25 -0
  105. data/lib/freight_kit/carriers/euro_kam.rb +28 -0
  106. data/lib/freight_kit/carriers/ew_riverside_trucking.rb +10 -0
  107. data/lib/freight_kit/carriers/express_2000_inc.rb +12 -0
  108. data/lib/freight_kit/carriers/express_services_international.rb +10 -0
  109. data/lib/freight_kit/carriers/f_and_a_express.rb +27 -0
  110. data/lib/freight_kit/carriers/fairmont_logistics.rb +13 -0
  111. data/lib/freight_kit/carriers/fargo_cargo.rb +10 -0
  112. data/lib/freight_kit/carriers/fast_freight_transportation.rb +10 -0
  113. data/lib/freight_kit/carriers/fast_load_transport.rb +10 -0
  114. data/lib/freight_kit/carriers/fed_ex_express.rb +30 -0
  115. data/lib/freight_kit/carriers/fed_ex_ground.rb +24 -0
  116. data/lib/freight_kit/carriers/fed_ex_ltl_economy.rb +11 -0
  117. data/lib/freight_kit/carriers/fed_ex_ltl_priority.rb +11 -0
  118. data/lib/freight_kit/carriers/first_trucking_express.rb +10 -0
  119. data/lib/freight_kit/carriers/flash_trucking.rb +10 -0
  120. data/lib/freight_kit/carriers/fort_transportation_and_service_company_inc.rb +37 -0
  121. data/lib/freight_kit/carriers/forward_air.rb +781 -0
  122. data/lib/freight_kit/carriers/frahtex.rb +10 -0
  123. data/lib/freight_kit/carriers/frozen_food_express.rb +10 -0
  124. data/lib/freight_kit/carriers/gholia_bros_trucking.rb +36 -0
  125. data/lib/freight_kit/carriers/global_cargo.rb +10 -0
  126. data/lib/freight_kit/carriers/global_logistics_and_transportation.rb +10 -0
  127. data/lib/freight_kit/carriers/gls_freight.rb +32 -0
  128. data/lib/freight_kit/carriers/go_trucking_services.rb +10 -0
  129. data/lib/freight_kit/carriers/gold_eagle_transportation.rb +11 -0
  130. data/lib/freight_kit/carriers/golden_drop_trucking.rb +10 -0
  131. data/lib/freight_kit/carriers/gonzalez_transportation.rb +10 -0
  132. data/lib/freight_kit/carriers/gps_transport.rb +10 -0
  133. data/lib/freight_kit/carriers/greene_enterprise.rb +10 -0
  134. data/lib/freight_kit/carriers/gsa_international.rb +10 -0
  135. data/lib/freight_kit/carriers/gsp_express.rb +24 -0
  136. data/lib/freight_kit/carriers/gsv_transportation.rb +10 -0
  137. data/lib/freight_kit/carriers/gta_transportation.rb +10 -0
  138. data/lib/freight_kit/carriers/guam_freight_services.rb +10 -0
  139. data/lib/freight_kit/carriers/harrah_transportation.rb +23 -0
  140. data/lib/freight_kit/carriers/her_trucking.rb +10 -0
  141. data/lib/freight_kit/carriers/hercules_freight.rb +20 -0
  142. data/lib/freight_kit/carriers/highlander_xpress.rb +36 -0
  143. data/lib/freight_kit/carriers/hn_transport.rb +10 -0
  144. data/lib/freight_kit/carriers/honolulu_freight_service.rb +10 -0
  145. data/lib/freight_kit/carriers/hot_line_freight_system_inc.rb +12 -0
  146. data/lib/freight_kit/carriers/hotshot_freight_of_texas.rb +13 -0
  147. data/lib/freight_kit/carriers/houser_transport.rb +27 -0
  148. data/lib/freight_kit/carriers/infiniti_freight_logistics.rb +28 -0
  149. data/lib/freight_kit/carriers/infinity_trucking.rb +10 -0
  150. data/lib/freight_kit/carriers/interstate_tma.rb +10 -0
  151. data/lib/freight_kit/carriers/intrade_industries.rb +10 -0
  152. data/lib/freight_kit/carriers/jasper_trucking.rb +28 -0
  153. data/lib/freight_kit/carriers/jb_hunt.rb +11 -0
  154. data/lib/freight_kit/carriers/jfj_transportation.rb +8 -8
  155. data/lib/freight_kit/carriers/jkb_express.rb +10 -0
  156. data/lib/freight_kit/carriers/jlm_transport.rb +10 -0
  157. data/lib/freight_kit/carriers/johansson_transport.rb +10 -0
  158. data/lib/freight_kit/carriers/jones_express.rb +10 -0
  159. data/lib/freight_kit/carriers/jp_logistics.rb +41 -0
  160. data/lib/freight_kit/carriers/just_in_time_cargo.rb +29 -0
  161. data/lib/freight_kit/carriers/kengkok_times.rb +10 -0
  162. data/lib/freight_kit/carriers/kings_express.rb +10 -0
  163. data/lib/freight_kit/carriers/klc_transportation.rb +10 -0
  164. data/lib/freight_kit/carriers/km_trucking.rb +10 -0
  165. data/lib/freight_kit/carriers/kma_logistics.rb +10 -0
  166. data/lib/freight_kit/carriers/krc_logistics.rb +10 -0
  167. data/lib/freight_kit/carriers/ktx.rb +10 -0
  168. data/lib/freight_kit/carriers/landstar.rb +25 -0
  169. data/lib/freight_kit/carriers/lanter_distributing_llc.rb +30 -0
  170. data/lib/freight_kit/carriers/ld_trucking.rb +10 -0
  171. data/lib/freight_kit/carriers/legacy_logistics_solutions.rb +10 -0
  172. data/lib/freight_kit/carriers/leonards_express.rb +10 -0
  173. data/lib/freight_kit/carriers/liberty_linehaul_west.rb +28 -0
  174. data/lib/freight_kit/carriers/liberty_transport.rb +10 -0
  175. data/lib/freight_kit/carriers/lightning_express.rb +10 -0
  176. data/lib/freight_kit/carriers/lj_express.rb +24 -0
  177. data/lib/freight_kit/carriers/lkp_enterprises.rb +10 -0
  178. data/lib/freight_kit/carriers/ltl_pros.rb +28 -0
  179. data/lib/freight_kit/carriers/m_and_m_and_sons.rb +10 -0
  180. data/lib/freight_kit/carriers/mag_lines_transport.rb +10 -0
  181. data/lib/freight_kit/carriers/magic_messenger.rb +24 -0
  182. data/lib/freight_kit/carriers/majors_transit.rb +10 -0
  183. data/lib/freight_kit/carriers/map_global_logistics.rb +10 -0
  184. data/lib/freight_kit/carriers/matths_trucking.rb +11 -0
  185. data/lib/freight_kit/carriers/mav_canadian_transport.rb +13 -0
  186. data/lib/freight_kit/carriers/mc_systems.rb +35 -0
  187. data/lib/freight_kit/carriers/mega_fleet.rb +10 -0
  188. data/lib/freight_kit/carriers/mega_trans_group.rb +28 -0
  189. data/lib/freight_kit/carriers/meta_express.rb +10 -0
  190. data/lib/freight_kit/carriers/mia_transportation.rb +10 -0
  191. data/lib/freight_kit/carriers/midwest_motor_express.rb +14 -0
  192. data/lib/freight_kit/carriers/midwest_transport_and_trucking.rb +10 -0
  193. data/lib/freight_kit/carriers/mikade_delivery_service.rb +10 -0
  194. data/lib/freight_kit/carriers/mohoff_freight_lines.rb +23 -0
  195. data/lib/freight_kit/carriers/montata_travelers_express.rb +10 -0
  196. data/lib/freight_kit/carriers/morgan_van_lines.rb +29 -0
  197. data/lib/freight_kit/carriers/moto_transportation.rb +24 -0
  198. data/lib/freight_kit/carriers/mountain_valley_express.rb +197 -0
  199. data/lib/freight_kit/carriers/ms_freight.rb +27 -0
  200. data/lib/freight_kit/carriers/mvg_transport.rb +10 -0
  201. data/lib/freight_kit/carriers/n_and_m_transfer_co_inc.rb +29 -0
  202. data/lib/freight_kit/carriers/nabot_transport_solutions.rb +10 -0
  203. data/lib/freight_kit/carriers/national_freight_xpress.rb +10 -0
  204. data/lib/freight_kit/carriers/navigation_group.rb +10 -0
  205. data/lib/freight_kit/carriers/nelson_trucking.rb +10 -0
  206. data/lib/freight_kit/carriers/network_1_transportation.rb +10 -0
  207. data/lib/freight_kit/carriers/new_century_transport.rb +28 -0
  208. data/lib/freight_kit/carriers/new_penn_motor_express.rb +11 -0
  209. data/lib/freight_kit/carriers/nieves_transportation.rb +10 -0
  210. data/lib/freight_kit/carriers/nolan_transportation_group.rb +26 -0
  211. data/lib/freight_kit/carriers/northland_trucking.rb +10 -0
  212. data/lib/freight_kit/carriers/northwest_carrier_logistics.rb +27 -0
  213. data/lib/freight_kit/carriers/nt_usa.rb +10 -0
  214. data/lib/freight_kit/carriers/nu_line_transportation.rb +10 -0
  215. data/lib/freight_kit/carriers/numark_transportation.rb +80 -0
  216. data/lib/freight_kit/carriers/nvk_transport.rb +10 -0
  217. data/lib/freight_kit/carriers/ny_transport.rb +10 -0
  218. data/lib/freight_kit/carriers/oak_harbor.rb +28 -0
  219. data/lib/freight_kit/carriers/oakline_transportation.rb +10 -0
  220. data/lib/freight_kit/carriers/old_dominion_freight_line.rb +30 -0
  221. data/lib/freight_kit/carriers/on_trac.rb +555 -0
  222. data/lib/freight_kit/carriers/one_hundred_one_transport.rb +10 -0
  223. data/lib/freight_kit/carriers/one_way_delivery.rb +10 -0
  224. data/lib/freight_kit/carriers/oracle_transportation_solutions.rb +10 -0
  225. data/lib/freight_kit/carriers/orange_courier.rb +27 -0
  226. data/lib/freight_kit/carriers/ortas_trucking.rb +10 -0
  227. data/lib/freight_kit/carriers/pac_trux_transportation.rb +10 -0
  228. data/lib/freight_kit/carriers/pacer.rb +10 -0
  229. data/lib/freight_kit/carriers/pacific_logistics.rb +10 -0
  230. data/lib/freight_kit/carriers/pacific_states_truck_lines.rb +10 -0
  231. data/lib/freight_kit/carriers/paradise_distributing.rb +10 -0
  232. data/lib/freight_kit/carriers/paramount_freight_systems.rb +10 -0
  233. data/lib/freight_kit/carriers/peninsula_truck_lines.rb +206 -0
  234. data/lib/freight_kit/carriers/pg_transport.rb +10 -0
  235. data/lib/freight_kit/carriers/pgs_360.rb +10 -0
  236. data/lib/freight_kit/carriers/pilot_freight_services.rb +10 -0
  237. data/lib/freight_kit/carriers/pious_trans.rb +27 -0
  238. data/lib/freight_kit/carriers/pitt_ohio_express.rb +30 -0
  239. data/lib/freight_kit/carriers/pki_logistics.rb +12 -0
  240. data/lib/freight_kit/carriers/plana_transportation.rb +28 -0
  241. data/lib/freight_kit/carriers/prestige.rb +10 -0
  242. data/lib/freight_kit/carriers/pro_trans_solutions.rb +28 -0
  243. data/lib/freight_kit/carriers/puma_logistics.rb +10 -0
  244. data/lib/freight_kit/carriers/pwc_international.rb +10 -0
  245. data/lib/freight_kit/carriers/quality_logistics.rb +10 -0
  246. data/lib/freight_kit/carriers/queen_star_trucking.rb +27 -0
  247. data/lib/freight_kit/carriers/r_and_l_carriers.rb +11 -0
  248. data/lib/freight_kit/carriers/rac_transport.rb +10 -0
  249. data/lib/freight_kit/carriers/re_logistics.rb +23 -0
  250. data/lib/freight_kit/carriers/reddaway.rb +11 -0
  251. data/lib/freight_kit/carriers/reefer_van_network.rb +13 -0
  252. data/lib/freight_kit/carriers/refrigerated_trucking_and_ltl_transportation_services.rb +10 -0
  253. data/lib/freight_kit/carriers/ridgeline_express.rb +10 -0
  254. data/lib/freight_kit/carriers/rist_transport.rb +29 -0
  255. data/lib/freight_kit/carriers/river_city_transport.rb +10 -0
  256. data/lib/freight_kit/carriers/roadrunner_transportation_services.rb +669 -0
  257. data/lib/freight_kit/carriers/roadtex.rb +13 -0
  258. data/lib/freight_kit/carriers/ronald_transport_services.rb +10 -0
  259. data/lib/freight_kit/carriers/rose_trucking.rb +24 -0
  260. data/lib/freight_kit/carriers/rp_and_j_transport.rb +24 -0
  261. data/lib/freight_kit/carriers/rpm_transportation.rb +11 -0
  262. data/lib/freight_kit/carriers/rude_transportation.rb +30 -0
  263. data/lib/freight_kit/carriers/s_and_s_logistics.rb +10 -0
  264. data/lib/freight_kit/carriers/saia.rb +456 -362
  265. data/lib/freight_kit/carriers/sb_transportation.rb +27 -0
  266. data/lib/freight_kit/carriers/schneider_national.rb +29 -0
  267. data/lib/freight_kit/carriers/schwarz_trucking.rb +10 -0
  268. data/lib/freight_kit/carriers/sewell_motor_express.rb +29 -0
  269. data/lib/freight_kit/carriers/shawnee_trucking.rb +28 -0
  270. data/lib/freight_kit/carriers/shi_logistics.rb +10 -0
  271. data/lib/freight_kit/carriers/sinbad_transport.rb +10 -0
  272. data/lib/freight_kit/carriers/skyway.rb +10 -0
  273. data/lib/freight_kit/carriers/smith_cargo_transportation_services.rb +23 -0
  274. data/lib/freight_kit/carriers/sna_transportation.rb +10 -0
  275. data/lib/freight_kit/carriers/solid_group.rb +10 -0
  276. data/lib/freight_kit/carriers/solution_carrier_express.rb +10 -0
  277. data/lib/freight_kit/carriers/southeastern_freight_lines.rb +441 -0
  278. data/lib/freight_kit/carriers/southwestern_motor_transport.rb +30 -0
  279. data/lib/freight_kit/carriers/span_alaska.rb +10 -0
  280. data/lib/freight_kit/carriers/specialize_transportation.rb +27 -0
  281. data/lib/freight_kit/carriers/ssi_refrigerated_express.rb +10 -0
  282. data/lib/freight_kit/carriers/standard_forwarding_llc.rb +28 -0
  283. data/lib/freight_kit/carriers/star_american_enterprise.rb +10 -0
  284. data/lib/freight_kit/carriers/sterling_transportation.rb +10 -0
  285. data/lib/freight_kit/carriers/stg.rb +163 -0
  286. data/lib/freight_kit/carriers/supervan_service.rb +10 -0
  287. data/lib/freight_kit/carriers/sutton_transport_inc.rb +12 -0
  288. data/lib/freight_kit/carriers/swift_transportation.rb +28 -0
  289. data/lib/freight_kit/carriers/t_force_worldwide.rb +605 -0
  290. data/lib/freight_kit/carriers/tax_airfreight_inc.rb +35 -0
  291. data/lib/freight_kit/carriers/tforce_freight_inc.rb +30 -0
  292. data/lib/freight_kit/carriers/the_custom_companies.rb +162 -0
  293. data/lib/freight_kit/carriers/thk_trucking.rb +28 -0
  294. data/lib/freight_kit/carriers/tiger_cool_express.rb +11 -0
  295. data/lib/freight_kit/carriers/tili_logistics.rb +10 -0
  296. data/lib/freight_kit/carriers/tmt_industries.rb +10 -0
  297. data/lib/freight_kit/carriers/top_ten_express.rb +28 -0
  298. data/lib/freight_kit/carriers/total_quality_logistics.rb +339 -0
  299. data/lib/freight_kit/carriers/total_transportation.rb +258 -0
  300. data/lib/freight_kit/carriers/trans_international_trucking.rb +29 -0
  301. data/lib/freight_kit/carriers/treasure_transportation.rb +10 -0
  302. data/lib/freight_kit/carriers/tri_state_services.rb +10 -0
  303. data/lib/freight_kit/carriers/tritex_freighters.rb +10 -0
  304. data/lib/freight_kit/carriers/triways.rb +10 -0
  305. data/lib/freight_kit/carriers/tsi_kansas.rb +29 -0
  306. data/lib/freight_kit/carriers/u_and_r_transportation.rb +23 -0
  307. data/lib/freight_kit/carriers/union_pacific.rb +11 -0
  308. data/lib/freight_kit/carriers/united_freight_logistics.rb +10 -0
  309. data/lib/freight_kit/carriers/unlimited_distance_transportation.rb +10 -0
  310. data/lib/freight_kit/carriers/up_streamline.rb +10 -0
  311. data/lib/freight_kit/carriers/ups_freight.rb +12 -0
  312. data/lib/freight_kit/carriers/us_freightways.rb +10 -0
  313. data/lib/freight_kit/carriers/usa_truck.rb +28 -0
  314. data/lib/freight_kit/carriers/usf_holland.rb +11 -0
  315. data/lib/freight_kit/carriers/valley_cartage.rb +11 -0
  316. data/lib/freight_kit/carriers/vc_transport.rb +10 -0
  317. data/lib/freight_kit/carriers/vision_express.rb +11 -0
  318. data/lib/freight_kit/carriers/vision_logistics_group.rb +10 -0
  319. data/lib/freight_kit/carriers/vmg_transportation_group.rb +10 -0
  320. data/lib/freight_kit/carriers/volpe_express.rb +10 -0
  321. data/lib/freight_kit/carriers/ward_trucking.rb +29 -0
  322. data/lib/freight_kit/carriers/wdwb.rb +10 -0
  323. data/lib/freight_kit/carriers/western_flyer_express.rb +28 -0
  324. data/lib/freight_kit/carriers/western_regional_delivery_service.rb +265 -0
  325. data/lib/freight_kit/carriers/western_specialized_trucking.rb +22 -0
  326. data/lib/freight_kit/carriers/win_distribution.rb +28 -0
  327. data/lib/freight_kit/carriers/wlb_transport.rb +10 -0
  328. data/lib/freight_kit/carriers/x_trux.rb +29 -0
  329. data/lib/freight_kit/carriers/xpo_logistics.rb +415 -0
  330. data/lib/freight_kit/carriers/xpress_global_systems.rb +30 -0
  331. data/lib/freight_kit/carriers/xylo_trucking.rb +10 -0
  332. data/lib/freight_kit/carriers/yrc_freight.rb +24 -0
  333. data/lib/freight_kit/carriers/zentner_transportation.rb +28 -0
  334. data/lib/freight_kit/carriers.rb +331 -34
  335. data/lib/freight_kit/countries.rb +22 -0
  336. data/lib/freight_kit/error.rb +0 -2
  337. data/lib/freight_kit/errors/document_not_found_error.rb +0 -2
  338. data/lib/freight_kit/errors/expired_credentials_error.rb +0 -2
  339. data/lib/freight_kit/errors/http_error.rb +0 -2
  340. data/lib/freight_kit/errors/invalid_credentials_error.rb +0 -2
  341. data/lib/freight_kit/errors/rate_limit_error.rb +12 -0
  342. data/lib/freight_kit/errors/response_error.rb +0 -2
  343. data/lib/freight_kit/errors/shipment_not_found_error.rb +0 -2
  344. data/lib/freight_kit/errors/unserviceable_accessorials_error.rb +1 -5
  345. data/lib/freight_kit/errors/unserviceable_error.rb +0 -2
  346. data/lib/freight_kit/helpers/documentable.rb +0 -2
  347. data/lib/freight_kit/helpers/pickupable.rb +3 -14
  348. data/lib/freight_kit/helpers/rateable.rb +0 -2
  349. data/lib/freight_kit/helpers/trackable.rb +0 -2
  350. data/lib/freight_kit/http_client/cache_store.rb +2 -4
  351. data/lib/freight_kit/http_client/httpi_adapter.rb +37 -0
  352. data/lib/freight_kit/http_client/log_device.rb +0 -2
  353. data/lib/freight_kit/http_client/response.rb +0 -2
  354. data/lib/freight_kit/http_client/revalidation.rb +0 -2
  355. data/lib/freight_kit/http_client/safe_retries.rb +17 -3
  356. data/lib/freight_kit/http_client/zstd.rb +2 -4
  357. data/lib/freight_kit/http_client.rb +21 -21
  358. data/lib/freight_kit/model.rb +1 -3
  359. data/lib/freight_kit/models/address.rb +15 -0
  360. data/lib/freight_kit/models/contact.rb +3 -4
  361. data/lib/freight_kit/models/country.rb +20 -0
  362. data/lib/freight_kit/models/credential.rb +3 -18
  363. data/lib/freight_kit/models/date_time.rb +0 -2
  364. data/lib/freight_kit/models/document_response.rb +0 -2
  365. data/lib/freight_kit/models/label.rb +0 -2
  366. data/lib/freight_kit/models/location.rb +10 -25
  367. data/lib/freight_kit/models/pickup_response.rb +0 -2
  368. data/lib/freight_kit/models/price.rb +0 -2
  369. data/lib/freight_kit/models/rate.rb +0 -2
  370. data/lib/freight_kit/models/rate_response.rb +0 -2
  371. data/lib/freight_kit/models/region.rb +19 -0
  372. data/lib/freight_kit/models/response.rb +0 -2
  373. data/lib/freight_kit/models/shipment.rb +5 -14
  374. data/lib/freight_kit/models/shipment_event.rb +0 -2
  375. data/lib/freight_kit/models/terminal.rb +10 -0
  376. data/lib/freight_kit/models/tracking_response.rb +0 -2
  377. data/lib/freight_kit/package.rb +52 -64
  378. data/lib/freight_kit/package_item.rb +14 -14
  379. data/lib/freight_kit/packaging.rb +6 -26
  380. data/lib/freight_kit/platform.rb +0 -32
  381. data/lib/freight_kit/platforms/carrier_logistics.rb +326 -345
  382. data/lib/freight_kit/platforms/dsdc.rb +82 -0
  383. data/lib/freight_kit/platforms/next_tms/graphql_client/mutation/quote_create.rb +32 -0
  384. data/lib/freight_kit/platforms/next_tms/graphql_client/mutation/shipment_create.rb +29 -0
  385. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_carrier.rb +37 -0
  386. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_carriers.rb +45 -0
  387. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_customer.rb +54 -0
  388. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_customers.rb +62 -0
  389. data/lib/freight_kit/platforms/next_tms/graphql_client/query/carrier.rb +22 -0
  390. data/lib/freight_kit/platforms/next_tms/graphql_client/query/carriers.rb +30 -0
  391. data/lib/freight_kit/platforms/next_tms/graphql_client/query/customer.rb +20 -0
  392. data/lib/freight_kit/platforms/next_tms/graphql_client/query/customers.rb +28 -0
  393. data/lib/freight_kit/platforms/next_tms/graphql_client/query/invoice.rb +31 -0
  394. data/lib/freight_kit/platforms/next_tms/graphql_client/query/invoices.rb +39 -0
  395. data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipment.rb +102 -0
  396. data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipment_documents.rb +29 -0
  397. data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipments.rb +110 -0
  398. data/lib/freight_kit/platforms/next_tms/graphql_client.rb +22 -0
  399. data/lib/freight_kit/platforms/next_tms/orm/address.rb +22 -0
  400. data/lib/freight_kit/platforms/next_tms/orm/base.rb +120 -0
  401. data/lib/freight_kit/platforms/next_tms/orm/broker_carrier.rb +18 -0
  402. data/lib/freight_kit/platforms/next_tms/orm/broker_customer.rb +22 -0
  403. data/lib/freight_kit/platforms/next_tms/orm/carrier.rb +14 -0
  404. data/lib/freight_kit/platforms/next_tms/orm/collection.rb +335 -0
  405. data/lib/freight_kit/platforms/next_tms/orm/customer.rb +12 -0
  406. data/lib/freight_kit/platforms/next_tms/orm/invoice.rb +21 -0
  407. data/lib/freight_kit/platforms/next_tms/orm/record_not_found_error.rb +9 -0
  408. data/lib/freight_kit/platforms/next_tms/orm/shipment.rb +50 -0
  409. data/lib/freight_kit/platforms/next_tms/orm.rb +38 -0
  410. data/lib/freight_kit/platforms/next_tms.rb +452 -0
  411. data/lib/freight_kit/platforms/the_great_information_factory.rb +492 -425
  412. data/lib/freight_kit/regions.rb +27 -0
  413. data/lib/freight_kit/shipment_packer.rb +36 -38
  414. data/lib/freight_kit/tariff/overlength_rule.rb +1 -5
  415. data/lib/freight_kit/tariff.rb +0 -2
  416. data/lib/freight_kit.rb +103 -11
  417. data/schemas/next_tms.json +110710 -0
  418. metadata +443 -55
  419. data/configuration/carriers/abfs.yml +0 -124
  420. data/configuration/carriers/btvp.yml +0 -84
  421. data/configuration/carriers/ccyq.yml +0 -121
  422. data/configuration/carriers/clni.yml +0 -113
  423. data/configuration/carriers/cnwy.yml +0 -113
  424. data/configuration/carriers/ctbv.yml +0 -117
  425. data/configuration/carriers/dcha.yml +0 -105
  426. data/configuration/carriers/dlds.yml +0 -111
  427. data/configuration/carriers/dphe.yml +0 -130
  428. data/configuration/carriers/drrq.yml +0 -131
  429. data/configuration/carriers/fcsy.yml +0 -102
  430. data/configuration/carriers/fwda.yml +0 -137
  431. data/configuration/carriers/jfj_transportation.yml +0 -2
  432. data/configuration/carriers/mtvl.yml +0 -12
  433. data/configuration/carriers/numk.yml +0 -14
  434. data/configuration/carriers/otcl.yml +0 -124
  435. data/configuration/carriers/pens.yml +0 -22
  436. data/configuration/carriers/rdfs.yml +0 -142
  437. data/configuration/carriers/saia.yml +0 -129
  438. data/configuration/carriers/sefl.yml +0 -115
  439. data/configuration/carriers/totl.yml +0 -111
  440. data/configuration/carriers/tqyl.yml +0 -28
  441. data/configuration/carriers/wrds.yml +0 -20
  442. data/configuration/platforms/carrier_logistics.yml +0 -25
  443. data/configuration/platforms/next.yml +0 -12
  444. data/configuration/platforms/the_great_information_factory.yml +0 -122
  445. data/lib/freight_kit/carriers/abfs.rb +0 -421
  446. data/lib/freight_kit/carriers/btvp.rb +0 -29
  447. data/lib/freight_kit/carriers/ccyq.rb +0 -310
  448. data/lib/freight_kit/carriers/clni.rb +0 -396
  449. data/lib/freight_kit/carriers/cnwy.rb +0 -327
  450. data/lib/freight_kit/carriers/ctbv.rb +0 -53
  451. data/lib/freight_kit/carriers/dcha.rb +0 -76
  452. data/lib/freight_kit/carriers/dlds.rb +0 -49
  453. data/lib/freight_kit/carriers/dphe.rb +0 -472
  454. data/lib/freight_kit/carriers/drrq.rb +0 -580
  455. data/lib/freight_kit/carriers/fcsy.rb +0 -57
  456. data/lib/freight_kit/carriers/fwda.rb +0 -744
  457. data/lib/freight_kit/carriers/mtvl.rb +0 -34
  458. data/lib/freight_kit/carriers/numk.rb +0 -58
  459. data/lib/freight_kit/carriers/otcl.rb +0 -520
  460. data/lib/freight_kit/carriers/pens.rb +0 -204
  461. data/lib/freight_kit/carriers/rdfs.rb +0 -521
  462. data/lib/freight_kit/carriers/sefl.rb +0 -342
  463. data/lib/freight_kit/carriers/totl.rb +0 -172
  464. data/lib/freight_kit/carriers/tqyl.rb +0 -337
  465. data/lib/freight_kit/carriers/wrds.rb +0 -246
  466. data/lib/freight_kit/platforms/next.rb +0 -101
@@ -0,0 +1,669 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class RoadrunnerTransportationServices < Carrier
4
+ class << self
5
+ def check_mailing_addresses
6
+ [
7
+ Address.new(
8
+ city: 'Chicago',
9
+ country: Countries.find_by(iso31661_alpha2: 'US'),
10
+ id: 'f436b32e-7ae2-4fe8-a8a7-f410d75d9cfc',
11
+ postal_code: '60694',
12
+ region_abbreviation: 'IL',
13
+ street: 'PO Box 74857'
14
+ )
15
+ ]
16
+ end
17
+
18
+ def contacts
19
+ [
20
+ Contact.new(department: 'Dispatch - Mira Loma, CA', id: 'dc14714f-e381-4b8b-97a6-f002c0897409', phone: '+19513615900'),
21
+ Contact.new(department: 'Main', id: '22203680-060c-41db-ba65-9925e8fa381d', phone: '+14146151696')
22
+ ]
23
+ end
24
+
25
+ def headquarters
26
+ Address.new(
27
+ city: 'Milwaukee',
28
+ country: Countries.find_by(iso31661_alpha2: 'US'),
29
+ id: 'a9baff89-6ef0-4c88-9dd5-05c53e355a9c',
30
+ postal_code: '53224',
31
+ region_abbreviation: 'WI',
32
+ street: '9160 N 107th'
33
+ )
34
+ end
35
+
36
+ def id = '62f7ca47-7577-4ad0-a54a-e37d2ffa6696'
37
+ def legal_name = 'Roadrunner Transportation Services Inc'
38
+
39
+ def mappable_accessorials
40
+ {
41
+ afterhours_delivery: 'NBD',
42
+ airport_delivery: 'AID',
43
+ airport_pickup: 'AIP',
44
+ amusement_park_delivery: 'AMD',
45
+ amusement_park_pickup: 'AMP',
46
+ appointment_delivery: 'APT',
47
+ church_delivery: 'CHD',
48
+ church_pickup: 'CHP',
49
+ construction_delivery: 'CSD',
50
+ construction_pickup: 'CSP',
51
+ farm_delivery: 'FAD',
52
+ farm_pickup: 'FAP',
53
+ golf_course_delivery: 'CCD',
54
+ golf_course_pickup: 'CCP',
55
+ government_delivery: 'GSD',
56
+ grocery_warehouse_delivery: 'GWD',
57
+ grocery_warehouse_pickup: 'GWP',
58
+ hotel_delivery: 'HHD',
59
+ hotel_pickup: 'HHP',
60
+ inside_delivery: 'ID',
61
+ inside_pickup: 'IP',
62
+ jobsite_delivery: 'CSD',
63
+ jobsite_pickup: 'CSP',
64
+ liftgate_delivery: 'LGD',
65
+ liftgate_pickup: 'LGP',
66
+ military_site_delivery: 'GSD',
67
+ mine_site_delivery: 'MSD',
68
+ nursing_home_delivery: 'NHD',
69
+ nursing_home_pickup: 'NHP',
70
+ park_delivery: 'CPD',
71
+ park_pickup: 'CPP',
72
+ prison_delivery: 'PSD',
73
+ ranch_delivery: 'FAD',
74
+ ranch_pickup: 'FAP',
75
+ reservation_delivery: 'IRD',
76
+ reservation_pickup: 'IRP',
77
+ residential_delivery: 'RSD',
78
+ residential_pickup: 'RSP',
79
+ resort_delivery: 'CPD',
80
+ resort_pickup: 'CPP',
81
+ school_delivery: 'SHD',
82
+ school_pickup: 'SHP',
83
+ university_delivery: 'SHD',
84
+ university_pickup: 'SHP',
85
+ storage_facility_delivery: 'STD',
86
+ storage_facility_pickup: 'STP',
87
+ utility_site_delivery: 'USD',
88
+ utility_site_pickup: 'USP'
89
+ }
90
+ end
91
+
92
+ def maximum_height = Measured::Length.new(105, :inches)
93
+ def maximum_weight = Measured::Weight.new(10_000, :pounds)
94
+ def minimum_length_for_overlength_fees = Measured::Length.new(8, :feet)
95
+ def name = 'Roadrunner Transportation Services'
96
+ def overlength_fees_require_tariff? = false
97
+ def required_credential_types = %i[website]
98
+ def requirements = %i[credentials]
99
+ def scac = 'RDFS'
100
+ def services = %i[standard]
101
+
102
+ def terminals
103
+ [
104
+ Terminal.new(
105
+ address: Address.new(
106
+ city: 'Los Angeles',
107
+ country: Countries.find_by(iso31661_alpha2: 'US'),
108
+ id: '8fcc2577-d11e-4f1b-baf0-eeb092ce78fa',
109
+ postal_code: '90040',
110
+ region_abbreviation: 'CA',
111
+ street: '4501 E Washington Blvd #2'
112
+ ),
113
+ id: '37649eaf-fcb1-4917-993a-cd82099b86ad',
114
+ phone: '+13237803488'
115
+ ),
116
+ Terminal.new(
117
+ address: Address.new(
118
+ city: 'Memphis',
119
+ country: Countries.find_by(iso31661_alpha2: 'US'),
120
+ id: 'ae6dd9b3-46b6-433d-b1d9-ba80cad25ce3',
121
+ postal_code: '38118',
122
+ region_abbreviation: 'TN',
123
+ street: '3845 Crowfarn Dr'
124
+ ),
125
+ id: 'b6d14db7-d645-491f-b205-7b2b0e2d6a95',
126
+ phone: '+19013007860'
127
+ ),
128
+ Terminal.new(
129
+ address: Address.new(
130
+ city: 'Indianapolis',
131
+ country: Countries.find_by(iso31661_alpha2: 'US'),
132
+ id: 'da0296b5-7dba-4e3d-8fb2-cbe9ac368511',
133
+ postal_code: '46241',
134
+ region_abbreviation: 'IN',
135
+ street: '5751 Dividend Rd'
136
+ ),
137
+ id: '56f382aa-cc26-462c-8bcb-0f5de30b190b',
138
+ phone: '+13177918978'
139
+ )
140
+ ]
141
+ end
142
+
143
+ def unquotable_accessorials
144
+ %i[
145
+ athletic_facility_delivery
146
+ athletic_facility_pickup
147
+ cemetery_delivery
148
+ cemetery_pickup
149
+ dock_dropoff
150
+ dock_pickup
151
+ fitness_center_delivery
152
+ fitness_center_pickup
153
+ government_pickup
154
+ grocery_store_delivery
155
+ grocery_store_pickup
156
+ hospital_delivery
157
+ hospital_pickup
158
+ inspection_site_delivery
159
+ inspection_site_pickup
160
+ mall_delivery
161
+ mall_pickup
162
+ marina_delivery
163
+ marina_pickup
164
+ military_site_pickup
165
+ mine_site_pickup
166
+ motel_delivery
167
+ motel_pickup
168
+ prison_pickup
169
+ restaurant_delivery
170
+ restaurant_pickup
171
+ steel_mill_delivery
172
+ steel_mill_pickup
173
+ ]
174
+ end
175
+
176
+ def unserviceable_accessorials
177
+ %i[
178
+ appointment_pickup
179
+ brewery_delivery
180
+ brewery_pickup
181
+ convention_delivery
182
+ convention_pickup
183
+ customs_brokerage
184
+ driver_assist
185
+ early_morning_delivery
186
+ fair_delivery
187
+ fair_pickup
188
+ flatbed_delivery
189
+ flatbed_pickup
190
+ guaranteed_delivery_am
191
+ guaranteed_delivery_pm
192
+ guaranteed_delivery
193
+ winery_delivery
194
+ winery_pickup
195
+ ]
196
+ end
197
+
198
+ def us_dot_number = 242_009
199
+ def us_mc_number = 170_247
200
+ def website_url = 'https://freight.rrts.com'
201
+ end
202
+
203
+ include FreightKit::Rateable
204
+
205
+ API = {
206
+ actions: { rates: :rate_quote_by_account },
207
+ domains: {
208
+ bol: 'tools.rrts.com',
209
+ pod: 'tools.rrts.com',
210
+ rates: 'webservices.rrts.com',
211
+ track: 'webservices.rrts.com',
212
+ tracking_number_from_pickup_number: 'tools.rrts.com'
213
+ },
214
+ endpoints: {
215
+ bol: '/LTLTrack/Home/ShowImage?proNumber=%%TRACKING_NUMBER%%&imageType=BOL',
216
+ pod: '/LTLTrack/Home/ShowImage?proNumber=%%TRACKING_NUMBER%%&imageType=POD',
217
+ rates: '/rating/ratequote.asmx?wsdl',
218
+ track: '/TrackWebApi/api/values',
219
+ tracking_number_from_pickup_number: '/LTLTrack/?searchValues=%%PICKUP_NUMBER%%'
220
+ },
221
+ soap: { namespaces: { rates: 'https://webservices.rrts.com/ratequote/' } },
222
+ use_ssl: { bol: false, pod: false, rates: false, track: true, tracking_number_from_pickup_number: false }
223
+ }.freeze
224
+ EVENTS = {
225
+ types: {
226
+ arrived_at_terminal: 'ARV',
227
+ delayed_due_to_weather: 'WTR',
228
+ delivered: 'DEL',
229
+ delivery_appointment_scheduled: 'APT',
230
+ departed: 'DSP',
231
+ located: 'ENR',
232
+ out_for_delivery: 'OFD',
233
+ pending_delivery_appointment: 'CFA',
234
+ picked_up: 'PU',
235
+ trailer_closed: 'CLO',
236
+ trailer_unloaded: 'UNL'
237
+ }
238
+ }.freeze
239
+
240
+ # Documents
241
+
242
+ def find_tracking_info(tracking_number)
243
+ response = commit_tracking_request(tracking_number)
244
+
245
+ parse_tracking_response(response)
246
+ end
247
+
248
+ def find_tracking_number_from_pickup_number(pickup_number, _date)
249
+ parse_tracking_number_from_pickup_number_response(pickup_number)
250
+ end
251
+
252
+ def pod(tracking_number) = parse_document_response(:pod, tracking_number)
253
+ def scanned_bol(tracking_number) = parse_document_response(:bol, tracking_number)
254
+
255
+ protected
256
+
257
+ def build_rate_request(shipment:)
258
+ api_credential = fetch_credential(:website)
259
+ validate_api_credential!(api_credential)
260
+
261
+ service_delivery_options = [
262
+ # API calls this invalid now
263
+ # service_options: { service_code: 'SS' }
264
+ ]
265
+
266
+ if shipment.accessorials.present?
267
+ serviceable_accessorials?(shipment.accessorials)
268
+
269
+ service_delivery_options = shipment.accessorials.excluding(*unquotable_accessorials).map do |accessorial|
270
+ { service_options: { service_code: mappable_accessorials[accessorial] } }
271
+ end
272
+ end
273
+
274
+ shipment.packages.each do |package|
275
+ longest_dimension = [package.width(:inches), package.length(:inches)].max.ceil
276
+
277
+ next if longest_dimension < 96
278
+
279
+ package.quantity.times do
280
+ if longest_dimension >= 240
281
+ service_delivery_options << { service_options: { service_code: 'EXX' } }
282
+ elsif longest_dimension >= 144
283
+ service_delivery_options << { service_options: { service_code: 'EXL' } }
284
+ elsif longest_dimension >= 96
285
+ service_delivery_options << { service_options: { service_code: 'EXM' } }
286
+ end
287
+ end
288
+ end
289
+
290
+ shipment_detail = []
291
+ shipment_box_count = 0
292
+ shipment_pallet_count = 0
293
+
294
+ shipment.packages.each do |package|
295
+ if package.packaging.type == 'pallet'
296
+ shipment_pallet_count += package.quantity
297
+ else
298
+ shipment_box_count += package.quantity
299
+ end
300
+
301
+ package.quantity.times do
302
+ shipment_detail << { 'ActualClass' => package.freight_class, 'Weight' => package.pounds(:each).ceil }
303
+ end
304
+ end
305
+
306
+ cubic_feet = if shipment.packages.map { |package| package.cubic_ft(:each) }.any?(nil)
307
+ nil
308
+ else
309
+ shipment.packages.sum { |package| package.cubic_ft(:total) }.ceil
310
+ end
311
+
312
+ request = {
313
+ 'request' => {
314
+ account: api_credential.account,
315
+ cubic_feet:,
316
+ destination_zip: shipment.destination.postal_code.gsub(/\s+/, '').upcase,
317
+ # linear_feet: linear_ft(packages),
318
+ origin_type: 'B', # O for shipper, I for consignee, B for third party
319
+ origin_zip: shipment.origin.postal_code.gsub(/\s+/, '').upcase,
320
+ pallet_count: shipment_pallet_count,
321
+ payment_type: 'P', # prepaid
322
+ pieces: shipment_box_count,
323
+ service_delivery_options:,
324
+ shipment_details: { shipment_detail: }
325
+ }
326
+ }
327
+
328
+ save_request(request)
329
+ request
330
+ end
331
+
332
+ def build_soap_header(action)
333
+ api_credential = fetch_credential(:website)
334
+ validate_api_credential!(api_credential)
335
+
336
+ {
337
+ authentication_header: {
338
+ :@xmlns => API.dig(:soap, :namespaces, action),
339
+ password: api_credential.password,
340
+ user_name: api_credential.username
341
+ }
342
+ }
343
+ end
344
+
345
+ def commit(action, request)
346
+ client_args = {
347
+ wsdl: request_url(action),
348
+ convert_request_keys_to: :camelcase,
349
+ env_namespace: :soap,
350
+ element_form_default: :qualified
351
+ }
352
+
353
+ call_args = { soap_header: build_soap_header(action), message: request }
354
+
355
+ soap_operation = API.dig(:actions, action)
356
+
357
+ client = ::FreightKit::SoapClient.new(carrier: self, action:, client_args:, call_args:, soap_operation:)
358
+ client.call(handle_soap_fault_error: false)
359
+ rescue Savon::SOAPFault => e
360
+ invalid_user = e.message.include?('RRTS.Common.BLL.InvalidUserException')
361
+ raise InvalidCredentialsError, 'Invalid credentials' if invalid_user
362
+
363
+ error = if e.respond_to?(:to_hash)
364
+ error_hash = e.to_hash
365
+
366
+ {
367
+ message: error_hash.dig(:fault, :detail, :error, :error_message),
368
+ number: error_hash.dig(:fault, :detail, :error, :error_number)
369
+ }
370
+ else
371
+ {}
372
+ end
373
+
374
+ if error[:message].blank?
375
+ erorr[:message] = if error[:number].present?
376
+ "Error #{error[:number]}"
377
+ else
378
+ 'Unknown error'
379
+ end
380
+ end
381
+
382
+ { error: }
383
+ end
384
+
385
+ def commit_tracking_request(tracking_number)
386
+ uri = URI.parse("#{request_url(:track)}/#{tracking_number}")
387
+ save_request(uri)
388
+
389
+ uri.open
390
+ rescue OpenURI::HTTPError, Errno::EHOSTUNREACH
391
+ nil
392
+ end
393
+
394
+ def parse_amount(amount)
395
+ negative = amount.start_with?('-$') || amount.start_with?('-')
396
+
397
+ ['$', '-', ','].each { |char| amount = amount.sub(char, '') }
398
+
399
+ return 0 if amount.blank?
400
+
401
+ amount = (amount.to_f * 100).to_i
402
+ return amount unless negative
403
+
404
+ amount * -1
405
+ end
406
+
407
+ def parse_api_date_time(date_time, location)
408
+ return if date_time.blank? || date_time == '0001-01-01T00:00:00'
409
+
410
+ local_date_time = ::Time.strptime(date_time, '%Y-%m-%dT%H:%M:%S').to_fs(:db)
411
+ ::FreightKit::DateTime.new(local_date_time:, location:)
412
+ end
413
+
414
+ def parse_api_location(comment, delimiters)
415
+ return if comment.blank? || !comment.include?(delimiters[0])
416
+
417
+ parts = if delimiters.size == 2
418
+ comment.split(delimiters[0])[0].split(delimiters[1])[1].split(',')
419
+ else
420
+ comment.split(delimiters[0])[1].split(',')
421
+ end
422
+
423
+ if parts.size == 1
424
+ str = parts[0].downcase
425
+ return Location.new(city: 'Long Beach', province: 'CA', country: ActiveUtils::Country.find('USA')) if str.include?('long beach')
426
+
427
+ return
428
+ end
429
+
430
+ city = parts[0].squish.strip.titleize
431
+ province = parts[1].gsub('.', '').squish.strip.upcase
432
+ country = ActiveUtils::Country.find('USA')
433
+
434
+ Location.new(city:, province:, country:)
435
+ end
436
+
437
+ def parse_document_response(type, tracking_number)
438
+ url = request_url(type).sub('%%TRACKING_NUMBER%%', tracking_number.to_s)
439
+ document_response = DocumentResponse.new(request: url)
440
+
441
+ begin
442
+ doc = Nokogiri::HTML(URI.parse(url).open)
443
+ rescue OpenURI::HTTPError
444
+ document_response.error = FreightKit::DocumentNotFoundError.new
445
+ return document_response
446
+ end
447
+
448
+ if doc.css('img').blank?
449
+ document_response.error = FreightKit::DocumentNotFoundError.new
450
+ return document_response
451
+ end
452
+
453
+ data = Base64.decode64(doc.css('img').first['src'].split('data:image/jpg;base64,').last)
454
+
455
+ document_response.assign_attributes(content_type: 'image/jpeg', data:)
456
+ document_response
457
+ end
458
+
459
+ def parse_rate_response(shipment:, response:)
460
+ rate_response = RateResponse.new(request: last_request, response:)
461
+
462
+ error_number = response.dig(:error, :number)&.to_i
463
+ error_message = response.dig(:error, :message)
464
+
465
+ if error_number.present?
466
+ case error_number
467
+ when 99_991
468
+ rate_response.error = UnserviceableError.new(error_message)
469
+ return rate_response
470
+ end
471
+ end
472
+
473
+ # @todo Don't rely on error_message
474
+
475
+ if error_message.present? && error_message.downcase.include?('not in the standard pickup area')
476
+ rate_response.error = UnserviceableError
477
+ return rate_response
478
+ end
479
+
480
+ if error_message.present? || error_number.present?
481
+ parts = [error_message]
482
+ parts << "(#{error_number})" if error_number.present?
483
+
484
+ message = parts.compact_blank.join(' ')
485
+
486
+ rate_response.error = ResponseError.new(message)
487
+ return rate_response
488
+ end
489
+
490
+ result = response.dig(:rate_quote_by_account_response, :rate_quote_by_account_result)
491
+
492
+ if result[:net_charge].blank?
493
+ rate_response.error = ResponseError.new('Cost is empty')
494
+ return rate_response
495
+ end
496
+
497
+ estimate_reference = result[:quote_number]
498
+ rate_details = result.dig(:rate_details, :quote_detail)
499
+ transit_days = result.dig(:routing_info, :estimated_transit_days).to_i
500
+
501
+ prices = []
502
+
503
+ rate_details.each do |rate_detail|
504
+ if rate_detail[:description].blank?
505
+ prices << Price.new(blame: :api, cents: parse_amount(rate_detail[:charge]), description: 'Freight')
506
+
507
+ next
508
+ end
509
+
510
+ prices << FreightKit::Price.new(
511
+ blame: :api,
512
+ cents: parse_amount(rate_detail[:charge]),
513
+ description: rate_detail[:description]&.capitalize
514
+ )
515
+ end
516
+
517
+ rate = Rate.new(
518
+ carrier: self,
519
+ carrier_name: name,
520
+ currency: 'USD',
521
+ estimate_reference:,
522
+ scac:,
523
+ service_name: :standard,
524
+ shipment:,
525
+ prices:,
526
+ transit_days:,
527
+ with_excessive_length_fees: rates_with_excessive_length_fees?
528
+ )
529
+
530
+ rate_response.rates = [rate]
531
+ rate_response
532
+ end
533
+
534
+ def parse_tracking_number_from_pickup_number_response(pickup_number)
535
+ url = request_url(:tracking_number_from_pickup_number).sub('%%PICKUP_NUMBER%%', pickup_number.to_s)
536
+
537
+ begin
538
+ doc = Nokogiri::HTML(URI.parse(url).open)
539
+ rescue OpenURI::HTTPError, Errno::EHOSTUNREACH
540
+ return
541
+ end
542
+
543
+ pro = doc.css('#lblProNumber')&.text
544
+
545
+ return if pro.blank? || pro.downcase.include?('not available')
546
+
547
+ pro
548
+ end
549
+
550
+ def parse_tracking_response(response)
551
+ tracking_response = TrackingResponse.new(carrier: self, request: last_request, response:)
552
+
553
+ json = JSON.parse(response&.read || '{}')
554
+
555
+ if json['SearchResults'].blank? || response.status[0] != '200'
556
+ tracking_response.error = ShipmentNotFoundError.new
557
+ return tracking_response
558
+ end
559
+
560
+ search_result = json['SearchResults']&.first
561
+
562
+ pro = search_result.dig('Shipment', 'ProNumber')&.downcase
563
+ if pro.blank? || pro.downcase.include?('not available')
564
+ tracking_response.error = ShipmentNotFoundError.new
565
+ return tracking_response
566
+ end
567
+
568
+ receiver_location = Location.new(
569
+ city: search_result.dig('Shipment', 'Consignee', 'City').titleize,
570
+ province: search_result.dig('Shipment', 'Consignee', 'State').upcase,
571
+ country: ActiveUtils::Country.find('USA')
572
+ )
573
+
574
+ shipper_location = Location.new(
575
+ city: search_result.dig('Shipment', 'Origin', 'City').titleize,
576
+ province: search_result.dig('Shipment', 'Origin', 'State').upcase,
577
+ country: ActiveUtils::Country.find('USA')
578
+ )
579
+
580
+ api_date_time = search_result.dig('Shipment', 'DeliveredDateTime')
581
+ actual_delivery_date = parse_api_date_time(api_date_time, receiver_location)
582
+
583
+ api_date_time = search_result.dig('Shipment', 'ApptDateTime')
584
+ scheduled_delivery_date = parse_api_date_time(api_date_time, receiver_location)
585
+
586
+ tracking_number = search_result.dig('Shipment', 'SearchItem')
587
+
588
+ api_date_time = search_result.dig('Shipment', 'ProDateTime')
589
+ ship_time = parse_api_date_time(api_date_time, shipper_location)
590
+
591
+ last_location = nil
592
+ shipment_events = []
593
+
594
+ search_result.dig('Shipment', 'Comments').each do |api_event|
595
+ type_code = api_event['ActivityCode']
596
+ next if !type_code || type_code == 'ARQ'
597
+
598
+ event = EVENTS[:types].key(type_code)
599
+ next if event.blank?
600
+
601
+ comment = strip_date(api_event['StatusComment'])
602
+
603
+ location = case event
604
+ when :arrived_at_terminal
605
+ parse_api_location(comment, [' terminal in '])
606
+ when :delayed_due_to_weather,
607
+ :delivery_appointment_scheduled,
608
+ :pending_delivery_appointment,
609
+ :trailer_closed,
610
+ :trailer_unloaded
611
+ last_location
612
+ when :delivered
613
+ receiver_location
614
+ when :departed, :out_for_delivery
615
+ parse_api_location(comment, [' to ', 'from '])
616
+ when :located
617
+ parse_api_location(comment, [' currently at '])
618
+ when :picked_up
619
+ shipper_location
620
+ end
621
+
622
+ date_time = parse_api_date_time(api_event['StatusDateTime'], location)
623
+
624
+ last_location = location
625
+
626
+ shipment_events << ShipmentEvent.new(date_time:, location:, type_code: event)
627
+ end
628
+
629
+ status = shipment_events.last&.type_code
630
+
631
+ tracking_response.assign_attributes(
632
+ actual_delivery_date:,
633
+ destination: receiver_location,
634
+ origin: shipper_location,
635
+ scheduled_delivery_date:,
636
+ ship_time:,
637
+ shipment_events:,
638
+ status:,
639
+ tracking_number:
640
+ )
641
+
642
+ tracking_response
643
+ end
644
+
645
+ def request_url(action)
646
+ scheme = API.dig(:use_ssl, action) ? 'https://' : 'http://'
647
+ "#{scheme}#{API.dig(:domains, action)}#{API.dig(:endpoints, action)}"
648
+ end
649
+
650
+ def strip_date(str) = str ? str.split(/[A|P]M /)[1] : nil
651
+
652
+ def validate_api_credential!(api_credential)
653
+ %i[account password username].each do |attribute|
654
+ if !api_credential.respond_to?(attribute) || api_credential.public_send(attribute).blank?
655
+ raise InvalidCredentialsError, "Invalid #{attribute}"
656
+ end
657
+
658
+ next unless attribute == :account
659
+
660
+ # Raises vague input exception from API if we don't handle ourselves
661
+ next if api_credential.account.gsub(/\D/, '') == api_credential.account &&
662
+ api_credential.account.length >= 6
663
+
664
+ raise InvalidCredentialsError, 'Invalid account'
665
+ end
666
+ end
667
+ end
668
+ end
669
+ end
@@ -0,0 +1,13 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class Roadtex < Carrier
4
+ class << self
5
+ def id = 'ba150145-1415-4b0d-8b52-120a1db0de8d'
6
+ def legal_name = 'Roadtex, LLC'
7
+ def name = 'Roadtex'
8
+ def us_dot_number = 2_221_701
9
+ def us_mc_number = 291_713
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class RonaldTransportServices < Carrier
4
+ class << self
5
+ def id = '05c7f3e1-71ae-41ce-b3bb-5ab6842b4b9f'
6
+ def name = 'Ronald Transport Services'
7
+ end
8
+ end
9
+ end
10
+ end