freight_kit 0.1.20 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -2
  3. data/README.md +6 -5
  4. data/Rakefile +4 -0
  5. data/VERSION +1 -1
  6. data/configuration/locations/amazon_warehouses.yml +3330 -0
  7. data/freight_kit-0.1.21.gem +0 -0
  8. data/freight_kit.gemspec +11 -22
  9. data/lib/freight_kit/address_normalizer.rb +24 -0
  10. data/lib/freight_kit/amazon_warehouse.rb +33 -0
  11. data/lib/freight_kit/api_clients/soap_client.rb +33 -10
  12. data/lib/freight_kit/carrier.rb +248 -302
  13. data/lib/freight_kit/carriers/a1_express.rb +25 -0
  14. data/lib/freight_kit/carriers/a_duie_pyle.rb +30 -0
  15. data/lib/freight_kit/carriers/aaa_cooper.rb +11 -0
  16. data/lib/freight_kit/carriers/aaa_expedited_services.rb +10 -0
  17. data/lib/freight_kit/carriers/ab_brothers_usa_inc.rb +12 -0
  18. data/lib/freight_kit/carriers/aberdeen_express_inc.rb +28 -0
  19. data/lib/freight_kit/carriers/abf_freight_system.rb +475 -0
  20. data/lib/freight_kit/carriers/access_transport.rb +10 -0
  21. data/lib/freight_kit/carriers/action_express.rb +10 -0
  22. data/lib/freight_kit/carriers/adams_and_companies.rb +10 -0
  23. data/lib/freight_kit/carriers/advance_distribution.rb +28 -0
  24. data/lib/freight_kit/carriers/alcon_transport.rb +10 -0
  25. data/lib/freight_kit/carriers/all_freight.rb +10 -0
  26. data/lib/freight_kit/carriers/alliance_transportation_group.rb +10 -0
  27. data/lib/freight_kit/carriers/allstate_transport.rb +10 -0
  28. data/lib/freight_kit/carriers/aloha_freight_forwarders.rb +31 -0
  29. data/lib/freight_kit/carriers/amado_trucking.rb +31 -0
  30. data/lib/freight_kit/carriers/american_fast_freight.rb +28 -0
  31. data/lib/freight_kit/carriers/amigos_service_transportation.rb +10 -0
  32. data/lib/freight_kit/carriers/anderson_towing_and_transport.rb +10 -0
  33. data/lib/freight_kit/carriers/apex_transporting.rb +10 -0
  34. data/lib/freight_kit/carriers/archer_cargo.rb +35 -0
  35. data/lib/freight_kit/carriers/armstrong_transport_group.rb +10 -0
  36. data/lib/freight_kit/carriers/autobahn_logistics.rb +10 -0
  37. data/lib/freight_kit/carriers/averitt_express.rb +30 -0
  38. data/lib/freight_kit/carriers/ba_transportation.rb +10 -0
  39. data/lib/freight_kit/carriers/balkin_express.rb +10 -0
  40. data/lib/freight_kit/carriers/bay_area_express.rb +10 -0
  41. data/lib/freight_kit/carriers/bc_freightways.rb +11 -0
  42. data/lib/freight_kit/carriers/benjamin_best_freight_inc.rb +37 -0
  43. data/lib/freight_kit/carriers/bennett_trucking.rb +10 -0
  44. data/lib/freight_kit/carriers/best_overnite_express.rb +78 -0
  45. data/lib/freight_kit/carriers/best_trucking.rb +10 -0
  46. data/lib/freight_kit/carriers/bestway_transport.rb +10 -0
  47. data/lib/freight_kit/carriers/bryan_systems.rb +10 -0
  48. data/lib/freight_kit/carriers/c_and_w_express.rb +10 -0
  49. data/lib/freight_kit/carriers/campbell_trucking.rb +10 -0
  50. data/lib/freight_kit/carriers/carde_transportation.rb +10 -0
  51. data/lib/freight_kit/carriers/cardinal_logistics.rb +28 -0
  52. data/lib/freight_kit/carriers/cdc_transport.rb +10 -0
  53. data/lib/freight_kit/carriers/cdo_express_diversified.rb +10 -0
  54. data/lib/freight_kit/carriers/cedar_supply_trucking.rb +10 -0
  55. data/lib/freight_kit/carriers/central_freight_lines.rb +12 -0
  56. data/lib/freight_kit/carriers/central_transport.rb +12 -0
  57. data/lib/freight_kit/carriers/chicago_suburban_express.rb +28 -0
  58. data/lib/freight_kit/carriers/city_logistics.rb +11 -0
  59. data/lib/freight_kit/carriers/clear_lane_freight_systems.rb +474 -0
  60. data/lib/freight_kit/carriers/cleopatra_trucking.rb +10 -0
  61. data/lib/freight_kit/carriers/clifford_transportation.rb +10 -0
  62. data/lib/freight_kit/carriers/cms_domestic.rb +25 -0
  63. data/lib/freight_kit/carriers/cnd_logistics.rb +10 -0
  64. data/lib/freight_kit/carriers/coast_to_coast_transport.rb +27 -0
  65. data/lib/freight_kit/carriers/countrywide_carriers.rb +10 -0
  66. data/lib/freight_kit/carriers/cpl_express.rb +31 -0
  67. data/lib/freight_kit/carriers/crosby_trucking_service.rb +29 -0
  68. data/lib/freight_kit/carriers/cross_country_freight_solutions.rb +408 -0
  69. data/lib/freight_kit/carriers/crowley.rb +10 -0
  70. data/lib/freight_kit/carriers/csa_transportation.rb +40 -0
  71. data/lib/freight_kit/carriers/csx_transportation.rb +40 -0
  72. data/lib/freight_kit/carriers/custom_global_logistics.rb +14 -0
  73. data/lib/freight_kit/carriers/d_and_a_transport.rb +10 -0
  74. data/lib/freight_kit/carriers/dak_transport.rb +10 -0
  75. data/lib/freight_kit/carriers/dash_courier_and_logistics_north_carolina.rb +10 -0
  76. data/lib/freight_kit/carriers/daylight_transport.rb +29 -0
  77. data/lib/freight_kit/carriers/dayton_freight_lines.rb +30 -0
  78. data/lib/freight_kit/carriers/dbr_logistics.rb +10 -0
  79. data/lib/freight_kit/carriers/deep_south_freight.rb +27 -0
  80. data/lib/freight_kit/carriers/delta_express.rb +10 -0
  81. data/lib/freight_kit/carriers/delta_transport.rb +10 -0
  82. data/lib/freight_kit/carriers/delta_trucking_logistics.rb +10 -0
  83. data/lib/freight_kit/carriers/demco_express.rb +10 -0
  84. data/lib/freight_kit/carriers/dependable_global_express.rb +10 -0
  85. data/lib/freight_kit/carriers/dependable_hawaiian_express.rb +24 -0
  86. data/lib/freight_kit/carriers/dependable_highway_express.rb +573 -0
  87. data/lib/freight_kit/carriers/desert_coastal_transport.rb +10 -0
  88. data/lib/freight_kit/carriers/dhl.rb +11 -0
  89. data/lib/freight_kit/carriers/diamond_line_delivery.rb +174 -0
  90. data/lib/freight_kit/carriers/ding_tai_trucking.rb +10 -0
  91. data/lib/freight_kit/carriers/diversified_transfer_and_storage.rb +29 -0
  92. data/lib/freight_kit/carriers/dohrn_transfer_company.rb +30 -0
  93. data/lib/freight_kit/carriers/dot_line_transportation.rb +29 -0
  94. data/lib/freight_kit/carriers/drt_transportation.rb +13 -0
  95. data/lib/freight_kit/carriers/dugan_truck_line.rb +29 -0
  96. data/lib/freight_kit/carriers/dupont.rb +10 -0
  97. data/lib/freight_kit/carriers/e_transport_carriers.rb +29 -0
  98. data/lib/freight_kit/carriers/echo_global_logistics.rb +13 -0
  99. data/lib/freight_kit/carriers/ecklund_logistics.rb +10 -0
  100. data/lib/freight_kit/carriers/el_emplumado_transport.rb +10 -0
  101. data/lib/freight_kit/carriers/elite_carriers.rb +28 -0
  102. data/lib/freight_kit/carriers/emerald_express.rb +10 -0
  103. data/lib/freight_kit/carriers/era_transport.rb +10 -0
  104. data/lib/freight_kit/carriers/estes_express_lines.rb +25 -0
  105. data/lib/freight_kit/carriers/euro_kam.rb +28 -0
  106. data/lib/freight_kit/carriers/ew_riverside_trucking.rb +10 -0
  107. data/lib/freight_kit/carriers/express_2000_inc.rb +12 -0
  108. data/lib/freight_kit/carriers/express_services_international.rb +10 -0
  109. data/lib/freight_kit/carriers/f_and_a_express.rb +27 -0
  110. data/lib/freight_kit/carriers/fairmont_logistics.rb +13 -0
  111. data/lib/freight_kit/carriers/fargo_cargo.rb +10 -0
  112. data/lib/freight_kit/carriers/fast_freight_transportation.rb +10 -0
  113. data/lib/freight_kit/carriers/fast_load_transport.rb +10 -0
  114. data/lib/freight_kit/carriers/fed_ex_express.rb +30 -0
  115. data/lib/freight_kit/carriers/fed_ex_ground.rb +24 -0
  116. data/lib/freight_kit/carriers/fed_ex_ltl_economy.rb +11 -0
  117. data/lib/freight_kit/carriers/fed_ex_ltl_priority.rb +11 -0
  118. data/lib/freight_kit/carriers/first_trucking_express.rb +10 -0
  119. data/lib/freight_kit/carriers/flash_trucking.rb +10 -0
  120. data/lib/freight_kit/carriers/fort_transportation_and_service_company_inc.rb +37 -0
  121. data/lib/freight_kit/carriers/forward_air.rb +781 -0
  122. data/lib/freight_kit/carriers/frahtex.rb +10 -0
  123. data/lib/freight_kit/carriers/frozen_food_express.rb +10 -0
  124. data/lib/freight_kit/carriers/gholia_bros_trucking.rb +36 -0
  125. data/lib/freight_kit/carriers/global_cargo.rb +10 -0
  126. data/lib/freight_kit/carriers/global_logistics_and_transportation.rb +10 -0
  127. data/lib/freight_kit/carriers/gls_freight.rb +32 -0
  128. data/lib/freight_kit/carriers/go_trucking_services.rb +10 -0
  129. data/lib/freight_kit/carriers/gold_eagle_transportation.rb +11 -0
  130. data/lib/freight_kit/carriers/golden_drop_trucking.rb +10 -0
  131. data/lib/freight_kit/carriers/gonzalez_transportation.rb +10 -0
  132. data/lib/freight_kit/carriers/gps_transport.rb +10 -0
  133. data/lib/freight_kit/carriers/greene_enterprise.rb +10 -0
  134. data/lib/freight_kit/carriers/gsa_international.rb +10 -0
  135. data/lib/freight_kit/carriers/gsp_express.rb +24 -0
  136. data/lib/freight_kit/carriers/gsv_transportation.rb +10 -0
  137. data/lib/freight_kit/carriers/gta_transportation.rb +10 -0
  138. data/lib/freight_kit/carriers/guam_freight_services.rb +10 -0
  139. data/lib/freight_kit/carriers/harrah_transportation.rb +23 -0
  140. data/lib/freight_kit/carriers/her_trucking.rb +10 -0
  141. data/lib/freight_kit/carriers/hercules_freight.rb +20 -0
  142. data/lib/freight_kit/carriers/highlander_xpress.rb +36 -0
  143. data/lib/freight_kit/carriers/hn_transport.rb +10 -0
  144. data/lib/freight_kit/carriers/honolulu_freight_service.rb +10 -0
  145. data/lib/freight_kit/carriers/hot_line_freight_system_inc.rb +12 -0
  146. data/lib/freight_kit/carriers/hotshot_freight_of_texas.rb +13 -0
  147. data/lib/freight_kit/carriers/houser_transport.rb +27 -0
  148. data/lib/freight_kit/carriers/infiniti_freight_logistics.rb +28 -0
  149. data/lib/freight_kit/carriers/infinity_trucking.rb +10 -0
  150. data/lib/freight_kit/carriers/interstate_tma.rb +10 -0
  151. data/lib/freight_kit/carriers/intrade_industries.rb +10 -0
  152. data/lib/freight_kit/carriers/jasper_trucking.rb +28 -0
  153. data/lib/freight_kit/carriers/jb_hunt.rb +11 -0
  154. data/lib/freight_kit/carriers/jfj_transportation.rb +8 -8
  155. data/lib/freight_kit/carriers/jkb_express.rb +10 -0
  156. data/lib/freight_kit/carriers/jlm_transport.rb +10 -0
  157. data/lib/freight_kit/carriers/johansson_transport.rb +10 -0
  158. data/lib/freight_kit/carriers/jones_express.rb +10 -0
  159. data/lib/freight_kit/carriers/jp_logistics.rb +41 -0
  160. data/lib/freight_kit/carriers/just_in_time_cargo.rb +29 -0
  161. data/lib/freight_kit/carriers/kengkok_times.rb +10 -0
  162. data/lib/freight_kit/carriers/kings_express.rb +10 -0
  163. data/lib/freight_kit/carriers/klc_transportation.rb +10 -0
  164. data/lib/freight_kit/carriers/km_trucking.rb +10 -0
  165. data/lib/freight_kit/carriers/kma_logistics.rb +10 -0
  166. data/lib/freight_kit/carriers/krc_logistics.rb +10 -0
  167. data/lib/freight_kit/carriers/ktx.rb +10 -0
  168. data/lib/freight_kit/carriers/landstar.rb +25 -0
  169. data/lib/freight_kit/carriers/lanter_distributing_llc.rb +30 -0
  170. data/lib/freight_kit/carriers/ld_trucking.rb +10 -0
  171. data/lib/freight_kit/carriers/legacy_logistics_solutions.rb +10 -0
  172. data/lib/freight_kit/carriers/leonards_express.rb +10 -0
  173. data/lib/freight_kit/carriers/liberty_linehaul_west.rb +28 -0
  174. data/lib/freight_kit/carriers/liberty_transport.rb +10 -0
  175. data/lib/freight_kit/carriers/lightning_express.rb +10 -0
  176. data/lib/freight_kit/carriers/lj_express.rb +24 -0
  177. data/lib/freight_kit/carriers/lkp_enterprises.rb +10 -0
  178. data/lib/freight_kit/carriers/ltl_pros.rb +28 -0
  179. data/lib/freight_kit/carriers/m_and_m_and_sons.rb +10 -0
  180. data/lib/freight_kit/carriers/mag_lines_transport.rb +10 -0
  181. data/lib/freight_kit/carriers/magic_messenger.rb +24 -0
  182. data/lib/freight_kit/carriers/majors_transit.rb +10 -0
  183. data/lib/freight_kit/carriers/map_global_logistics.rb +10 -0
  184. data/lib/freight_kit/carriers/matths_trucking.rb +11 -0
  185. data/lib/freight_kit/carriers/mav_canadian_transport.rb +13 -0
  186. data/lib/freight_kit/carriers/mc_systems.rb +35 -0
  187. data/lib/freight_kit/carriers/mega_fleet.rb +10 -0
  188. data/lib/freight_kit/carriers/mega_trans_group.rb +28 -0
  189. data/lib/freight_kit/carriers/meta_express.rb +10 -0
  190. data/lib/freight_kit/carriers/mia_transportation.rb +10 -0
  191. data/lib/freight_kit/carriers/midwest_motor_express.rb +14 -0
  192. data/lib/freight_kit/carriers/midwest_transport_and_trucking.rb +10 -0
  193. data/lib/freight_kit/carriers/mikade_delivery_service.rb +10 -0
  194. data/lib/freight_kit/carriers/mohoff_freight_lines.rb +23 -0
  195. data/lib/freight_kit/carriers/montata_travelers_express.rb +10 -0
  196. data/lib/freight_kit/carriers/morgan_van_lines.rb +29 -0
  197. data/lib/freight_kit/carriers/moto_transportation.rb +24 -0
  198. data/lib/freight_kit/carriers/mountain_valley_express.rb +197 -0
  199. data/lib/freight_kit/carriers/ms_freight.rb +27 -0
  200. data/lib/freight_kit/carriers/mvg_transport.rb +10 -0
  201. data/lib/freight_kit/carriers/n_and_m_transfer_co_inc.rb +29 -0
  202. data/lib/freight_kit/carriers/nabot_transport_solutions.rb +10 -0
  203. data/lib/freight_kit/carriers/national_freight_xpress.rb +10 -0
  204. data/lib/freight_kit/carriers/navigation_group.rb +10 -0
  205. data/lib/freight_kit/carriers/nelson_trucking.rb +10 -0
  206. data/lib/freight_kit/carriers/network_1_transportation.rb +10 -0
  207. data/lib/freight_kit/carriers/new_century_transport.rb +28 -0
  208. data/lib/freight_kit/carriers/new_penn_motor_express.rb +11 -0
  209. data/lib/freight_kit/carriers/nieves_transportation.rb +10 -0
  210. data/lib/freight_kit/carriers/nolan_transportation_group.rb +26 -0
  211. data/lib/freight_kit/carriers/northland_trucking.rb +10 -0
  212. data/lib/freight_kit/carriers/northwest_carrier_logistics.rb +27 -0
  213. data/lib/freight_kit/carriers/nt_usa.rb +10 -0
  214. data/lib/freight_kit/carriers/nu_line_transportation.rb +10 -0
  215. data/lib/freight_kit/carriers/numark_transportation.rb +80 -0
  216. data/lib/freight_kit/carriers/nvk_transport.rb +10 -0
  217. data/lib/freight_kit/carriers/ny_transport.rb +10 -0
  218. data/lib/freight_kit/carriers/oak_harbor.rb +28 -0
  219. data/lib/freight_kit/carriers/oakline_transportation.rb +10 -0
  220. data/lib/freight_kit/carriers/old_dominion_freight_line.rb +30 -0
  221. data/lib/freight_kit/carriers/on_trac.rb +555 -0
  222. data/lib/freight_kit/carriers/one_hundred_one_transport.rb +10 -0
  223. data/lib/freight_kit/carriers/one_way_delivery.rb +10 -0
  224. data/lib/freight_kit/carriers/oracle_transportation_solutions.rb +10 -0
  225. data/lib/freight_kit/carriers/orange_courier.rb +27 -0
  226. data/lib/freight_kit/carriers/ortas_trucking.rb +10 -0
  227. data/lib/freight_kit/carriers/pac_trux_transportation.rb +10 -0
  228. data/lib/freight_kit/carriers/pacer.rb +10 -0
  229. data/lib/freight_kit/carriers/pacific_logistics.rb +10 -0
  230. data/lib/freight_kit/carriers/pacific_states_truck_lines.rb +10 -0
  231. data/lib/freight_kit/carriers/paradise_distributing.rb +10 -0
  232. data/lib/freight_kit/carriers/paramount_freight_systems.rb +10 -0
  233. data/lib/freight_kit/carriers/peninsula_truck_lines.rb +206 -0
  234. data/lib/freight_kit/carriers/pg_transport.rb +10 -0
  235. data/lib/freight_kit/carriers/pgs_360.rb +10 -0
  236. data/lib/freight_kit/carriers/pilot_freight_services.rb +10 -0
  237. data/lib/freight_kit/carriers/pious_trans.rb +27 -0
  238. data/lib/freight_kit/carriers/pitt_ohio_express.rb +30 -0
  239. data/lib/freight_kit/carriers/pki_logistics.rb +12 -0
  240. data/lib/freight_kit/carriers/plana_transportation.rb +28 -0
  241. data/lib/freight_kit/carriers/prestige.rb +10 -0
  242. data/lib/freight_kit/carriers/pro_trans_solutions.rb +28 -0
  243. data/lib/freight_kit/carriers/puma_logistics.rb +10 -0
  244. data/lib/freight_kit/carriers/pwc_international.rb +10 -0
  245. data/lib/freight_kit/carriers/quality_logistics.rb +10 -0
  246. data/lib/freight_kit/carriers/queen_star_trucking.rb +27 -0
  247. data/lib/freight_kit/carriers/r_and_l_carriers.rb +11 -0
  248. data/lib/freight_kit/carriers/rac_transport.rb +10 -0
  249. data/lib/freight_kit/carriers/re_logistics.rb +23 -0
  250. data/lib/freight_kit/carriers/reddaway.rb +11 -0
  251. data/lib/freight_kit/carriers/reefer_van_network.rb +13 -0
  252. data/lib/freight_kit/carriers/refrigerated_trucking_and_ltl_transportation_services.rb +10 -0
  253. data/lib/freight_kit/carriers/ridgeline_express.rb +10 -0
  254. data/lib/freight_kit/carriers/rist_transport.rb +29 -0
  255. data/lib/freight_kit/carriers/river_city_transport.rb +10 -0
  256. data/lib/freight_kit/carriers/roadrunner_transportation_services.rb +669 -0
  257. data/lib/freight_kit/carriers/roadtex.rb +13 -0
  258. data/lib/freight_kit/carriers/ronald_transport_services.rb +10 -0
  259. data/lib/freight_kit/carriers/rose_trucking.rb +24 -0
  260. data/lib/freight_kit/carriers/rp_and_j_transport.rb +24 -0
  261. data/lib/freight_kit/carriers/rpm_transportation.rb +11 -0
  262. data/lib/freight_kit/carriers/rude_transportation.rb +30 -0
  263. data/lib/freight_kit/carriers/s_and_s_logistics.rb +10 -0
  264. data/lib/freight_kit/carriers/saia.rb +456 -362
  265. data/lib/freight_kit/carriers/sb_transportation.rb +27 -0
  266. data/lib/freight_kit/carriers/schneider_national.rb +29 -0
  267. data/lib/freight_kit/carriers/schwarz_trucking.rb +10 -0
  268. data/lib/freight_kit/carriers/sewell_motor_express.rb +29 -0
  269. data/lib/freight_kit/carriers/shawnee_trucking.rb +28 -0
  270. data/lib/freight_kit/carriers/shi_logistics.rb +10 -0
  271. data/lib/freight_kit/carriers/sinbad_transport.rb +10 -0
  272. data/lib/freight_kit/carriers/skyway.rb +10 -0
  273. data/lib/freight_kit/carriers/smith_cargo_transportation_services.rb +23 -0
  274. data/lib/freight_kit/carriers/sna_transportation.rb +10 -0
  275. data/lib/freight_kit/carriers/solid_group.rb +10 -0
  276. data/lib/freight_kit/carriers/solution_carrier_express.rb +10 -0
  277. data/lib/freight_kit/carriers/southeastern_freight_lines.rb +441 -0
  278. data/lib/freight_kit/carriers/southwestern_motor_transport.rb +30 -0
  279. data/lib/freight_kit/carriers/span_alaska.rb +10 -0
  280. data/lib/freight_kit/carriers/specialize_transportation.rb +27 -0
  281. data/lib/freight_kit/carriers/ssi_refrigerated_express.rb +10 -0
  282. data/lib/freight_kit/carriers/standard_forwarding_llc.rb +28 -0
  283. data/lib/freight_kit/carriers/star_american_enterprise.rb +10 -0
  284. data/lib/freight_kit/carriers/sterling_transportation.rb +10 -0
  285. data/lib/freight_kit/carriers/stg.rb +163 -0
  286. data/lib/freight_kit/carriers/supervan_service.rb +10 -0
  287. data/lib/freight_kit/carriers/sutton_transport_inc.rb +12 -0
  288. data/lib/freight_kit/carriers/swift_transportation.rb +28 -0
  289. data/lib/freight_kit/carriers/t_force_worldwide.rb +605 -0
  290. data/lib/freight_kit/carriers/tax_airfreight_inc.rb +35 -0
  291. data/lib/freight_kit/carriers/tforce_freight_inc.rb +30 -0
  292. data/lib/freight_kit/carriers/the_custom_companies.rb +162 -0
  293. data/lib/freight_kit/carriers/thk_trucking.rb +28 -0
  294. data/lib/freight_kit/carriers/tiger_cool_express.rb +11 -0
  295. data/lib/freight_kit/carriers/tili_logistics.rb +10 -0
  296. data/lib/freight_kit/carriers/tmt_industries.rb +10 -0
  297. data/lib/freight_kit/carriers/top_ten_express.rb +28 -0
  298. data/lib/freight_kit/carriers/total_quality_logistics.rb +339 -0
  299. data/lib/freight_kit/carriers/total_transportation.rb +258 -0
  300. data/lib/freight_kit/carriers/trans_international_trucking.rb +29 -0
  301. data/lib/freight_kit/carriers/treasure_transportation.rb +10 -0
  302. data/lib/freight_kit/carriers/tri_state_services.rb +10 -0
  303. data/lib/freight_kit/carriers/tritex_freighters.rb +10 -0
  304. data/lib/freight_kit/carriers/triways.rb +10 -0
  305. data/lib/freight_kit/carriers/tsi_kansas.rb +29 -0
  306. data/lib/freight_kit/carriers/u_and_r_transportation.rb +23 -0
  307. data/lib/freight_kit/carriers/union_pacific.rb +11 -0
  308. data/lib/freight_kit/carriers/united_freight_logistics.rb +10 -0
  309. data/lib/freight_kit/carriers/unlimited_distance_transportation.rb +10 -0
  310. data/lib/freight_kit/carriers/up_streamline.rb +10 -0
  311. data/lib/freight_kit/carriers/ups_freight.rb +12 -0
  312. data/lib/freight_kit/carriers/us_freightways.rb +10 -0
  313. data/lib/freight_kit/carriers/usa_truck.rb +28 -0
  314. data/lib/freight_kit/carriers/usf_holland.rb +11 -0
  315. data/lib/freight_kit/carriers/valley_cartage.rb +11 -0
  316. data/lib/freight_kit/carriers/vc_transport.rb +10 -0
  317. data/lib/freight_kit/carriers/vision_express.rb +11 -0
  318. data/lib/freight_kit/carriers/vision_logistics_group.rb +10 -0
  319. data/lib/freight_kit/carriers/vmg_transportation_group.rb +10 -0
  320. data/lib/freight_kit/carriers/volpe_express.rb +10 -0
  321. data/lib/freight_kit/carriers/ward_trucking.rb +29 -0
  322. data/lib/freight_kit/carriers/wdwb.rb +10 -0
  323. data/lib/freight_kit/carriers/western_flyer_express.rb +28 -0
  324. data/lib/freight_kit/carriers/western_regional_delivery_service.rb +265 -0
  325. data/lib/freight_kit/carriers/western_specialized_trucking.rb +22 -0
  326. data/lib/freight_kit/carriers/win_distribution.rb +28 -0
  327. data/lib/freight_kit/carriers/wlb_transport.rb +10 -0
  328. data/lib/freight_kit/carriers/x_trux.rb +29 -0
  329. data/lib/freight_kit/carriers/xpo_logistics.rb +415 -0
  330. data/lib/freight_kit/carriers/xpress_global_systems.rb +30 -0
  331. data/lib/freight_kit/carriers/xylo_trucking.rb +10 -0
  332. data/lib/freight_kit/carriers/yrc_freight.rb +24 -0
  333. data/lib/freight_kit/carriers/zentner_transportation.rb +28 -0
  334. data/lib/freight_kit/carriers.rb +331 -34
  335. data/lib/freight_kit/countries.rb +22 -0
  336. data/lib/freight_kit/error.rb +0 -2
  337. data/lib/freight_kit/errors/document_not_found_error.rb +0 -2
  338. data/lib/freight_kit/errors/expired_credentials_error.rb +0 -2
  339. data/lib/freight_kit/errors/http_error.rb +0 -2
  340. data/lib/freight_kit/errors/invalid_credentials_error.rb +0 -2
  341. data/lib/freight_kit/errors/rate_limit_error.rb +12 -0
  342. data/lib/freight_kit/errors/response_error.rb +0 -2
  343. data/lib/freight_kit/errors/shipment_not_found_error.rb +0 -2
  344. data/lib/freight_kit/errors/unserviceable_accessorials_error.rb +1 -5
  345. data/lib/freight_kit/errors/unserviceable_error.rb +0 -2
  346. data/lib/freight_kit/helpers/documentable.rb +0 -2
  347. data/lib/freight_kit/helpers/pickupable.rb +3 -14
  348. data/lib/freight_kit/helpers/rateable.rb +0 -2
  349. data/lib/freight_kit/helpers/trackable.rb +0 -2
  350. data/lib/freight_kit/http_client/cache_store.rb +2 -4
  351. data/lib/freight_kit/http_client/httpi_adapter.rb +37 -0
  352. data/lib/freight_kit/http_client/log_device.rb +0 -2
  353. data/lib/freight_kit/http_client/response.rb +0 -2
  354. data/lib/freight_kit/http_client/revalidation.rb +0 -2
  355. data/lib/freight_kit/http_client/safe_retries.rb +17 -3
  356. data/lib/freight_kit/http_client/zstd.rb +2 -4
  357. data/lib/freight_kit/http_client.rb +21 -21
  358. data/lib/freight_kit/model.rb +1 -3
  359. data/lib/freight_kit/models/address.rb +15 -0
  360. data/lib/freight_kit/models/contact.rb +3 -4
  361. data/lib/freight_kit/models/country.rb +20 -0
  362. data/lib/freight_kit/models/credential.rb +3 -18
  363. data/lib/freight_kit/models/date_time.rb +0 -2
  364. data/lib/freight_kit/models/document_response.rb +0 -2
  365. data/lib/freight_kit/models/label.rb +0 -2
  366. data/lib/freight_kit/models/location.rb +10 -25
  367. data/lib/freight_kit/models/pickup_response.rb +0 -2
  368. data/lib/freight_kit/models/price.rb +0 -2
  369. data/lib/freight_kit/models/rate.rb +0 -2
  370. data/lib/freight_kit/models/rate_response.rb +0 -2
  371. data/lib/freight_kit/models/region.rb +19 -0
  372. data/lib/freight_kit/models/response.rb +0 -2
  373. data/lib/freight_kit/models/shipment.rb +5 -14
  374. data/lib/freight_kit/models/shipment_event.rb +0 -2
  375. data/lib/freight_kit/models/terminal.rb +10 -0
  376. data/lib/freight_kit/models/tracking_response.rb +0 -2
  377. data/lib/freight_kit/package.rb +52 -64
  378. data/lib/freight_kit/package_item.rb +14 -14
  379. data/lib/freight_kit/packaging.rb +6 -26
  380. data/lib/freight_kit/platform.rb +0 -32
  381. data/lib/freight_kit/platforms/carrier_logistics.rb +326 -345
  382. data/lib/freight_kit/platforms/dsdc.rb +82 -0
  383. data/lib/freight_kit/platforms/next_tms/graphql_client/mutation/quote_create.rb +32 -0
  384. data/lib/freight_kit/platforms/next_tms/graphql_client/mutation/shipment_create.rb +29 -0
  385. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_carrier.rb +37 -0
  386. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_carriers.rb +45 -0
  387. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_customer.rb +54 -0
  388. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_customers.rb +62 -0
  389. data/lib/freight_kit/platforms/next_tms/graphql_client/query/carrier.rb +22 -0
  390. data/lib/freight_kit/platforms/next_tms/graphql_client/query/carriers.rb +30 -0
  391. data/lib/freight_kit/platforms/next_tms/graphql_client/query/customer.rb +20 -0
  392. data/lib/freight_kit/platforms/next_tms/graphql_client/query/customers.rb +28 -0
  393. data/lib/freight_kit/platforms/next_tms/graphql_client/query/invoice.rb +31 -0
  394. data/lib/freight_kit/platforms/next_tms/graphql_client/query/invoices.rb +39 -0
  395. data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipment.rb +102 -0
  396. data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipment_documents.rb +29 -0
  397. data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipments.rb +110 -0
  398. data/lib/freight_kit/platforms/next_tms/graphql_client.rb +22 -0
  399. data/lib/freight_kit/platforms/next_tms/orm/address.rb +22 -0
  400. data/lib/freight_kit/platforms/next_tms/orm/base.rb +120 -0
  401. data/lib/freight_kit/platforms/next_tms/orm/broker_carrier.rb +18 -0
  402. data/lib/freight_kit/platforms/next_tms/orm/broker_customer.rb +22 -0
  403. data/lib/freight_kit/platforms/next_tms/orm/carrier.rb +14 -0
  404. data/lib/freight_kit/platforms/next_tms/orm/collection.rb +335 -0
  405. data/lib/freight_kit/platforms/next_tms/orm/customer.rb +12 -0
  406. data/lib/freight_kit/platforms/next_tms/orm/invoice.rb +21 -0
  407. data/lib/freight_kit/platforms/next_tms/orm/record_not_found_error.rb +9 -0
  408. data/lib/freight_kit/platforms/next_tms/orm/shipment.rb +50 -0
  409. data/lib/freight_kit/platforms/next_tms/orm.rb +38 -0
  410. data/lib/freight_kit/platforms/next_tms.rb +452 -0
  411. data/lib/freight_kit/platforms/the_great_information_factory.rb +492 -425
  412. data/lib/freight_kit/regions.rb +27 -0
  413. data/lib/freight_kit/shipment_packer.rb +36 -38
  414. data/lib/freight_kit/tariff/overlength_rule.rb +1 -5
  415. data/lib/freight_kit/tariff.rb +0 -2
  416. data/lib/freight_kit.rb +103 -11
  417. data/schemas/next_tms.json +110710 -0
  418. metadata +443 -55
  419. data/configuration/carriers/abfs.yml +0 -124
  420. data/configuration/carriers/btvp.yml +0 -84
  421. data/configuration/carriers/ccyq.yml +0 -121
  422. data/configuration/carriers/clni.yml +0 -113
  423. data/configuration/carriers/cnwy.yml +0 -113
  424. data/configuration/carriers/ctbv.yml +0 -117
  425. data/configuration/carriers/dcha.yml +0 -105
  426. data/configuration/carriers/dlds.yml +0 -111
  427. data/configuration/carriers/dphe.yml +0 -130
  428. data/configuration/carriers/drrq.yml +0 -131
  429. data/configuration/carriers/fcsy.yml +0 -102
  430. data/configuration/carriers/fwda.yml +0 -137
  431. data/configuration/carriers/jfj_transportation.yml +0 -2
  432. data/configuration/carriers/mtvl.yml +0 -12
  433. data/configuration/carriers/numk.yml +0 -14
  434. data/configuration/carriers/otcl.yml +0 -124
  435. data/configuration/carriers/pens.yml +0 -22
  436. data/configuration/carriers/rdfs.yml +0 -142
  437. data/configuration/carriers/saia.yml +0 -129
  438. data/configuration/carriers/sefl.yml +0 -115
  439. data/configuration/carriers/totl.yml +0 -111
  440. data/configuration/carriers/tqyl.yml +0 -28
  441. data/configuration/carriers/wrds.yml +0 -20
  442. data/configuration/platforms/carrier_logistics.yml +0 -25
  443. data/configuration/platforms/next.yml +0 -12
  444. data/configuration/platforms/the_great_information_factory.yml +0 -122
  445. data/lib/freight_kit/carriers/abfs.rb +0 -421
  446. data/lib/freight_kit/carriers/btvp.rb +0 -29
  447. data/lib/freight_kit/carriers/ccyq.rb +0 -310
  448. data/lib/freight_kit/carriers/clni.rb +0 -396
  449. data/lib/freight_kit/carriers/cnwy.rb +0 -327
  450. data/lib/freight_kit/carriers/ctbv.rb +0 -53
  451. data/lib/freight_kit/carriers/dcha.rb +0 -76
  452. data/lib/freight_kit/carriers/dlds.rb +0 -49
  453. data/lib/freight_kit/carriers/dphe.rb +0 -472
  454. data/lib/freight_kit/carriers/drrq.rb +0 -580
  455. data/lib/freight_kit/carriers/fcsy.rb +0 -57
  456. data/lib/freight_kit/carriers/fwda.rb +0 -744
  457. data/lib/freight_kit/carriers/mtvl.rb +0 -34
  458. data/lib/freight_kit/carriers/numk.rb +0 -58
  459. data/lib/freight_kit/carriers/otcl.rb +0 -520
  460. data/lib/freight_kit/carriers/pens.rb +0 -204
  461. data/lib/freight_kit/carriers/rdfs.rb +0 -521
  462. data/lib/freight_kit/carriers/sefl.rb +0 -342
  463. data/lib/freight_kit/carriers/totl.rb +0 -172
  464. data/lib/freight_kit/carriers/tqyl.rb +0 -337
  465. data/lib/freight_kit/carriers/wrds.rb +0 -246
  466. data/lib/freight_kit/platforms/next.rb +0 -101
