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,25 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class A1Express < Carrier
4
+ class << self
5
+ def check_mailing_addresses
6
+ [
7
+ Address.new(
8
+ city: 'Vernon',
9
+ country: Countries.find_by(iso31661_alpha2: 'US'),
10
+ id: 'b6c55625-c4f0-42d0-aef3-067b70fc6f3e',
11
+ postal_code: '90058',
12
+ region_abbreviation: 'CA',
13
+ street: '4520 S Maywood Ave'
14
+ )
15
+ ]
16
+ end
17
+
18
+ def consider_bol_and_pod_documents_same? = true
19
+ def id = 'e899224d-f3c9-47b5-9e2f-61c9c0d8c497'
20
+ def name = 'A1 Express'
21
+ def scac = 'AOXQ'
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class ADuiePyle < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: '07dd8d84-72ad-4615-bed5-b0a1b5a3c9dc', phone: '+16106965800')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'West Chester',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: '1567bf10-dcb8-4eae-9bbb-d211c2ab3810',
14
+ postal_code: '19382',
15
+ region_abbreviation: 'PA',
16
+ street: '650 Westtown Rd'
17
+ )
18
+ end
19
+
20
+ def id = '57593449-77b3-4966-beca-4ab37fd3a927'
21
+ def legal_name = 'A Duie Pyle Inc'
22
+ def name = 'A Duie Pyle'
23
+ def scac = 'PYLE'
24
+ def us_dot_number = 113_594
25
+ def us_mc_number = 39_140
26
+ def website_url = 'https://aduiepyle.com'
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class AAACooper < Carrier
4
+ class << self
5
+ def id = 'b8a9ac0a-3c12-4edf-9e44-2e73dfdfc47b'
6
+ def name = 'AAA Cooper'
7
+ def scac = 'AACT'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class AAAExpeditedServices < Carrier
4
+ class << self
5
+ def id = 'f60248ce-d253-41dd-bcac-83f992d429da'
6
+ def name = 'AAA Expedited Services'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class ABBrothersUSAInc < Carrier
4
+ class << self
5
+ def id = 'a9fe374d-ae1a-4c9c-b466-bcb213392c88'
6
+ def legal_name = 'AB Brothers USA Inc'
7
+ def name = 'AB Brothers USA'
8
+ def us_mc_number = 974_610
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,28 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class AberdeenExpressInc < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: '7e1cc9f0-fa9f-45f4-b874-4369edf1e5d5', phone: '+15137723210')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'Sharonville',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: 'f9691559-d586-420f-8772-c1fd2ef6fb64',
14
+ postal_code: '45241',
15
+ region_abbreviation: 'OH',
16
+ street: '2490-B Commerce Blvd'
17
+ )
18
+ end
19
+
20
+ def id = '176e3b36-1769-4d3f-85d5-ed9ea0ccb70f'
21
+ def legal_name = 'Aberdeen Express Inc'
22
+ def name = 'Aberdeen Express'
23
+ def scac = 'ABNE'
24
+ def us_dot_number = 262_824
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,475 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class ABFFreightSystem < FreightKit::Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: 'ea41c709-cf46-4958-9a19-c78d7266ed6d', phone: '+18007556486')]
7
+ end
8
+
9
+ def find_rates_with_declared_value? = true
10
+
11
+ def headquarters
12
+ Address.new(
13
+ city: 'Fort Smith',
14
+ country: Countries.find_by(iso31661_alpha2: 'US'),
15
+ id: '9f83d523-a6dc-495b-b14e-06fc7e63daec',
16
+ postal_code: '72903-5937',
17
+ region_abbreviation: 'AR',
18
+ street: '3801 Old Greenwood Rd'
19
+ )
20
+ end
21
+
22
+ def id = 'bbbe2213-850b-4230-9211-14cf190ee1d1'
23
+ def legal_name = 'ABF Freight System Inc'
24
+ def maximum_height = Measured::Length.new(105, :inches)
25
+ def maximum_weight = Measured::Weight.new(150, :pounds)
26
+ def minimum_length_for_overlength_fees = Measured::Length.new(6, :feet)
27
+ def name = 'ABF Freight System'
28
+ def overlength_fees_require_tariff? = false
29
+ def pickup_number_is_tracking_number? = true
30
+ def required_credential_types = %i[api api_key]
31
+ def requirements = %i[credentials]
32
+ def scac = 'ABFS'
33
+
34
+ def serviceable_accessorials?(accessorials)
35
+ unsupported_accessorials = unserviceable_accessorials.select { |key| accessorials.include?(key) }.sort!
36
+
37
+ message = "#{unsupported_accessorials.join(', ')} unserviceable"
38
+ raise FreightKit::UnserviceableError, message if unsupported_accessorials.any?
39
+
40
+ true
41
+ end
42
+
43
+ def services = %i[standard]
44
+
45
+ def unserviceable_accessorials
46
+ %i[
47
+ afterhours_delivery
48
+ afterhours_pickup
49
+ appointment_delivery
50
+ appointment_pickup
51
+ athletic_facility_delivery
52
+ athletic_facility_pickup
53
+ brewery_delivery
54
+ brewery_pickup
55
+ construction_site_pickup
56
+ customs_brokerage
57
+ dock_dropoff
58
+ dock_pickup
59
+ driver_assist
60
+ early_morning_delivery
61
+ early_morning_pickup
62
+ fitness_center_delivery
63
+ fitness_center_pickup
64
+ flatbed_delivery
65
+ flatbed_pickup
66
+ gated_community_delivery
67
+ gated_community_pickup
68
+ grocery_store_delivery
69
+ grocery_store_pickup
70
+ grocery_warehouse_delivery
71
+ grocery_warehouse_pickup
72
+ guaranteed_delivery
73
+ guaranteed_delivery_am
74
+ guaranteed_delivery_pm
75
+ hotel_delivery
76
+ hotel_pickup
77
+ inspection_site_delivery
78
+ inspection_site_pickup
79
+ jobsite_delivery
80
+ jobsite_pickup
81
+ mall_delivery
82
+ mall_pickup
83
+ marina_delivery
84
+ marina_pickup
85
+ motel_delivery
86
+ motel_pickup
87
+ residential_delivery
88
+ residential_pickup
89
+ resort_delivery
90
+ resort_pickup
91
+ steel_mill_delivery
92
+ steel_mill_pickup
93
+ winery_delivery
94
+ winery_pickup
95
+ ]
96
+ end
97
+
98
+ def us_dot_number = 82_866
99
+ def us_mc_number = 29_910
100
+
101
+ def validate_packages(packages)
102
+ # @note This doesn't refer to package quantities, instead it referes to maximum number of package-related URL
103
+ # query params
104
+ raise FreightKit::UnserviceableError, 'Too many packages' if packages.count > 15
105
+
106
+ unsupported_packaging_types = packages.map(&:packaging).map(&:type).select { |type| PACKAGE_TYPES.keys.exclude?(type) }.sort!
107
+
108
+ message = "#{unsupported_packaging_types.join(', ').upcase_first} unserviceable"
109
+ raise FreightKit::UnserviceableError, message if unsupported_packaging_types.any?
110
+
111
+ true
112
+ end
113
+
114
+ def website_url = 'https://arcb.com'
115
+ end
116
+
117
+ API = { domain: 'www.abfs.com', endpoints: { rates: '/xml/aquotexml.asp' }, methods: { rates: 'GET' } }.freeze
118
+ DELIVERY_LIMITED_ACCESS_TYPES = {
119
+ airport_delivery: 'O',
120
+ amusement_park_delivery: 'O',
121
+ cemetery_delivery: 'O',
122
+ church_delivery: 'C',
123
+ construction_site_delivery: 'O',
124
+ convention_delivery: 'O',
125
+ fair_delivery: 'O',
126
+ farm_delivery: 'O',
127
+ golf_course_delivery: 'O',
128
+ government_delivery: 'O',
129
+ hospital_delivery: 'O',
130
+ liftgate_delivery: 'O',
131
+ military_site_delivery: 'M',
132
+ mine_site_delivery: 'O',
133
+ nursing_home_delivery: 'O',
134
+ park_delivery: 'O',
135
+ prison_delivery: 'O',
136
+ ranch_delivery: 'O',
137
+ reservation_delivery: 'O',
138
+ restaurant_delivery: 'O',
139
+ school_delivery: 'S',
140
+ storage_facility_delivery: 'U',
141
+ university_delivery: 'O',
142
+ utility_site_delivery: 'O'
143
+ }.freeze
144
+ PACKAGE_TYPES = {
145
+ box: 'BX',
146
+ bundle: 'BDL',
147
+ crate: 'CRT',
148
+ cylinder: 'CYL',
149
+ drum: 'DR',
150
+ luggage: 'PC',
151
+ pail: 'PL',
152
+ pallet: 'PLT',
153
+ piece: 'PC',
154
+ roll: 'RL',
155
+ tote: 'TOTE'
156
+ }.freeze
157
+ PICKUP_LIMITED_ACCESS_TYPES = {
158
+ airport_pickup: 'O',
159
+ amusement_park_pickup: 'O',
160
+ cemetery_pickup: 'O',
161
+ church_pickup: 'C',
162
+ convention_pickup: 'O',
163
+ fair_pickup: 'O',
164
+ farm_pickup: 'O',
165
+ golf_course_pickup: 'O',
166
+ government_pickup: 'O',
167
+ hospital_pickup: 'O',
168
+ liftgate_pickup: 'Acc_GRD_PU',
169
+ military_site_pickup: 'M',
170
+ mine_site_pickup: 'O',
171
+ nursing_home_pickup: 'O',
172
+ park_pickup: 'O',
173
+ prison_pickup: 'O',
174
+ ranch_pickup: 'O',
175
+ reservation_pickup: 'O',
176
+ restaurant_pickup: 'O',
177
+ school_pickup: 'S',
178
+ storage_facility_pickup: 'U',
179
+ university_pickup: 'O',
180
+ utility_site_pickup: 'O'
181
+ }.freeze
182
+ XML_HEADERS = { 'Accept' => 'application/xml', 'charset' => 'utf-8', 'Content-Type' => 'application/xml' }.freeze
183
+
184
+ # Documents
185
+
186
+ # Pickups
187
+
188
+ # Rates
189
+
190
+ def find_rates(shipment:)
191
+ begin
192
+ serviceable_accessorials?(shipment.accessorials)
193
+ validate_packages(shipment.packages)
194
+ rescue UnserviceableError => e
195
+ return RateResponse.new(error: e)
196
+ end
197
+
198
+ request = build_rate_request(shipment:)
199
+ # commit(request)
200
+ parse_rate_response(shipment:, response: commit(request))
201
+ end
202
+
203
+ # Tracking
204
+
205
+ protected
206
+
207
+ def build_rate_request(shipment:)
208
+ broker_credential = fetch_credential(:api)
209
+ tms_credential = fetch_credential(:api_key)
210
+
211
+ account = { 'ID' => broker_credential.username }
212
+ account['APP_ID'] = tms_credential.api_key
213
+
214
+ delivery = {}.tap do |builder|
215
+ delivery_limited_access_type = DELIVERY_LIMITED_ACCESS_TYPES.values_at(*shipment.accessorials).first
216
+
217
+ if delivery_limited_access_type.present?
218
+ builder['Acc_LAD'] = 'Y'
219
+ builder['LADType'] = delivery_limited_access_type
220
+ end
221
+
222
+ builder['Acc_CSD'] = 'Y' if shipment.accessorials.include?(:construction_site_delivery)
223
+ builder['Acc_GRD_DEL'] = 'Y' if shipment.accessorials.include?(:liftgate_delivery)
224
+ builder['Acc_IDEL'] = 'Y' if shipment.accessorials.include?(:inside_delivery)
225
+ builder['Acc_RDEL'] = 'Y' if shipment.accessorials.include?(:residential_delivery)
226
+
227
+ if shipment.accessorials.include?(:convention_delivery)
228
+ builder['Acc_TRDSHWD'] = 'Y'
229
+ builder['TRDSHWDType'] = 'DTS' if shipment.accessorials.include?(:convention_delivery)
230
+ end
231
+ end
232
+
233
+ pickup = {}.tap do |builder|
234
+ pickup_limited_access_type = PICKUP_LIMITED_ACCESS_TYPES.values_at(*shipment.accessorials).first
235
+
236
+ if pickup_limited_access_type.present?
237
+ builder['Acc_LAP'] = 'Y'
238
+ builder['LAPType'] = pickup_limited_access_type
239
+ end
240
+
241
+ builder['Acc_GRD_PU'] = 'Y' if shipment.accessorials.include?(:liftgate_pickup)
242
+ builder['Acc_IPU'] = 'Y' if shipment.accessorials.include?(:inside_pickup)
243
+ builder['Acc_RPU'] = 'Y' if shipment.accessorials.include?(:residential_pickup)
244
+ builder['Acc_TRDSHWO'] = 'DTS' if shipment.accessorials.include?(:convention_pickup)
245
+ end
246
+
247
+ shipper = {
248
+ 'ShipCity' => shipment.origin.city,
249
+ 'ShipState' => shipment.origin.province,
250
+ 'ShipZip' => shipment.origin.postal_code,
251
+ 'ShipCountry' => shipment.origin.country.code(:alpha2).value
252
+ }
253
+
254
+ consignee = {
255
+ 'ConsCity' => shipment.destination.city,
256
+ 'ConsState' => shipment.destination.province,
257
+ 'ConsZip' => shipment.destination.postal_code,
258
+ 'ConsCountry' => shipment.destination.country.code(:alpha2).value
259
+ }
260
+
261
+ third_party = {
262
+ 'TPBAcct' => broker_credential.account,
263
+ 'TPBAddr' => [customer_location.address1, customer_location.address2].compact.join(', '),
264
+ 'TPBAff' => 'Y',
265
+ 'TPBCity' => customer_location.city,
266
+ 'TPBCountry' => customer_location.country.code(:alpha2).value,
267
+ 'TPBName' => customer_location.contact&.company_name,
268
+ 'TPBPay' => 'Y',
269
+ 'TPBState' => customer_location.province,
270
+ 'TPBZip' => customer_location.postal_code
271
+ }
272
+ .compact_blank!
273
+
274
+ shipment.packages.map { |p| p.pounds(:total).ceil }.sum
275
+
276
+ commodities = shipment.packages.map.with_index do |package, i|
277
+ {
278
+ "Class#{i + 1}" => package.freight_class,
279
+ "FrtHght#{i + 1}" => package.inches(:height),
280
+ "FrtLng#{i + 1}" => package.inches(:length),
281
+ "FrtWdth#{i + 1}" => package.inches(:width),
282
+ "UnitNo#{i + 1}" => package.quantity,
283
+ "UnitType#{i + 1}" => PACKAGE_TYPES[package.packaging.type],
284
+ "Wgt#{i + 1}" => package.pounds(:total)
285
+ }
286
+ end
287
+ commodities = commodities.reduce({}, :merge)
288
+
289
+ # @note API won't accept any other date
290
+ time = Time.current.in_time_zone('America/Chicago')
291
+
292
+ specifics = {
293
+ 'FrtLWHType' => 'IN',
294
+ 'ShipMonth' => time.strftime('%m'),
295
+ 'ShipDay' => time.strftime('%d'),
296
+ 'ShipYear' => time.strftime('%Y')
297
+ }
298
+
299
+ if shipment.packages.map { |package| package.cubic_ft(:each) }.all?(&:present?)
300
+ specifics['Cube'] = shipment.packages.sum { |package| package.cubic_ft(:each) }.ceil
301
+ end
302
+
303
+ other_options = {}.tap do |builder|
304
+ alpha2_codes = [shipment.destination.country, shipment.origin.country].map { |country| country.code(:alpha2).value }
305
+
306
+ builder['Acc_ARR'] = 'Y' if shipment.accessorials.include?(:appointment_delivery)
307
+
308
+ if alpha2_codes.any? { |alpha2_code| alpha2_code == 'US' } &&
309
+ alpha2_codes.any? { |alpha2_code| alpha2_code != 'US' }
310
+ builder['Acc_BOND'] = 'Y'
311
+ end
312
+
313
+ unless shipment.accessorials.intersect?(%i[
314
+ church_delivery
315
+ inside_delivery
316
+ liftgate_delivery
317
+ residential_delivery
318
+ restaurant_delivery
319
+ ])
320
+ builder['Acc_CUL'] = 'Y'
321
+ end
322
+
323
+ builder['Acc_HAZ'] = 'Y' if shipment.packages.any?(&:hazmat?)
324
+ builder['Acc_PALLET'] = 'Y' if shipment.packages.map(&:packaging).all?(&:pallet?)
325
+
326
+ unless shipment.accessorials.intersect?(%i[church_pickup inside_pickup liftgate_pickup residential_pickup restaurant_pickup])
327
+ builder['Acc_SL'] = 'Y'
328
+ end
329
+
330
+ builder['Acc_SS'] = 'Y'
331
+
332
+ longest_dimension_in = if shipment.packages.all? { |package| package.length(:inch).present? && package.width(:inch).present? }
333
+
334
+ shipment.packages.map { |package| [package.length(:in), package.width(:in)].max }.max.ceil
335
+ end
336
+
337
+ if longest_dimension_in.present?
338
+ builder['ODLongestSide'] = longest_dimension_in
339
+
340
+ if longest_dimension_in >= 96
341
+ builder['Acc_OD'] = 'Y'
342
+
343
+ builder['Acc_CAP'] = 'Y' if longest_dimension_in >= 336
344
+ end
345
+ end
346
+
347
+ if shipment.declared_value_cents.present? && shipment.declared_value_cents.positive?
348
+ builder['Acc_ELC'] = 'Y'
349
+ builder['DeclaredType'] = 'N'
350
+ builder['DeclaredValue'] = (shipment.declared_value_cents / 100).ceil
351
+ end
352
+ end
353
+
354
+ params = [account, commodities, consignee, delivery, other_options, pickup, shipper, specifics, third_party].reduce({}, :merge)
355
+
356
+ build_request(:rates, { params: })
357
+ end
358
+
359
+ def build_request(action, options = {})
360
+ request = { url: build_url(action, options), headers: XML_HEADERS, method: API.dig(:methods, action) }
361
+
362
+ save_request(request)
363
+ request
364
+ end
365
+
366
+ def build_url(action, options = {})
367
+ uri = URI.parse("https://#{API[:domain]}#{API.dig(:endpoints, action)}")
368
+ uri.query = options[:params].to_query if options[:params].present?
369
+
370
+ uri.to_s
371
+ end
372
+
373
+ def commit(request)
374
+ body = request[:body]
375
+ headers = request[:headers]
376
+ method = request[:method]
377
+ url = request[:url]
378
+
379
+ response = if method == :post
380
+ HTTPClient.post(url, headers:, body:, proxy_url:)
381
+ else
382
+ HTTPClient.get(url, headers:, proxy_url:)
383
+ end
384
+
385
+ response.deep_transform_keys! { |key| key.downcase.to_sym }[:abf] if response&.parsed_response
386
+ end
387
+
388
+ def parse_rate_response(shipment:, response:)
389
+ rate_response = RateResponse.new(request: last_request, response:)
390
+
391
+ error_count = response[:numerrors].to_i
392
+ if error_count.positive?
393
+ # response.dig(:error, :errorcode).to_i
394
+
395
+ message = response.dig(:error, :errormessage)
396
+ rate_response.error = ResponseError.new(message)
397
+ return rate_response
398
+ end
399
+
400
+ if response[:charge].blank?
401
+ rate_response.error = ResponseError.new('Cost is blank')
402
+ return rate_response
403
+ end
404
+
405
+ estimate_reference = response[:quoteid]
406
+ included_charges = response[:includedcharges].compact_blank!.keys
407
+ transit_days = response[:standard_service_days].to_i
408
+
409
+ rates = [].tap do |builder|
410
+ cents = (response[:charge].to_f * 100).to_i
411
+ transit_days = parse_transit_duration(response[:shipdate], response[:advertisedduedate])
412
+ with_excessive_length_fees = included_charges.include?(:overdimension)
413
+
414
+ builder << Rate.new(
415
+ carrier: self,
416
+ carrier_name: name,
417
+ currency: 'USD',
418
+ estimate_reference:,
419
+ scac:,
420
+ service_name: :standard,
421
+ shipment:,
422
+ prices: [Price.new(blame: :api, cents:, description: 'Freight')],
423
+ transit_days:,
424
+ with_excessive_length_fees:
425
+ )
426
+
427
+ guaranteed_options = response.dig(:guaranteedoptions, :option)
428
+
429
+ if guaranteed_options.is_a?(Array)
430
+ guaranteed_options.each do |guaranteed_option|
431
+ cents = (guaranteed_option[:guaranteedcharge].to_f * 100).to_i
432
+ service_name = guaranteed_ltl_service(guaranteed_option[:guaranteedbytime])
433
+ transit_days = parse_transit_duration(response[:shipdate], guaranteed_option[:guaranteeddeldate])
434
+
435
+ builder << Rate.new(
436
+ carrier: self,
437
+ carrier_name: name,
438
+ currency: 'USD',
439
+ estimate_reference:,
440
+ scac:,
441
+ service_name:,
442
+ shipment:,
443
+ prices: [Price.new(blame: :api, cents:, description: 'Freight')],
444
+ transit_days:,
445
+ with_excessive_length_fees:
446
+ )
447
+ end
448
+ end
449
+ end
450
+
451
+ rate_response.rates = rates
452
+ rate_response
453
+ end
454
+
455
+ # Tracking
456
+
457
+ private
458
+
459
+ def guaranteed_ltl_service(hours)
460
+ raise ArgumentError, 'Invalid hours' unless hours.match?(/^\d{4}$/)
461
+
462
+ return :guaranteed_ltl_am if hours[0..1].to_i <= 12
463
+
464
+ :guaranteed_ltl
465
+ end
466
+
467
+ def parse_transit_duration(from, to)
468
+ from = ::Time.parse(from).in_time_zone('America/Chicago')
469
+ to = ::Time.parse(to).in_time_zone('America/Chicago')
470
+
471
+ (from.business_time_until(to) / 28_800.0).days
472
+ end
473
+ end
474
+ end
475
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class AccessTransport < Carrier
4
+ class << self
5
+ def id = '2ee33087-cd6a-4b77-8f03-06a17e8fda44'
6
+ def name = 'Access Transport'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class ActionExpress < Carrier
4
+ class << self
5
+ def id = 'b1f09c44-1765-464f-afd4-58c7c3ea5aa1'
6
+ def name = 'Action Express'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class AdamsAndCompanies < Carrier
4
+ class << self
5
+ def id = '730aad6a-356b-46a0-8d66-d7ac0f4ea0f2'
6
+ def name = 'Adams & Companies'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,28 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class AdvanceDistribution < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: '38161452-94fe-4f2c-ab22-557ff44d0c4a', phone: '+17655535999')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'Kokomo',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: '6a11b04d-514e-47df-821c-069b57748272',
14
+ postal_code: '46901',
15
+ region_abbreviation: 'IN',
16
+ street: '700 Touby Pike'
17
+ )
18
+ end
19
+
20
+ def id = '0cece448-c35a-40d5-9f40-08de623f808b'
21
+ def legal_name = 'Advance Distribution Inc'
22
+ def name = 'Advance Distribution'
23
+ def us_dot_number = 709_610
24
+ def website_url = 'https://shipadi.com'
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class AlconTransport < Carrier
4
+ class << self
5
+ def id = 'eb1b573b-42e9-463b-b88c-bca06c3e42da'
6
+ def name = 'Alcon Transport'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class AllFreight < Carrier
4
+ class << self
5
+ def id = '20790e3a-8f4f-4e4f-a7d2-91f36085a4a5'
6
+ def name = 'All Freight'
7
+ end
8
+ end
9
+ end
10
+ end