freight_kit 0.1.20 → 0.1.22

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