@@ -0,0 +1,415 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class XPOLogistics < Carrier
4
+ class << self
5
+ def check_mailing_addresses
6
+ [
7
+ Address.new(
8
+ city: 'Chicago',
9
+ country: Countries.find_by(iso31661_alpha2: 'US'),
10
+ id: '6a957fa1-73cd-417c-a0f7-cc4531cd5570',
11
+ postal_code: '60673',
12
+ region_abbreviation: 'IL',
13
+ street: '29559 Network Pl'
14
+ )
15
+ ]
16
+ end
17
+
18
+ def contacts
19
+ [
20
+ Contact.new(department: 'Customer Service - Kingman, AZ', id: '5bb9caaa-ae84-4ee6-90ef-3c14f6d434c6', phone: '+17609228255')
21
+ ]
22
+ end
23
+
24
+ def headquarters
25
+ Address.new(
26
+ city: 'Ann Arbor',
27
+ country: Countries.find_by(iso31661_alpha2: 'US'),
28
+ id: '17cbf3e9-ca23-4591-9363-4a0abd7aa5c5',
29
+ postal_code: '48105-2963',
30
+ region_abbreviation: 'MI',
31
+ street: '2211 Old Earhart Rd'
32
+ )
33
+ end
34
+
35
+ def id = '5ca40fc0-a4f0-444c-a300-d794336b8216'
36
+ def legal_name = 'XPO Logistics Freight Inc'
37
+
38
+ def mappable_accessorials
39
+ {
40
+ afterhours_delivery: 'DAH',
41
+ airport_delivery: 'DMS',
42
+ appointment_delivery: 'APT',
43
+ construction_delivery: 'CSD',
44
+ construction_pickup: 'OCS',
45
+ convention_delivery: 'PED',
46
+ convention_pickup: 'PEO',
47
+ fair_delivery: 'PED',
48
+ fair_pickup: 'PEO',
49
+ government_delivery: 'DMS',
50
+ guaranteed_delivery_am: 'G12',
51
+ guaranteed_delivery: 'GUR',
52
+ inside_delivery: 'DID',
53
+ inside_pickup: 'OIP',
54
+ jobsite_delivery: 'CSD',
55
+ jobsite_pickup: 'OCS',
56
+ liftgate_delivery: 'DLG',
57
+ liftgate_pickup: 'OLG',
58
+ marina_delivery: 'DPW',
59
+ mine_site_delivery: 'DMS',
60
+ residential_delivery: 'RSD',
61
+ residential_pickup: 'RSO'
62
+ }
63
+ end
64
+
65
+ def maximum_height = Measured::Length.new(105, :inches)
66
+ def maximum_weight = Measured::Weight.new(10_000, :pounds)
67
+ def minimum_length_for_overlength_fees = Measured::Length.new(8, :feet)
68
+ def name = 'XPO Logistics'
69
+ def overlength_fees_require_tariff? = false
70
+ def required_credential_types = %i[api api_key]
71
+ def requirements = %i[credentials]
72
+ def scac = 'CNWY'
73
+ def services = %i[standard]
74
+
75
+ def unserviceable_accessorials
76
+ %i[
77
+ afterhours_pickup
78
+ airport_pickup
79
+ amusement_park_delivery
80
+ amusement_park_pickup
81
+ appointment_pickup
82
+ athletic_facility_delivery
83
+ athletic_facility_pickup
84
+ brewery_delivery
85
+ brewery_pickup
86
+ cemetery_delivery
87
+ cemetery_pickup
88
+ church_delivery
89
+ church_pickup
90
+ customs_brokerage
91
+ dock_dropoff
92
+ dock_pickup
93
+ driver_assist
94
+ early_morning_delivery
95
+ early_morning_pickup
96
+ farm_delivery
97
+ farm_pickup
98
+ fitness_center_delivery
99
+ fitness_center_pickup
100
+ flatbed_delivery
101
+ flatbed_pickup
102
+ golf_course_delivery
103
+ golf_course_pickup
104
+ government_pickup
105
+ grocery_store_delivery
106
+ grocery_store_pickup
107
+ grocery_warehouse_delivery
108
+ grocery_warehouse_pickup
109
+ guaranteed_delivery_pm
110
+ hospital_delivery
111
+ hospital_pickup
112
+ hotel_delivery
113
+ hotel_pickup
114
+ inspection_site_delivery
115
+ inspection_site_pickup
116
+ mall_delivery
117
+ mall_pickup
118
+ marina_pickup
119
+ military_site_delivery
120
+ military_site_pickup
121
+ mine_site_pickup
122
+ motel_delivery
123
+ motel_pickup
124
+ nursing_home_delivery
125
+ nursing_home_pickup
126
+ park_delivery
127
+ park_pickup
128
+ prison_delivery
129
+ prison_pickup
130
+ ranch_delivery
131
+ ranch_pickup
132
+ reservation_delivery
133
+ reservation_pickup
134
+ resort_delivery
135
+ resort_pickup
136
+ restaurant_delivery
137
+ restaurant_pickup
138
+ school_delivery
139
+ school_pickup
140
+ steel_mill_delivery
141
+ steel_mill_pickup
142
+ storage_facility_delivery
143
+ storage_facility_pickup
144
+ university_delivery
145
+ university_pickup
146
+ utility_site_delivery
147
+ utility_site_pickup
148
+ winery_delivery
149
+ winery_pickup
150
+ ]
151
+ end
152
+
153
+ def us_dot_number = 241_829
154
+ def us_mc_number = 165_377
155
+ def website_url = 'https://www.xpo.com'
156
+ end
157
+
158
+ API = { domain: 'api.ltl.xpo.com', endpoints: { rates: '/rating/1.0/ratequotes', token: '/token' }, use_ssl: true }.freeze
159
+
160
+ # Documents
161
+
162
+ # Pickups
163
+
164
+ # Rates
165
+
166
+ def find_rates(shipment:)
167
+ begin
168
+ validate_packages(shipment.packages)
169
+ rescue UnserviceableError => e
170
+ return RateResponse.new(error: e)
171
+ end
172
+
173
+ request = build_rate_request(shipment:)
174
+ parse_rate_response(shipment:, response: commit(request))
175
+ end
176
+
177
+ # Tracking
178
+
179
+ protected
180
+
181
+ def bearer_token = @bearer_token ||= commit(build_bearer_token_request)[:access_token]
182
+
183
+ def build_accessorials(shipment:)
184
+ serviceable_accessorials?(shipment.accessorials)
185
+
186
+ accessorial_codes = []
187
+ accessorial_codes << 'SSC'
188
+ accessorial_codes << 'ZHM' if shipment.hazmat?
189
+
190
+ if shipment.destination.province.upcase == 'HI'
191
+ accessorial_codes = accessorial_codes.map { |code| ['DID', 'OIP'].include?(code) ? 'WHN' : code }.uniq
192
+ end
193
+
194
+ longest_dimension_in = shipment.packages.map { |p| [p.width(:inch), p.length(:inch)].max }.max.ceil
195
+
196
+ # Switch to accessorials rather than accessorial_codes since now we need more complex structures
197
+
198
+ accessorials = accessorial_codes.map { |accessorial_code| { accessorial_cd: accessorial_code, quantity: 0 } }
199
+
200
+ return accessorials if longest_dimension_in < 96 && shipment.accessorials.blank?
201
+
202
+ accessorials << { accessorial_cd: 'ELS', quantity_uom: 'INCH', quantity: longest_dimension_in } if longest_dimension_in >= 96
203
+
204
+ return accessorials if shipment.accessorials.blank?
205
+
206
+ shipment.accessorials.map do |accessorial|
207
+ next if unquotable_accessorials.include?(accessorial)
208
+
209
+ accessorials << { accessorial_cd: mappable_accessorials[accessorial], quantity: 0 }
210
+ end
211
+
212
+ accessorials
213
+ end
214
+
215
+ def build_bearer_token_request
216
+ api_credentials = fetch_credential(:api)
217
+
218
+ body = URI.encode_www_form(grant_type: 'password', password: api_credentials.password, username: api_credentials.username)
219
+
220
+ {
221
+ body:,
222
+ headers: {
223
+ authorization: "Basic #{api_credentials.api_key}",
224
+ content_type: 'application/x-www-form-urlencoded'
225
+ },
226
+ method: :post,
227
+ url: build_url(:token)
228
+ }
229
+ end
230
+
231
+ def build_commodity(shipment:)
232
+ shipment.packages.map do |package|
233
+ {
234
+ dimensions: {
235
+ dimensions_uom: 'INCH',
236
+ height: package.inches(:height).ceil,
237
+ length: package.inches(:length).ceil,
238
+ width: package.inches(:width).ceil
239
+ },
240
+ gross_weight: { weight: package.pounds(:total).ceil, weight_uom: 'LBS' },
241
+ hazmat_ind: package.hazmat?,
242
+ nmfc_class: package.freight_class.to_s,
243
+ nmfc_item_cd: package.nmfc,
244
+ piece_cnt: package.quantity
245
+ }
246
+ end
247
+ end
248
+
249
+ def build_headers
250
+ { accept: 'application/json', authorization: "Bearer #{bearer_token}", 'Content-Type': 'application/json' }
251
+ end
252
+
253
+ def build_rate_request(shipment:)
254
+ api_credentials = fetch_credential(:api)
255
+ shipment_date = shipment.pickup_at.date_time_with_zone.iso8601
256
+
257
+ accessorials = build_accessorials(shipment:)
258
+ commodity = build_commodity(shipment:)
259
+
260
+ body = {
261
+ shipmentInfo: {
262
+ accessorials:,
263
+ bill_2_party: { acct_inst_id: api_credentials.account },
264
+ commodity:,
265
+ consignee: { address: { postal_cd: shipment.destination.postal_code.to_s } },
266
+ pallet_cnt: shipment.packages.map(&:packaging).map(&:pallet?).count(true),
267
+ payment_term_cd: 'P', # prepaid,
268
+ shipment_date:,
269
+ shipper: { address: { postal_cd: shipment.origin.postal_code.to_s } }
270
+ }
271
+ }.deep_transform_keys! { |key| key.to_s.camelize(:lower) }.to_json
272
+
273
+ request = { body:, headers: build_headers, method: :post, url: build_url(:rates) }
274
+
275
+ save_request(request)
276
+ request
277
+ end
278
+
279
+ def build_url(action)
280
+ scheme = API[:use_ssl] ? 'https://' : 'http://'
281
+ "#{scheme}#{API[:domain]}#{API.dig(:endpoints, action)}"
282
+ end
283
+
284
+ def commit(request)
285
+ url = request[:url]
286
+ headers = request[:headers] || build_headers
287
+ method = request[:method]
288
+ body = request[:body]
289
+
290
+ response = case method
291
+ when :post
292
+ HTTPClient.post(url, headers:, body:, proxy_url:)
293
+ else
294
+ HTTPClient.get(url, headers:, proxy_url:)
295
+ end
296
+
297
+ begin
298
+ json = JSON.parse(response.body).deep_symbolize_keys
299
+ rescue JSON::ParserError => e
300
+ # CNWY returns a string during runtime/server error
301
+ raise FreightKit::ResponseError, 'Runtime Error' if response.body.include?('Runtime Error')
302
+
303
+ raise e
304
+ end
305
+
306
+ error = (json[:error_description] || json.dig(:fault, :description) || json.dig(:error, :message) if json.is_a?(Hash))
307
+
308
+ if error.blank?
309
+ return json if (200..299).include?(response.code)
310
+ else
311
+ case response.code
312
+ when 401
313
+ raise FreightKit::InvalidCredentialsError
314
+ end
315
+ end
316
+
317
+ raise FreightKit::ResponseError, error
318
+ end
319
+
320
+ def parse_amount(amount) = (amount.to_f * 100).to_i
321
+
322
+ def parse_rate_response(shipment:, response:)
323
+ rate_response = RateResponse.new(request: last_request, response:)
324
+
325
+ if response.blank?
326
+ rate_response.error = ResponseError.new('Unknown response')
327
+ return rate_response
328
+ end
329
+
330
+ if response.dig(:data, :rateQuote, :totCharge, 0, :amt).blank?
331
+ rate_response.error = ResponseError.new('Cost is empty')
332
+ return rate_response
333
+ end
334
+
335
+ accessorials = response.dig(:data, :rateQuote, :shipmentInfo, :accessorials)
336
+ commodities = response.dig(:data, :rateQuote, :shipmentInfo, :commodity)
337
+ deficit_weight = response.dig(:data, :rateQuote, :deficitRatingInfo)
338
+
339
+ prices = []
340
+
341
+ prices << FreightKit::Price.new(
342
+ blame: :api,
343
+ cents: parse_amount(commodities.sum { |c| c.dig(:charge, :chargeAmt, :amt) }),
344
+ description: 'Freight'
345
+ )
346
+
347
+ if deficit_weight.present?
348
+ prices << FreightKit::Price.new(
349
+ blame: :api,
350
+ cents: parse_amount(deficit_weight.dig(:deficitAmt, :amt)),
351
+ description: <<~DESC.squish
352
+ Deficit weight
353
+ #{deficit_weight.dig(:deficitWght, :weight).ceil}
354
+ #{deficit_weight.dig(:deficitWght, :weightUom).downcase}
355
+ DESC
356
+ )
357
+ end
358
+
359
+ prices << FreightKit::Price.new(
360
+ blame: :api,
361
+ cents: parse_amount(response.dig(:data, :rateQuote, :totDiscountAmt, :amt)) * -1,
362
+ description: "Discount #{response.dig(:data, :rateQuote, :actlDiscountPct)}%"
363
+ )
364
+
365
+ prices += accessorials.map do |accessorial|
366
+ FreightKit::Price.new(
367
+ blame: :api,
368
+ cents: parse_amount(accessorial.dig(:chargeAmt, :amt)),
369
+ description: accessorial[:accessorialDesc].squish.capitalize.gsub('Xpo', 'XPO')
370
+ )
371
+ end
372
+
373
+ comment = response.dig(:data, :rateQuote, :shipmentInfo, :comment)
374
+ days = if comment.blank?
375
+ nil
376
+ else
377
+ comment[/(\d+) days/, 1]&.to_i
378
+ end
379
+
380
+ expires_at = if days.is_a?(Integer) && days.positive?
381
+ days.days.from_now
382
+ else
383
+ 2.days.from_now
384
+ end
385
+
386
+ estimate_reference = response.dig(:data, :rateQuote, :confirmationNbr)
387
+ transit_days = response.dig(:data, :transitTime, :transitDays)
388
+
389
+ rate = Rate.new(
390
+ carrier: self,
391
+ carrier_name: name,
392
+ currency: 'USD',
393
+ estimate_reference:,
394
+ expires_at:,
395
+ scac:,
396
+ service_name: :standard,
397
+ shipment:,
398
+ prices:,
399
+ transit_days:,
400
+ with_excessive_length_fees: rates_with_excessive_length_fees?
401
+ )
402
+
403
+ rate_response.rates = [rate]
404
+ rate_response
405
+ end
406
+
407
+ def request_url(action)
408
+ scheme = API.dig(:use_ssl, action) ? 'https://' : 'http://'
409
+ "#{scheme}#{API.dig(:domains, action)}#{API.dig(:endpoints, action)}"
410
+ end
411
+
412
+ # Tracking
413
+ end
414
+ end
415
+ end
@@ -0,0 +1,30 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class XpressGlobalSystems < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: '72b8ba38-1281-47d1-86e1-2f6c9df102d9', phone: '+17063413393')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'Tunnel Hill',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: '093e63fd-0d3d-4730-8386-e4e789a376b0',
14
+ postal_code: '30755',
15
+ region_abbreviation: 'GA',
16
+ street: '1537 New Hope Church Road'
17
+ )
18
+ end
19
+
20
+ def id = '1802a2a1-a0f8-4a8b-a441-acc40a8f18e0'
21
+ def legal_name = 'Xpress Global Systems LLC'
22
+ def name = 'Xpress Global Systems'
23
+ def scac = 'XGSI'
24
+ def us_dot_number = 534_817
25
+ def us_mc_number = 188_471
26
+ def website_url = 'https://www.xgsi.com'
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class XyloTrucking < Carrier
4
+ class << self
5
+ def id = 'f13bfd99-a3e8-4cea-9bff-7685d603737a'
6
+ def name = 'Xylo Trucking'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,24 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class YRCFreight < Carrier
4
+ class << self
5
+ def check_mailing_addresses
6
+ [
7
+ Address.new(
8
+ city: 'Pasadena',
9
+ country: Countries.find_by(iso31661_alpha2: 'US'),
10
+ id: 'b4d30c47-00dc-47b8-a732-29890a6b7032',
11
+ postal_code: '91189',
12
+ region_abbreviation: 'CA',
13
+ street: 'PO Box 100129'
14
+ )
15
+ ]
16
+ end
17
+
18
+ def id = '30d0fc37-971b-4a67-bd12-bb4dda3f411a'
19
+ def name = 'YRC Freight'
20
+ def scac = 'RDWY'
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class ZentnerTransportation < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: '268a3b40-b03a-4600-839a-478223ed0bca', phone: '+13083580291')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'Cedar Rapids',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: 'bd418b64-abb8-47ef-b6aa-5298a4e5bd80',
14
+ postal_code: '68627',
15
+ region_abbreviation: 'NE',
16
+ street: '612 S Third Street'
17
+ )
18
+ end
19
+
20
+ def id = 'd46277ce-db54-46b5-8310-02b1f84524ee'
21
+ def legal_name = 'Zentner Transportation Inc'
22
+ def name = 'Zentner Transportation'
23
+ def us_dot_number = 239_232
24
+ def website_url = 'https://zentnertransportation.com'
25
+ end
26
+ end
27
+ end
28
+ end