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,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,492 @@
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 do |key|
36
+ accessorials.include?(key)
37
+ end.sort!
38
+
39
+ message = "#{unsupported_accessorials.join(', ')} unserviceable"
40
+ raise FreightKit::UnserviceableError, message if unsupported_accessorials.any?
41
+
42
+ true
43
+ end
44
+
45
+ def services = %i[standard]
46
+
47
+ def unserviceable_accessorials
48
+ %i[
49
+ afterhours_delivery
50
+ afterhours_pickup
51
+ appointment_delivery
52
+ appointment_pickup
53
+ athletic_facility_delivery
54
+ athletic_facility_pickup
55
+ brewery_delivery
56
+ brewery_pickup
57
+ construction_site_pickup
58
+ customs_brokerage
59
+ dock_dropoff
60
+ dock_pickup
61
+ driver_assist
62
+ early_morning_delivery
63
+ early_morning_pickup
64
+ fitness_center_delivery
65
+ fitness_center_pickup
66
+ flatbed_delivery
67
+ flatbed_pickup
68
+ gated_community_delivery
69
+ gated_community_pickup
70
+ grocery_store_delivery
71
+ grocery_store_pickup
72
+ grocery_warehouse_delivery
73
+ grocery_warehouse_pickup
74
+ guaranteed_delivery
75
+ guaranteed_delivery_am
76
+ guaranteed_delivery_pm
77
+ hotel_delivery
78
+ hotel_pickup
79
+ inspection_site_delivery
80
+ inspection_site_pickup
81
+ jobsite_delivery
82
+ jobsite_pickup
83
+ mall_delivery
84
+ mall_pickup
85
+ marina_delivery
86
+ marina_pickup
87
+ motel_delivery
88
+ motel_pickup
89
+ residential_delivery
90
+ residential_pickup
91
+ resort_delivery
92
+ resort_pickup
93
+ steel_mill_delivery
94
+ steel_mill_pickup
95
+ winery_delivery
96
+ winery_pickup
97
+ ]
98
+ end
99
+
100
+ def us_dot_number = 82_866
101
+ def us_mc_number = 29_910
102
+
103
+ def validate_packages(packages)
104
+ # @note This doesn't refer to package quantities, instead it referes to maximum number of package-related URL
105
+ # query params
106
+ raise FreightKit::UnserviceableError, 'Too many packages' if packages.count > 15
107
+
108
+ unsupported_packaging_types = packages.map(&:packaging).map(&:type).select do |type|
109
+ PACKAGE_TYPES.keys.exclude?(type)
110
+ end.sort!
111
+
112
+ message = "#{unsupported_packaging_types.join(', ').upcase_first} unserviceable"
113
+ raise FreightKit::UnserviceableError, message if unsupported_packaging_types.any?
114
+
115
+ true
116
+ end
117
+
118
+ def website_url = 'https://arcb.com'
119
+ end
120
+
121
+ API = { domain: 'www.abfs.com', endpoints: { rates: '/xml/aquotexml.asp' }, methods: { rates: 'GET' } }.freeze
122
+ DELIVERY_LIMITED_ACCESS_TYPES = {
123
+ airport_delivery: 'O',
124
+ amusement_park_delivery: 'O',
125
+ cemetery_delivery: 'O',
126
+ church_delivery: 'C',
127
+ construction_site_delivery: 'O',
128
+ convention_delivery: 'O',
129
+ fair_delivery: 'O',
130
+ farm_delivery: 'O',
131
+ golf_course_delivery: 'O',
132
+ government_delivery: 'O',
133
+ hospital_delivery: 'O',
134
+ liftgate_delivery: 'O',
135
+ military_site_delivery: 'M',
136
+ mine_site_delivery: 'O',
137
+ nursing_home_delivery: 'O',
138
+ park_delivery: 'O',
139
+ prison_delivery: 'O',
140
+ ranch_delivery: 'O',
141
+ reservation_delivery: 'O',
142
+ restaurant_delivery: 'O',
143
+ school_delivery: 'S',
144
+ storage_facility_delivery: 'U',
145
+ university_delivery: 'O',
146
+ utility_site_delivery: 'O'
147
+ }.freeze
148
+ PACKAGE_TYPES = {
149
+ box: 'BX',
150
+ bundle: 'BDL',
151
+ crate: 'CRT',
152
+ cylinder: 'CYL',
153
+ drum: 'DR',
154
+ luggage: 'PC',
155
+ pail: 'PL',
156
+ pallet: 'PLT',
157
+ piece: 'PC',
158
+ roll: 'RL',
159
+ tote: 'TOTE'
160
+ }.freeze
161
+ PICKUP_LIMITED_ACCESS_TYPES = {
162
+ airport_pickup: 'O',
163
+ amusement_park_pickup: 'O',
164
+ cemetery_pickup: 'O',
165
+ church_pickup: 'C',
166
+ convention_pickup: 'O',
167
+ fair_pickup: 'O',
168
+ farm_pickup: 'O',
169
+ golf_course_pickup: 'O',
170
+ government_pickup: 'O',
171
+ hospital_pickup: 'O',
172
+ liftgate_pickup: 'Acc_GRD_PU',
173
+ military_site_pickup: 'M',
174
+ mine_site_pickup: 'O',
175
+ nursing_home_pickup: 'O',
176
+ park_pickup: 'O',
177
+ prison_pickup: 'O',
178
+ ranch_pickup: 'O',
179
+ reservation_pickup: 'O',
180
+ restaurant_pickup: 'O',
181
+ school_pickup: 'S',
182
+ storage_facility_pickup: 'U',
183
+ university_pickup: 'O',
184
+ utility_site_pickup: 'O'
185
+ }.freeze
186
+ XML_HEADERS = { 'Accept' => 'application/xml', 'charset' => 'utf-8', 'Content-Type' => 'application/xml' }.freeze
187
+
188
+ # Documents
189
+
190
+ # Pickups
191
+
192
+ # Rates
193
+
194
+ def find_rates(shipment:)
195
+ begin
196
+ serviceable_accessorials?(shipment.accessorials)
197
+ validate_packages(shipment.packages)
198
+ rescue UnserviceableError => e
199
+ return RateResponse.new(error: e)
200
+ end
201
+
202
+ request = build_rate_request(shipment:)
203
+ # commit(request)
204
+ parse_rate_response(shipment:, response: commit(request))
205
+ end
206
+
207
+ # Tracking
208
+
209
+ protected
210
+
211
+ def build_rate_request(shipment:)
212
+ broker_credential = fetch_credential(:api)
213
+ tms_credential = fetch_credential(:api_key)
214
+
215
+ account = { 'ID' => broker_credential.username }
216
+ account['APP_ID'] = tms_credential.api_key
217
+
218
+ delivery = {}.tap do |builder|
219
+ delivery_limited_access_type = DELIVERY_LIMITED_ACCESS_TYPES.values_at(*shipment.accessorials).first
220
+
221
+ if delivery_limited_access_type.present?
222
+ builder['Acc_LAD'] = 'Y'
223
+ builder['LADType'] = delivery_limited_access_type
224
+ end
225
+
226
+ builder['Acc_CSD'] = 'Y' if shipment.accessorials.include?(:construction_site_delivery)
227
+ builder['Acc_GRD_DEL'] = 'Y' if shipment.accessorials.include?(:liftgate_delivery)
228
+ builder['Acc_IDEL'] = 'Y' if shipment.accessorials.include?(:inside_delivery)
229
+ builder['Acc_RDEL'] = 'Y' if shipment.accessorials.include?(:residential_delivery)
230
+
231
+ if shipment.accessorials.include?(:convention_delivery)
232
+ builder['Acc_TRDSHWD'] = 'Y'
233
+ builder['TRDSHWDType'] = 'DTS' if shipment.accessorials.include?(:convention_delivery)
234
+ end
235
+ end
236
+
237
+ pickup = {}.tap do |builder|
238
+ pickup_limited_access_type = PICKUP_LIMITED_ACCESS_TYPES.values_at(*shipment.accessorials).first
239
+
240
+ if pickup_limited_access_type.present?
241
+ builder['Acc_LAP'] = 'Y'
242
+ builder['LAPType'] = pickup_limited_access_type
243
+ end
244
+
245
+ builder['Acc_GRD_PU'] = 'Y' if shipment.accessorials.include?(:liftgate_pickup)
246
+ builder['Acc_IPU'] = 'Y' if shipment.accessorials.include?(:inside_pickup)
247
+ builder['Acc_RPU'] = 'Y' if shipment.accessorials.include?(:residential_pickup)
248
+ builder['Acc_TRDSHWO'] = 'DTS' if shipment.accessorials.include?(:convention_pickup)
249
+ end
250
+
251
+ shipper = {
252
+ 'ShipCity' => shipment.origin.city,
253
+ 'ShipState' => shipment.origin.province,
254
+ 'ShipZip' => shipment.origin.postal_code,
255
+ 'ShipCountry' => shipment.origin.country.code(:alpha2).value
256
+ }
257
+
258
+ consignee = {
259
+ 'ConsCity' => shipment.destination.city,
260
+ 'ConsState' => shipment.destination.province,
261
+ 'ConsZip' => shipment.destination.postal_code,
262
+ 'ConsCountry' => shipment.destination.country.code(:alpha2).value
263
+ }
264
+
265
+ third_party = {
266
+ 'TPBAcct' => broker_credential.account,
267
+ 'TPBAddr' => [customer_location.address1, customer_location.address2].compact.join(', '),
268
+ 'TPBAff' => 'Y',
269
+ 'TPBCity' => customer_location.city,
270
+ 'TPBCountry' => customer_location.country.code(:alpha2).value,
271
+ 'TPBName' => customer_location.contact&.company_name,
272
+ 'TPBPay' => 'Y',
273
+ 'TPBState' => customer_location.province,
274
+ 'TPBZip' => customer_location.postal_code
275
+ }
276
+ .compact_blank!
277
+
278
+ shipment.packages.map { |p| p.pounds(:total).ceil }.sum
279
+
280
+ commodities = shipment.packages.map.with_index do |package, i|
281
+ {
282
+ "Class#{i + 1}" => package.freight_class,
283
+ "FrtHght#{i + 1}" => package.inches(:height),
284
+ "FrtLng#{i + 1}" => package.inches(:length),
285
+ "FrtWdth#{i + 1}" => package.inches(:width),
286
+ "UnitNo#{i + 1}" => package.quantity,
287
+ "UnitType#{i + 1}" => PACKAGE_TYPES[package.packaging.type],
288
+ "Wgt#{i + 1}" => package.pounds(:total)
289
+ }
290
+ end
291
+ commodities = commodities.reduce({}, :merge)
292
+
293
+ # @note API won't accept any other date
294
+ time = Time.current.in_time_zone('America/Chicago')
295
+
296
+ specifics = {
297
+ 'FrtLWHType' => 'IN',
298
+ 'ShipMonth' => time.strftime('%m'),
299
+ 'ShipDay' => time.strftime('%d'),
300
+ 'ShipYear' => time.strftime('%Y')
301
+ }
302
+
303
+ if shipment.packages.map { |package| package.cubic_ft(:each) }.all?(&:present?)
304
+ specifics['Cube'] = shipment.packages.sum { |package| package.cubic_ft(:each) }.ceil
305
+ end
306
+
307
+ other_options = {}.tap do |builder|
308
+ alpha2_codes = [shipment.destination.country, shipment.origin.country].map do |country|
309
+ country.code(:alpha2).value
310
+ end
311
+
312
+ builder['Acc_ARR'] = 'Y' if shipment.accessorials.include?(:appointment_delivery)
313
+
314
+ if alpha2_codes.any? { |alpha2_code| alpha2_code == 'US' } &&
315
+ alpha2_codes.any? { |alpha2_code| alpha2_code != 'US' }
316
+ builder['Acc_BOND'] = 'Y'
317
+ end
318
+
319
+ unless shipment.accessorials.intersect?(%i[
320
+ church_delivery
321
+ inside_delivery
322
+ liftgate_delivery
323
+ residential_delivery
324
+ restaurant_delivery
325
+ ])
326
+ builder['Acc_CUL'] = 'Y'
327
+ end
328
+
329
+ builder['Acc_HAZ'] = 'Y' if shipment.packages.any?(&:hazmat?)
330
+ builder['Acc_PALLET'] = 'Y' if shipment.packages.map(&:packaging).all?(&:pallet?)
331
+
332
+ unless shipment.accessorials.intersect?(%i[
333
+ church_pickup
334
+ inside_pickup
335
+ liftgate_pickup
336
+ residential_pickup
337
+ restaurant_pickup
338
+ ])
339
+ builder['Acc_SL'] = 'Y'
340
+ end
341
+
342
+ builder['Acc_SS'] = 'Y'
343
+
344
+ longest_dimension_in = if shipment.packages.all? do |package|
345
+ package.length(:inch).present? && package.width(:inch).present?
346
+ end
347
+
348
+ shipment.packages.map do |package|
349
+ [package.length(:in), package.width(:in)].max
350
+ end.max.ceil
351
+ end
352
+
353
+ if longest_dimension_in.present?
354
+ builder['ODLongestSide'] = longest_dimension_in
355
+
356
+ if longest_dimension_in >= 96
357
+ builder['Acc_OD'] = 'Y'
358
+
359
+ builder['Acc_CAP'] = 'Y' if longest_dimension_in >= 336
360
+ end
361
+ end
362
+
363
+ if shipment.declared_value_cents.present? && shipment.declared_value_cents.positive?
364
+ builder['Acc_ELC'] = 'Y'
365
+ builder['DeclaredType'] = 'N'
366
+ builder['DeclaredValue'] = (shipment.declared_value_cents / 100).ceil
367
+ end
368
+ end
369
+
370
+ params = [account, commodities, consignee, delivery, other_options, pickup, shipper, specifics, third_party]
371
+ .reduce({}, :merge)
372
+
373
+ build_request(:rates, { params: })
374
+ end
375
+
376
+ def build_request(action, options = {})
377
+ request = { url: build_url(action, options), headers: XML_HEADERS, method: API.dig(:methods, action) }
378
+
379
+ save_request(request)
380
+ request
381
+ end
382
+
383
+ def build_url(action, options = {})
384
+ uri = URI.parse("https://#{API[:domain]}#{API.dig(:endpoints, action)}")
385
+ uri.query = options[:params].to_query if options[:params].present?
386
+
387
+ uri.to_s
388
+ end
389
+
390
+ def commit(request)
391
+ body = request[:body]
392
+ headers = request[:headers]
393
+ method = request[:method]
394
+ url = request[:url]
395
+
396
+ response = if method == :post
397
+ HTTPClient.post(url, headers:, body:)
398
+ else
399
+ HTTPClient.get(url, headers:)
400
+ end
401
+
402
+ response.deep_transform_keys! { |key| key.downcase.to_sym }[:abf] if response&.parsed_response
403
+ end
404
+
405
+ def parse_rate_response(shipment:, response:)
406
+ rate_response = RateResponse.new(request: last_request, response:)
407
+
408
+ error_count = response[:numerrors].to_i
409
+ if error_count.positive?
410
+ # response.dig(:error, :errorcode).to_i
411
+
412
+ message = response.dig(:error, :errormessage)
413
+ rate_response.error = ResponseError.new(message)
414
+ return rate_response
415
+ end
416
+
417
+ if response[:charge].blank?
418
+ rate_response.error = ResponseError.new('Cost is blank')
419
+ return rate_response
420
+ end
421
+
422
+ estimate_reference = response[:quoteid]
423
+ included_charges = response[:includedcharges].compact_blank!.keys
424
+ transit_days = response[:standard_service_days].to_i
425
+
426
+ rates = [].tap do |builder|
427
+ cents = (response[:charge].to_f * 100).to_i
428
+ transit_days = parse_transit_duration(response[:shipdate], response[:advertisedduedate])
429
+ with_excessive_length_fees = included_charges.include?(:overdimension)
430
+
431
+ builder << Rate.new(
432
+ carrier: self,
433
+ carrier_name: name,
434
+ currency: 'USD',
435
+ estimate_reference:,
436
+ scac:,
437
+ service_name: :standard,
438
+ shipment:,
439
+ prices: [Price.new(blame: :api, cents:, description: 'Freight')],
440
+ transit_days:,
441
+ with_excessive_length_fees:
442
+ )
443
+
444
+ guaranteed_options = response.dig(:guaranteedoptions, :option)
445
+
446
+ if guaranteed_options.is_a?(Array)
447
+ guaranteed_options.each do |guaranteed_option|
448
+ cents = (guaranteed_option[:guaranteedcharge].to_f * 100).to_i
449
+ service_name = guaranteed_ltl_service(guaranteed_option[:guaranteedbytime])
450
+ transit_days = parse_transit_duration(response[:shipdate], guaranteed_option[:guaranteeddeldate])
451
+
452
+ builder << Rate.new(
453
+ carrier: self,
454
+ carrier_name: name,
455
+ currency: 'USD',
456
+ estimate_reference:,
457
+ scac:,
458
+ service_name:,
459
+ shipment:,
460
+ prices: [Price.new(blame: :api, cents:, description: 'Freight')],
461
+ transit_days:,
462
+ with_excessive_length_fees:
463
+ )
464
+ end
465
+ end
466
+ end
467
+
468
+ rate_response.rates = rates
469
+ rate_response
470
+ end
471
+
472
+ # Tracking
473
+
474
+ private
475
+
476
+ def guaranteed_ltl_service(hours)
477
+ raise ArgumentError, 'Invalid hours' unless hours.match?(/^\d{4}$/)
478
+
479
+ return :guaranteed_ltl_am if hours[0..1].to_i <= 12
480
+
481
+ :guaranteed_ltl
482
+ end
483
+
484
+ def parse_transit_duration(from, to)
485
+ from = ::Time.parse(from).in_time_zone('America/Chicago')
486
+ to = ::Time.parse(to).in_time_zone('America/Chicago')
487
+
488
+ (from.business_time_until(to) / 28_800.0).days
489
+ end
490
+ end
491
+ end
492
+ 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