freight_kit 0.1.20 → 0.1.21

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 (434) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -2
  3. data/README.md +1 -2
  4. data/Rakefile +6 -0
  5. data/VERSION +1 -1
  6. data/configuration/locations/amazon_warehouses.yml +3330 -0
  7. data/freight_kit.gemspec +13 -13
  8. data/lib/freight_kit/address_normalizer.rb +26 -0
  9. data/lib/freight_kit/amazon_warehouse.rb +33 -0
  10. data/lib/freight_kit/api_clients/soap_client.rb +7 -9
  11. data/lib/freight_kit/carrier.rb +250 -303
  12. data/lib/freight_kit/carriers/a1_express.rb +25 -0
  13. data/lib/freight_kit/carriers/a_duie_pyle.rb +30 -0
  14. data/lib/freight_kit/carriers/aaa_cooper.rb +11 -0
  15. data/lib/freight_kit/carriers/aaa_expedited_services.rb +10 -0
  16. data/lib/freight_kit/carriers/ab_brothers_usa_inc.rb +12 -0
  17. data/lib/freight_kit/carriers/aberdeen_express_inc.rb +28 -0
  18. data/lib/freight_kit/carriers/abf_freight_system.rb +492 -0
  19. data/lib/freight_kit/carriers/access_transport.rb +10 -0
  20. data/lib/freight_kit/carriers/action_express.rb +10 -0
  21. data/lib/freight_kit/carriers/adams_and_companies.rb +10 -0
  22. data/lib/freight_kit/carriers/advance_distribution.rb +28 -0
  23. data/lib/freight_kit/carriers/alcon_transport.rb +10 -0
  24. data/lib/freight_kit/carriers/all_freight.rb +10 -0
  25. data/lib/freight_kit/carriers/alliance_transportation_group.rb +10 -0
  26. data/lib/freight_kit/carriers/allstate_transport.rb +10 -0
  27. data/lib/freight_kit/carriers/aloha_freight_forwarders.rb +35 -0
  28. data/lib/freight_kit/carriers/amado_trucking.rb +35 -0
  29. data/lib/freight_kit/carriers/american_fast_freight.rb +28 -0
  30. data/lib/freight_kit/carriers/amigos_service_transportation.rb +10 -0
  31. data/lib/freight_kit/carriers/anderson_towing_and_transport.rb +10 -0
  32. data/lib/freight_kit/carriers/apex_transporting.rb +10 -0
  33. data/lib/freight_kit/carriers/archer_cargo.rb +35 -0
  34. data/lib/freight_kit/carriers/armstrong_transport_group.rb +10 -0
  35. data/lib/freight_kit/carriers/autobahn_logistics.rb +10 -0
  36. data/lib/freight_kit/carriers/averitt_express.rb +30 -0
  37. data/lib/freight_kit/carriers/ba_transportation.rb +10 -0
  38. data/lib/freight_kit/carriers/balkin_express.rb +10 -0
  39. data/lib/freight_kit/carriers/bay_area_express.rb +10 -0
  40. data/lib/freight_kit/carriers/bc_freightways.rb +11 -0
  41. data/lib/freight_kit/carriers/benjamin_best_freight_inc.rb +37 -0
  42. data/lib/freight_kit/carriers/bennett_trucking.rb +10 -0
  43. data/lib/freight_kit/carriers/best_overnite_express.rb +78 -0
  44. data/lib/freight_kit/carriers/best_trucking.rb +10 -0
  45. data/lib/freight_kit/carriers/bestway_transport.rb +10 -0
  46. data/lib/freight_kit/carriers/bryan_systems.rb +10 -0
  47. data/lib/freight_kit/carriers/c_and_w_express.rb +10 -0
  48. data/lib/freight_kit/carriers/campbell_trucking.rb +10 -0
  49. data/lib/freight_kit/carriers/carde_transportation.rb +10 -0
  50. data/lib/freight_kit/carriers/cardinal_logistics.rb +28 -0
  51. data/lib/freight_kit/carriers/cdc_transport.rb +10 -0
  52. data/lib/freight_kit/carriers/cdo_express_diversified.rb +10 -0
  53. data/lib/freight_kit/carriers/cedar_supply_trucking.rb +10 -0
  54. data/lib/freight_kit/carriers/central_freight_lines.rb +12 -0
  55. data/lib/freight_kit/carriers/central_transport.rb +12 -0
  56. data/lib/freight_kit/carriers/chicago_suburban_express.rb +28 -0
  57. data/lib/freight_kit/carriers/city_logistics.rb +11 -0
  58. data/lib/freight_kit/carriers/clear_lane_freight_systems.rb +483 -0
  59. data/lib/freight_kit/carriers/cleopatra_trucking.rb +10 -0
  60. data/lib/freight_kit/carriers/clifford_transportation.rb +10 -0
  61. data/lib/freight_kit/carriers/cms_domestic.rb +25 -0
  62. data/lib/freight_kit/carriers/cnd_logistics.rb +10 -0
  63. data/lib/freight_kit/carriers/coast_to_coast_transport.rb +27 -0
  64. data/lib/freight_kit/carriers/countrywide_carriers.rb +10 -0
  65. data/lib/freight_kit/carriers/cpl_express.rb +35 -0
  66. data/lib/freight_kit/carriers/crosby_trucking_service.rb +29 -0
  67. data/lib/freight_kit/carriers/cross_country_freight_solutions.rb +419 -0
  68. data/lib/freight_kit/carriers/crowley.rb +10 -0
  69. data/lib/freight_kit/carriers/csa_transportation.rb +40 -0
  70. data/lib/freight_kit/carriers/csx_transportation.rb +40 -0
  71. data/lib/freight_kit/carriers/custom_global_logistics.rb +14 -0
  72. data/lib/freight_kit/carriers/d_and_a_transport.rb +10 -0
  73. data/lib/freight_kit/carriers/dak_transport.rb +10 -0
  74. data/lib/freight_kit/carriers/dash_courier_and_logistics_north_carolina.rb +10 -0
  75. data/lib/freight_kit/carriers/daylight_transport.rb +29 -0
  76. data/lib/freight_kit/carriers/dayton_freight_lines.rb +30 -0
  77. data/lib/freight_kit/carriers/dbr_logistics.rb +10 -0
  78. data/lib/freight_kit/carriers/deep_south_freight.rb +27 -0
  79. data/lib/freight_kit/carriers/delta_express.rb +10 -0
  80. data/lib/freight_kit/carriers/delta_transport.rb +10 -0
  81. data/lib/freight_kit/carriers/delta_trucking_logistics.rb +10 -0
  82. data/lib/freight_kit/carriers/demco_express.rb +10 -0
  83. data/lib/freight_kit/carriers/dependable_global_express.rb +10 -0
  84. data/lib/freight_kit/carriers/dependable_hawaiian_express.rb +24 -0
  85. data/lib/freight_kit/carriers/dependable_highway_express.rb +585 -0
  86. data/lib/freight_kit/carriers/desert_coastal_transport.rb +10 -0
  87. data/lib/freight_kit/carriers/dhl.rb +11 -0
  88. data/lib/freight_kit/carriers/diamond_line_delivery.rb +174 -0
  89. data/lib/freight_kit/carriers/ding_tai_trucking.rb +10 -0
  90. data/lib/freight_kit/carriers/diversified_transfer_and_storage.rb +29 -0
  91. data/lib/freight_kit/carriers/dohrn_transfer_company.rb +30 -0
  92. data/lib/freight_kit/carriers/dot_line_transportation.rb +29 -0
  93. data/lib/freight_kit/carriers/drt_transportation.rb +13 -0
  94. data/lib/freight_kit/carriers/dugan_truck_line.rb +29 -0
  95. data/lib/freight_kit/carriers/dupont.rb +10 -0
  96. data/lib/freight_kit/carriers/e_transport_carriers.rb +29 -0
  97. data/lib/freight_kit/carriers/echo_global_logistics.rb +13 -0
  98. data/lib/freight_kit/carriers/ecklund_logistics.rb +10 -0
  99. data/lib/freight_kit/carriers/el_emplumado_transport.rb +10 -0
  100. data/lib/freight_kit/carriers/elite_carriers.rb +28 -0
  101. data/lib/freight_kit/carriers/emerald_express.rb +10 -0
  102. data/lib/freight_kit/carriers/era_transport.rb +10 -0
  103. data/lib/freight_kit/carriers/estes_express_lines.rb +25 -0
  104. data/lib/freight_kit/carriers/euro_kam.rb +28 -0
  105. data/lib/freight_kit/carriers/ew_riverside_trucking.rb +10 -0
  106. data/lib/freight_kit/carriers/express_2000_inc.rb +12 -0
  107. data/lib/freight_kit/carriers/express_services_international.rb +10 -0
  108. data/lib/freight_kit/carriers/f_and_a_express.rb +27 -0
  109. data/lib/freight_kit/carriers/fairmont_logistics.rb +13 -0
  110. data/lib/freight_kit/carriers/fargo_cargo.rb +10 -0
  111. data/lib/freight_kit/carriers/fast_freight_transportation.rb +10 -0
  112. data/lib/freight_kit/carriers/fast_load_transport.rb +10 -0
  113. data/lib/freight_kit/carriers/fed_ex_express.rb +30 -0
  114. data/lib/freight_kit/carriers/fed_ex_ground.rb +24 -0
  115. data/lib/freight_kit/carriers/fed_ex_ltl_economy.rb +11 -0
  116. data/lib/freight_kit/carriers/fed_ex_ltl_priority.rb +11 -0
  117. data/lib/freight_kit/carriers/first_trucking_express.rb +10 -0
  118. data/lib/freight_kit/carriers/flash_trucking.rb +10 -0
  119. data/lib/freight_kit/carriers/fort_transportation_and_service_company_inc.rb +37 -0
  120. data/lib/freight_kit/carriers/forward_air.rb +789 -0
  121. data/lib/freight_kit/carriers/frahtex.rb +10 -0
  122. data/lib/freight_kit/carriers/frozen_food_express.rb +10 -0
  123. data/lib/freight_kit/carriers/gholia_bros_trucking.rb +36 -0
  124. data/lib/freight_kit/carriers/global_cargo.rb +10 -0
  125. data/lib/freight_kit/carriers/global_logistics_and_transportation.rb +10 -0
  126. data/lib/freight_kit/carriers/gls_freight.rb +32 -0
  127. data/lib/freight_kit/carriers/go_trucking_services.rb +10 -0
  128. data/lib/freight_kit/carriers/gold_eagle_transportation.rb +11 -0
  129. data/lib/freight_kit/carriers/golden_drop_trucking.rb +10 -0
  130. data/lib/freight_kit/carriers/gonzalez_transportation.rb +10 -0
  131. data/lib/freight_kit/carriers/gps_transport.rb +10 -0
  132. data/lib/freight_kit/carriers/greene_enterprise.rb +10 -0
  133. data/lib/freight_kit/carriers/gsa_international.rb +10 -0
  134. data/lib/freight_kit/carriers/gsp_express.rb +24 -0
  135. data/lib/freight_kit/carriers/gsv_transportation.rb +10 -0
  136. data/lib/freight_kit/carriers/gta_transportation.rb +10 -0
  137. data/lib/freight_kit/carriers/guam_freight_services.rb +10 -0
  138. data/lib/freight_kit/carriers/harrah_transportation.rb +23 -0
  139. data/lib/freight_kit/carriers/her_trucking.rb +10 -0
  140. data/lib/freight_kit/carriers/hercules_freight.rb +20 -0
  141. data/lib/freight_kit/carriers/highlander_xpress.rb +36 -0
  142. data/lib/freight_kit/carriers/hn_transport.rb +10 -0
  143. data/lib/freight_kit/carriers/honolulu_freight_service.rb +10 -0
  144. data/lib/freight_kit/carriers/hot_line_freight_system_inc.rb +12 -0
  145. data/lib/freight_kit/carriers/hotshot_freight_of_texas.rb +13 -0
  146. data/lib/freight_kit/carriers/houser_transport.rb +27 -0
  147. data/lib/freight_kit/carriers/infiniti_freight_logistics.rb +28 -0
  148. data/lib/freight_kit/carriers/infinity_trucking.rb +10 -0
  149. data/lib/freight_kit/carriers/interstate_tma.rb +10 -0
  150. data/lib/freight_kit/carriers/intrade_industries.rb +10 -0
  151. data/lib/freight_kit/carriers/jasper_trucking.rb +28 -0
  152. data/lib/freight_kit/carriers/jb_hunt.rb +11 -0
  153. data/lib/freight_kit/carriers/jfj_transportation.rb +8 -8
  154. data/lib/freight_kit/carriers/jkb_express.rb +10 -0
  155. data/lib/freight_kit/carriers/jlm_transport.rb +10 -0
  156. data/lib/freight_kit/carriers/johansson_transport.rb +10 -0
  157. data/lib/freight_kit/carriers/jones_express.rb +10 -0
  158. data/lib/freight_kit/carriers/jp_logistics.rb +41 -0
  159. data/lib/freight_kit/carriers/just_in_time_cargo.rb +29 -0
  160. data/lib/freight_kit/carriers/kengkok_times.rb +10 -0
  161. data/lib/freight_kit/carriers/kings_express.rb +10 -0
  162. data/lib/freight_kit/carriers/klc_transportation.rb +10 -0
  163. data/lib/freight_kit/carriers/km_trucking.rb +10 -0
  164. data/lib/freight_kit/carriers/kma_logistics.rb +10 -0
  165. data/lib/freight_kit/carriers/krc_logistics.rb +10 -0
  166. data/lib/freight_kit/carriers/ktx.rb +10 -0
  167. data/lib/freight_kit/carriers/landstar.rb +25 -0
  168. data/lib/freight_kit/carriers/lanter_distributing_llc.rb +30 -0
  169. data/lib/freight_kit/carriers/ld_trucking.rb +10 -0
  170. data/lib/freight_kit/carriers/legacy_logistics_solutions.rb +10 -0
  171. data/lib/freight_kit/carriers/leonards_express.rb +10 -0
  172. data/lib/freight_kit/carriers/liberty_linehaul_west.rb +28 -0
  173. data/lib/freight_kit/carriers/liberty_transport.rb +10 -0
  174. data/lib/freight_kit/carriers/lightning_express.rb +10 -0
  175. data/lib/freight_kit/carriers/lj_express.rb +24 -0
  176. data/lib/freight_kit/carriers/lkp_enterprises.rb +10 -0
  177. data/lib/freight_kit/carriers/ltl_pros.rb +28 -0
  178. data/lib/freight_kit/carriers/m_and_m_and_sons.rb +10 -0
  179. data/lib/freight_kit/carriers/mag_lines_transport.rb +10 -0
  180. data/lib/freight_kit/carriers/magic_messenger.rb +24 -0
  181. data/lib/freight_kit/carriers/majors_transit.rb +10 -0
  182. data/lib/freight_kit/carriers/map_global_logistics.rb +10 -0
  183. data/lib/freight_kit/carriers/matths_trucking.rb +11 -0
  184. data/lib/freight_kit/carriers/mav_canadian_transport.rb +13 -0
  185. data/lib/freight_kit/carriers/mc_systems.rb +35 -0
  186. data/lib/freight_kit/carriers/mega_fleet.rb +10 -0
  187. data/lib/freight_kit/carriers/mega_trans_group.rb +28 -0
  188. data/lib/freight_kit/carriers/meta_express.rb +10 -0
  189. data/lib/freight_kit/carriers/mia_transportation.rb +10 -0
  190. data/lib/freight_kit/carriers/midwest_motor_express.rb +14 -0
  191. data/lib/freight_kit/carriers/midwest_transport_and_trucking.rb +10 -0
  192. data/lib/freight_kit/carriers/mikade_delivery_service.rb +10 -0
  193. data/lib/freight_kit/carriers/mohoff_freight_lines.rb +23 -0
  194. data/lib/freight_kit/carriers/montata_travelers_express.rb +10 -0
  195. data/lib/freight_kit/carriers/morgan_van_lines.rb +29 -0
  196. data/lib/freight_kit/carriers/moto_transportation.rb +24 -0
  197. data/lib/freight_kit/carriers/mountain_valley_express.rb +197 -0
  198. data/lib/freight_kit/carriers/ms_freight.rb +27 -0
  199. data/lib/freight_kit/carriers/mvg_transport.rb +10 -0
  200. data/lib/freight_kit/carriers/n_and_m_transfer_co_inc.rb +29 -0
  201. data/lib/freight_kit/carriers/nabot_transport_solutions.rb +10 -0
  202. data/lib/freight_kit/carriers/national_freight_xpress.rb +10 -0
  203. data/lib/freight_kit/carriers/navigation_group.rb +10 -0
  204. data/lib/freight_kit/carriers/nelson_trucking.rb +10 -0
  205. data/lib/freight_kit/carriers/network_1_transportation.rb +10 -0
  206. data/lib/freight_kit/carriers/new_century_transport.rb +28 -0
  207. data/lib/freight_kit/carriers/new_penn_motor_express.rb +11 -0
  208. data/lib/freight_kit/carriers/nieves_transportation.rb +10 -0
  209. data/lib/freight_kit/carriers/nolan_transportation_group.rb +26 -0
  210. data/lib/freight_kit/carriers/northland_trucking.rb +10 -0
  211. data/lib/freight_kit/carriers/northwest_carrier_logistics.rb +27 -0
  212. data/lib/freight_kit/carriers/nt_usa.rb +10 -0
  213. data/lib/freight_kit/carriers/nu_line_transportation.rb +10 -0
  214. data/lib/freight_kit/carriers/numark_transportation.rb +80 -0
  215. data/lib/freight_kit/carriers/nvk_transport.rb +10 -0
  216. data/lib/freight_kit/carriers/ny_transport.rb +10 -0
  217. data/lib/freight_kit/carriers/oak_harbor.rb +28 -0
  218. data/lib/freight_kit/carriers/oakline_transportation.rb +10 -0
  219. data/lib/freight_kit/carriers/old_dominion_freight_line.rb +30 -0
  220. data/lib/freight_kit/carriers/on_trac.rb +573 -0
  221. data/lib/freight_kit/carriers/one_hundred_one_transport.rb +10 -0
  222. data/lib/freight_kit/carriers/one_way_delivery.rb +10 -0
  223. data/lib/freight_kit/carriers/oracle_transportation_solutions.rb +10 -0
  224. data/lib/freight_kit/carriers/orange_courier.rb +27 -0
  225. data/lib/freight_kit/carriers/ortas_trucking.rb +10 -0
  226. data/lib/freight_kit/carriers/pac_trux_transportation.rb +10 -0
  227. data/lib/freight_kit/carriers/pacer.rb +10 -0
  228. data/lib/freight_kit/carriers/pacific_logistics.rb +10 -0
  229. data/lib/freight_kit/carriers/pacific_states_truck_lines.rb +10 -0
  230. data/lib/freight_kit/carriers/paradise_distributing.rb +10 -0
  231. data/lib/freight_kit/carriers/paramount_freight_systems.rb +10 -0
  232. data/lib/freight_kit/carriers/peninsula_truck_lines.rb +222 -0
  233. data/lib/freight_kit/carriers/pg_transport.rb +10 -0
  234. data/lib/freight_kit/carriers/pgs_360.rb +10 -0
  235. data/lib/freight_kit/carriers/pilot_freight_services.rb +10 -0
  236. data/lib/freight_kit/carriers/pious_trans.rb +27 -0
  237. data/lib/freight_kit/carriers/pitt_ohio_express.rb +30 -0
  238. data/lib/freight_kit/carriers/pki_logistics.rb +12 -0
  239. data/lib/freight_kit/carriers/plana_transportation.rb +28 -0
  240. data/lib/freight_kit/carriers/prestige.rb +10 -0
  241. data/lib/freight_kit/carriers/pro_trans_solutions.rb +28 -0
  242. data/lib/freight_kit/carriers/puma_logistics.rb +10 -0
  243. data/lib/freight_kit/carriers/pwc_international.rb +10 -0
  244. data/lib/freight_kit/carriers/quality_logistics.rb +10 -0
  245. data/lib/freight_kit/carriers/queen_star_trucking.rb +27 -0
  246. data/lib/freight_kit/carriers/r_and_l_carriers.rb +11 -0
  247. data/lib/freight_kit/carriers/rac_transport.rb +10 -0
  248. data/lib/freight_kit/carriers/re_logistics.rb +23 -0
  249. data/lib/freight_kit/carriers/reddaway.rb +11 -0
  250. data/lib/freight_kit/carriers/reefer_van_network.rb +13 -0
  251. data/lib/freight_kit/carriers/refrigerated_trucking_and_ltl_transportation_services.rb +10 -0
  252. data/lib/freight_kit/carriers/ridgeline_express.rb +10 -0
  253. data/lib/freight_kit/carriers/rist_transport.rb +29 -0
  254. data/lib/freight_kit/carriers/river_city_transport.rb +10 -0
  255. data/lib/freight_kit/carriers/roadrunner_transportation_services.rb +675 -0
  256. data/lib/freight_kit/carriers/roadtex.rb +13 -0
  257. data/lib/freight_kit/carriers/ronald_transport_services.rb +10 -0
  258. data/lib/freight_kit/carriers/rose_trucking.rb +24 -0
  259. data/lib/freight_kit/carriers/rp_and_j_transport.rb +24 -0
  260. data/lib/freight_kit/carriers/rpm_transportation.rb +11 -0
  261. data/lib/freight_kit/carriers/rude_transportation.rb +30 -0
  262. data/lib/freight_kit/carriers/s_and_s_logistics.rb +10 -0
  263. data/lib/freight_kit/carriers/saia.rb +470 -361
  264. data/lib/freight_kit/carriers/sb_transportation.rb +27 -0
  265. data/lib/freight_kit/carriers/schneider_national.rb +29 -0
  266. data/lib/freight_kit/carriers/schwarz_trucking.rb +10 -0
  267. data/lib/freight_kit/carriers/sewell_motor_express.rb +29 -0
  268. data/lib/freight_kit/carriers/shawnee_trucking.rb +28 -0
  269. data/lib/freight_kit/carriers/shi_logistics.rb +10 -0
  270. data/lib/freight_kit/carriers/sinbad_transport.rb +10 -0
  271. data/lib/freight_kit/carriers/skyway.rb +10 -0
  272. data/lib/freight_kit/carriers/smith_cargo_transportation_services.rb +23 -0
  273. data/lib/freight_kit/carriers/sna_transportation.rb +10 -0
  274. data/lib/freight_kit/carriers/solid_group.rb +10 -0
  275. data/lib/freight_kit/carriers/solution_carrier_express.rb +10 -0
  276. data/lib/freight_kit/carriers/southeastern_freight_lines.rb +450 -0
  277. data/lib/freight_kit/carriers/southwestern_motor_transport.rb +30 -0
  278. data/lib/freight_kit/carriers/span_alaska.rb +10 -0
  279. data/lib/freight_kit/carriers/specialize_transportation.rb +27 -0
  280. data/lib/freight_kit/carriers/ssi_refrigerated_express.rb +10 -0
  281. data/lib/freight_kit/carriers/standard_forwarding_llc.rb +28 -0
  282. data/lib/freight_kit/carriers/star_american_enterprise.rb +10 -0
  283. data/lib/freight_kit/carriers/sterling_transportation.rb +10 -0
  284. data/lib/freight_kit/carriers/stg.rb +163 -0
  285. data/lib/freight_kit/carriers/supervan_service.rb +10 -0
  286. data/lib/freight_kit/carriers/sutton_transport_inc.rb +12 -0
  287. data/lib/freight_kit/carriers/swift_transportation.rb +28 -0
  288. data/lib/freight_kit/carriers/t_force_worldwide.rb +617 -0
  289. data/lib/freight_kit/carriers/tax_airfreight_inc.rb +35 -0
  290. data/lib/freight_kit/carriers/tforce_freight_inc.rb +30 -0
  291. data/lib/freight_kit/carriers/the_custom_companies.rb +162 -0
  292. data/lib/freight_kit/carriers/thk_trucking.rb +28 -0
  293. data/lib/freight_kit/carriers/tiger_cool_express.rb +11 -0
  294. data/lib/freight_kit/carriers/tili_logistics.rb +10 -0
  295. data/lib/freight_kit/carriers/tmt_industries.rb +10 -0
  296. data/lib/freight_kit/carriers/top_ten_express.rb +28 -0
  297. data/lib/freight_kit/carriers/total_quality_logistics.rb +338 -0
  298. data/lib/freight_kit/carriers/total_transportation.rb +258 -0
  299. data/lib/freight_kit/carriers/trans_international_trucking.rb +29 -0
  300. data/lib/freight_kit/carriers/treasure_transportation.rb +10 -0
  301. data/lib/freight_kit/carriers/tri_state_services.rb +10 -0
  302. data/lib/freight_kit/carriers/tritex_freighters.rb +10 -0
  303. data/lib/freight_kit/carriers/triways.rb +10 -0
  304. data/lib/freight_kit/carriers/tsi_kansas.rb +29 -0
  305. data/lib/freight_kit/carriers/u_and_r_transportation.rb +23 -0
  306. data/lib/freight_kit/carriers/union_pacific.rb +11 -0
  307. data/lib/freight_kit/carriers/united_freight_logistics.rb +10 -0
  308. data/lib/freight_kit/carriers/unlimited_distance_transportation.rb +10 -0
  309. data/lib/freight_kit/carriers/up_streamline.rb +10 -0
  310. data/lib/freight_kit/carriers/ups_freight.rb +12 -0
  311. data/lib/freight_kit/carriers/us_freightways.rb +10 -0
  312. data/lib/freight_kit/carriers/usa_truck.rb +28 -0
  313. data/lib/freight_kit/carriers/usf_holland.rb +11 -0
  314. data/lib/freight_kit/carriers/valley_cartage.rb +11 -0
  315. data/lib/freight_kit/carriers/vc_transport.rb +10 -0
  316. data/lib/freight_kit/carriers/vision_express.rb +11 -0
  317. data/lib/freight_kit/carriers/vision_logistics_group.rb +10 -0
  318. data/lib/freight_kit/carriers/vmg_transportation_group.rb +10 -0
  319. data/lib/freight_kit/carriers/volpe_express.rb +10 -0
  320. data/lib/freight_kit/carriers/ward_trucking.rb +29 -0
  321. data/lib/freight_kit/carriers/wdwb.rb +10 -0
  322. data/lib/freight_kit/carriers/western_flyer_express.rb +28 -0
  323. data/lib/freight_kit/carriers/western_regional_delivery_service.rb +271 -0
  324. data/lib/freight_kit/carriers/western_specialized_trucking.rb +22 -0
  325. data/lib/freight_kit/carriers/win_distribution.rb +28 -0
  326. data/lib/freight_kit/carriers/wlb_transport.rb +10 -0
  327. data/lib/freight_kit/carriers/x_trux.rb +29 -0
  328. data/lib/freight_kit/carriers/xpo_logistics.rb +427 -0
  329. data/lib/freight_kit/carriers/xpress_global_systems.rb +30 -0
  330. data/lib/freight_kit/carriers/xylo_trucking.rb +10 -0
  331. data/lib/freight_kit/carriers/yrc_freight.rb +24 -0
  332. data/lib/freight_kit/carriers/zentner_transportation.rb +28 -0
  333. data/lib/freight_kit/carriers.rb +331 -34
  334. data/lib/freight_kit/countries.rb +22 -0
  335. data/lib/freight_kit/error.rb +0 -2
  336. data/lib/freight_kit/errors/document_not_found_error.rb +0 -2
  337. data/lib/freight_kit/errors/expired_credentials_error.rb +0 -2
  338. data/lib/freight_kit/errors/http_error.rb +0 -2
  339. data/lib/freight_kit/errors/invalid_credentials_error.rb +0 -2
  340. data/lib/freight_kit/errors/response_error.rb +0 -2
  341. data/lib/freight_kit/errors/shipment_not_found_error.rb +0 -2
  342. data/lib/freight_kit/errors/unserviceable_accessorials_error.rb +2 -4
  343. data/lib/freight_kit/errors/unserviceable_error.rb +0 -2
  344. data/lib/freight_kit/helpers/documentable.rb +0 -2
  345. data/lib/freight_kit/helpers/pickupable.rb +3 -5
  346. data/lib/freight_kit/helpers/rateable.rb +0 -2
  347. data/lib/freight_kit/helpers/trackable.rb +0 -2
  348. data/lib/freight_kit/http_client/cache_store.rb +2 -4
  349. data/lib/freight_kit/http_client/log_device.rb +0 -2
  350. data/lib/freight_kit/http_client/response.rb +0 -2
  351. data/lib/freight_kit/http_client/revalidation.rb +0 -2
  352. data/lib/freight_kit/http_client/safe_retries.rb +0 -2
  353. data/lib/freight_kit/http_client/zstd.rb +2 -4
  354. data/lib/freight_kit/http_client.rb +8 -12
  355. data/lib/freight_kit/model.rb +1 -3
  356. data/lib/freight_kit/models/address.rb +15 -0
  357. data/lib/freight_kit/models/contact.rb +3 -4
  358. data/lib/freight_kit/models/country.rb +20 -0
  359. data/lib/freight_kit/models/credential.rb +14 -16
  360. data/lib/freight_kit/models/date_time.rb +0 -2
  361. data/lib/freight_kit/models/document_response.rb +0 -2
  362. data/lib/freight_kit/models/label.rb +0 -2
  363. data/lib/freight_kit/models/location.rb +10 -25
  364. data/lib/freight_kit/models/pickup_response.rb +0 -2
  365. data/lib/freight_kit/models/price.rb +0 -2
  366. data/lib/freight_kit/models/rate.rb +0 -2
  367. data/lib/freight_kit/models/rate_response.rb +0 -2
  368. data/lib/freight_kit/models/region.rb +19 -0
  369. data/lib/freight_kit/models/response.rb +0 -2
  370. data/lib/freight_kit/models/shipment.rb +4 -6
  371. data/lib/freight_kit/models/shipment_event.rb +0 -2
  372. data/lib/freight_kit/models/terminal.rb +10 -0
  373. data/lib/freight_kit/models/tracking_response.rb +0 -2
  374. data/lib/freight_kit/package.rb +51 -53
  375. data/lib/freight_kit/package_item.rb +14 -14
  376. data/lib/freight_kit/packaging.rb +21 -26
  377. data/lib/freight_kit/platform.rb +0 -32
  378. data/lib/freight_kit/platforms/carrier_logistics.rb +331 -345
  379. data/lib/freight_kit/platforms/next_tms.rb +93 -0
  380. data/lib/freight_kit/platforms/the_great_information_factory.rb +500 -425
  381. data/lib/freight_kit/regions.rb +27 -0
  382. data/lib/freight_kit/shipment_packer.rb +36 -38
  383. data/lib/freight_kit/tariff/overlength_rule.rb +1 -5
  384. data/lib/freight_kit/tariff.rb +0 -2
  385. data/lib/freight_kit.rb +84 -11
  386. metadata +361 -51
  387. data/configuration/carriers/abfs.yml +0 -124
  388. data/configuration/carriers/btvp.yml +0 -84
  389. data/configuration/carriers/ccyq.yml +0 -121
  390. data/configuration/carriers/clni.yml +0 -113
  391. data/configuration/carriers/cnwy.yml +0 -113
  392. data/configuration/carriers/ctbv.yml +0 -117
  393. data/configuration/carriers/dcha.yml +0 -105
  394. data/configuration/carriers/dlds.yml +0 -111
  395. data/configuration/carriers/dphe.yml +0 -130
  396. data/configuration/carriers/drrq.yml +0 -131
  397. data/configuration/carriers/fcsy.yml +0 -102
  398. data/configuration/carriers/fwda.yml +0 -137
  399. data/configuration/carriers/jfj_transportation.yml +0 -2
  400. data/configuration/carriers/mtvl.yml +0 -12
  401. data/configuration/carriers/numk.yml +0 -14
  402. data/configuration/carriers/otcl.yml +0 -124
  403. data/configuration/carriers/pens.yml +0 -22
  404. data/configuration/carriers/rdfs.yml +0 -142
  405. data/configuration/carriers/saia.yml +0 -129
  406. data/configuration/carriers/sefl.yml +0 -115
  407. data/configuration/carriers/totl.yml +0 -111
  408. data/configuration/carriers/tqyl.yml +0 -28
  409. data/configuration/carriers/wrds.yml +0 -20
  410. data/configuration/platforms/carrier_logistics.yml +0 -25
  411. data/configuration/platforms/next.yml +0 -12
  412. data/configuration/platforms/the_great_information_factory.yml +0 -122
  413. data/lib/freight_kit/carriers/abfs.rb +0 -421
  414. data/lib/freight_kit/carriers/btvp.rb +0 -29
  415. data/lib/freight_kit/carriers/ccyq.rb +0 -310
  416. data/lib/freight_kit/carriers/clni.rb +0 -396
  417. data/lib/freight_kit/carriers/cnwy.rb +0 -327
  418. data/lib/freight_kit/carriers/ctbv.rb +0 -53
  419. data/lib/freight_kit/carriers/dcha.rb +0 -76
  420. data/lib/freight_kit/carriers/dlds.rb +0 -49
  421. data/lib/freight_kit/carriers/dphe.rb +0 -472
  422. data/lib/freight_kit/carriers/drrq.rb +0 -580
  423. data/lib/freight_kit/carriers/fcsy.rb +0 -57
  424. data/lib/freight_kit/carriers/fwda.rb +0 -744
  425. data/lib/freight_kit/carriers/mtvl.rb +0 -34
  426. data/lib/freight_kit/carriers/numk.rb +0 -58
  427. data/lib/freight_kit/carriers/otcl.rb +0 -520
  428. data/lib/freight_kit/carriers/pens.rb +0 -204
  429. data/lib/freight_kit/carriers/rdfs.rb +0 -521
  430. data/lib/freight_kit/carriers/sefl.rb +0 -342
  431. data/lib/freight_kit/carriers/totl.rb +0 -172
  432. data/lib/freight_kit/carriers/tqyl.rb +0 -337
  433. data/lib/freight_kit/carriers/wrds.rb +0 -246
  434. data/lib/freight_kit/platforms/next.rb +0 -101
