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,555 @@
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(delivery_from:, delivery_to:, dispatcher:, pickup_from:, pickup_to:, scac:, service:, shipment:)
159
+
160
+ labels = parse_shipment_response(commit(request))
161
+
162
+ request = build_pickup_request(delivery_from:, delivery_to:, dispatcher:, pickup_from:, pickup_to:, scac:, service:, shipment:)
163
+
164
+ parse_pickup_response(response: commit(request), labels:)
165
+ end
166
+
167
+ def find_rates(shipment:)
168
+ begin
169
+ validate_packages(shipment.packages)
170
+ rescue UnserviceableError => e
171
+ return RateResponse.new(error: e)
172
+ end
173
+
174
+ request = build_rate_request(shipment:)
175
+ parse_rate_response(shipment:, response: commit(request))
176
+ end
177
+
178
+ # Tracking
179
+
180
+ protected
181
+
182
+ def build_pickup_request(
183
+ delivery_from:,
184
+ delivery_to:,
185
+ dispatcher:,
186
+ pickup_from:,
187
+ pickup_to:,
188
+ scac:,
189
+ service:,
190
+ shipment:
191
+ )
192
+ dispatcher_phone = dispatcher.phone.sub('+1', '').delete('^0-9')
193
+
194
+ raise UnserviceableError, 'Palletized freight unsupported' unless shipment.loose?
195
+
196
+ request_body = {
197
+ Address: shipment.origin.address1,
198
+ City: shipment.origin.city,
199
+ CloseAt: pickup_to.strftime('%H:%M:00'),
200
+ Contact: shipment.origin.contact.name || 'Shipping',
201
+ Date: pickup_from.to_date,
202
+ DelZip: shipment.destination.postal_code,
203
+ Instructions: '',
204
+ Name: shipment.origin.contact.company_name,
205
+ Phone: dispatcher_phone,
206
+ ReadyAt: pickup_from.strftime('%H:%M:00'),
207
+ State: shipment.origin.province,
208
+ Zip: shipment.origin.postal_code
209
+ }.freeze
210
+
211
+ request = {
212
+ headers: XML_HEADERS,
213
+ method: API.dig(:methods, :pickups),
214
+ url: build_url(:pickups),
215
+ body: request_body.to_xml(root: 'OnTracPickupRequest', skip_types: true)
216
+ }
217
+
218
+ save_request(request)
219
+ request
220
+ end
221
+
222
+ def build_rate_request(shipment:)
223
+ serviceable_accessorials?(shipment.accessorials)
224
+ serviceable_states?([shipment.origin.province, shipment.destination.province])
225
+
226
+ # API supports non-loose items (see below) but per OnTrac it shouldn't be quoted. We'll raise an error here but
227
+ # leave the support baked-in below anyway.
228
+ raise FreightKit::UnserviceableError, 'Palletized freight unsupported' unless shipment.loose?
229
+
230
+ dim_weights_too_heavy = shipment.packages.map(&:dim_weight).select { |w| w > self.class.maximum_weight.value }
231
+
232
+ if dim_weights_too_heavy.any?
233
+ message = <<~MESSAGE.squish
234
+ Dimensional weight(s) of #{dim_weights_too_heavy.map(&:round).join('lbs, ')} lbs more than maximum of
235
+ #{self.class.maximum_weight.value.round} lbs
236
+ MESSAGE
237
+ raise FreightKit::UnserviceableError, message
238
+ end
239
+
240
+ params = ''.dup
241
+ params << 'packages='
242
+
243
+ total_weight = shipment.packages.map { |p| p.pounds(:total) }.sum
244
+
245
+ i = 1
246
+ package_param_parts = []
247
+
248
+ shipment.packages.each do |package|
249
+ package.quantity.times do
250
+ declared_value = if shipment.declared_value_cents.blank?
251
+ 0
252
+ else
253
+ shipment.declared_value_cents.to_f * (package.pounds(:each) / total_weight)
254
+ end
255
+
256
+ declared_value = declared_value.to_s
257
+
258
+ parts = []
259
+
260
+ parts << "ID#{i}"
261
+ parts << shipment.origin.postal_code
262
+ parts << shipment.destination.postal_code
263
+ parts << shipment.accessorials.include?(:residential_delivery).to_s
264
+ parts << '0'
265
+ parts << 'false' # Staurday delivery
266
+ parts << declared_value
267
+ parts << package.pounds(:each).ceil
268
+ parts << "#{package.inches(:length).ceil}X#{package.inches(:width).ceil}X#{package.inches(:height).ceil}"
269
+ parts << 'C'
270
+ parts << '0' # not a letter
271
+ parts << '0' # always 0 per documentation
272
+
273
+ package_param_parts << parts.join(';')
274
+ end
275
+ end
276
+
277
+ params << package_param_parts.join(',')
278
+
279
+ build_request(:rates, { params: })
280
+ end
281
+
282
+ def build_request(action, options = {})
283
+ request = { url: build_url(action, options), headers: XML_HEADERS, method: API.dig(:methods, action) }
284
+
285
+ save_request(request)
286
+ request
287
+ end
288
+
289
+ def build_shipment_request(
290
+ delivery_from:,
291
+ delivery_to:,
292
+ dispatcher:,
293
+ pickup_from:,
294
+ pickup_to:,
295
+ scac:,
296
+ service:,
297
+ shipment:
298
+ )
299
+ dispatcher_phone = dispatcher.phone.sub('+1', '').delete('^0-9')
300
+ receiver_phone = shipment.destination.contact.phone.sub('+1', '').delete('^0-9')
301
+
302
+ declared_value = if shipment.declared_value_cents.blank?
303
+ '0'
304
+ else
305
+ format('%.2f', (shipment.declared_value_cents.to_f / 100).ceil)
306
+ end
307
+
308
+ raise UnserviceableError, 'Palletized freight unsupported' unless shipment.loose?
309
+
310
+ base_api_shipment = {
311
+ consignee: {
312
+ Name: shipment.destination.contact.company_name,
313
+ Addr1: shipment.destination.address1,
314
+ Addr2: '',
315
+ Addr3: '',
316
+ City: shipment.destination.city,
317
+ Contact: shipment.destination.contact.name || 'Shipping',
318
+ Phone: receiver_phone || '',
319
+ State: shipment.destination.province,
320
+ Zip: shipment.destination.postal_code.to_s
321
+ },
322
+ shipper: {
323
+ Name: shipment.origin.contact.company_name,
324
+ Addr1: shipment.origin.address1,
325
+ City: shipment.origin.city,
326
+ State: shipment.origin.province,
327
+ Zip: shipment.origin.postal_code,
328
+ Contact: shipment.origin.contact.name || 'Shipping',
329
+ Phone: dispatcher_phone
330
+ },
331
+ BillTo: '0',
332
+ CargoType: '0',
333
+ COD: '0',
334
+ CODType: 'NONE',
335
+ Declared: declared_value,
336
+ DelEmail: dispatcher.email,
337
+ Instructions: '',
338
+ LabelType: '1', # PDF label
339
+ Reference: shipment.order_number,
340
+ Reference2: shipment.po_number,
341
+ Reference3: '',
342
+ Residential: shipment.accessorials.include?(:residential_delivery) ? 'true' : 'false',
343
+ SaturdayDel: 'false',
344
+ Service: 'C',
345
+ ShipDate: pickup_from.to_date.to_s,
346
+ ShipEmail: dispatcher.email,
347
+ SignatureRequired: 'true',
348
+ Tracking: ''
349
+ }.freeze
350
+
351
+ api_shipments = []
352
+
353
+ shipment.packages.each do |package|
354
+ package.quantity.times do
355
+ api_shipments << base_api_shipment.merge(
356
+ {
357
+ DIM: {
358
+ Length: package.length(:inches).ceil,
359
+ Width: package.width(:inches).ceil,
360
+ Height: package.height(:inches).ceil
361
+ },
362
+ UID: SecureRandom.uuid,
363
+ Weight: package.pounds(:each).ceil
364
+ }
365
+ )
366
+ end
367
+ end
368
+
369
+ request = {
370
+ headers: XML_HEADERS,
371
+ method: API.dig(:methods, :shipments),
372
+ url: build_url(:shipments),
373
+ body: { Shipments: api_shipments }.to_xml(root: 'OnTracShipmentRequest', skip_types: true)
374
+ }
375
+
376
+ save_request(request)
377
+ request
378
+ end
379
+
380
+ def build_url(action, options = {})
381
+ api_credentials = fetch_credential(:api_key)
382
+
383
+ env = @test_mode ? :test : :production
384
+
385
+ url = "https://#{API[:domain]}#{API.dig(:endpoints, env, action)}"
386
+ url = url.gsub('%ACCOUNT_NUMBER%', api_credentials.account)
387
+
388
+ url += "?pw=#{api_credentials.api_key}"
389
+ url << "&#{options[:params]}" if options[:params].present?
390
+
391
+ url
392
+ end
393
+
394
+ def commit(request)
395
+ body = request[:body]
396
+ headers = request[:headers]
397
+ method = request[:method]
398
+ url = request[:url]
399
+
400
+ response = case method
401
+ when :post
402
+ HTTPClient.post(url, headers:, body:, proxy_url:)
403
+ else
404
+ HTTPClient.get(url, headers:, proxy_url:)
405
+ end
406
+
407
+ response.parsed_response if response&.parsed_response
408
+ end
409
+
410
+ def parse_pickup_response(response:, labels:)
411
+ pickup_response = PickupResponse.new(request: last_request, response:)
412
+
413
+ if response.blank?
414
+ pickup_response.error = FreightKit::ResponseError.new('API Error: Blank response')
415
+ return pickup_response
416
+ end
417
+
418
+ error = response.dig('OnTracPickupResponse', 'Error')
419
+
420
+ if error.present?
421
+ pickup_response.error = FreightKit::ResponseError.new(error.capitalize)
422
+ return pickup_response
423
+ end
424
+
425
+ pickup_number = response.dig('OnTracPickupResponse', 'Tracking')
426
+
427
+ if pickup_number.blank?
428
+ pickup_response.error = FreightKit::ResponseError.new('Blank pickup number')
429
+ return pickup_response
430
+ end
431
+
432
+ pickup_response.pickup_number = pickup_number
433
+ pickup_response
434
+ end
435
+
436
+ def parse_rate_response(shipment:, response:)
437
+ rate_response = RateResponse.new(request: last_request, response:)
438
+
439
+ if response.blank?
440
+ rate_response.error = ResponseError.new('Blank response')
441
+ return rate_response
442
+ end
443
+
444
+ error = response.dig('OnTracRateResponse', 'Shipments', 'Shipment', 'Error') ||
445
+ response.dig('OnTracRateResponse', 'Shipments', 'Error') ||
446
+ response.dig('OnTracRateResponse', 'Error')
447
+
448
+ if error.blank? && response.dig('OnTracRateResponse', 'Shipments', 'Shipment').is_a?(Hash)
449
+ error = response.dig('OnTracRateResponse', 'Shipments', 'Shipment', 'Rates', 'Rate', 'Error')
450
+ end
451
+
452
+ if error.present?
453
+ case error.downcase
454
+ when ->(value) { value.include?('not serviced') }
455
+ rate_response.error = UnserviceableError.new(error)
456
+ return rate_response
457
+ when ->(value) { value.include?('invalid username') }
458
+ rate_response.error = InvalidCredentialsError.new(error)
459
+ return rate_response
460
+ when ->(value) { value.include?('no valid service') }
461
+ rate_response.error = UnserviceableError.new(error)
462
+ return rate_response
463
+ end
464
+
465
+ rate_response.error = ResponseError.new(error)
466
+ return rate_response
467
+ end
468
+
469
+ prices = []
470
+ transit_days = nil
471
+
472
+ api_shipments = Array.wrap(response.dig('OnTracRateResponse', 'Shipments', 'Shipment'))
473
+ return rate_response.tap { |item| item.error = ResponseError.new('API Error: Blank shipment') } if api_shipments.empty?
474
+
475
+ if api_shipments.any? { |api_shipment| api_shipment['Error']&.downcase&.include?('not serviced') }
476
+ rate_response.error = UnserviceableError.new
477
+ return rate_response
478
+ end
479
+
480
+ api_shipments.each do |api_shipment|
481
+ api_rate = api_shipment.dig('Rates', 'Rate')
482
+ api_transit_days = api_rate['TransitDays'].to_i
483
+
484
+ transit_days = api_transit_days if transit_days.blank? || transit_days < api_transit_days
485
+
486
+ cents = (api_rate['ServiceCharge'].to_f * 100).to_i
487
+ prices << Price.new(blame: :api, cents:, description: 'Service charge')
488
+
489
+ cents = (api_rate['FuelCharge'].to_f * 100).to_i
490
+ prices << Price.new(blame: :api, cents:, description: 'Fuel charge')
491
+ end
492
+
493
+ rate = Rate.new(
494
+ carrier_name: name,
495
+ carrier: self,
496
+ currency: 'USD',
497
+ prices:,
498
+ scac:,
499
+ service_name: :standard,
500
+ shipment:,
501
+ transit_days:,
502
+ with_excessive_length_fees: rates_with_excessive_length_fees?
503
+ )
504
+
505
+ rate_response.rates = [rate]
506
+ rate_response
507
+ end
508
+
509
+ def parse_shipment_response(response)
510
+ raise FreightKit::ResponseError, 'API Error: Blank response' if response.blank?
511
+
512
+ error = response.dig('OnTracShipmentResponse', 'Shipments', 'Error')
513
+
514
+ if error.blank? && response.dig('OnTracShipmentResponse', 'Shipments', 'Shipment').is_a?(Hash)
515
+ error = response.dig('OnTracShipmentResponse', 'Shipments', 'Shipment', 'Error')
516
+ end
517
+
518
+ if error.present?
519
+ error = error.capitalize
520
+
521
+ raise FreightKit::InvalidCredentialsError, error if error.downcase.include?('invalid username')
522
+
523
+ raise FreightKit::UnserviceableError, error if error.downcase.include?('no valid service')
524
+
525
+ raise FreightKit::UnserviceableError, error if error.downcase.include?('not serviced')
526
+
527
+ raise FreightKit::ResponseError, "API Error: #{error}"
528
+ end
529
+
530
+ api_shipments = response.dig('OnTracShipmentResponse', 'Shipments', 'Shipment')
531
+ api_shipments = Array.wrap(api_shipments)
532
+
533
+ base64_labels = api_shipments&.map { |s| s['Label'] }
534
+ raise FreightKit::ResponseError, 'API Error: Blank label' if base64_labels.blank?
535
+
536
+ base64_labels.map { |base64_label| Label.new(data: base64_label) }
537
+ end
538
+
539
+ def serviceable_states?(states)
540
+ valid_states = ['AZ', 'CA', 'CO', 'ID', 'NV', 'OR', 'UT', 'WA']
541
+
542
+ invalid_states = []
543
+ states.each do |state|
544
+ invalid_states << state if valid_states.exclude?(state)
545
+ end
546
+
547
+ return true if invalid_states.blank?
548
+
549
+ raise FreightKit::UnserviceableError, "No service to #{invalid_states.join(', ')}"
550
+ end
551
+
552
+ # Tracking
553
+ end
554
+ end
555
+ 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
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class ParadiseDistributing < Carrier
4
+ class << self
5
+ def id = 'd30f4625-577b-4fdc-8331-93eeb48ce496'
6
+ def name = 'Paradise Distributing'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class ParamountFreightSystems < Carrier
4
+ class << self
5
+ def id = 'cc1243c9-1acc-4904-abeb-fa92e097baa6'
6
+ def name = 'Paramount Freight Systems'
7
+ end
8
+ end
9
+ end
10
+ end