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,573 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class OnTrac < FreightKit::Carrier
4
+ class << self
5
+ def find_rates_with_declared_value? = true
6
+ def id = 'b1ba6e79-b7b3-41ae-a853-78bb75b421be'
7
+
8
+ # Not really mapped but can be quoted
9
+ def mappable_accessorials = { residential_delivery: true }
10
+
11
+ def maximum_height = Measured::Length.new(105, :inches)
12
+ def maximum_weight = Measured::Weight.new(150, :pounds)
13
+ def minimum_length_for_overlength_fees = Measured::Length.new(6, :feet)
14
+ def name = 'OnTrac'
15
+ def overlength_fees_require_tariff? = false
16
+ def pickup_number_is_tracking_number? = true
17
+ def required_credential_types = %i[api_key]
18
+ def requirements = %i[credentials]
19
+ def scac = 'OTCL'
20
+ def services = %i[standard guaranteed_delivery guaranteed_delivery_am guaranteed_delivery_pm]
21
+
22
+ def unquotable_accessorials
23
+ %i[
24
+ airport_delivery
25
+ airport_pickup
26
+ amusement_park_delivery
27
+ amusement_park_pickup
28
+ appointment_delivery
29
+ appointment_pickup
30
+ athletic_facility_delivery
31
+ athletic_facility_pickup
32
+ brewery_delivery
33
+ brewery_pickup
34
+ cemetery_delivery
35
+ cemetery_pickup
36
+ church_delivery
37
+ church_pickup
38
+ construction_delivery
39
+ construction_pickup
40
+ convention_delivery
41
+ convention_pickup
42
+ customs_brokerage
43
+ dock_dropoff
44
+ dock_pickup
45
+ driver_assist
46
+ early_morning_delivery
47
+ early_morning_pickup
48
+ fair_delivery
49
+ fair_pickup
50
+ farm_delivery
51
+ farm_pickup
52
+ fitness_center_delivery
53
+ fitness_center_pickup
54
+ flatbed_delivery
55
+ flatbed_pickup
56
+ golf_course_delivery
57
+ golf_course_pickup
58
+ government_delivery
59
+ government_pickup
60
+ grocery_store_delivery
61
+ grocery_store_pickup
62
+ grocery_warehouse_delivery
63
+ grocery_warehouse_pickup
64
+ hospital_delivery
65
+ hospital_pickup
66
+ hotel_delivery
67
+ hotel_pickup
68
+ inside_delivery
69
+ inside_pickup
70
+ inspection_site_delivery
71
+ inspection_site_pickup
72
+ jobsite_delivery
73
+ jobsite_pickup
74
+ liftgate_delivery
75
+ liftgate_pickup
76
+ mall_delivery
77
+ mall_pickup
78
+ marina_delivery
79
+ marina_pickup
80
+ military_site_delivery
81
+ military_site_pickup
82
+ mine_site_delivery
83
+ mine_site_pickup
84
+ motel_delivery
85
+ motel_pickup
86
+ nursing_home_delivery
87
+ nursing_home_pickup
88
+ park_delivery
89
+ park_pickup
90
+ prison_delivery
91
+ prison_pickup
92
+ ranch_delivery
93
+ ranch_pickup
94
+ reservation_delivery
95
+ reservation_pickup
96
+ residential_pickup
97
+ resort_delivery
98
+ resort_pickup
99
+ restaurant_delivery
100
+ restaurant_pickup
101
+ school_delivery
102
+ school_pickup
103
+ steel_mill_delivery
104
+ steel_mill_pickup
105
+ storage_facility_delivery
106
+ storage_facility_pickup
107
+ university_delivery
108
+ university_pickup
109
+ utility_site_delivery
110
+ utility_site_pickup
111
+ winery_delivery
112
+ winery_pickup
113
+ ]
114
+ end
115
+
116
+ def unserviceable_accessorials
117
+ %i[afterhours_delivery afterhours_pickup guaranteed_delivery guaranteed_delivery_am guaranteed_delivery_pm]
118
+ end
119
+
120
+ def website_url = 'https://www.ontrac.com'
121
+ end
122
+
123
+ API = {
124
+ domain: 'www.shipontrac.net',
125
+ endpoints: {
126
+ production: {
127
+ pickups: '/OnTracWebServices/OnTracServices.svc/V4/' \
128
+ '%ACCOUNT_NUMBER%/pickups',
129
+ rates: '/OnTracWebServices/OnTracServices.svc/V4/%ACCOUNT_NUMBER%/rates',
130
+ shipments: '/OnTracWebServices/OnTracServices.svc/V4/' \
131
+ '%ACCOUNT_NUMBER%/shipments'
132
+ },
133
+ test: {
134
+ pickups: '/OnTracTestWebServices/OnTracServices.svc/V4/%ACCOUNT_NUMBER%/pickups',
135
+ rates: '/OnTracTestWebServices/OnTracServices.svc/V4/%ACCOUNT_NUMBER%/rates',
136
+ shipments: '/OnTracTestWebServices/OnTracServices.svc/V4/' \
137
+ '%ACCOUNT_NUMBER%/shipments'
138
+ }
139
+ },
140
+ methods: { pickups: :post, rates: :get, shipments: :post }
141
+ }.freeze
142
+ XML_HEADERS = { Accept: 'application/xml', charset: 'utf-8', 'Content-Type': 'application/xml' }.freeze
143
+
144
+ # Documents
145
+
146
+ # Pickups
147
+
148
+ def create_pickup(
149
+ delivery_from:,
150
+ delivery_to:,
151
+ dispatcher:,
152
+ pickup_from:,
153
+ pickup_to:,
154
+ scac:,
155
+ service:,
156
+ shipment:
157
+ )
158
+ request = build_shipment_request(
159
+ delivery_from:,
160
+ delivery_to:,
161
+ dispatcher:,
162
+ pickup_from:,
163
+ pickup_to:,
164
+ scac:,
165
+ service:,
166
+ shipment:
167
+ )
168
+
169
+ labels = parse_shipment_response(commit(request))
170
+
171
+ request = build_pickup_request(
172
+ delivery_from:,
173
+ delivery_to:,
174
+ dispatcher:,
175
+ pickup_from:,
176
+ pickup_to:,
177
+ scac:,
178
+ service:,
179
+ shipment:
180
+ )
181
+
182
+ parse_pickup_response(response: commit(request), labels:)
183
+ end
184
+
185
+ def find_rates(shipment:)
186
+ begin
187
+ validate_packages(shipment.packages)
188
+ rescue UnserviceableError => e
189
+ return RateResponse.new(error: e)
190
+ end
191
+
192
+ request = build_rate_request(shipment:)
193
+ parse_rate_response(shipment:, response: commit(request))
194
+ end
195
+
196
+ # Tracking
197
+
198
+ protected
199
+
200
+ def build_pickup_request(
201
+ delivery_from:,
202
+ delivery_to:,
203
+ dispatcher:,
204
+ pickup_from:,
205
+ pickup_to:,
206
+ scac:,
207
+ service:,
208
+ shipment:
209
+ )
210
+ dispatcher_phone = dispatcher.phone.sub('+1', '').delete('^0-9')
211
+
212
+ raise UnserviceableError, 'Palletized freight unsupported' unless shipment.loose?
213
+
214
+ request_body = {
215
+ Address: shipment.origin.address1,
216
+ City: shipment.origin.city,
217
+ CloseAt: pickup_to.strftime('%H:%M:00'),
218
+ Contact: shipment.origin.contact.name || 'Shipping',
219
+ Date: pickup_from.to_date,
220
+ DelZip: shipment.destination.postal_code,
221
+ Instructions: '',
222
+ Name: shipment.origin.contact.company_name,
223
+ Phone: dispatcher_phone,
224
+ ReadyAt: pickup_from.strftime('%H:%M:00'),
225
+ State: shipment.origin.province,
226
+ Zip: shipment.origin.postal_code
227
+ }.freeze
228
+
229
+ request = {
230
+ headers: XML_HEADERS,
231
+ method: API.dig(:methods, :pickups),
232
+ url: build_url(:pickups),
233
+ body: request_body.to_xml(root: 'OnTracPickupRequest', skip_types: true)
234
+ }
235
+
236
+ save_request(request)
237
+ request
238
+ end
239
+
240
+ def build_rate_request(shipment:)
241
+ serviceable_accessorials?(shipment.accessorials)
242
+ serviceable_states?([shipment.origin.province, shipment.destination.province])
243
+
244
+ # API supports non-loose items (see below) but per OnTrac it shouldn't be quoted. We'll raise an error here but
245
+ # leave the support baked-in below anyway.
246
+ raise FreightKit::UnserviceableError, 'Palletized freight unsupported' unless shipment.loose?
247
+
248
+ dim_weights_too_heavy = shipment.packages.map(&:dim_weight).select { |w| w > self.class.maximum_weight.value }
249
+
250
+ if dim_weights_too_heavy.any?
251
+ message = <<~MESSAGE.squish
252
+ Dimensional weight(s) of #{dim_weights_too_heavy.map(&:round).join('lbs, ')} lbs more than maximum of
253
+ #{self.class.maximum_weight.value.round} lbs
254
+ MESSAGE
255
+ raise FreightKit::UnserviceableError, message
256
+ end
257
+
258
+ params = ''.dup
259
+ params << 'packages='
260
+
261
+ total_weight = shipment.packages.map { |p| p.pounds(:total) }.sum
262
+
263
+ i = 1
264
+ package_param_parts = []
265
+
266
+ shipment.packages.each do |package|
267
+ package.quantity.times do
268
+ declared_value = if shipment.declared_value_cents.blank?
269
+ 0
270
+ else
271
+ shipment.declared_value_cents.to_f * (package.pounds(:each) / total_weight)
272
+ end
273
+
274
+ declared_value = declared_value.to_s
275
+
276
+ parts = []
277
+
278
+ parts << "ID#{i}"
279
+ parts << shipment.origin.postal_code
280
+ parts << shipment.destination.postal_code
281
+ parts << shipment.accessorials.include?(:residential_delivery).to_s
282
+ parts << '0'
283
+ parts << 'false' # Staurday delivery
284
+ parts << declared_value
285
+ parts << package.pounds(:each).ceil
286
+ parts << "#{package.inches(:length).ceil}X#{package.inches(:width).ceil}X#{package.inches(:height).ceil}"
287
+ parts << 'C'
288
+ parts << '0' # not a letter
289
+ parts << '0' # always 0 per documentation
290
+
291
+ package_param_parts << parts.join(';')
292
+ end
293
+ end
294
+
295
+ params << package_param_parts.join(',')
296
+
297
+ build_request(:rates, { params: })
298
+ end
299
+
300
+ def build_request(action, options = {})
301
+ request = { url: build_url(action, options), headers: XML_HEADERS, method: API.dig(:methods, action) }
302
+
303
+ save_request(request)
304
+ request
305
+ end
306
+
307
+ def build_shipment_request(
308
+ delivery_from:,
309
+ delivery_to:,
310
+ dispatcher:,
311
+ pickup_from:,
312
+ pickup_to:,
313
+ scac:,
314
+ service:,
315
+ shipment:
316
+ )
317
+ dispatcher_phone = dispatcher.phone.sub('+1', '').delete('^0-9')
318
+ receiver_phone = shipment.destination.contact.phone.sub('+1', '').delete('^0-9')
319
+
320
+ declared_value = if shipment.declared_value_cents.blank?
321
+ '0'
322
+ else
323
+ format('%.2f', (shipment.declared_value_cents.to_f / 100).ceil)
324
+ end
325
+
326
+ raise UnserviceableError, 'Palletized freight unsupported' unless shipment.loose?
327
+
328
+ base_api_shipment = {
329
+ consignee: {
330
+ Name: shipment.destination.contact.company_name,
331
+ Addr1: shipment.destination.address1,
332
+ Addr2: '',
333
+ Addr3: '',
334
+ City: shipment.destination.city,
335
+ Contact: shipment.destination.contact.name || 'Shipping',
336
+ Phone: receiver_phone || '',
337
+ State: shipment.destination.province,
338
+ Zip: shipment.destination.postal_code.to_s
339
+ },
340
+ shipper: {
341
+ Name: shipment.origin.contact.company_name,
342
+ Addr1: shipment.origin.address1,
343
+ City: shipment.origin.city,
344
+ State: shipment.origin.province,
345
+ Zip: shipment.origin.postal_code,
346
+ Contact: shipment.origin.contact.name || 'Shipping',
347
+ Phone: dispatcher_phone
348
+ },
349
+ BillTo: '0',
350
+ CargoType: '0',
351
+ COD: '0',
352
+ CODType: 'NONE',
353
+ Declared: declared_value,
354
+ DelEmail: dispatcher.email,
355
+ Instructions: '',
356
+ LabelType: '1', # PDF label
357
+ Reference: shipment.order_number,
358
+ Reference2: shipment.po_number,
359
+ Reference3: '',
360
+ Residential: shipment.accessorials.include?(:residential_delivery) ? 'true' : 'false',
361
+ SaturdayDel: 'false',
362
+ Service: 'C',
363
+ ShipDate: pickup_from.to_date.to_s,
364
+ ShipEmail: dispatcher.email,
365
+ SignatureRequired: 'true',
366
+ Tracking: ''
367
+ }.freeze
368
+
369
+ api_shipments = []
370
+
371
+ shipment.packages.each do |package|
372
+ package.quantity.times do
373
+ api_shipments << base_api_shipment.merge(
374
+ {
375
+ DIM: {
376
+ Length: package.length(:inches).ceil,
377
+ Width: package.width(:inches).ceil,
378
+ Height: package.height(:inches).ceil
379
+ },
380
+ UID: SecureRandom.uuid,
381
+ Weight: package.pounds(:each).ceil
382
+ }
383
+ )
384
+ end
385
+ end
386
+
387
+ request = {
388
+ headers: XML_HEADERS,
389
+ method: API.dig(:methods, :shipments),
390
+ url: build_url(:shipments),
391
+ body: { Shipments: api_shipments }.to_xml(root: 'OnTracShipmentRequest', skip_types: true)
392
+ }
393
+
394
+ save_request(request)
395
+ request
396
+ end
397
+
398
+ def build_url(action, options = {})
399
+ api_credentials = fetch_credential(:api_key)
400
+
401
+ env = @test_mode ? :test : :production
402
+
403
+ url = "https://#{API[:domain]}#{API.dig(:endpoints, env, action)}"
404
+ url = url.gsub('%ACCOUNT_NUMBER%', api_credentials.account)
405
+
406
+ url += "?pw=#{api_credentials.api_key}"
407
+ url << "&#{options[:params]}" if options[:params].present?
408
+
409
+ url
410
+ end
411
+
412
+ def commit(request)
413
+ body = request[:body]
414
+ headers = request[:headers]
415
+ method = request[:method]
416
+ url = request[:url]
417
+
418
+ response = case method
419
+ when :post
420
+ HTTPClient.post(url, headers:, body:)
421
+ else
422
+ HTTPClient.get(url, headers:)
423
+ end
424
+
425
+ response.parsed_response if response&.parsed_response
426
+ end
427
+
428
+ def parse_pickup_response(response:, labels:)
429
+ pickup_response = PickupResponse.new(request: last_request, response:)
430
+
431
+ if response.blank?
432
+ pickup_response.error = FreightKit::ResponseError.new('API Error: Blank response')
433
+ return pickup_response
434
+ end
435
+
436
+ error = response.dig('OnTracPickupResponse', 'Error')
437
+
438
+ if error.present?
439
+ pickup_response.error = FreightKit::ResponseError.new(error.capitalize)
440
+ return pickup_response
441
+ end
442
+
443
+ pickup_number = response.dig('OnTracPickupResponse', 'Tracking')
444
+
445
+ if pickup_number.blank?
446
+ pickup_response.error = FreightKit::ResponseError.new('Blank pickup number')
447
+ return pickup_response
448
+ end
449
+
450
+ pickup_response.pickup_number = pickup_number
451
+ pickup_response
452
+ end
453
+
454
+ def parse_rate_response(shipment:, response:)
455
+ rate_response = RateResponse.new(request: last_request, response:)
456
+
457
+ if response.blank?
458
+ rate_response.error = ResponseError.new('Blank response')
459
+ return rate_response
460
+ end
461
+
462
+ error = response.dig('OnTracRateResponse', 'Shipments', 'Shipment', 'Error') ||
463
+ response.dig('OnTracRateResponse', 'Shipments', 'Error') ||
464
+ response.dig('OnTracRateResponse', 'Error')
465
+
466
+ if error.blank? && response.dig('OnTracRateResponse', 'Shipments', 'Shipment').is_a?(Hash)
467
+ error = response.dig('OnTracRateResponse', 'Shipments', 'Shipment', 'Rates', 'Rate', 'Error')
468
+ end
469
+
470
+ if error.present?
471
+ case error.downcase
472
+ when ->(value) { value.include?('not serviced') }
473
+ rate_response.error = UnserviceableError.new(error)
474
+ return rate_response
475
+ when ->(value) { value.include?('invalid username') }
476
+ rate_response.error = InvalidCredentialsError.new(error)
477
+ return rate_response
478
+ when ->(value) { value.include?('no valid service') }
479
+ rate_response.error = UnserviceableError.new(error)
480
+ return rate_response
481
+ end
482
+
483
+ rate_response.error = ResponseError.new(error)
484
+ return rate_response
485
+ end
486
+
487
+ prices = []
488
+ transit_days = nil
489
+
490
+ api_shipments = response.dig('OnTracRateResponse', 'Shipments', 'Shipment')
491
+ api_shipments = [api_shipments] unless api_shipments.is_a?(Array)
492
+
493
+ if api_shipments.any? { |api_shipment| api_shipment['Error']&.downcase&.include?('not serviced') }
494
+ rate_response.error = UnserviceableError.new
495
+ return rate_response
496
+ end
497
+
498
+ api_shipments.each do |api_shipment|
499
+ api_rate = api_shipment.dig('Rates', 'Rate')
500
+ api_transit_days = api_rate['TransitDays'].to_i
501
+
502
+ transit_days = api_transit_days if transit_days.blank? || transit_days < api_transit_days
503
+
504
+ cents = (api_rate['ServiceCharge'].to_f * 100).to_i
505
+ prices << Price.new(blame: :api, cents:, description: 'Service charge')
506
+
507
+ cents = (api_rate['FuelCharge'].to_f * 100).to_i
508
+ prices << Price.new(blame: :api, cents:, description: 'Fuel charge')
509
+ end
510
+
511
+ rate = Rate.new(
512
+ carrier_name: name,
513
+ carrier: self,
514
+ currency: 'USD',
515
+ prices:,
516
+ scac:,
517
+ service_name: :standard,
518
+ shipment:,
519
+ transit_days:,
520
+ with_excessive_length_fees: rates_with_excessive_length_fees?
521
+ )
522
+
523
+ rate_response.rates = [rate]
524
+ rate_response
525
+ end
526
+
527
+ def parse_shipment_response(response)
528
+ raise FreightKit::ResponseError, 'API Error: Blank response' if response.blank?
529
+
530
+ error = response.dig('OnTracShipmentResponse', 'Shipments', 'Error')
531
+
532
+ if error.blank? && response.dig('OnTracShipmentResponse', 'Shipments', 'Shipment').is_a?(Hash)
533
+ error = response.dig('OnTracShipmentResponse', 'Shipments', 'Shipment', 'Error')
534
+ end
535
+
536
+ if error.present?
537
+ error = error.capitalize
538
+
539
+ raise FreightKit::InvalidCredentialsError, error if error.downcase.include?('invalid username')
540
+
541
+ raise FreightKit::UnserviceableError, error if error.downcase.include?('no valid service')
542
+
543
+ raise FreightKit::UnserviceableError, error if error.downcase.include?('not serviced')
544
+
545
+ raise FreightKit::ResponseError, "API Error: #{error}"
546
+ end
547
+
548
+ api_shipments = response.dig('OnTracShipmentResponse', 'Shipments', 'Shipment')
549
+ api_shipments = [api_shipments] unless api_shipments.is_a?(Array)
550
+
551
+ base64_labels = api_shipments&.map { |s| s['Label'] }
552
+ raise FreightKit::ResponseError, 'API Error: Blank label' if base64_labels.blank?
553
+
554
+ base64_labels.map { |base64_label| Label.new(data: base64_label) }
555
+ end
556
+
557
+ def serviceable_states?(states)
558
+ valid_states = ['AZ', 'CA', 'CO', 'ID', 'NV', 'OR', 'UT', 'WA']
559
+
560
+ invalid_states = []
561
+ states.each do |state|
562
+ invalid_states << state if valid_states.exclude?(state)
563
+ end
564
+
565
+ return true if invalid_states.blank?
566
+
567
+ raise FreightKit::UnserviceableError, "No service to #{invalid_states.join(', ')}"
568
+ end
569
+
570
+ # Tracking
571
+ end
572
+ end
573
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class OneHundredOneTransport < Carrier
4
+ class << self
5
+ def id = '31e01fd8-6ebb-4004-9c32-fb0cf1f9bec5'
6
+ def name = '101 Transport'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class OneWayDelivery < Carrier
4
+ class << self
5
+ def id = 'b9e44903-94e3-48ea-9fe4-8137e87813ef'
6
+ def name = 'One Way Delivery'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class OracleTransportationSolutions < Carrier
4
+ class << self
5
+ def id = '043b1a1e-1036-4f11-be22-fde7f15ddc28'
6
+ def name = 'Oracle Transportation Solutions'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,27 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class OrangeCourier < Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: 'd16cc0ef-7ed6-4fc9-8b24-c33809817689', phone: '+17143843600')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'La Mirada',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: '31fede2a-9a5f-4f20-93d1-3b7618c82aa9',
14
+ postal_code: '90638',
15
+ region_abbreviation: 'CA',
16
+ street: '15300 Desman Rd'
17
+ )
18
+ end
19
+
20
+ def id = '25cd5d4c-fde5-4dad-8a4b-f69ea7cbd82a'
21
+ def legal_name = 'Orange Courier Inc'
22
+ def name = 'Orange Courier'
23
+ def us_dot_number = 710_576
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class OrtasTrucking < Carrier
4
+ class << self
5
+ def id = 'fa6096fd-6fe6-4c11-8faa-2891b6551249'
6
+ def name = 'Ortas Trucking'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class PacTruxTransportation < Carrier
4
+ class << self
5
+ def id = '81879207-bd70-43eb-b43c-5ab2badc8ccc'
6
+ def name = 'PacTrux Transportation'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class Pacer < Carrier
4
+ class << self
5
+ def id = 'bff1a7ec-0d6d-43af-8ec9-665106006c41'
6
+ def name = 'Pacer'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class PacificLogistics < Carrier
4
+ class << self
5
+ def id = '08359e6a-e526-4b95-bf92-0d11db1542c3'
6
+ def name = 'Pacific Logistics'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class PacificStatesTruckLines < Carrier
4
+ class << self
5
+ def id = '9cb27c0c-dbec-4b8b-b1ae-f2cd037045a3'
6
+ def name = 'Pacific States Truck Lines'
7
+ end
8
+ end
9
+ end
10
+ end