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,27 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class SBTransportation < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: '44d7a6cd-793a-4854-b310-59d549fe9a86', phone: '+14077044947')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'Orlando',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: '273678e1-0877-45d0-8b38-c9463f58ebfe',
14
+ postal_code: '32819-8508',
15
+ region_abbreviation: 'FL',
16
+ street: '7575 Kingspointe Pkwy Ste 26'
17
+ )
18
+ end
19
+
20
+ def id = 'b9fe0d63-1637-41c5-add9-7ad95a5fceda'
21
+ def legal_name = 'SB Transportation Service Inc'
22
+ def name = 'SB Transportation'
23
+ def us_dot_number = 3_072_336
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,29 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class SchneiderNational < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: '16de7430-ff26-415a-817d-9acd2f5ca69f', phone: '+18005586767')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'Green Bay',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: 'f03995ec-487e-4b04-ad6b-6f5d4e9ccc36',
14
+ postal_code: '54313',
15
+ region_abbreviation: 'WI',
16
+ street: '3101 South Packerland Drive'
17
+ )
18
+ end
19
+
20
+ def id = '7f242e83-5194-4d2b-adee-0025dd7c00ff'
21
+ def legal_name = 'Schneider National Carriers Inc'
22
+ def name = 'Schneider National'
23
+ def us_dot_number = 264_184
24
+ def us_mc_number = 133_655
25
+ def website_url = 'https://schneider.com'
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class SchwarzTrucking < Carrier
4
+ class << self
5
+ def id = '8c5ea288-b345-470b-8816-3f37a691a2cc'
6
+ def name = 'Schwarz Trucking'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,29 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class SewellMotorExpress < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: '2d3cd00e-fc8e-4a1e-95cd-948667e5b0bd', phone: '+19373823847')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'Wilmington',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: 'f550e34c-83b5-4795-a537-f7a7325b688a',
14
+ postal_code: '45177',
15
+ region_abbreviation: 'OH',
16
+ street: '370 Davids Drive'
17
+ )
18
+ end
19
+
20
+ def id = '8868b780-9c04-4a1c-a0df-6b9cb3b06b47'
21
+ def legal_name = 'Sewell Motor Express Co'
22
+ def name = 'Sewell Motor Express'
23
+ def us_dot_number = 258_149
24
+ def us_mc_number = 57_992
25
+ def website_url = 'https://go-sewell.com'
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class ShawneeTrucking < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: 'cc54bc7b-4053-4d10-9a79-c05e5c06fd99', phone: '+12014387060')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'Clifton',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: '00527f54-15cb-49c4-a1b4-e4c04b041824',
14
+ postal_code: '07012',
15
+ region_abbreviation: 'NJ',
16
+ street: '50 Somerset Place'
17
+ )
18
+ end
19
+
20
+ def id = 'f619ca2e-b7ec-4a3a-a190-e970c135ba44'
21
+ def legal_name = 'Shawnee Trucking Company Inc'
22
+ def name = 'Shawnee Trucking'
23
+ def us_dot_number = 564_981
24
+ def us_mc_number = 275_313
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class ShiLogistics < Carrier
4
+ class << self
5
+ def id = 'b56a7770-6988-4410-944c-d85f178d10cb'
6
+ def name = 'Shi Logistics'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class SinbadTransport < Carrier
4
+ class << self
5
+ def id = '5e463c12-33f6-43b7-ae7f-65246a83d140'
6
+ def name = 'Sinbad Transport'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class Skyway < Carrier
4
+ class << self
5
+ def id = '10e5f283-2b39-4b04-bd21-076ceae20c0d'
6
+ def name = 'Skyway'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class SmithCargoTransportationServices < Carrier
4
+ class << self
5
+ def check_mailing_addresses
6
+ [
7
+ Address.new(
8
+ city: 'Atlanta',
9
+ country: Countries.find_by(iso31661_alpha2: 'US'),
10
+ id: '1d2277ec-c692-4e8c-b270-c61a0dfc7aab',
11
+ postal_code: '31192',
12
+ region_abbreviation: 'GA',
13
+ street: 'Dept At 952490'
14
+ )
15
+ ]
16
+ end
17
+
18
+ def id = '9d4c34e3-ce99-4610-a99e-1d7a503e2e0f'
19
+ def name = 'Smith Cargo Transportation Services'
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class SNATransportation < Carrier
4
+ class << self
5
+ def id = '070feac7-1983-460f-9353-ff25a293e240'
6
+ def name = 'SNA Transportation'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class SolidGroup < Carrier
4
+ class << self
5
+ def id = 'ef53463f-6edf-4dd4-bd8a-eadeb642d9d2'
6
+ def name = 'Solid Group'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class SolutionCarrierExpress < Carrier
4
+ class << self
5
+ def id = '4534f34f-e00f-4bc0-a479-6d1b9d94ae95'
6
+ def name = 'Solution Carrier Express'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,450 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class SoutheasternFreightLines < FreightKit::Carrier
4
+ class << self
5
+ def check_mailing_addresses
6
+ [
7
+ Address.new(
8
+ city: 'Lexington',
9
+ country: Countries.find_by(iso31661_alpha2: 'US'),
10
+ id: 'd032f1fc-0c3d-4717-b9e7-314156374088',
11
+ postal_code: '29073',
12
+ region_abbreviation: 'SC',
13
+ street: '420 Davega Rd'
14
+ )
15
+ ]
16
+ end
17
+
18
+ def contacts
19
+ [Contact.new(department: 'Main', id: 'da295604-b58b-4f48-bdfa-3bfea8c9514e', phone: '+18006377335')]
20
+ end
21
+
22
+ def find_rates_with_declared_value? = true
23
+
24
+ def headquarters
25
+ Address.new(
26
+ city: 'Lexington',
27
+ country: Countries.find_by(iso31661_alpha2: 'US'),
28
+ id: '13399c8d-ffaf-4e3b-b9ee-872b3b964308',
29
+ postal_code: '29073',
30
+ region_abbreviation: 'SC',
31
+ street: '420 Davega Rd'
32
+ )
33
+ end
34
+
35
+ def id = '4f076fd0-ed4f-4e66-9cfe-9c880c9db8ca'
36
+ def legal_name = 'Southeastern Freight Lines LLC'
37
+
38
+ def mappable_accessorials
39
+ {
40
+ airport_delivery: 'chkAPD',
41
+ airport_pickup: 'chkAPU',
42
+ amusement_park_delivery: 'chkLAD',
43
+ amusement_park_pickup: 'chkLAP',
44
+ appointment_delivery: 'chkAN',
45
+ athletic_facility_delivery: 'chkLAD',
46
+ athletic_facility_pickup: 'chkLAP',
47
+ cemetery_delivery: 'chkLAD',
48
+ cemetery_pickup: 'chkLAP',
49
+ church_delivery: 'chkLAD',
50
+ church_pickup: 'chkLAP',
51
+ construction_delivery: 'chkLAD',
52
+ construction_pickup: 'chkLAP',
53
+ convention_delivery: 'chkLAD',
54
+ convention_pickup: 'chkLAP',
55
+ dock_dropoff: 'chkSHC',
56
+ fair_delivery: 'chkLAD',
57
+ fair_pickup: 'chkLAP',
58
+ farm_delivery: 'chkLAD',
59
+ farm_pickup: 'chkLAP',
60
+ fitness_center_delivery: 'chkLAD',
61
+ fitness_center_pickup: 'chkLAP',
62
+ golf_course_delivery: 'chkLAD',
63
+ golf_course_pickup: 'chkLAP',
64
+ government_delivery: 'chkLAD',
65
+ government_pickup: 'chkLAP',
66
+ grocery_store_delivery: 'chkLAD',
67
+ grocery_store_pickup: 'chkLAP',
68
+ guaranteed_delivery: 'chkDG',
69
+ guaranteed_delivery_am: 'chkNG',
70
+ guaranteed_delivery_pm: 'chkDG',
71
+ hospital_delivery: 'chkLAD',
72
+ hospital_pickup: 'chkLAP',
73
+ hotel_delivery: 'chkLAD',
74
+ hotel_pickup: 'chkLAP',
75
+ inside_delivery: 'chkID',
76
+ inside_pickup: 'chkIP',
77
+ inspection_site_delivery: 'chkLAD',
78
+ inspection_site_pickup: 'chkLAP',
79
+ jobsite_delivery: 'chkLAD',
80
+ jobsite_pickup: 'chkLAP',
81
+ liftgate_delivery: 'chkLGD',
82
+ liftgate_pickup: 'chkLGP',
83
+ mall_delivery: 'chkLAD',
84
+ mall_pickup: 'chkLAP',
85
+ marina_delivery: 'chkLAD',
86
+ marina_pickup: 'chkLAP',
87
+ military_site_delivery: 'chkLAD',
88
+ military_site_pickup: 'chkLAP',
89
+ mine_site_delivery: 'chkLAD',
90
+ mine_site_pickup: 'chkLAP',
91
+ motel_delivery: 'chkLAD',
92
+ motel_pickup: 'chkLAP',
93
+ nursing_home_delivery: 'chkLAD',
94
+ nursing_home_pickup: 'chkLAP',
95
+ park_delivery: 'chkLAD',
96
+ park_pickup: 'chkLAP',
97
+ prison_delivery: 'chkLAD',
98
+ prison_pickup: 'chkLAP',
99
+ ranch_delivery: 'chkLAD',
100
+ ranch_pickup: 'chkLAP',
101
+ reservation_delivery: 'chkLAD',
102
+ reservation_pickup: 'chkLAP',
103
+ residential_delivery: 'chkPR',
104
+ residential_pickup: 'chkPR',
105
+ resort_delivery: 'chkLAD',
106
+ resort_pickup: 'chkLAP',
107
+ restaurant_delivery: 'chkLAD',
108
+ restaurant_pickup: 'chkLAP',
109
+ school_delivery: 'chkLAD',
110
+ school_pickup: 'chkLAP',
111
+ steel_mill_delivery: 'chkLAD',
112
+ steel_mill_pickup: 'chkLAP',
113
+ storage_facility_delivery: 'chkLAD',
114
+ storage_facility_pickup: 'chkLAP',
115
+ university_delivery: 'chkLAD',
116
+ university_pickup: 'chkLAP',
117
+ utility_site_delivery: 'chkLAD',
118
+ utility_site_pickup: 'chkLAP'
119
+ }
120
+ end
121
+
122
+ def maximum_height = Measured::Length.new(105, :inches)
123
+ def maximum_weight = Measured::Weight.new(10_000, :pounds)
124
+ def minimum_length_for_overlength_fees = Measured::Length.new(8, :feet)
125
+ def name = 'Southeastern Freight Lines'
126
+ def overlength_fees_require_tariff? = false
127
+ def required_credential_types = %i[api]
128
+ def requirements = %i[credentials]
129
+ def scac = 'SEFL'
130
+ def services = %i[standard]
131
+ def unquotable_accessorials = %i[dock_pickup]
132
+
133
+ def unserviceable_accessorials
134
+ %i[
135
+ afterhours_delivery
136
+ afterhours_pickup
137
+ appointment_pickup
138
+ brewery_delivery
139
+ brewery_pickup
140
+ customs_brokerage
141
+ driver_assist
142
+ early_morning_delivery
143
+ early_morning_pickup
144
+ flatbed_delivery
145
+ flatbed_pickup
146
+ grocery_warehouse_delivery
147
+ grocery_warehouse_pickup
148
+ winery_delivery
149
+ winery_pickup
150
+ ]
151
+ end
152
+
153
+ def us_dot_number = 63_419
154
+ def website_url = 'https://sefl.com'
155
+ end
156
+
157
+ API = {
158
+ domain: 'www.sefl.com',
159
+ endpoints: { rates: '/webconnect/ratequotes/rest/submitQuote' },
160
+ methods: { get_rate: :get, rates: :post },
161
+ use_ssl: false
162
+ }.freeze
163
+ JSON_HEADERS = {
164
+ Accept: 'application/json',
165
+ charset: 'utf-8',
166
+ 'Content-Type' => 'application/x-www-form-urlencoded'
167
+ }.freeze
168
+
169
+ # Documents
170
+
171
+ # Rates
172
+ def find_rates(shipment:)
173
+ begin
174
+ validate_packages(shipment.packages)
175
+ rescue UnserviceableError => e
176
+ return RateResponse.new(error: e)
177
+ end
178
+
179
+ request = build_rate_request(shipment:)
180
+ parse_rate_response(shipment:, response: commit(request))
181
+ end
182
+
183
+ # Tracking
184
+
185
+ protected
186
+
187
+ def auth_header
188
+ api_credentials = fetch_credential(:api)
189
+ auth = Base64.strict_encode64("#{api_credentials.username}:#{api_credentials.password}")
190
+
191
+ { Authorization: "Basic #{auth}" }
192
+ end
193
+
194
+ def base_url = "https://#{API[:domain]}"
195
+
196
+ # Rates
197
+ def build_rate_request(shipment:)
198
+ accessorials = []
199
+
200
+ if shipment.accessorials.any?
201
+ serviceable_accessorials?(shipment.accessorials)
202
+
203
+ shipment
204
+ .accessorials
205
+ .reject { |accessorial| unquotable_accessorials.include?(accessorial) }
206
+ .each do |shipment_accessorial|
207
+ conf_accessorial = mappable_accessorials[shipment_accessorial]
208
+
209
+ case conf_accessorial
210
+ when Array then accessorials += conf_accessorial
211
+ when String then accessorials << conf_accessorial
212
+ end
213
+ end
214
+ end
215
+
216
+ longest_dimension = shipment.packages.map { |p| [p.width(:inches), p.length(:inches)].max }.max.ceil
217
+ accessorials << 'chkOD' if longest_dimension >= 96
218
+
219
+ accessorials.uniq!
220
+
221
+ pickup_on = Date.current
222
+ shipment_description = shipment.packages.map(&:description).reject(&:blank?).uniq.join(', ')
223
+ shipment_description = 'Freight All Kinds' if shipment_description.blank?
224
+
225
+ api_credentials = fetch_credential(:api)
226
+
227
+ body = {
228
+ allowSpot: longest_dimension >= 120 ? 'Y' : 'N',
229
+ CustomerAccount: api_credentials.account.to_i.to_s.rjust(9, '0'),
230
+ CustomerCity: customer_location.city,
231
+ CustomerName: customer_location.contact.company_name,
232
+ CustomerState: customer_location.province,
233
+ CustomerStreet: customer_location.address1,
234
+ CustomerZip: customer_location.postal_code,
235
+ Description: shipment_description,
236
+ DestCountry: 'U',
237
+ DestinationCity: shipment.destination.city,
238
+ DestinationState: shipment.destination.province,
239
+ DestinationZip: shipment.destination.postal_code,
240
+ DimsOption: 'I',
241
+ EmailAddress: customer_location.contact.email,
242
+ Option: 'T',
243
+ OrigCountry: 'U',
244
+ OriginCity: shipment.origin.city,
245
+ OriginState: shipment.origin.province,
246
+ OriginZip: shipment.origin.postal_code,
247
+ PickupDay: pickup_on.strftime('%_d'),
248
+ PickupMonth: pickup_on.strftime('%_m'),
249
+ PickupYear: pickup_on.strftime('%Y'),
250
+ rateXML: 'Y',
251
+ returnX: 'Y',
252
+ Terms: 'P'
253
+ }
254
+
255
+ declared_value = if shipment.declared_value_cents.blank?
256
+ 0
257
+ else
258
+ (shipment.declared_value_cents.to_f / 100).ceil
259
+ end
260
+
261
+ body.deep_merge!({ chkIN: 'on', FVInsuranceAmount: format('%.2f', declared_value) }) if declared_value.positive?
262
+ body.deep_merge!({ ODLength: longest_dimension, ODLengthUnit: 'I' }) if longest_dimension >= 96
263
+
264
+ cubic_ft_required = shipment.destination.province.upcase == 'PR'
265
+
266
+ i = 0
267
+ shipment.packages.each do |package|
268
+ package.quantity.times do
269
+ i += 1
270
+
271
+ body = body.deep_merge({ "Class#{i}": package.freight_class.to_s.sub('.', '').to_i })
272
+ body = body.deep_merge({ "Description#{i}": package.description || 'Freight' })
273
+ body = body.deep_merge({ "PieceLength#{i}": package.length(:in).ceil })
274
+ body = body.deep_merge({ "PieceWidth#{i}": package.width(:in).ceil })
275
+ body = body.deep_merge({ "PieceHeight#{i}": package.height(:in).ceil })
276
+ body = body.deep_merge({ "Weight#{i}": package.pounds(:each).ceil })
277
+
278
+ body = body.deep_merge({ "CubicFt#{i}": package.cubic_ft(:each) }) if cubic_ft_required
279
+ end
280
+ end
281
+
282
+ if accessorials.any?
283
+ body[:accessorial] = 'on'
284
+
285
+ accessorials.each { |accessorial| body[accessorial] = 'on' }
286
+ end
287
+
288
+ request = build_request(:rates, body:)
289
+ save_request(request)
290
+ request
291
+ end
292
+
293
+ def build_request(action, options = {})
294
+ headers = JSON_HEADERS
295
+ headers = headers.merge(auth_header)
296
+ headers = headers.merge(options[:headers]) if options[:headers].present?
297
+ body = URI.encode_www_form(options[:body]) if options[:body].present?
298
+
299
+ request = {
300
+ url: options[:url].presence || build_url(action),
301
+ headers:,
302
+ method: API.dig(:methods, action),
303
+ body:
304
+ }
305
+
306
+ save_request(request)
307
+ request
308
+ end
309
+
310
+ def build_url(action) = "#{base_url}#{API.dig(:endpoints, action)}"
311
+
312
+ def commit(request)
313
+ url = request[:url]
314
+ headers = request[:headers]
315
+ method = request[:method]
316
+ body = request[:body]
317
+
318
+ case method
319
+ when :post
320
+ HTTPClient.post(url, headers:, body:)
321
+ else
322
+ HTTPClient.get(url, headers:)
323
+ end
324
+ end
325
+
326
+ def parse_rate_response(shipment:, response:, tries: 0)
327
+ rate_response = RateResponse.new(request: last_request, response:)
328
+
329
+ # Used begin rescue block's retry instead.
330
+ # if tries > 10
331
+ # rate_response.error = ResponseError.new("Timeout after #{tries * 5} seconds")
332
+ # return rate_response
333
+ # end
334
+
335
+ if response.body.blank?
336
+ rate_response.error = InvalidCredentialsError if response.code == 401
337
+
338
+ rate_response.error = ResponseError.new('Unknown response') if rate_response.error.blank?
339
+ return rate_response
340
+ end
341
+
342
+ begin
343
+ response = JSON.parse(response.body)
344
+ rescue JSON::ParserError
345
+ sleep(5)
346
+ if tries > 10
347
+ rate_response.error = ResponseError.new("Timeout after #{tries * 5} seconds")
348
+ return rate_response
349
+ end
350
+
351
+ tries += 1
352
+ retry
353
+ end
354
+
355
+ error = response['errorMessage']
356
+
357
+ if error.present?
358
+ rate_response.error = UnserviceableError.new(error.sub(' by SEFL.', '')) if error.include?('one point must be directly serviced')
359
+
360
+ rate_response.error = ResponseError.new(error) if rate_response.error.blank?
361
+ return rate_response
362
+ end
363
+
364
+ url = response['detailQuoteLocation'].gsub('\\', '')
365
+ request = build_request(:get_rate, url:)
366
+
367
+ tries = 0
368
+
369
+ until tries > 10
370
+ save_request(request)
371
+ response = commit(request)
372
+
373
+ if response.body.blank?
374
+ rate_response.error = InvalidCredentialsError if response.code == 401
375
+
376
+ rate_response.error = ResponseError.new('Unknown response') if rate_response.error.blank?
377
+ return rate_response
378
+ end
379
+
380
+ response = JSON.parse(response.body)
381
+
382
+ if response.blank?
383
+ rate_response.error = ResponseError.new('Unknown response')
384
+ return rate_response
385
+ end
386
+
387
+ error = response['errorMessage']
388
+
389
+ if error.present?
390
+ if error.downcase.include?('not yet been processed')
391
+ sleep(5)
392
+ tries += 1
393
+ next
394
+ else
395
+ rate_response.error = ResponseError.new(error)
396
+ return rate_response
397
+ end
398
+ end
399
+
400
+ tries = 50
401
+ end
402
+
403
+ if response['rateQuote'].blank?
404
+ rate_response.error = ResponseError.new('Cost is empty')
405
+ return rate_response
406
+ end
407
+
408
+ estimate_reference = response['quoteNumber']
409
+ transit_days = response['transitTime'].to_i
410
+
411
+ details = response['details']
412
+ prices = []
413
+
414
+ # return details
415
+
416
+ details.each do |detail|
417
+ next if detail['typeCharge'].include?('TTL') || detail['typeCharge'].include?('NFC')
418
+
419
+ cents = detail['charges'].squish
420
+ cents = cents.blank? ? 0 : (cents.to_f * 100).to_i
421
+ next if cents.zero?
422
+
423
+ description = detail['description'].squish
424
+
425
+ cents *= -1 if detail['description'].include?('DISCOUNT')
426
+
427
+ prices << Price.new(blame: :api, cents:, description:)
428
+ end
429
+
430
+ rate = Rate.new(
431
+ carrier: self,
432
+ carrier_name: name,
433
+ currency: 'USD',
434
+ estimate_reference:,
435
+ scac:,
436
+ service_name: :standard,
437
+ shipment:,
438
+ prices:,
439
+ transit_days:,
440
+ with_excessive_length_fees: rates_with_excessive_length_fees?
441
+ )
442
+
443
+ rate_response.rates = [rate]
444
+ rate_response
445
+ end
446
+
447
+ # Tracking
448
+ end
449
+ end
450
+ end