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
@@ -1,310 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FreightKit
4
- class CCYQ < FreightKit::Carrier
5
- class << self
6
- def minimum_length_for_overlength_fees
7
- Measured::Length.new(6, :feet)
8
- end
9
-
10
- def overlength_fees_require_tariff?
11
- false
12
- end
13
-
14
- def required_credential_types
15
- %i[api_key api_proxy]
16
- end
17
-
18
- def requirements
19
- %i[credentials]
20
- end
21
- end
22
-
23
- REACTIVE_FREIGHT_CARRIER = true
24
-
25
- class << self
26
- attr_reader :name, :scac
27
- end
28
- @name = 'CrossCountry Freight Solutions'
29
- @scac = 'CCYQ'
30
-
31
- JSON_HEADERS = {
32
- Accept: 'application/json',
33
- charset: 'utf-8',
34
- 'Content-Type' => 'application/json'
35
- }.freeze
36
-
37
- include FreightKit::Rateable
38
- include FreightKit::Trackable
39
- include FreightKit::Documentable
40
- include FreightKit::Pickupable
41
-
42
- protected
43
-
44
- def build_url(action)
45
- "https://#{@conf.dig(:api, :domain)}#{@conf.dig(:api, :endpoints, action)}"
46
- end
47
-
48
- def build_request(action, body: {}, query: {})
49
- api_key = fetch_credential(:api_key).api_key
50
- proxy_url = fetch_credential(:api_proxy).proxy_url
51
-
52
- request = {
53
- url: build_url(action),
54
- headers: { APIKEY: api_key },
55
- method: @conf.dig(:api, :methods, action),
56
- body:,
57
- query:,
58
- proxy_url:
59
- }.compact
60
-
61
- save_request(request)
62
- request
63
- end
64
-
65
- def commit(_action, request)
66
- response = HTTPClient.request(
67
- request[:method],
68
- request[:url],
69
- headers: request[:headers].merge(JSON_HEADERS),
70
- body: request[:body],
71
- query: request[:query],
72
- proxy: request[:proxy_url],
73
- )
74
-
75
- unless response.code == 200
76
- message = begin
77
- JSON.parse(response.body)['Message'] || "HTTP #{response.code}"
78
- rescue JSON::ParserError
79
- "HTTP #{response.code}"
80
- end
81
-
82
- if message == 'API key is inactive'
83
- raise FreightKit::InvalidCredentialsError, message
84
- end
85
-
86
- raise FreightKit::ResponseError, message
87
- end
88
-
89
- JSON.parse(response.body)
90
- end
91
-
92
- # Documents
93
-
94
- def parse_document_response(type, tracking_number)
95
- # Tracking Endpoint returns Images for the Shipment
96
- request = build_request(:track, query: { ReferenceNum: tracking_number })
97
- response = commit(type, request)
98
-
99
- document_response = DocumentResponse.new
100
-
101
- unless response
102
- document_response.error = DocumentNotFoundError.new
103
- return document_response
104
- end
105
-
106
- # API response sometimes returns an array
107
- response = response.first if response.is_a?(Array)
108
-
109
- unless response
110
- document_response.error = DocumentNotFoundError.new
111
- return document_response
112
- end
113
-
114
- document = response['Images']&.find { |image| image['DocumentType'] == type.upcase }
115
-
116
- unless document
117
- document_response.error = DocumentNotFoundError.new
118
- return document_response
119
- end
120
-
121
- decoded_pdf_data = Base64.decode64(document['Content'])
122
- document_response.assign_attributes(content_type: 'application/pdf', data: decoded_pdf_data)
123
-
124
- document_response
125
- end
126
-
127
- # Tracking
128
-
129
- def build_tracking_request(tracking_number)
130
- build_request(:track, query: { ReferenceNum: tracking_number })
131
- end
132
-
133
- def parse_tracking_response(response)
134
- TrackingResponse.new(carrier: self, request: last_request, response:)
135
-
136
- # TODO
137
- end
138
-
139
- # Pickups
140
-
141
- def build_pickup_request(
142
- delivery_from:,
143
- delivery_to:,
144
- dispatcher:,
145
- pickup_from:,
146
- pickup_to:,
147
- scac:,
148
- service:,
149
- shipment:
150
- )
151
- dispatcher_phone = dispatcher.phone.delete('^0-9')
152
- receiver_phone = shipment.destination.contact.phone.delete('^0-9')
153
-
154
- build_request(
155
- :pickup,
156
- body: {
157
- PickupAddress: {
158
- Name: shipment.origin.contact.company_name || shipment.destination.origin.name,
159
- Address1: shipment.origin.address1,
160
- Address2: '',
161
- City: shipment.origin.city,
162
- State: shipment.origin.province,
163
- Zip: shipment.origin.postal_code.to_s,
164
- Phone: dispatcher_phone.presence || '',
165
- Contact: shipment.origin.contact.name,
166
- Country: shipment.origin.country.code(:alpha2).value
167
- },
168
- DeliveryAddress: {
169
- Name: shipment.destination.contact.company_name || shipment.destination.contact.name,
170
- Address1: shipment.destination.address1,
171
- Address2: '',
172
- City: shipment.destination.city,
173
- State: shipment.destination.province,
174
- Zip: shipment.destination.postal_code.to_s,
175
- Phone: receiver_phone || '',
176
- Contact: shipment.destination.contact.name,
177
- Country: shipment.destination.country.code(:alpha2).value
178
- },
179
- PickupSchedule: {
180
- After: pickup_from.iso8601,
181
- Before: pickup_to.iso8601,
182
- AppointmentRequired: false,
183
- AppointmentMade: false
184
- },
185
- TotalWeight: shipment.packages.sum { |p| p.pounds(:total).ceil },
186
- TotalUnits: shipment.packages.sum(&:quantity),
187
- TotalBills: 1,
188
- # TODO: Update with actual value: TotalBills desc =>
189
- # Total number of freight bills that will be picked up
190
- TestFlag: false
191
- }.to_json,
192
- )
193
- end
194
-
195
- def parse_pickup_response(response)
196
- pickup_response = PickupResponse.new(request: last_request, response:)
197
- pickup_number = response['FreightBillNum']
198
-
199
- if pickup_number.blank?
200
- pickup_response.error = FreightKit::ResponseError.new('Unknown response')
201
- return pickup_response
202
- end
203
-
204
- pickup_response.pickup_number = pickup_number
205
- pickup_response
206
- end
207
-
208
- # Rates
209
-
210
- def build_accessorials(shipment:)
211
- accessorials = []
212
- serviceable_accessorials?(shipment.accessorials)
213
-
214
- accessorials << { Code: 'HAZMAT', Factor: 1 } if shipment.hazmat?
215
-
216
- shipment.packages.each do |package|
217
- longest_dimension = [package.width(:inches), package.length(:inches)].max.ceil
218
-
219
- next if longest_dimension < 96
220
-
221
- package.quantity.times do
222
- accessorials << { Code: 'EXLEN', Factor: longest_dimension }
223
- end
224
- end
225
-
226
- shipment.accessorials.map do |accessorial|
227
- next if @conf.dig(:accessorials, :unquotable)&.include?(accessorial)
228
-
229
- accessorials << { Code: @conf.dig(:accessorials, :mappable, accessorial.to_sym), Factor: 1 }
230
- end
231
-
232
- accessorials
233
- end
234
-
235
- def build_rate_request(shipment:)
236
- build_request(
237
- :rates,
238
- body: {
239
- Orig: shipment.origin.postal_code,
240
- Dest: shipment.destination.postal_code,
241
- Accessorials: build_accessorials(shipment:),
242
- Details: shipment.packages.map do |package|
243
- {
244
- Height: package.inches(:height).ceil.to_f,
245
- Length: package.inches(:length).ceil.to_f,
246
- Width: package.inches(:width).ceil.to_f,
247
- Units: package.quantity.to_i,
248
- Class: package.freight_class.to_f,
249
- Weight: package.pounds(:total).ceil.to_f
250
- }
251
- end
252
- }.to_json,
253
- )
254
- end
255
-
256
- def parse_rate_response(shipment:, response:)
257
- rate_response = RateResponse.new(request: last_request, response:)
258
-
259
- if response.blank?
260
- rate_response.error = ResponseError.new('API Error: Unknown response')
261
- return rate_response
262
- end
263
-
264
- if response['Message'].include?('Quotes between these points are not available')
265
- rate_response.error = UnserviceableError.new(response['Message'])
266
- return rate_response
267
- end
268
-
269
- if response['TotalCharge'].blank?
270
- rate_response.error = ResponseError.new('Cost is blank')
271
- return rate_response
272
- end
273
-
274
- estimate_reference = response['QuoteNum']
275
- expires_at = ::Time.iso8601(response['QuoteExpiryDate'])
276
-
277
- transit_days = (
278
- ::Time.iso8601(response['EarliestDeliveryDate']).to_date -
279
- ::Time.iso8601(response['PickupDate']).to_date
280
- ).to_i
281
-
282
- prices = []
283
-
284
- ['AccessorialCharge', 'FuelCharge', 'HighCostCharge', 'MinCharge'].each do |charge_line_key|
285
- charge_line = response[charge_line_key]
286
- next unless charge_line
287
-
288
- cents = (charge_line.to_f * 100).to_i
289
- prices << Price.new(blame: :api, cents:, description: charge_line_key)
290
- end
291
-
292
- rate = Rate.new(
293
- carrier: self,
294
- carrier_name: self.class.name,
295
- currency: 'USD',
296
- estimate_reference:,
297
- expires_at:,
298
- scac: self.class.scac.upcase,
299
- service_name: :standard,
300
- shipment:,
301
- prices:,
302
- transit_days:,
303
- with_excessive_length_fees: @conf.dig(:attributes, :rates, :with_excessive_length_fees),
304
- )
305
-
306
- rate_response.rates = [rate]
307
- rate_response
308
- end
309
- end
310
- end
@@ -1,396 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FreightKit
4
- class CLNI < FreightKit::Carrier
5
- class << self
6
- # @note Explicitly set to `false` because though API allows this, it "doesn't quote correctly" per customer
7
- # service
8
- def find_rates_with_declared_value?
9
- false
10
- end
11
-
12
- def maximum_height
13
- Measured::Length.new(105, :inches)
14
- end
15
-
16
- def maximum_weight
17
- Measured::Weight.new(10_000, :pounds)
18
- end
19
-
20
- def minimum_length_for_overlength_fees
21
- Measured::Length.new(8, :feet)
22
- end
23
-
24
- def overlength_fees_require_tariff?
25
- false
26
- end
27
-
28
- def required_credential_types
29
- %i[api website]
30
- end
31
-
32
- def requirements
33
- %i[credentials]
34
- end
35
- end
36
-
37
- REACTIVE_FREIGHT_CARRIER = true
38
-
39
- include FreightKit::Rateable
40
-
41
- class << self
42
- attr_reader :name, :scac
43
- end
44
- @name = 'Clear Lane Freight Systems'
45
- @scac = 'CLNI'
46
-
47
- # Documents
48
-
49
- def pod(tracking_number)
50
- parse_document_response(:pod, tracking_number)
51
- end
52
-
53
- def scanned_bol(tracking_number)
54
- parse_document_response(:bol, tracking_number)
55
- end
56
-
57
- # Rates
58
-
59
- def validate_packages(packages, tariff = nil)
60
- raise UnserviceableError, 'Must be fewer than 10 items altogether' if packages.sum(&:quantity) > 10
61
-
62
- super
63
- end
64
-
65
- # Tracking
66
-
67
- protected
68
-
69
- def commit(action, request)
70
- client_args = {
71
- wsdl: build_url(:api, action),
72
- convert_request_keys_to: :none,
73
- env_namespace: :soap,
74
- element_form_default: :qualified
75
- }
76
-
77
- call_args = { message: request_blueprint.deep_merge(request) }
78
-
79
- ::FreightKit::SoapClient.new(
80
- carrier: self,
81
- action:,
82
- client_args:,
83
- call_args:,
84
- soap_operation: @conf.dig(:api, :actions, action),
85
- ).call&.to_hash&.with_indifferent_access
86
- end
87
-
88
- def request_blueprint
89
- api_credentials = fetch_credential(:api)
90
-
91
- {
92
- request: {
93
- Application: 'ThirdParty',
94
- AccountNumber: api_credentials.account,
95
- UserID: api_credentials.username,
96
- Password: api_credentials.password,
97
- TestMode: 'N'
98
- }
99
- }
100
- end
101
-
102
- def build_url(api_or_website, action)
103
- case api_or_website
104
- when :api
105
- scheme = @conf.dig(:api, :use_ssl) ? 'https://' : 'http://'
106
- "#{scheme}#{@conf.dig(:api, :domain)}#{@conf.dig(:api, :endpoints, action)}"
107
- when :website
108
- @conf.dig(:website, action)
109
- end
110
- end
111
-
112
- # Documents
113
-
114
- def parse_document_response(action, tracking_number)
115
- document_response = DocumentResponse.new
116
-
117
- selenoid_credential = fetch_credential(:selenoid)
118
- website_credentials = fetch_credential(:website)
119
-
120
- browser = Watir::Browser.new(*selenoid_credential.watir_args)
121
- browser.goto('https://ssworldtrak.com/WebtrakWTNew/')
122
-
123
- browser.text_field(name: 'txtUserId').set(website_credentials.username)
124
- browser.text_field(name: 'txtPass').set(website_credentials.password)
125
- browser.button(name: 'btnSubmit').click
126
-
127
- if browser.html.include?('Either UserID or Password are incorrect, please try again.')
128
- browser.close
129
-
130
- document_response.error = InvalidCredentialsError.new
131
- return document_response
132
- end
133
-
134
- # Bypass the hover menu
135
- browser.goto('https://ssworldtrak.com/WebtrakWTNew/Main/Reports/POD.aspx')
136
-
137
- from = 90.days.ago.strftime('%m%d%Y')
138
-
139
- browser.text_field(name: 'txtFromDate').wait_until(&:present?).focus
140
-
141
- # Hack to get around JavaScript messing up our input
142
- sleep(1)
143
- from.chars.each do |char|
144
- browser.text_field(name: 'txtFromDate').append(char)
145
- end
146
-
147
- browser.text_field(name: 'txtToDate').click
148
- browser
149
- .element(xpath: '/html/body/form/div[3]/div[4]/div[3]/div[2]/div/div/div[3]/div')
150
- .wait_until(&:present?)
151
- .click
152
-
153
- browser.button(name: 'btnSubmit').click
154
-
155
- browser.text_field(id: 'yadcf-filter--grid-2').set(tracking_number)
156
- browser.send_keys(:enter)
157
-
158
- if browser.element(id: 'tdPODName0').wait_until(&:present?).text == 'NO POD' && action == :pod
159
- browser.window.close
160
- browser.original_window.use
161
- browser.goto('https://ssworldtrak.com/WebtrakWTNew/logoff.aspx')
162
- browser.close
163
-
164
- document_response.error = DocumentNotFoundError.new
165
- return document_response
166
- end
167
-
168
- browser
169
- .element(xpath: '/html/body/form/div[3]/div[4]/div[8]/div/table/tbody/tr/td[12]/a')
170
- .wait_until(&:present?)
171
- .click
172
-
173
- browser.switch_window
174
-
175
- sleep(5)
176
-
177
- html = browser.element(id: 'DataTables_Table_0').wait_until(&:present?).html
178
- html = Nokogiri::HTML(html)
179
- link_id = nil
180
-
181
- html.css('tbody tr').each do |row|
182
- next unless row.css('td:nth-child(3)').text == action.to_s.upcase
183
-
184
- link_id = row.css('td:nth-child(1) a').attr('id').value
185
- end
186
-
187
- if link_id.blank?
188
- browser.window.close
189
- browser.original_window.use
190
- browser.goto('https://ssworldtrak.com/WebtrakWTNew/logoff.aspx')
191
- browser.close
192
-
193
- document_response.error = DocumentNotFoundError.new
194
- return document_response
195
- end
196
-
197
- browser.element(css: "##{link_id}").click
198
-
199
- sleep(50) # so Chrome can finish downloading, Selenoid default timeout is 60s
200
-
201
- download_url = "#{selenoid_credential.selenoid_options[:download_url]}/#{browser.driver.session_id}"
202
- response = HTTPClient.get("#{download_url}/?json")
203
-
204
- filename = URI.encode_www_form_component(JSON.parse(response.body)&.last)
205
- url = "#{download_url}/#{filename}"
206
-
207
- document_response.request = URI.parse(url)
208
-
209
- begin
210
- response = HTTPClient.get(url)
211
- rescue StandardError => e
212
- document_response.error = e
213
- return document_response
214
- end
215
-
216
- browser.window.close
217
- browser.original_window.use
218
- browser.goto('https://ssworldtrak.com/WebtrakWTNew/logoff.aspx')
219
- browser.close
220
-
221
- unless response.code == 200
222
- document_response.error = DocumentNotFoundError.new
223
-
224
- return document_response
225
- end
226
-
227
- document_response.assign_attributes(content_type: response.headers['content-type'], data: response.body)
228
- document_response
229
- end
230
-
231
- # Rates
232
-
233
- def build_commodity_input(packages)
234
- packages.map do |package|
235
- {
236
- CommodityInput: {
237
- CommodityClass: package.freight_class,
238
- CommodityHazmat: package.hazmat? ? 'Y' : 'N',
239
- CommodityHeight: package.height(:in).ceil,
240
- CommodityLength: package.length(:in).ceil,
241
- CommodityPieces: package.quantity,
242
- CommodityPieceType: package.packaging.pallet? ? 'pallet' : 'box',
243
- CommodityWeight: package.pounds(:total).ceil,
244
- CommodityWeightPerPiece: package.pounds(:each).ceil,
245
- CommodityWidth: package.width(:in).ceil
246
- }
247
- }
248
- end
249
- end
250
-
251
- def build_rate_request(shipment:)
252
- accessorial_input = []
253
- if shipment.accessorials.present?
254
- serviceable_accessorials?(shipment.accessorials)
255
- shipment.accessorials.each do |a|
256
- if @conf.dig(:accessorials, :unserviceable).exclude?(a)
257
- accessorial_input << { AccessorialInput: { AccessorialCode: @conf.dig(:accessorials, :mappable)[a] } }
258
- end
259
- end
260
- end
261
-
262
- accessorial_input.uniq!
263
-
264
- commodity_input = build_commodity_input(shipment.packages)
265
-
266
- palletized = shipment.packages.all? { |package| package.packaging.pallet? } ? 'Y' : 'N'
267
-
268
- pickup_from = ::Time.current.beginning_of_day + 14.hours
269
- pickup_from += 1.day if ::Time.current > pickup_from
270
- pickup_to = pickup_from + 3.hours
271
-
272
- api_credentials = fetch_credential(:api)
273
-
274
- request = {
275
- RatingParam: {
276
- AccessorialInput: accessorial_input,
277
- CommodityInput: commodity_input,
278
- RatingInput: {
279
- DeclaredValue: 0,
280
- DestinationCity: shipment.destination.city,
281
- DestinationCountry: shipment.destination.country.code(:alpha2).value,
282
- DestinationState: shipment.destination.province,
283
- DestinationZip: shipment.destination.postal_code,
284
- LiabilityType: '',
285
- OriginCity: shipment.origin.city,
286
- OriginCountry: shipment.origin.country.code(:alpha2).value,
287
- OriginState: shipment.origin.province,
288
- OriginZip: shipment.origin.postal_code,
289
- Palletized: palletized,
290
- PickupDate: pickup_from.to_date.strftime('%Y-%m-%d'),
291
- PickupLocationCloseTime: pickup_to.strftime('%H:%M:00'),
292
- PickupTime: pickup_from.strftime('%H:%M:00'),
293
- RequestID: rand(0..999_999).to_s,
294
- ServiceLevelID: '',
295
- ShipmentTerms: '',
296
- Stackable: false,
297
- WebTrakUserID: api_credentials.username
298
- }
299
- }
300
- }
301
-
302
- save_request(request)
303
- request
304
- end
305
-
306
- def parse_rate_response(shipment:, response:)
307
- rate_response = RateResponse.new(request: last_request, response:)
308
-
309
- if response.blank?
310
- rate_response.error = ResponseError.new('Blank response')
311
- return rate_response
312
- end
313
-
314
- error = response.dig(:get_rating_response, :get_rating_result, :rating_output, :message)
315
-
316
- if error.present?
317
- if error.include?('do not service this lane')
318
- rate_response.error = UnserviceableError.new(
319
- 'Incorrect ZIP code or no service available at origin and/or destination',
320
- )
321
- return rate_response
322
- end
323
-
324
- pretty_error = error.strip.gsub('can not', 'cannot')
325
-
326
- rate_response.error = ResponseError.new(pretty_error)
327
- return rate_response
328
- end
329
-
330
- result = response.dig(:get_rating_response, :get_rating_result, :rating_output)
331
-
332
- if result.blank?
333
- rate_response.error = ResponseError.new('Blank response')
334
- return rate_response
335
- end
336
-
337
- cents = parse_amount(result[:standard_total_rate])
338
-
339
- if cents.blank?
340
- rate_response.error = ResponseError.new('Cost is blank')
341
- return rate_response
342
- end
343
-
344
- prices = []
345
- prices << Price.new(blame: :api, cents:, description: 'Freight')
346
-
347
- accessorial_outputs = result.dig(:accessorial_output, :accessorial_output)
348
-
349
- accessorial_outputs.each do |accessorial_output|
350
- prices << Price.new(
351
- blame: :api,
352
- cents: 0,
353
- description: accessorial_output_description(accessorial_output),
354
- )
355
- end
356
-
357
- transit_days = response[:transit_days].to_i
358
-
359
- rate = Rate.new(
360
- carrier: self,
361
- carrier_name: self.class.name,
362
- currency: 'USD',
363
- estimate_reference: nil,
364
- scac: self.class.scac.upcase,
365
- service_name: :standard,
366
- shipment:,
367
- prices:,
368
- transit_days:,
369
- with_excessive_length_fees: @conf.dig(:attributes, :rates, :with_excessive_length_fees),
370
- )
371
-
372
- rate_response.rates = [rate]
373
- rate_response
374
- end
375
-
376
- def accessorial_output_description(accessorial_output)
377
- return '' if accessorial_output[:accessorial_desc].blank?
378
-
379
- description = accessorial_output[:accessorial_desc]
380
- description = description.capitalize
381
- description.gsub('Smc', 'SMC')
382
- end
383
-
384
- def parse_amount(amount)
385
- ['$', ','].each do |char|
386
- amount = amount.sub(char, '')
387
- end
388
-
389
- return 0 if amount.blank?
390
-
391
- amount = (amount.to_f * 100).to_i
392
- end
393
-
394
- # Tracking
395
- end
396
- end