freight_kit 0.1.20 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -2
  3. data/README.md +1 -2
  4. data/Rakefile +6 -0
  5. data/VERSION +1 -1
  6. data/configuration/locations/amazon_warehouses.yml +3330 -0
  7. data/freight_kit.gemspec +13 -13
  8. data/lib/freight_kit/address_normalizer.rb +26 -0
  9. data/lib/freight_kit/amazon_warehouse.rb +33 -0
  10. data/lib/freight_kit/api_clients/soap_client.rb +7 -9
  11. data/lib/freight_kit/carrier.rb +250 -303
  12. data/lib/freight_kit/carriers/a1_express.rb +25 -0
  13. data/lib/freight_kit/carriers/a_duie_pyle.rb +30 -0
  14. data/lib/freight_kit/carriers/aaa_cooper.rb +11 -0
  15. data/lib/freight_kit/carriers/aaa_expedited_services.rb +10 -0
  16. data/lib/freight_kit/carriers/ab_brothers_usa_inc.rb +12 -0
  17. data/lib/freight_kit/carriers/aberdeen_express_inc.rb +28 -0
  18. data/lib/freight_kit/carriers/abf_freight_system.rb +492 -0
  19. data/lib/freight_kit/carriers/access_transport.rb +10 -0
  20. data/lib/freight_kit/carriers/action_express.rb +10 -0
  21. data/lib/freight_kit/carriers/adams_and_companies.rb +10 -0
  22. data/lib/freight_kit/carriers/advance_distribution.rb +28 -0
  23. data/lib/freight_kit/carriers/alcon_transport.rb +10 -0
  24. data/lib/freight_kit/carriers/all_freight.rb +10 -0
  25. data/lib/freight_kit/carriers/alliance_transportation_group.rb +10 -0
  26. data/lib/freight_kit/carriers/allstate_transport.rb +10 -0
  27. data/lib/freight_kit/carriers/aloha_freight_forwarders.rb +35 -0
  28. data/lib/freight_kit/carriers/amado_trucking.rb +35 -0
  29. data/lib/freight_kit/carriers/american_fast_freight.rb +28 -0
  30. data/lib/freight_kit/carriers/amigos_service_transportation.rb +10 -0
  31. data/lib/freight_kit/carriers/anderson_towing_and_transport.rb +10 -0
  32. data/lib/freight_kit/carriers/apex_transporting.rb +10 -0
  33. data/lib/freight_kit/carriers/archer_cargo.rb +35 -0
  34. data/lib/freight_kit/carriers/armstrong_transport_group.rb +10 -0
  35. data/lib/freight_kit/carriers/autobahn_logistics.rb +10 -0
  36. data/lib/freight_kit/carriers/averitt_express.rb +30 -0
  37. data/lib/freight_kit/carriers/ba_transportation.rb +10 -0
  38. data/lib/freight_kit/carriers/balkin_express.rb +10 -0
  39. data/lib/freight_kit/carriers/bay_area_express.rb +10 -0
  40. data/lib/freight_kit/carriers/bc_freightways.rb +11 -0
  41. data/lib/freight_kit/carriers/benjamin_best_freight_inc.rb +37 -0
  42. data/lib/freight_kit/carriers/bennett_trucking.rb +10 -0
  43. data/lib/freight_kit/carriers/best_overnite_express.rb +78 -0
  44. data/lib/freight_kit/carriers/best_trucking.rb +10 -0
  45. data/lib/freight_kit/carriers/bestway_transport.rb +10 -0
  46. data/lib/freight_kit/carriers/bryan_systems.rb +10 -0
  47. data/lib/freight_kit/carriers/c_and_w_express.rb +10 -0
  48. data/lib/freight_kit/carriers/campbell_trucking.rb +10 -0
  49. data/lib/freight_kit/carriers/carde_transportation.rb +10 -0
  50. data/lib/freight_kit/carriers/cardinal_logistics.rb +28 -0
  51. data/lib/freight_kit/carriers/cdc_transport.rb +10 -0
  52. data/lib/freight_kit/carriers/cdo_express_diversified.rb +10 -0
  53. data/lib/freight_kit/carriers/cedar_supply_trucking.rb +10 -0
  54. data/lib/freight_kit/carriers/central_freight_lines.rb +12 -0
  55. data/lib/freight_kit/carriers/central_transport.rb +12 -0
  56. data/lib/freight_kit/carriers/chicago_suburban_express.rb +28 -0
  57. data/lib/freight_kit/carriers/city_logistics.rb +11 -0
  58. data/lib/freight_kit/carriers/clear_lane_freight_systems.rb +483 -0
  59. data/lib/freight_kit/carriers/cleopatra_trucking.rb +10 -0
  60. data/lib/freight_kit/carriers/clifford_transportation.rb +10 -0
  61. data/lib/freight_kit/carriers/cms_domestic.rb +25 -0
  62. data/lib/freight_kit/carriers/cnd_logistics.rb +10 -0
  63. data/lib/freight_kit/carriers/coast_to_coast_transport.rb +27 -0
  64. data/lib/freight_kit/carriers/countrywide_carriers.rb +10 -0
  65. data/lib/freight_kit/carriers/cpl_express.rb +35 -0
  66. data/lib/freight_kit/carriers/crosby_trucking_service.rb +29 -0
  67. data/lib/freight_kit/carriers/cross_country_freight_solutions.rb +419 -0
  68. data/lib/freight_kit/carriers/crowley.rb +10 -0
  69. data/lib/freight_kit/carriers/csa_transportation.rb +40 -0
  70. data/lib/freight_kit/carriers/csx_transportation.rb +40 -0
  71. data/lib/freight_kit/carriers/custom_global_logistics.rb +14 -0
  72. data/lib/freight_kit/carriers/d_and_a_transport.rb +10 -0
  73. data/lib/freight_kit/carriers/dak_transport.rb +10 -0
  74. data/lib/freight_kit/carriers/dash_courier_and_logistics_north_carolina.rb +10 -0
  75. data/lib/freight_kit/carriers/daylight_transport.rb +29 -0
  76. data/lib/freight_kit/carriers/dayton_freight_lines.rb +30 -0
  77. data/lib/freight_kit/carriers/dbr_logistics.rb +10 -0
  78. data/lib/freight_kit/carriers/deep_south_freight.rb +27 -0
  79. data/lib/freight_kit/carriers/delta_express.rb +10 -0
  80. data/lib/freight_kit/carriers/delta_transport.rb +10 -0
  81. data/lib/freight_kit/carriers/delta_trucking_logistics.rb +10 -0
  82. data/lib/freight_kit/carriers/demco_express.rb +10 -0
  83. data/lib/freight_kit/carriers/dependable_global_express.rb +10 -0
  84. data/lib/freight_kit/carriers/dependable_hawaiian_express.rb +24 -0
  85. data/lib/freight_kit/carriers/dependable_highway_express.rb +585 -0
  86. data/lib/freight_kit/carriers/desert_coastal_transport.rb +10 -0
  87. data/lib/freight_kit/carriers/dhl.rb +11 -0
  88. data/lib/freight_kit/carriers/diamond_line_delivery.rb +174 -0
  89. data/lib/freight_kit/carriers/ding_tai_trucking.rb +10 -0
  90. data/lib/freight_kit/carriers/diversified_transfer_and_storage.rb +29 -0
  91. data/lib/freight_kit/carriers/dohrn_transfer_company.rb +30 -0
  92. data/lib/freight_kit/carriers/dot_line_transportation.rb +29 -0
  93. data/lib/freight_kit/carriers/drt_transportation.rb +13 -0
  94. data/lib/freight_kit/carriers/dugan_truck_line.rb +29 -0
  95. data/lib/freight_kit/carriers/dupont.rb +10 -0
  96. data/lib/freight_kit/carriers/e_transport_carriers.rb +29 -0
  97. data/lib/freight_kit/carriers/echo_global_logistics.rb +13 -0
  98. data/lib/freight_kit/carriers/ecklund_logistics.rb +10 -0
  99. data/lib/freight_kit/carriers/el_emplumado_transport.rb +10 -0
  100. data/lib/freight_kit/carriers/elite_carriers.rb +28 -0
  101. data/lib/freight_kit/carriers/emerald_express.rb +10 -0
  102. data/lib/freight_kit/carriers/era_transport.rb +10 -0
  103. data/lib/freight_kit/carriers/estes_express_lines.rb +25 -0
  104. data/lib/freight_kit/carriers/euro_kam.rb +28 -0
  105. data/lib/freight_kit/carriers/ew_riverside_trucking.rb +10 -0
  106. data/lib/freight_kit/carriers/express_2000_inc.rb +12 -0
  107. data/lib/freight_kit/carriers/express_services_international.rb +10 -0
  108. data/lib/freight_kit/carriers/f_and_a_express.rb +27 -0
  109. data/lib/freight_kit/carriers/fairmont_logistics.rb +13 -0
  110. data/lib/freight_kit/carriers/fargo_cargo.rb +10 -0
  111. data/lib/freight_kit/carriers/fast_freight_transportation.rb +10 -0
  112. data/lib/freight_kit/carriers/fast_load_transport.rb +10 -0
  113. data/lib/freight_kit/carriers/fed_ex_express.rb +30 -0
  114. data/lib/freight_kit/carriers/fed_ex_ground.rb +24 -0
  115. data/lib/freight_kit/carriers/fed_ex_ltl_economy.rb +11 -0
  116. data/lib/freight_kit/carriers/fed_ex_ltl_priority.rb +11 -0
  117. data/lib/freight_kit/carriers/first_trucking_express.rb +10 -0
  118. data/lib/freight_kit/carriers/flash_trucking.rb +10 -0
  119. data/lib/freight_kit/carriers/fort_transportation_and_service_company_inc.rb +37 -0
  120. data/lib/freight_kit/carriers/forward_air.rb +789 -0
  121. data/lib/freight_kit/carriers/frahtex.rb +10 -0
  122. data/lib/freight_kit/carriers/frozen_food_express.rb +10 -0
  123. data/lib/freight_kit/carriers/gholia_bros_trucking.rb +36 -0
  124. data/lib/freight_kit/carriers/global_cargo.rb +10 -0
  125. data/lib/freight_kit/carriers/global_logistics_and_transportation.rb +10 -0
  126. data/lib/freight_kit/carriers/gls_freight.rb +32 -0
  127. data/lib/freight_kit/carriers/go_trucking_services.rb +10 -0
  128. data/lib/freight_kit/carriers/gold_eagle_transportation.rb +11 -0
  129. data/lib/freight_kit/carriers/golden_drop_trucking.rb +10 -0
  130. data/lib/freight_kit/carriers/gonzalez_transportation.rb +10 -0
  131. data/lib/freight_kit/carriers/gps_transport.rb +10 -0
  132. data/lib/freight_kit/carriers/greene_enterprise.rb +10 -0
  133. data/lib/freight_kit/carriers/gsa_international.rb +10 -0
  134. data/lib/freight_kit/carriers/gsp_express.rb +24 -0
  135. data/lib/freight_kit/carriers/gsv_transportation.rb +10 -0
  136. data/lib/freight_kit/carriers/gta_transportation.rb +10 -0
  137. data/lib/freight_kit/carriers/guam_freight_services.rb +10 -0
  138. data/lib/freight_kit/carriers/harrah_transportation.rb +23 -0
  139. data/lib/freight_kit/carriers/her_trucking.rb +10 -0
  140. data/lib/freight_kit/carriers/hercules_freight.rb +20 -0
  141. data/lib/freight_kit/carriers/highlander_xpress.rb +36 -0
  142. data/lib/freight_kit/carriers/hn_transport.rb +10 -0
  143. data/lib/freight_kit/carriers/honolulu_freight_service.rb +10 -0
  144. data/lib/freight_kit/carriers/hot_line_freight_system_inc.rb +12 -0
  145. data/lib/freight_kit/carriers/hotshot_freight_of_texas.rb +13 -0
  146. data/lib/freight_kit/carriers/houser_transport.rb +27 -0
  147. data/lib/freight_kit/carriers/infiniti_freight_logistics.rb +28 -0
  148. data/lib/freight_kit/carriers/infinity_trucking.rb +10 -0
  149. data/lib/freight_kit/carriers/interstate_tma.rb +10 -0
  150. data/lib/freight_kit/carriers/intrade_industries.rb +10 -0
  151. data/lib/freight_kit/carriers/jasper_trucking.rb +28 -0
  152. data/lib/freight_kit/carriers/jb_hunt.rb +11 -0
  153. data/lib/freight_kit/carriers/jfj_transportation.rb +8 -8
  154. data/lib/freight_kit/carriers/jkb_express.rb +10 -0
  155. data/lib/freight_kit/carriers/jlm_transport.rb +10 -0
  156. data/lib/freight_kit/carriers/johansson_transport.rb +10 -0
  157. data/lib/freight_kit/carriers/jones_express.rb +10 -0
  158. data/lib/freight_kit/carriers/jp_logistics.rb +41 -0
  159. data/lib/freight_kit/carriers/just_in_time_cargo.rb +29 -0
  160. data/lib/freight_kit/carriers/kengkok_times.rb +10 -0
  161. data/lib/freight_kit/carriers/kings_express.rb +10 -0
  162. data/lib/freight_kit/carriers/klc_transportation.rb +10 -0
  163. data/lib/freight_kit/carriers/km_trucking.rb +10 -0
  164. data/lib/freight_kit/carriers/kma_logistics.rb +10 -0
  165. data/lib/freight_kit/carriers/krc_logistics.rb +10 -0
  166. data/lib/freight_kit/carriers/ktx.rb +10 -0
  167. data/lib/freight_kit/carriers/landstar.rb +25 -0
  168. data/lib/freight_kit/carriers/lanter_distributing_llc.rb +30 -0
  169. data/lib/freight_kit/carriers/ld_trucking.rb +10 -0
  170. data/lib/freight_kit/carriers/legacy_logistics_solutions.rb +10 -0
  171. data/lib/freight_kit/carriers/leonards_express.rb +10 -0
  172. data/lib/freight_kit/carriers/liberty_linehaul_west.rb +28 -0
  173. data/lib/freight_kit/carriers/liberty_transport.rb +10 -0
  174. data/lib/freight_kit/carriers/lightning_express.rb +10 -0
  175. data/lib/freight_kit/carriers/lj_express.rb +24 -0
  176. data/lib/freight_kit/carriers/lkp_enterprises.rb +10 -0
  177. data/lib/freight_kit/carriers/ltl_pros.rb +28 -0
  178. data/lib/freight_kit/carriers/m_and_m_and_sons.rb +10 -0
  179. data/lib/freight_kit/carriers/mag_lines_transport.rb +10 -0
  180. data/lib/freight_kit/carriers/magic_messenger.rb +24 -0
  181. data/lib/freight_kit/carriers/majors_transit.rb +10 -0
  182. data/lib/freight_kit/carriers/map_global_logistics.rb +10 -0
  183. data/lib/freight_kit/carriers/matths_trucking.rb +11 -0
  184. data/lib/freight_kit/carriers/mav_canadian_transport.rb +13 -0
  185. data/lib/freight_kit/carriers/mc_systems.rb +35 -0
  186. data/lib/freight_kit/carriers/mega_fleet.rb +10 -0
  187. data/lib/freight_kit/carriers/mega_trans_group.rb +28 -0
  188. data/lib/freight_kit/carriers/meta_express.rb +10 -0
  189. data/lib/freight_kit/carriers/mia_transportation.rb +10 -0
  190. data/lib/freight_kit/carriers/midwest_motor_express.rb +14 -0
  191. data/lib/freight_kit/carriers/midwest_transport_and_trucking.rb +10 -0
  192. data/lib/freight_kit/carriers/mikade_delivery_service.rb +10 -0
  193. data/lib/freight_kit/carriers/mohoff_freight_lines.rb +23 -0
  194. data/lib/freight_kit/carriers/montata_travelers_express.rb +10 -0
  195. data/lib/freight_kit/carriers/morgan_van_lines.rb +29 -0
  196. data/lib/freight_kit/carriers/moto_transportation.rb +24 -0
  197. data/lib/freight_kit/carriers/mountain_valley_express.rb +197 -0
  198. data/lib/freight_kit/carriers/ms_freight.rb +27 -0
  199. data/lib/freight_kit/carriers/mvg_transport.rb +10 -0
  200. data/lib/freight_kit/carriers/n_and_m_transfer_co_inc.rb +29 -0
  201. data/lib/freight_kit/carriers/nabot_transport_solutions.rb +10 -0
  202. data/lib/freight_kit/carriers/national_freight_xpress.rb +10 -0
  203. data/lib/freight_kit/carriers/navigation_group.rb +10 -0
  204. data/lib/freight_kit/carriers/nelson_trucking.rb +10 -0
  205. data/lib/freight_kit/carriers/network_1_transportation.rb +10 -0
  206. data/lib/freight_kit/carriers/new_century_transport.rb +28 -0
  207. data/lib/freight_kit/carriers/new_penn_motor_express.rb +11 -0
  208. data/lib/freight_kit/carriers/nieves_transportation.rb +10 -0
  209. data/lib/freight_kit/carriers/nolan_transportation_group.rb +26 -0
  210. data/lib/freight_kit/carriers/northland_trucking.rb +10 -0
  211. data/lib/freight_kit/carriers/northwest_carrier_logistics.rb +27 -0
  212. data/lib/freight_kit/carriers/nt_usa.rb +10 -0
  213. data/lib/freight_kit/carriers/nu_line_transportation.rb +10 -0
  214. data/lib/freight_kit/carriers/numark_transportation.rb +80 -0
  215. data/lib/freight_kit/carriers/nvk_transport.rb +10 -0
  216. data/lib/freight_kit/carriers/ny_transport.rb +10 -0
  217. data/lib/freight_kit/carriers/oak_harbor.rb +28 -0
  218. data/lib/freight_kit/carriers/oakline_transportation.rb +10 -0
  219. data/lib/freight_kit/carriers/old_dominion_freight_line.rb +30 -0
  220. data/lib/freight_kit/carriers/on_trac.rb +573 -0
  221. data/lib/freight_kit/carriers/one_hundred_one_transport.rb +10 -0
  222. data/lib/freight_kit/carriers/one_way_delivery.rb +10 -0
  223. data/lib/freight_kit/carriers/oracle_transportation_solutions.rb +10 -0
  224. data/lib/freight_kit/carriers/orange_courier.rb +27 -0
  225. data/lib/freight_kit/carriers/ortas_trucking.rb +10 -0
  226. data/lib/freight_kit/carriers/pac_trux_transportation.rb +10 -0
  227. data/lib/freight_kit/carriers/pacer.rb +10 -0
  228. data/lib/freight_kit/carriers/pacific_logistics.rb +10 -0
  229. data/lib/freight_kit/carriers/pacific_states_truck_lines.rb +10 -0
  230. data/lib/freight_kit/carriers/paradise_distributing.rb +10 -0
  231. data/lib/freight_kit/carriers/paramount_freight_systems.rb +10 -0
  232. data/lib/freight_kit/carriers/peninsula_truck_lines.rb +222 -0
  233. data/lib/freight_kit/carriers/pg_transport.rb +10 -0
  234. data/lib/freight_kit/carriers/pgs_360.rb +10 -0
  235. data/lib/freight_kit/carriers/pilot_freight_services.rb +10 -0
  236. data/lib/freight_kit/carriers/pious_trans.rb +27 -0
  237. data/lib/freight_kit/carriers/pitt_ohio_express.rb +30 -0
  238. data/lib/freight_kit/carriers/pki_logistics.rb +12 -0
  239. data/lib/freight_kit/carriers/plana_transportation.rb +28 -0
  240. data/lib/freight_kit/carriers/prestige.rb +10 -0
  241. data/lib/freight_kit/carriers/pro_trans_solutions.rb +28 -0
  242. data/lib/freight_kit/carriers/puma_logistics.rb +10 -0
  243. data/lib/freight_kit/carriers/pwc_international.rb +10 -0
  244. data/lib/freight_kit/carriers/quality_logistics.rb +10 -0
  245. data/lib/freight_kit/carriers/queen_star_trucking.rb +27 -0
  246. data/lib/freight_kit/carriers/r_and_l_carriers.rb +11 -0
  247. data/lib/freight_kit/carriers/rac_transport.rb +10 -0
  248. data/lib/freight_kit/carriers/re_logistics.rb +23 -0
  249. data/lib/freight_kit/carriers/reddaway.rb +11 -0
  250. data/lib/freight_kit/carriers/reefer_van_network.rb +13 -0
  251. data/lib/freight_kit/carriers/refrigerated_trucking_and_ltl_transportation_services.rb +10 -0
  252. data/lib/freight_kit/carriers/ridgeline_express.rb +10 -0
  253. data/lib/freight_kit/carriers/rist_transport.rb +29 -0
  254. data/lib/freight_kit/carriers/river_city_transport.rb +10 -0
  255. data/lib/freight_kit/carriers/roadrunner_transportation_services.rb +675 -0
  256. data/lib/freight_kit/carriers/roadtex.rb +13 -0
  257. data/lib/freight_kit/carriers/ronald_transport_services.rb +10 -0
  258. data/lib/freight_kit/carriers/rose_trucking.rb +24 -0
  259. data/lib/freight_kit/carriers/rp_and_j_transport.rb +24 -0
  260. data/lib/freight_kit/carriers/rpm_transportation.rb +11 -0
  261. data/lib/freight_kit/carriers/rude_transportation.rb +30 -0
  262. data/lib/freight_kit/carriers/s_and_s_logistics.rb +10 -0
  263. data/lib/freight_kit/carriers/saia.rb +470 -361
  264. data/lib/freight_kit/carriers/sb_transportation.rb +27 -0
  265. data/lib/freight_kit/carriers/schneider_national.rb +29 -0
  266. data/lib/freight_kit/carriers/schwarz_trucking.rb +10 -0
  267. data/lib/freight_kit/carriers/sewell_motor_express.rb +29 -0
  268. data/lib/freight_kit/carriers/shawnee_trucking.rb +28 -0
  269. data/lib/freight_kit/carriers/shi_logistics.rb +10 -0
  270. data/lib/freight_kit/carriers/sinbad_transport.rb +10 -0
  271. data/lib/freight_kit/carriers/skyway.rb +10 -0
  272. data/lib/freight_kit/carriers/smith_cargo_transportation_services.rb +23 -0
  273. data/lib/freight_kit/carriers/sna_transportation.rb +10 -0
  274. data/lib/freight_kit/carriers/solid_group.rb +10 -0
  275. data/lib/freight_kit/carriers/solution_carrier_express.rb +10 -0
  276. data/lib/freight_kit/carriers/southeastern_freight_lines.rb +450 -0
  277. data/lib/freight_kit/carriers/southwestern_motor_transport.rb +30 -0
  278. data/lib/freight_kit/carriers/span_alaska.rb +10 -0
  279. data/lib/freight_kit/carriers/specialize_transportation.rb +27 -0
  280. data/lib/freight_kit/carriers/ssi_refrigerated_express.rb +10 -0
  281. data/lib/freight_kit/carriers/standard_forwarding_llc.rb +28 -0
  282. data/lib/freight_kit/carriers/star_american_enterprise.rb +10 -0
  283. data/lib/freight_kit/carriers/sterling_transportation.rb +10 -0
  284. data/lib/freight_kit/carriers/stg.rb +163 -0
  285. data/lib/freight_kit/carriers/supervan_service.rb +10 -0
  286. data/lib/freight_kit/carriers/sutton_transport_inc.rb +12 -0
  287. data/lib/freight_kit/carriers/swift_transportation.rb +28 -0
  288. data/lib/freight_kit/carriers/t_force_worldwide.rb +617 -0
  289. data/lib/freight_kit/carriers/tax_airfreight_inc.rb +35 -0
  290. data/lib/freight_kit/carriers/tforce_freight_inc.rb +30 -0
  291. data/lib/freight_kit/carriers/the_custom_companies.rb +162 -0
  292. data/lib/freight_kit/carriers/thk_trucking.rb +28 -0
  293. data/lib/freight_kit/carriers/tiger_cool_express.rb +11 -0
  294. data/lib/freight_kit/carriers/tili_logistics.rb +10 -0
  295. data/lib/freight_kit/carriers/tmt_industries.rb +10 -0
  296. data/lib/freight_kit/carriers/top_ten_express.rb +28 -0
  297. data/lib/freight_kit/carriers/total_quality_logistics.rb +338 -0
  298. data/lib/freight_kit/carriers/total_transportation.rb +258 -0
  299. data/lib/freight_kit/carriers/trans_international_trucking.rb +29 -0
  300. data/lib/freight_kit/carriers/treasure_transportation.rb +10 -0
  301. data/lib/freight_kit/carriers/tri_state_services.rb +10 -0
  302. data/lib/freight_kit/carriers/tritex_freighters.rb +10 -0
  303. data/lib/freight_kit/carriers/triways.rb +10 -0
  304. data/lib/freight_kit/carriers/tsi_kansas.rb +29 -0
  305. data/lib/freight_kit/carriers/u_and_r_transportation.rb +23 -0
  306. data/lib/freight_kit/carriers/union_pacific.rb +11 -0
  307. data/lib/freight_kit/carriers/united_freight_logistics.rb +10 -0
  308. data/lib/freight_kit/carriers/unlimited_distance_transportation.rb +10 -0
  309. data/lib/freight_kit/carriers/up_streamline.rb +10 -0
  310. data/lib/freight_kit/carriers/ups_freight.rb +12 -0
  311. data/lib/freight_kit/carriers/us_freightways.rb +10 -0
  312. data/lib/freight_kit/carriers/usa_truck.rb +28 -0
  313. data/lib/freight_kit/carriers/usf_holland.rb +11 -0
  314. data/lib/freight_kit/carriers/valley_cartage.rb +11 -0
  315. data/lib/freight_kit/carriers/vc_transport.rb +10 -0
  316. data/lib/freight_kit/carriers/vision_express.rb +11 -0
  317. data/lib/freight_kit/carriers/vision_logistics_group.rb +10 -0
  318. data/lib/freight_kit/carriers/vmg_transportation_group.rb +10 -0
  319. data/lib/freight_kit/carriers/volpe_express.rb +10 -0
  320. data/lib/freight_kit/carriers/ward_trucking.rb +29 -0
  321. data/lib/freight_kit/carriers/wdwb.rb +10 -0
  322. data/lib/freight_kit/carriers/western_flyer_express.rb +28 -0
  323. data/lib/freight_kit/carriers/western_regional_delivery_service.rb +271 -0
  324. data/lib/freight_kit/carriers/western_specialized_trucking.rb +22 -0
  325. data/lib/freight_kit/carriers/win_distribution.rb +28 -0
  326. data/lib/freight_kit/carriers/wlb_transport.rb +10 -0
  327. data/lib/freight_kit/carriers/x_trux.rb +29 -0
  328. data/lib/freight_kit/carriers/xpo_logistics.rb +427 -0
  329. data/lib/freight_kit/carriers/xpress_global_systems.rb +30 -0
  330. data/lib/freight_kit/carriers/xylo_trucking.rb +10 -0
  331. data/lib/freight_kit/carriers/yrc_freight.rb +24 -0
  332. data/lib/freight_kit/carriers/zentner_transportation.rb +28 -0
  333. data/lib/freight_kit/carriers.rb +331 -34
  334. data/lib/freight_kit/countries.rb +22 -0
  335. data/lib/freight_kit/error.rb +0 -2
  336. data/lib/freight_kit/errors/document_not_found_error.rb +0 -2
  337. data/lib/freight_kit/errors/expired_credentials_error.rb +0 -2
  338. data/lib/freight_kit/errors/http_error.rb +0 -2
  339. data/lib/freight_kit/errors/invalid_credentials_error.rb +0 -2
  340. data/lib/freight_kit/errors/response_error.rb +0 -2
  341. data/lib/freight_kit/errors/shipment_not_found_error.rb +0 -2
  342. data/lib/freight_kit/errors/unserviceable_accessorials_error.rb +2 -4
  343. data/lib/freight_kit/errors/unserviceable_error.rb +0 -2
  344. data/lib/freight_kit/helpers/documentable.rb +0 -2
  345. data/lib/freight_kit/helpers/pickupable.rb +3 -5
  346. data/lib/freight_kit/helpers/rateable.rb +0 -2
  347. data/lib/freight_kit/helpers/trackable.rb +0 -2
  348. data/lib/freight_kit/http_client/cache_store.rb +2 -4
  349. data/lib/freight_kit/http_client/log_device.rb +0 -2
  350. data/lib/freight_kit/http_client/response.rb +0 -2
  351. data/lib/freight_kit/http_client/revalidation.rb +0 -2
  352. data/lib/freight_kit/http_client/safe_retries.rb +0 -2
  353. data/lib/freight_kit/http_client/zstd.rb +2 -4
  354. data/lib/freight_kit/http_client.rb +8 -12
  355. data/lib/freight_kit/model.rb +1 -3
  356. data/lib/freight_kit/models/address.rb +15 -0
  357. data/lib/freight_kit/models/contact.rb +3 -4
  358. data/lib/freight_kit/models/country.rb +20 -0
  359. data/lib/freight_kit/models/credential.rb +14 -16
  360. data/lib/freight_kit/models/date_time.rb +0 -2
  361. data/lib/freight_kit/models/document_response.rb +0 -2
  362. data/lib/freight_kit/models/label.rb +0 -2
  363. data/lib/freight_kit/models/location.rb +10 -25
  364. data/lib/freight_kit/models/pickup_response.rb +0 -2
  365. data/lib/freight_kit/models/price.rb +0 -2
  366. data/lib/freight_kit/models/rate.rb +0 -2
  367. data/lib/freight_kit/models/rate_response.rb +0 -2
  368. data/lib/freight_kit/models/region.rb +19 -0
  369. data/lib/freight_kit/models/response.rb +0 -2
  370. data/lib/freight_kit/models/shipment.rb +4 -6
  371. data/lib/freight_kit/models/shipment_event.rb +0 -2
  372. data/lib/freight_kit/models/terminal.rb +10 -0
  373. data/lib/freight_kit/models/tracking_response.rb +0 -2
  374. data/lib/freight_kit/package.rb +51 -53
  375. data/lib/freight_kit/package_item.rb +14 -14
  376. data/lib/freight_kit/packaging.rb +21 -26
  377. data/lib/freight_kit/platform.rb +0 -32
  378. data/lib/freight_kit/platforms/carrier_logistics.rb +331 -345
  379. data/lib/freight_kit/platforms/next_tms.rb +93 -0
  380. data/lib/freight_kit/platforms/the_great_information_factory.rb +500 -425
  381. data/lib/freight_kit/regions.rb +27 -0
  382. data/lib/freight_kit/shipment_packer.rb +36 -38
  383. data/lib/freight_kit/tariff/overlength_rule.rb +1 -5
  384. data/lib/freight_kit/tariff.rb +0 -2
  385. data/lib/freight_kit.rb +84 -11
  386. metadata +361 -51
  387. data/configuration/carriers/abfs.yml +0 -124
  388. data/configuration/carriers/btvp.yml +0 -84
  389. data/configuration/carriers/ccyq.yml +0 -121
  390. data/configuration/carriers/clni.yml +0 -113
  391. data/configuration/carriers/cnwy.yml +0 -113
  392. data/configuration/carriers/ctbv.yml +0 -117
  393. data/configuration/carriers/dcha.yml +0 -105
  394. data/configuration/carriers/dlds.yml +0 -111
  395. data/configuration/carriers/dphe.yml +0 -130
  396. data/configuration/carriers/drrq.yml +0 -131
  397. data/configuration/carriers/fcsy.yml +0 -102
  398. data/configuration/carriers/fwda.yml +0 -137
  399. data/configuration/carriers/jfj_transportation.yml +0 -2
  400. data/configuration/carriers/mtvl.yml +0 -12
  401. data/configuration/carriers/numk.yml +0 -14
  402. data/configuration/carriers/otcl.yml +0 -124
  403. data/configuration/carriers/pens.yml +0 -22
  404. data/configuration/carriers/rdfs.yml +0 -142
  405. data/configuration/carriers/saia.yml +0 -129
  406. data/configuration/carriers/sefl.yml +0 -115
  407. data/configuration/carriers/totl.yml +0 -111
  408. data/configuration/carriers/tqyl.yml +0 -28
  409. data/configuration/carriers/wrds.yml +0 -20
  410. data/configuration/platforms/carrier_logistics.yml +0 -25
  411. data/configuration/platforms/next.yml +0 -12
  412. data/configuration/platforms/the_great_information_factory.yml +0 -122
  413. data/lib/freight_kit/carriers/abfs.rb +0 -421
  414. data/lib/freight_kit/carriers/btvp.rb +0 -29
  415. data/lib/freight_kit/carriers/ccyq.rb +0 -310
  416. data/lib/freight_kit/carriers/clni.rb +0 -396
  417. data/lib/freight_kit/carriers/cnwy.rb +0 -327
  418. data/lib/freight_kit/carriers/ctbv.rb +0 -53
  419. data/lib/freight_kit/carriers/dcha.rb +0 -76
  420. data/lib/freight_kit/carriers/dlds.rb +0 -49
  421. data/lib/freight_kit/carriers/dphe.rb +0 -472
  422. data/lib/freight_kit/carriers/drrq.rb +0 -580
  423. data/lib/freight_kit/carriers/fcsy.rb +0 -57
  424. data/lib/freight_kit/carriers/fwda.rb +0 -744
  425. data/lib/freight_kit/carriers/mtvl.rb +0 -34
  426. data/lib/freight_kit/carriers/numk.rb +0 -58
  427. data/lib/freight_kit/carriers/otcl.rb +0 -520
  428. data/lib/freight_kit/carriers/pens.rb +0 -204
  429. data/lib/freight_kit/carriers/rdfs.rb +0 -521
  430. data/lib/freight_kit/carriers/sefl.rb +0 -342
  431. data/lib/freight_kit/carriers/totl.rb +0 -172
  432. data/lib/freight_kit/carriers/tqyl.rb +0 -337
  433. data/lib/freight_kit/carriers/wrds.rb +0 -246
  434. data/lib/freight_kit/platforms/next.rb +0 -101
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class DeltaTruckingLogistics < Carrier
4
+ class << self
5
+ def id = '7c7dd6fc-0c0b-48ca-bfc0-8a475286d713'
6
+ def name = 'Delta Trucking Logistics'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class DemcoExpress < Carrier
4
+ class << self
5
+ def id = '0809bfe1-37bd-400d-973e-31f06fb1793f'
6
+ def name = 'Demco Express'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class DependableGlobalExpress < Carrier
4
+ class << self
5
+ def id = 'fd5a6481-37e8-4d22-a544-8c060d6edcd2'
6
+ def name = 'Dependable Global Express'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,24 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class DependableHawaiianExpress < Carrier
4
+ class << self
5
+ def check_mailing_addresses
6
+ [
7
+ Address.new(
8
+ city: 'Hayward',
9
+ country: Countries.find_by(iso31661_alpha2: 'US'),
10
+ id: '7e9bf6a0-1bf8-45e6-8808-87045bd286e2',
11
+ postal_code: '94545',
12
+ region_abbreviation: 'CA',
13
+ street: 'PO Box 57136'
14
+ )
15
+ ]
16
+ end
17
+
18
+ def id = '0388971f-0ebb-4a03-b6e4-37c3afb098fb'
19
+ def name = 'Dependable Hawaiian Express'
20
+ def scac = 'HSXF'
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,585 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class DependableHighwayExpress < FreightKit::Carrier
4
+ class << self
5
+ def contacts
6
+ [Contact.new(department: 'Main', id: '0e090486-7ea4-4d55-9a6c-7589275882ae', phone: '+13233629399')]
7
+ end
8
+
9
+ def headquarters
10
+ Address.new(
11
+ city: 'Los Angeles',
12
+ country: Countries.find_by(iso31661_alpha2: 'US'),
13
+ id: 'ac1b703d-aa8e-4547-95bc-e9e85ddfb356',
14
+ postal_code: '90023',
15
+ region_abbreviation: 'CA',
16
+ street: '2555 E Olympic Blvd'
17
+ )
18
+ end
19
+
20
+ def id = 'd66c61eb-bda4-4574-80e2-3246786b831b'
21
+ def legal_name = 'Dependable Highway Express Inc'
22
+
23
+ def mappable_accessorials
24
+ {
25
+ amusement_park_delivery: 'LMD',
26
+ amusement_park_pickup: 'LMP',
27
+ appointment_delivery: 'NTD',
28
+ appointment_pickup: 'NTP',
29
+ athletic_facility_delivery: 'LMD',
30
+ athletic_facility_pickup: 'LMP',
31
+ cemetery_delivery: 'LMD',
32
+ cemetery_pickup: 'LMP',
33
+ church_delivery: 'LMD',
34
+ church_pickup: 'LMP',
35
+ construction_delivery: 'LMT',
36
+ construction_pickup: 'LMT',
37
+ farm_delivery: 'LMD',
38
+ farm_pickup: 'LMP',
39
+ fitness_center_delivery: 'LMD',
40
+ fitness_center_pickup: 'LMP',
41
+ golf_course_delivery: 'LMD',
42
+ golf_course_pickup: 'LMP',
43
+ grocery_store_delivery: 'LMD',
44
+ grocery_store_pickup: 'LMP',
45
+ hospital_delivery: 'LMD',
46
+ hospital_pickup: 'LMP',
47
+ hotel_delivery: 'LMD',
48
+ hotel_pickup: 'LMP',
49
+ inside_delivery: 'IND',
50
+ inside_pickup: 'INP',
51
+ jobsite_delivery: 'LMT',
52
+ jobsite_pickup: 'LMT',
53
+ liftgate_delivery: 'LGD',
54
+ liftgate_pickup: 'LGP',
55
+ mall_delivery: 'LMD',
56
+ mall_pickup: 'LMP',
57
+ marina_delivery: 'LMD',
58
+ marina_pickup: 'LMP',
59
+ military_site_delivery: 'LMD',
60
+ military_site_pickup: 'LMP',
61
+ mine_site_delivery: 'LMD',
62
+ mine_site_pickup: 'LMP',
63
+ motel_delivery: 'LMD',
64
+ motel_pickup: 'LMP',
65
+ nursing_home_delivery: 'LMD',
66
+ nursing_home_pickup: 'LMP',
67
+ park_delivery: 'LMD',
68
+ park_pickup: 'LMP',
69
+ prison_delivery: 'LMD',
70
+ prison_pickup: 'LMP',
71
+ ranch_delivery: 'LMD',
72
+ ranch_pickup: 'LMP',
73
+ reservation_delivery: 'LMD',
74
+ reservation_pickup: 'LMP',
75
+ residential_delivery: 'RDS',
76
+ residential_pickup: 'RSP',
77
+ resort_delivery: 'LMD',
78
+ resort_pickup: 'LMP',
79
+ restaurant_delivery: 'LMD',
80
+ restaurant_pickup: 'LMP',
81
+ school_delivery: 'LMD',
82
+ school_pickup: 'LMP',
83
+ steel_mill_delivery: 'LMD',
84
+ steel_mill_pickup: 'LMP',
85
+ storage_facility_delivery: 'LMD',
86
+ storage_facility_pickup: 'LMP',
87
+ university_delivery: 'LMD',
88
+ university_pickup: 'LMP'
89
+ }
90
+ end
91
+
92
+ def maximum_height = Measured::Length.new(105, :inches)
93
+ def maximum_weight = Measured::Weight.new(10_000, :pounds)
94
+ def minimum_length_for_overlength_fees = Measured::Length.new(8, :feet)
95
+ def name = 'Dependable Highway Express'
96
+ def overlength_fees_require_tariff? = false
97
+ def required_credential_types = %i[api selenoid website]
98
+ def requirements = %i[credentials]
99
+ def scac = 'DPHE'
100
+ def services = %i[standard]
101
+ def unquotable_accessorials = %i[dock_dropoff dock_pickup]
102
+
103
+ def unserviceable_accessorials
104
+ %i[
105
+ afterhours_delivery
106
+ afterhours_pickup
107
+ airport_delivery
108
+ airport_pickup
109
+ brewery_delivery
110
+ brewery_pickup
111
+ convention_delivery
112
+ convention_pickup
113
+ customs_brokerage
114
+ driver_assist
115
+ early_morning_delivery
116
+ fair_delivery
117
+ fair_pickup
118
+ flatbed_delivery
119
+ flatbed_pickup
120
+ government_delivery
121
+ government_pickup
122
+ grocery_warehouse_delivery
123
+ grocery_warehouse_pickup
124
+ guaranteed_delivery_am
125
+ guaranteed_delivery_pm
126
+ guaranteed_delivery
127
+ inspection_site_delivery
128
+ inspection_site_pickup
129
+ utility_site_delivery
130
+ utility_site_pickup
131
+ winery_delivery
132
+ winery_pickup
133
+ ]
134
+ end
135
+
136
+ def us_dot_number = 9_853
137
+ end
138
+
139
+ include FreightKit::Rateable
140
+ include FreightKit::Trackable
141
+
142
+ API = {
143
+ actions: { rates: :get_rates, track: :get_tracking },
144
+ domains: {
145
+ bol: 'apps.godependable.com',
146
+ pod: 'apps.godependable.com',
147
+ rates: 'www.godependable.com',
148
+ track: 'www.godependable.com'
149
+ },
150
+ endpoints: {
151
+ bol: '/CustomerLogin.aspx',
152
+ pod: '/CustomerLogin.aspx',
153
+ rates: '/services/rates.asmx?WSDL',
154
+ track: '/services/track.asmx?WSDL'
155
+ },
156
+ use_ssl: { rates: false, track: false }
157
+ }.freeze
158
+ CITY_STATES = {
159
+ ca: ['Los Angeles', 'Mammoth Lakes', 'Sacramento', 'Redding', 'West Sacramento'],
160
+ nv: ['Reno', 'Sparks']
161
+ }.freeze
162
+ EVENTS = {
163
+ types: {
164
+ arrived_at_terminal: 'linehaul arrived',
165
+ departed: 'linehaul departed',
166
+ out_for_delivery: 'out for delivery',
167
+ trailer_closed: 'terminal load',
168
+ trailer_unloaded: 'terminal unload'
169
+ }
170
+ }.freeze
171
+
172
+ # Documents
173
+
174
+ def pod(tracking_number) = parse_document_response(:pod, tracking_number)
175
+ def scanned_bol(tracking_number) = parse_document_response(:bol, tracking_number)
176
+
177
+ protected
178
+
179
+ def build_rate_request(shipment:)
180
+ country_codes = [shipment.destination.country.code(:alpha2).value, shipment.origin.country.code(:alpha2).value]
181
+
182
+ if country_codes.reject { |c| c.upcase == 'US' }.any?
183
+ raise UnserviceableError,
184
+ "No service from #{shipment.origin.postal_code} to #{shipment.destination.postal_code}"
185
+ end
186
+
187
+ accessorials = []
188
+ if shipment.accessorials.present?
189
+ serviceable_accessorials?(shipment.accessorials)
190
+ shipment.accessorials.each do |a|
191
+ accessorials << mappable_accessorials[a] if unserviceable_accessorials.exclude?(a)
192
+ end
193
+ end
194
+
195
+ longest_dimension = shipment.packages.map { |p| [p.length(:in), p.width(:in)].max }.max.ceil
196
+ if longest_dimension >= 336
197
+ accessorials << 'X29'
198
+ elsif longest_dimension >= 240 && longest_dimension < 336
199
+ accessorials << 'X28'
200
+ elsif longest_dimension >= 144 && longest_dimension < 240
201
+ accessorials << 'X20'
202
+ elsif longest_dimension >= 96 && longest_dimension < 144
203
+ accessorials << 'X12'
204
+ end
205
+
206
+ accessorials = accessorials.uniq.join(',')
207
+
208
+ shipment_detail = shipment.packages.map do |package|
209
+ [package.quantity, package.freight_class, package.pounds(:total)].join('|')
210
+ end.join('|')
211
+
212
+ api_credentials = fetch_credential(:api)
213
+
214
+ request = {
215
+ customer_code: api_credentials.account,
216
+ origin_zip: shipment.origin.postal_code.to_s.upcase,
217
+ destination_zip: shipment.destination.postal_code.to_s.upcase,
218
+ shipment_detail:,
219
+ rating_type: '', # per API documentation
220
+ accessorials:
221
+ }
222
+
223
+ save_request(request)
224
+ request
225
+ end
226
+
227
+ def build_soap_header(_action)
228
+ api_credentials = fetch_credential(:api)
229
+
230
+ { authentication_header: { user_name: api_credentials.username, password: api_credentials.password } }
231
+ end
232
+
233
+ def build_tracking_request(tracking_number)
234
+ request = { pro_number: tracking_number }
235
+ save_request(request)
236
+ request
237
+ end
238
+
239
+ def commit(action, request)
240
+ client_args = {
241
+ wsdl: request_url(action),
242
+ convert_request_keys_to: :camelcase,
243
+ env_namespace: :soap,
244
+ element_form_default: :qualified
245
+ }
246
+
247
+ call_args = { message: request }
248
+
249
+ response = ::FreightKit::SoapClient.new(
250
+ carrier: self,
251
+ action:,
252
+ client_args:,
253
+ call_args:,
254
+ soap_operation: API.dig(:actions, action)
255
+ ).call
256
+
257
+ return response if response.is_a?(TrackingResponse) || response.is_a?(RateResponse)
258
+
259
+ response.to_hash
260
+ end
261
+
262
+ def parse_amount(amount)
263
+ negative = amount.include?('(') && amount.include?(')')
264
+
265
+ ['$', ',', '(', ')'].each do |char|
266
+ amount = amount.sub(char, '')
267
+ end
268
+
269
+ return 0 if amount.blank?
270
+
271
+ amount = (amount.to_f * 100).to_i
272
+ return amount unless negative
273
+
274
+ amount * -1
275
+ end
276
+
277
+ def parse_api_city(str)
278
+ return if str.blank?
279
+
280
+ city = str.squish.strip.titleize
281
+ province = nil
282
+ country = ActiveUtils::Country.find('USA')
283
+
284
+ CITY_STATES.each do |state, cities|
285
+ if cities.include?(city)
286
+ province = state.to_s.upcase
287
+ break
288
+ end
289
+ end
290
+
291
+ Location.new(city:, province:, country:)
292
+ end
293
+
294
+ def parse_api_city_state(str)
295
+ return if str.blank?
296
+
297
+ Location.new(
298
+ city: str.split(', ')[0].titleize,
299
+ province: str.split(', ')[1].split[0].upcase,
300
+ country: ActiveUtils::Country.find('USA')
301
+ )
302
+ end
303
+
304
+ def parse_api_date_time(date_time, location)
305
+ return if date_time.blank?
306
+
307
+ local_date_time = ::Time.strptime(date_time, '%m/%d/%Y %l:%M:%S %p').to_fs(:db)
308
+ ::FreightKit::DateTime.new(local_date_time:, location:)
309
+ end
310
+
311
+ def parse_document_response(action, tracking_number)
312
+ document_response = DocumentResponse.new
313
+
314
+ selenoid_credential = fetch_credential(:selenoid)
315
+ website_credentials = fetch_credential(:website)
316
+
317
+ browser = Watir::Browser.new(*selenoid_credential.watir_args)
318
+
319
+ browser.goto(request_url(action))
320
+
321
+ browser.text_field(name: 'dnn$ctr1914$View$TextBox1').set(website_credentials.username)
322
+ browser.text_field(name: 'dnn$ctr1914$View$TextBox2').set(website_credentials.password)
323
+ browser.button(name: 'dnn$ctr1914$View$Button1').click
324
+
325
+ if browser.html.downcase.include?('invalid username or password')
326
+ browser.close
327
+
328
+ document_response.error = InvalidCredentialsError.new
329
+ return document_response
330
+ end
331
+
332
+ browser.text_field(name: 'ctl00$ContentPlaceHolder1$txtProNumber').set(tracking_number)
333
+ browser.button(name: 'ctl00$ContentPlaceHolder1$btnSubmit').click
334
+
335
+ begin
336
+ browser.element(xpath: '//*[@id="ContentPlaceHolder1_GridView1"]/tbody/tr[2]/td[2]/a')
337
+ .click
338
+ rescue Watir::Exception::UnknownObjectException
339
+ document_response.error = DocumentNotFoundError.new
340
+ return document_response
341
+ end
342
+
343
+ browser.switch_window
344
+ button_xpath = case action
345
+ when :bol then '//*[@id="ContentPlaceHolder1_btnDocs"]'
346
+ when :pod then '//*[@id="ContentPlaceHolder1_btnPOD"]'
347
+ end
348
+
349
+ if !button_xpath || !browser.element(xpath: button_xpath).exists?
350
+ browser.close
351
+
352
+ document_response.error = DocumentNotFoundError.new
353
+ return document_response
354
+ end
355
+
356
+ browser.element(xpath: button_xpath).click
357
+
358
+ if !button_xpath || browser.element(xpath: button_xpath).innertext.downcase.include?('unavailable')
359
+ browser.close
360
+
361
+ document_response.error = DocumentNotFoundError.new
362
+ return document_response
363
+ end
364
+
365
+ sleep(10) # so Chrome can finish downloading
366
+
367
+ download_url = "#{selenoid_credential.selenoid_options[:download_url]}/#{browser.driver.session_id}"
368
+ response = HTTPClient.get("#{download_url}/?json")
369
+
370
+ filename = URI.encode_www_form_component(JSON.parse(response.body)&.last)
371
+ url = "#{download_url}/#{filename}"
372
+
373
+ document_response.request = URI.parse(url)
374
+
375
+ begin
376
+ response = HTTPClient.get(url)
377
+ rescue StandardError => e
378
+ document_response.error = e
379
+ return document_response
380
+ end
381
+
382
+ browser.close
383
+
384
+ unless response.code == 200
385
+ document_response.error = DocumentNotFoundError.new
386
+ return document_response
387
+ end
388
+
389
+ document_response.assign_attributes(content_type: response.headers['content-type'], data: response.body)
390
+ document_response
391
+ end
392
+
393
+ def parse_location(comment, delimiters)
394
+ return if comment.blank? || !comment.include?(delimiters[0]) || !comment.include?(delimiters[1])
395
+
396
+ parts = comment.split(delimiters[0])[0].split(delimiters[1])[1].split(',')
397
+
398
+ city = parts[0].squish.strip.titleize
399
+ province = parts[1].squish.strip.upcase
400
+ country = ActiveUtils::Country.find('USA')
401
+
402
+ Location.new(city:, province:, country:)
403
+ end
404
+
405
+ def parse_rate_response(shipment:, response:)
406
+ rate_response = RateResponse.new(request: last_request, response:)
407
+
408
+ if response.blank?
409
+ rate_response.error = ResponseError.new('Unknown response')
410
+ return rate_response
411
+ end
412
+
413
+ error = response.dig(:get_rates_response, :get_rates_result, :return_line)
414
+ error ||= response.dig(:get_rates_response, :get_rates_result, :rate_error)
415
+
416
+ if error
417
+ message = error.downcase
418
+ rate_response.error = InvalidCredentialsError.new(error) if message.include?('not a valid customer code')
419
+
420
+ if message.include?('not a direct service point') || message.include?('lanes not serviced')
421
+ rate_response.error = UnserviceableError.new(error)
422
+ end
423
+
424
+ rate_response.error = ResponseError.new(error) if rate_response.error.blank?
425
+ return rate_response
426
+ end
427
+
428
+ quote_number = response.dig(:get_rates_response, :get_rates_result, :rate_quote_number)
429
+ raise FreightKit::UnserviceableError if quote_number.blank?
430
+
431
+ if response.dig(:get_rates_response, :get_rates_result, :totals).blank?
432
+ rate_response.error = ResponseError.new('Cost is empty')
433
+ return rate_response
434
+ end
435
+
436
+ transit_days = response.dig(:get_rates_response, :get_rates_result, :transit_days)&.to_i
437
+ estimate_reference = response.dig(:get_rates_response, :get_rates_result, :rate_quote_number)
438
+
439
+ prices = []
440
+
441
+ shipment_details = response.dig(
442
+ :get_rates_response,
443
+ :get_rates_result,
444
+ :shipment_detail_response,
445
+ :shipment_detail_row
446
+ )
447
+
448
+ shipment_details.each do |shipment_detail|
449
+ next if shipment_detail[:charge].blank?
450
+ next if shipment_detail[:description] == 'Totals'
451
+
452
+ cents = parse_amount(shipment_detail[:charge])
453
+ description = shipment_detail_description(shipment_detail)
454
+
455
+ prices << Price.new(blame: :api, cents:, description:)
456
+ end
457
+
458
+ rate = Rate.new(
459
+ carrier_name: name,
460
+ carrier: self,
461
+ currency: 'USD',
462
+ estimate_reference:,
463
+ prices:,
464
+ scac:,
465
+ service_name: :standard,
466
+ shipment:,
467
+ transit_days:,
468
+ with_excessive_length_fees: rates_with_excessive_length_fees?
469
+ )
470
+
471
+ rate_response.rates = [rate]
472
+ rate_response
473
+ end
474
+
475
+ def parse_tracking_response(response)
476
+ tracking_response = TrackingResponse.new(carrier: self, request: last_request, response:)
477
+
478
+ if response.dig(:get_tracking_response, :get_tracking_result, :tracking_status_response).blank?
479
+ tracking_response.error = ShipmentNotFoundError.new
480
+ return tracking_response
481
+ end
482
+
483
+ search_result = response.dig(:get_tracking_response, :get_tracking_result)
484
+
485
+ country = ActiveUtils::Country.find('USA')
486
+
487
+ shipper_location = Location.new(
488
+ address1: search_result[:shipperaddress]&.squish&.titleize,
489
+ city: search_result[:shipper_city].squish.strip.titleize,
490
+ province: search_result[:shipper_state].strip.upcase,
491
+ postal_code: search_result[:shipper_zip].strip,
492
+ country:
493
+ )
494
+
495
+ receiver_location = Location.new(
496
+ address1: search_result[:consaddress]&.squish&.titleize,
497
+ city: search_result[:cons_city].squish.strip.titleize,
498
+ province: search_result[:cons_state].strip.upcase,
499
+ postal_code: search_result[:cons_zip].strip,
500
+ country:
501
+ )
502
+
503
+ api_date_time = search_result.dig('Shipment', 'DeliveredDateTime')
504
+ actual_delivery_date = parse_api_date_time(api_date_time, receiver_location)
505
+
506
+ api_date_time = search_result[:pickup_date]
507
+ pickup_date = parse_api_date_time(api_date_time, shipper_location)
508
+
509
+ api_date_time = search_result.dig('Shipment', 'ApptDateTime')
510
+ scheduled_delivery_date = parse_api_date_time(api_date_time, receiver_location)
511
+
512
+ ship_time = pickup_date
513
+ tracking_number = search_result.dig('Shipment', 'SearchItem')
514
+
515
+ shipment_events = []
516
+ shipment_events << ShipmentEvent.new(location: shipper_location, date_time: pickup_date, type_code: :picked_up)
517
+
518
+ api_events = search_result.dig(:tracking_status_response, :tracking_status_row).reverse
519
+ api_events.each do |api_event|
520
+ event_key = nil
521
+ comment = api_event[:tracking_status]
522
+
523
+ EVENTS[:types].each do |key, val|
524
+ if comment.downcase.include?(val)
525
+ event_key = key
526
+ else
527
+ ['signed by', 'partner delivery'].each { |val| event_key = :delivered if comment.downcase.include?(val) }
528
+ end
529
+
530
+ break if event_key
531
+ end
532
+
533
+ next if event_key.blank?
534
+
535
+ location = case event_key
536
+ when :arrived_at_terminal
537
+ parse_api_city(comment.split('arrived')[1].upcase.split('SERVICE CENTER')[0])
538
+ when :delivered
539
+ receiver_location
540
+ when :departed
541
+ parse_api_city(comment.split('departed')[1].upcase.split('SERVICE CENTER')[0])
542
+ when :out_for_delivery
543
+ receiver_location
544
+ when :trailer_closed
545
+ parse_api_city(comment.split('Location:')[1])
546
+ when :trailer_unloaded
547
+ parse_api_city(comment.split('Location:')[1])
548
+ end
549
+
550
+ date_time = parse_api_date_time(api_event[:tracking_date], location)
551
+
552
+ actual_delivery_date = date_time if event_key == :delivered
553
+
554
+ shipment_events << ShipmentEvent.new(date_time:, location:, type_code: event_key)
555
+ end
556
+
557
+ status = shipment_events.last&.type_code
558
+
559
+ tracking_response.assign_attributes(
560
+ actual_delivery_date:,
561
+ destination: receiver_location,
562
+ origin: shipper_location,
563
+ scheduled_delivery_date:,
564
+ ship_time:,
565
+ shipment_events:,
566
+ status:,
567
+ tracking_number:
568
+ )
569
+
570
+ tracking_response
571
+ end
572
+
573
+ def request_url(action)
574
+ scheme = API.dig(:use_ssl, action) ? 'https://' : 'http://'
575
+ "#{scheme}#{API.dig(:domains, action)}#{API.dig(:endpoints, action)}"
576
+ end
577
+
578
+ def shipment_detail_description(shipment_detail)
579
+ return '' if shipment_detail[:description].blank?
580
+
581
+ shipment_detail[:description].capitalize.squish
582
+ end
583
+ end
584
+ end
585
+ end
@@ -0,0 +1,10 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class DesertCoastalTransport < Carrier
4
+ class << self
5
+ def id = '73babb98-bbec-4d26-8d8a-cec1f4bb18b9'
6
+ def name = 'Desert Coastal Transport'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module FreightKit
2
+ module Carriers
3
+ class DHL < Carrier
4
+ class << self
5
+ def id = '617c592f-ec16-4ef5-b5bc-22be37888730'
6
+ def name = 'DHL'
7
+ def website_url = 'https://www.deutschepost.de'
8
+ end
9
+ end
10
+ end
11
+ end