@@ -0,0 +1,162 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class TheCustomCompanies < Platforms::CarrierLogistics
4
+ class << self
5
+ def id = '895554d3-7efe-4fdf-870f-ca0f0005d0f9'
6
+ def legal_name = 'The Custom Companies, Inc.'
7
+
8
+ # See https://api.customco.com/scripts/cgiip.exe/keywordlist.xml
9
+ def mappable_accessorials
10
+ {
11
+ airport_delivery: 'LA',
12
+ airport_pickup: 'LA',
13
+ amusement_park_delivery: 'LA',
14
+ amusement_park_pickup: 'LA',
15
+ appointment_delivery: 'APPT',
16
+ cemetery_delivery: 'LA',
17
+ cemetery_pickup: 'LA',
18
+ church_delivery: 'LA',
19
+ church_pickup: 'LA',
20
+ construction_delivery: 'CS',
21
+ construction_pickup: 'CS',
22
+ farm_delivery: 'LA',
23
+ farm_pickup: 'LA',
24
+ fitness_center_delivery: 'LA',
25
+ fitness_center_pickup: 'LA',
26
+ golf_course_delivery: 'LA',
27
+ golf_course_pickup: 'LA',
28
+ government_delivery: 'LA',
29
+ government_pickup: 'LA',
30
+ grocery_warehouse_delivery: 'GWF',
31
+ grocery_warehouse_pickup: 'GWF',
32
+ hospital_delivery: 'LA',
33
+ hospital_pickup: 'LA',
34
+ hotel_delivery: 'LA',
35
+ hotel_pickup: 'LA',
36
+ inside_delivery: 'INSIDE',
37
+ inside_pickup: 'INSIDE',
38
+ inspection_site_delivery: 'LA',
39
+ inspection_site_pickup: 'LA',
40
+ jobsite_delivery: 'CS',
41
+ jobsite_pickup: 'CS',
42
+ liftgate_delivery: 'LIFT',
43
+ liftgate_pickup: 'LIFTP',
44
+ mall_pickup: 'LA',
45
+ marina_delivery: 'LA',
46
+ marina_pickup: 'LA',
47
+ military_site_delivery: 'LA',
48
+ military_site_pickup: 'LA',
49
+ mine_site_delivery: 'LA',
50
+ mine_site_pickup: 'LA',
51
+ nursing_home_delivery: 'LA',
52
+ nursing_home_pickup: 'LA',
53
+ park_delivery: 'LA',
54
+ park_pickup: 'LA',
55
+ prison_delivery: 'LA',
56
+ prison_pickup: 'LA',
57
+ ranch_delivery: 'LA',
58
+ ranch_pickup: 'LA',
59
+ reservation_delivery: 'LA',
60
+ reservation_pickup: 'LA',
61
+ residential_delivery: 'RESDEL',
62
+ residential_pickup: 'RESPI',
63
+ resort_delivery: 'LA',
64
+ resort_pickup: 'LA',
65
+ school_delivery: 'LA',
66
+ school_pickup: 'LA',
67
+ storage_facility_delivery: 'LA',
68
+ storage_facility_pickup: 'LA',
69
+ university_delivery: 'LA',
70
+ university_pickup: 'LA',
71
+ utility_site_delivery: 'LA',
72
+ utility_site_pickup: 'LA'
73
+ }
74
+ end
75
+
76
+ def maximum_height = Measured::Length.new(105, :inches)
77
+ def maximum_weight = Measured::Weight.new(6999, :pounds)
78
+ def minimum_length_for_overlength_fees = Measured::Length.new(8, :feet)
79
+ def name = 'The Custom Companies'
80
+ def overlength_fees_require_tariff? = false
81
+ def scac = 'CTBV'
82
+ def services = %i[standard]
83
+
84
+ def unquotable_accessorials
85
+ %i[
86
+ athletic_facility_delivery
87
+ athletic_facility_pickup
88
+ dock_dropoff
89
+ dock_pickup
90
+ grocery_store_delivery
91
+ grocery_store_pickup
92
+ mall_delivery
93
+ motel_delivery
94
+ motel_pickup
95
+ restaurant_delivery
96
+ restaurant_pickup
97
+ steel_mill_delivery
98
+ steel_mill_pickup
99
+ ]
100
+ end
101
+
102
+ def unserviceable_accessorials
103
+ %i[
104
+ appointment_pickup
105
+ brewery_delivery
106
+ brewery_pickup
107
+ convention_delivery
108
+ convention_pickup
109
+ customs_brokerage
110
+ driver_assist
111
+ early_morning_delivery
112
+ fair_delivery
113
+ fair_pickup
114
+ flatbed_delivery
115
+ flatbed_pickup
116
+ guaranteed_delivery_am
117
+ guaranteed_delivery_pm
118
+ guaranteed_delivery
119
+ winery_delivery
120
+ winery_pickup
121
+ ]
122
+ end
123
+
124
+ def us_dot_number = 2_228_134
125
+ def us_mc_number = 413_674
126
+ end
127
+
128
+ API = Platforms::CarrierLogistics::API.deep_merge(
129
+ domain: 'api.customco.com',
130
+ endpoints: {
131
+ bol: '/scripts/cgiip.exe/web-login.htm?',
132
+ pod: '/scripts/cgiip.exe/web-login.htm?',
133
+ rates: '/scripts/cgiip.exe/ratequote.xml?',
134
+ track: '/scripts/cgiip.exe/protracexml.htm?'
135
+ },
136
+ use_ssl: { bol: false, pod: false, rates: false, track: true }
137
+ ).freeze
138
+
139
+ # Documents
140
+
141
+ # Rates
142
+ def build_calculated_accessorials(shipment)
143
+ [].tap do |builder|
144
+ longest_dimension = shipment.packages.map { |package| [package.length(:in), package.width(:in)].max }.max.ceil
145
+
146
+ case longest_dimension
147
+ when (96..143) then builder << 'OL1'
148
+ when (144..) then builder << 'OL'
149
+ end
150
+ end
151
+ end
152
+
153
+ # Tracking
154
+
155
+ # protected
156
+
157
+ # Documents
158
+
159
+ # Rates
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,28 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class THKTrucking < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: '0d6cf829-3835-42ad-859b-0852b1ed5fd2', phone: '+16308782993')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'Elmhurst',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: '4c405b47-1325-45d7-80df-3a541978e3ac',
14
+ postal_code: '60126',
15
+ region_abbreviation: 'IL',
16
+ street: '562 West Lorraine Ave'
17
+ )
18
+ end
19
+
20
+ def id = '630f9d07-6ba2-4fb6-857f-e48379c08b4c'
21
+ def legal_name = 'THK Trucking Inc'
22
+ def name = 'THK Trucking'
23
+ def us_dot_number = 1_526_463
24
+ def us_mc_number = 593_205
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class TigerCoolExpress < Carrier
4
+ class << self
5
+ def consider_bol_and_pod_documents_same? = true
6
+ def id = 'd810cbab-4984-43ab-8f21-b2ec79a5f74c'
7
+ def name = 'Tiger Cool Express'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class TILILogistics < Carrier
4
+ class << self
5
+ def id = 'e2ca975b-4d28-4248-a46e-9ec9b7fe05a8'
6
+ def name = 'TILI Logistics'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class TMTIndustries < Carrier
4
+ class << self
5
+ def id = '8fe4882b-c73c-4dd3-91ac-7f20bc27870c'
6
+ def name = 'TMT Industries'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,28 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class TopTenExpress < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: 'ddc7584d-22f3-4f70-8a9f-06bba733184c', phone: '+18003585990')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'Gurnee',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: '1bf1b86a-92c0-49aa-a986-f562a4a0b6a7',
14
+ postal_code: '60031-1206',
15
+ region_abbreviation: 'IL',
16
+ street: '2001 N Delany Rd'
17
+ )
18
+ end
19
+
20
+ def id = '06cb58f8-4542-4ffc-aebc-98272678c78b'
21
+ def legal_name = 'Top-ten Express Corp'
22
+ def name = 'Top Ten Express'
23
+ def us_dot_number = 1_625_877
24
+ def us_mc_number = 600_068
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,338 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class TotalQualityLogistics < FreightKit::Carrier
4
+ class << self
5
+ def check_mailing_addresses
6
+ [
7
+ Address.new(
8
+ city: 'Cincinnati',
9
+ country: Countries.find_by(iso31661_alpha2: 'US'),
10
+ id: '55c06675-cf01-4657-8f57-eba4e50be0fd',
11
+ postal_code: '45263',
12
+ region_abbreviation: 'OH',
13
+ street: 'PO Box 634558'
14
+ )
15
+ ]
16
+ end
17
+
18
+ def consider_bol_and_pod_documents_same? = true
19
+ def id = '1e1dad85-44fb-44d8-9b13-09037d401f17'
20
+
21
+ # Per carrier at 2023-02-13
22
+ def mappable_accessorials
23
+ {
24
+ appointment_delivery: 'APPTDEL',
25
+ inside_delivery: 'INPU',
26
+ inside_pickup: 'INDEL',
27
+ liftgate_delivery: 'LGDEL',
28
+ liftgate_pickup: 'LGPU'
29
+ }
30
+ end
31
+
32
+ def minimum_length_for_overlength_fees = Measured::Length.new(6, :feet)
33
+ def name = 'Total Quality Logistics'
34
+ def overlength_fees_require_tariff? = false
35
+ def required_credential_types = %i[api]
36
+ def requirements = %i[credentials]
37
+ def scac = 'TQYL'
38
+ def website_url = 'https://www.tql.com'
39
+ end
40
+
41
+ include FreightKit::Rateable
42
+ include FreightKit::Trackable
43
+ include FreightKit::Pickupable
44
+
45
+ API = {
46
+ domain: 'public.api.tql.com',
47
+ endpoints: {
48
+ rates: '/ltl/quotes',
49
+ track: '/tracking/%TRACKING_NUMBER%',
50
+ pickup: '/ltl/loads/tender',
51
+ auth: '/identity/token'
52
+ },
53
+ methods: { rates: :post, track: :get, pickup: :post, auth: :post }
54
+ }.freeze
55
+ API_SCOPE = 'https://tqlidentity.onmicrosoft.com/services_combined/LTLQuotes.Tender'.freeze
56
+ EVENTS = { types: { picked_up: 'Tendered', delivered: 'Delivered', out_for_delivery: 'In Transit' } }.freeze
57
+
58
+ protected
59
+
60
+ def build_access_token
61
+ build_url(:auth)
62
+ credentials = fetch_credential(:api)
63
+
64
+ request_body = {
65
+ username: credentials.username,
66
+ password: credentials.password,
67
+ grant_type: 'password',
68
+ scope: API_SCOPE,
69
+ client_id: credentials.api_key
70
+ }
71
+
72
+ request = build_request(:auth, query: request_body)
73
+ response = commit(request)
74
+
75
+ response['access_token']
76
+ end
77
+
78
+ def build_accessorials(shipment:)
79
+ accessorials = []
80
+ serviceable_accessorials?(shipment.accessorials)
81
+
82
+ shipment.accessorials.map do |accessorial|
83
+ next if mappable_accessorials.exclude?(accessorial)
84
+
85
+ accessorials << mappable_accessorials[accessorial.to_sym]
86
+ end
87
+
88
+ accessorials
89
+ end
90
+
91
+ def build_commodities(shipment)
92
+ shipment.packages.map do |package|
93
+ unit_type = package.packaging.type.to_s
94
+ {
95
+ freightClassCode: package.freight_class,
96
+ unitTypeCode: package.packaging.pallet? ? 'PLT' : unit_type.upcase,
97
+ description: package.description,
98
+ quantity: package.quantity.to_i,
99
+ weight: package.pounds(:total).ceil.to_i,
100
+ dimensionHeight: package.inches(:height).ceil.to_i,
101
+ dimensionLength: package.inches(:length).ceil.to_i,
102
+ dimensionWidth: package.inches(:width).ceil.to_i,
103
+ isHazmat: package.hazmat?
104
+ }
105
+ end
106
+ end
107
+
108
+ def build_pickup_request(
109
+ delivery_from:,
110
+ delivery_to:,
111
+ dispatcher:,
112
+ pickup_from:,
113
+ pickup_to:,
114
+ scac:,
115
+ service:,
116
+ shipment:
117
+ )
118
+ origin = shipment.origin
119
+ destination = shipment.destination
120
+ shipper_phone = shipment.origin.contact.phone.delete('^0-9')
121
+ receiver_phone = shipment.destination.contact.phone.delete('^0-9')
122
+
123
+ build_request(
124
+ :pickup,
125
+ body: {
126
+ scac:,
127
+ serviceLevel: service.to_s.capitalize,
128
+ shipmentDate: pickup_from.iso8601,
129
+ commodities: build_commodities(shipment),
130
+ accessorials: build_accessorials(shipment:),
131
+ pickupDetails: {
132
+ address1: origin.address1,
133
+ postalCode: origin.postal_code.to_i,
134
+ city: origin.city,
135
+ state: origin.province.upcase,
136
+ country: origin.country.code(:alpha3).value,
137
+ contactName: origin.contact.name || 'Shipping',
138
+ contactPhone: shipper_phone || '',
139
+ stopName: origin.contact.name || 'Shipping',
140
+ hoursOpen: pickup_from.strftime('%I:%M %p'),
141
+ hoursClosed: pickup_to.strftime('%I:%M %p')
142
+ },
143
+ deliveryDetails: {
144
+ address1: destination.address1,
145
+ postalCode: destination.postal_code.to_i,
146
+ city: destination.city,
147
+ state: destination.province.upcase,
148
+ country: destination.country.code(:alpha3).value,
149
+ contactName: destination.contact.name || 'Receiving',
150
+ contactPhone: receiver_phone || '',
151
+ stopName: destination.contact.name || 'Receiving',
152
+ hoursOpen: delivery_from.strftime('%I:%M %p'),
153
+ hoursClosed: delivery_to.strftime('%I:%M %p')
154
+ }
155
+ }
156
+ )
157
+ end
158
+
159
+ def build_rate_request(shipment:)
160
+ origin = shipment.origin
161
+ destination = shipment.destination
162
+
163
+ build_request(
164
+ :rates,
165
+ body: {
166
+ accessorials: build_accessorials(shipment:),
167
+ pickLocationType: origin.type || 'Commercial',
168
+ origin: {
169
+ postalCode: origin.postal_code.to_i,
170
+ city: origin.city,
171
+ state: origin.province.upcase,
172
+ country: origin.country.code(:alpha3).value
173
+ },
174
+ dropLocationType: destination.type || 'Commercial',
175
+ destination: {
176
+ postalCode: destination.postal_code.to_i,
177
+ city: destination.city,
178
+ state: destination.province.upcase,
179
+ country: destination.country.code(:alpha3).value
180
+ },
181
+ shipmentDate: shipment.pickup_at.date_time_with_zone.iso8601,
182
+ quoteCommodities: build_commodities(shipment)
183
+ }.to_json
184
+ )
185
+ end
186
+
187
+ def build_request(action, body: {}, query: {})
188
+ fetch_credential(:api).api_key
189
+
190
+ request = { url: build_url(action), method: API.dig(:methods, action), headers: {}, body:, query: }.compact
191
+
192
+ request[:headers] = { 'Authorization' => "Bearer #{build_access_token}" } unless action == :auth
193
+
194
+ save_request(request)
195
+ request
196
+ end
197
+
198
+ def build_tracking_request(tracking_number)
199
+ request = {
200
+ url: build_url(:track).gsub('%TRACKING_NUMBER%', tracking_number.to_s),
201
+ method: API.dig(:methods, :track),
202
+ headers: { 'Authorization' => "Bearer #{build_access_token}" }
203
+ }.compact
204
+
205
+ save_request(request)
206
+ request
207
+ end
208
+
209
+ def build_url(action) = "https://#{API[:domain]}#{API.dig(:endpoints, action)}"
210
+
211
+ def commit(request)
212
+ response = HTTPClient.request(
213
+ request[:method],
214
+ request[:url],
215
+ headers: request[:headers].merge(subscription_key_headers),
216
+ query: request[:query],
217
+ body: request[:body]
218
+ )
219
+
220
+ parsed_response = JSON.parse(response.body)
221
+ return parsed_response if [200, 201].include?(response.code)
222
+
223
+ message = if parsed_response.is_a?(String)
224
+ parsed_response
225
+ else
226
+ parsed_response.dig('content', 'message').presence || "HTTP #{response.code}"
227
+ end
228
+
229
+ raise FreightKit::ResponseError, message
230
+ rescue JSON::ParserError => e
231
+ raise FreightKit::InvalidCredentialsError if response.body.include?('Sorry, but we&#39;re having trouble signing you in')
232
+
233
+ raise FreightKit::ResponseError, e.message
234
+ end
235
+
236
+ def parse_pickup_response(response)
237
+ pickup_response = PickupResponse.new(request: last_request, response:)
238
+ pickup_number = response.dig('content', 'poNumber')
239
+
240
+ if pickup_number.blank?
241
+ pickup_response.error = FreightKit::ResponseError.new('Unknown response')
242
+ return pickup_response
243
+ end
244
+
245
+ pickup_response.pickup_number = pickup_number
246
+ pickup_response
247
+ end
248
+
249
+ def parse_rate_response(shipment:, response:)
250
+ rate_response = RateResponse.new(request: last_request, response:)
251
+
252
+ if response.blank?
253
+ rate_response.error = ResponseError.new('Unknown response')
254
+ return rate_response
255
+ end
256
+
257
+ if response['statusCode'] != 201
258
+ rate_response.error = ResponseError.new(response.dig('content', 'message'))
259
+ return rate_response
260
+ end
261
+
262
+ rates = []
263
+
264
+ response.dig('content', 'carrierPrices').each do |response_line|
265
+ rate_in_cents = (response_line['customerRate'].to_f * 100).round
266
+ rates << Rate.new(
267
+ carrier_name: response_line['carrier'],
268
+ carrier: self,
269
+ currency: 'USD',
270
+ estimate_reference: response_line['id'],
271
+ prices: [Price.new(blame: :api, cents: rate_in_cents, description: response_line['CarrierName'])],
272
+ scac: response_line['scac'],
273
+ service_name: :standard,
274
+ shipment:,
275
+ transit_days: response_line['transitDays'],
276
+ with_excessive_length_fees: rates_with_excessive_length_fees?
277
+ )
278
+ end
279
+
280
+ rate_response.rates = rates
281
+ rate_response
282
+ end
283
+
284
+ def parse_tracking_response(response)
285
+ tracking_response = TrackingResponse.new(carrier: self, request: last_request, response:)
286
+
287
+ actual_delivery_date = nil
288
+ estimated_delivery_date = nil
289
+ scheduled_delivery_date = nil
290
+ ship_time = nil
291
+
292
+ pickup_city, pickup_state = response['firstPick'].split(', ')
293
+ drop_city, drop_state = response['lastDrop'].split(', ')
294
+ country = ActiveUtils::Country.find('US') # Fallback To US. Country not provided in response
295
+ receiver_location = Location.new(city: pickup_city, province: pickup_state, country:)
296
+ shipper_location = Location.new(city: drop_city, province: drop_state, country:)
297
+
298
+ tracking_number = response['poNumber']
299
+ status = response['status']
300
+
301
+ shipment_events = []
302
+
303
+ response['trackingDetails'].each do |api_event|
304
+ event = EVENTS[:types].key(api_event['status'])
305
+
306
+ case event
307
+ when :picked_up
308
+ ship_time = api_event['time']
309
+ when :delivered
310
+ actual_delivery_date = api_event['time'].to_date
311
+ end
312
+
313
+ shipment_events << ShipmentEvent.new(
314
+ date_time: api_event['time'],
315
+ location: Location.new(city: api_event['city'], province: api_event['state'], country:),
316
+ type_code: event
317
+ )
318
+ end
319
+
320
+ tracking_response.assign_attributes(
321
+ actual_delivery_date:,
322
+ destination: receiver_location,
323
+ estimated_delivery_date:,
324
+ origin: shipper_location,
325
+ scheduled_delivery_date:,
326
+ ship_time:,
327
+ shipment_events:,
328
+ status:,
329
+ tracking_number:
330
+ )
331
+ end
332
+
333
+ def subscription_key_headers
334
+ { 'Ocp-Apim-Subscription-Key' => fetch_credential(:api).account, 'Content-Type' => 'application/json' }
335
+ end
336
+ end
337
+ end
338
+ end