freight_kit 0.1.20 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -2
  3. data/README.md +1 -2
  4. data/Rakefile +6 -0
  5. data/VERSION +1 -1
  6. data/configuration/locations/amazon_warehouses.yml +3330 -0
  7. data/freight_kit.gemspec +13 -13
  8. data/lib/freight_kit/address_normalizer.rb +26 -0
  9. data/lib/freight_kit/amazon_warehouse.rb +33 -0
  10. data/lib/freight_kit/api_clients/soap_client.rb +7 -9
  11. data/lib/freight_kit/carrier.rb +250 -303
  12. data/lib/freight_kit/carriers/a1_express.rb +25 -0
  13. data/lib/freight_kit/carriers/a_duie_pyle.rb +30 -0
  14. data/lib/freight_kit/carriers/aaa_cooper.rb +11 -0
  15. data/lib/freight_kit/carriers/aaa_expedited_services.rb +10 -0
  16. data/lib/freight_kit/carriers/ab_brothers_usa_inc.rb +12 -0
  17. data/lib/freight_kit/carriers/aberdeen_express_inc.rb +28 -0
  18. data/lib/freight_kit/carriers/abf_freight_system.rb +492 -0
  19. data/lib/freight_kit/carriers/access_transport.rb +10 -0
  20. data/lib/freight_kit/carriers/action_express.rb +10 -0
  21. data/lib/freight_kit/carriers/adams_and_companies.rb +10 -0
  22. data/lib/freight_kit/carriers/advance_distribution.rb +28 -0
  23. data/lib/freight_kit/carriers/alcon_transport.rb +10 -0
  24. data/lib/freight_kit/carriers/all_freight.rb +10 -0
  25. data/lib/freight_kit/carriers/alliance_transportation_group.rb +10 -0
  26. data/lib/freight_kit/carriers/allstate_transport.rb +10 -0
  27. data/lib/freight_kit/carriers/aloha_freight_forwarders.rb +35 -0
  28. data/lib/freight_kit/carriers/amado_trucking.rb +35 -0
  29. data/lib/freight_kit/carriers/american_fast_freight.rb +28 -0
  30. data/lib/freight_kit/carriers/amigos_service_transportation.rb +10 -0
  31. data/lib/freight_kit/carriers/anderson_towing_and_transport.rb +10 -0
  32. data/lib/freight_kit/carriers/apex_transporting.rb +10 -0
  33. data/lib/freight_kit/carriers/archer_cargo.rb +35 -0
  34. data/lib/freight_kit/carriers/armstrong_transport_group.rb +10 -0
  35. data/lib/freight_kit/carriers/autobahn_logistics.rb +10 -0
  36. data/lib/freight_kit/carriers/averitt_express.rb +30 -0
  37. data/lib/freight_kit/carriers/ba_transportation.rb +10 -0
  38. data/lib/freight_kit/carriers/balkin_express.rb +10 -0
  39. data/lib/freight_kit/carriers/bay_area_express.rb +10 -0
  40. data/lib/freight_kit/carriers/bc_freightways.rb +11 -0
  41. data/lib/freight_kit/carriers/benjamin_best_freight_inc.rb +37 -0
  42. data/lib/freight_kit/carriers/bennett_trucking.rb +10 -0
  43. data/lib/freight_kit/carriers/best_overnite_express.rb +78 -0
  44. data/lib/freight_kit/carriers/best_trucking.rb +10 -0
  45. data/lib/freight_kit/carriers/bestway_transport.rb +10 -0
  46. data/lib/freight_kit/carriers/bryan_systems.rb +10 -0
  47. data/lib/freight_kit/carriers/c_and_w_express.rb +10 -0
  48. data/lib/freight_kit/carriers/campbell_trucking.rb +10 -0
  49. data/lib/freight_kit/carriers/carde_transportation.rb +10 -0
  50. data/lib/freight_kit/carriers/cardinal_logistics.rb +28 -0
  51. data/lib/freight_kit/carriers/cdc_transport.rb +10 -0
  52. data/lib/freight_kit/carriers/cdo_express_diversified.rb +10 -0
  53. data/lib/freight_kit/carriers/cedar_supply_trucking.rb +10 -0
  54. data/lib/freight_kit/carriers/central_freight_lines.rb +12 -0
  55. data/lib/freight_kit/carriers/central_transport.rb +12 -0
  56. data/lib/freight_kit/carriers/chicago_suburban_express.rb +28 -0
  57. data/lib/freight_kit/carriers/city_logistics.rb +11 -0
  58. data/lib/freight_kit/carriers/clear_lane_freight_systems.rb +483 -0
  59. data/lib/freight_kit/carriers/cleopatra_trucking.rb +10 -0
  60. data/lib/freight_kit/carriers/clifford_transportation.rb +10 -0
  61. data/lib/freight_kit/carriers/cms_domestic.rb +25 -0
  62. data/lib/freight_kit/carriers/cnd_logistics.rb +10 -0
  63. data/lib/freight_kit/carriers/coast_to_coast_transport.rb +27 -0
  64. data/lib/freight_kit/carriers/countrywide_carriers.rb +10 -0
  65. data/lib/freight_kit/carriers/cpl_express.rb +35 -0
  66. data/lib/freight_kit/carriers/crosby_trucking_service.rb +29 -0
  67. data/lib/freight_kit/carriers/cross_country_freight_solutions.rb +419 -0
  68. data/lib/freight_kit/carriers/crowley.rb +10 -0
  69. data/lib/freight_kit/carriers/csa_transportation.rb +40 -0
  70. data/lib/freight_kit/carriers/csx_transportation.rb +40 -0
  71. data/lib/freight_kit/carriers/custom_global_logistics.rb +14 -0
  72. data/lib/freight_kit/carriers/d_and_a_transport.rb +10 -0
  73. data/lib/freight_kit/carriers/dak_transport.rb +10 -0
  74. data/lib/freight_kit/carriers/dash_courier_and_logistics_north_carolina.rb +10 -0
  75. data/lib/freight_kit/carriers/daylight_transport.rb +29 -0
  76. data/lib/freight_kit/carriers/dayton_freight_lines.rb +30 -0
  77. data/lib/freight_kit/carriers/dbr_logistics.rb +10 -0
  78. data/lib/freight_kit/carriers/deep_south_freight.rb +27 -0
  79. data/lib/freight_kit/carriers/delta_express.rb +10 -0
  80. data/lib/freight_kit/carriers/delta_transport.rb +10 -0
  81. data/lib/freight_kit/carriers/delta_trucking_logistics.rb +10 -0
  82. data/lib/freight_kit/carriers/demco_express.rb +10 -0
  83. data/lib/freight_kit/carriers/dependable_global_express.rb +10 -0
  84. data/lib/freight_kit/carriers/dependable_hawaiian_express.rb +24 -0
  85. data/lib/freight_kit/carriers/dependable_highway_express.rb +585 -0
  86. data/lib/freight_kit/carriers/desert_coastal_transport.rb +10 -0
  87. data/lib/freight_kit/carriers/dhl.rb +11 -0
  88. data/lib/freight_kit/carriers/diamond_line_delivery.rb +174 -0
  89. data/lib/freight_kit/carriers/ding_tai_trucking.rb +10 -0
  90. data/lib/freight_kit/carriers/diversified_transfer_and_storage.rb +29 -0
  91. data/lib/freight_kit/carriers/dohrn_transfer_company.rb +30 -0
  92. data/lib/freight_kit/carriers/dot_line_transportation.rb +29 -0
  93. data/lib/freight_kit/carriers/drt_transportation.rb +13 -0
  94. data/lib/freight_kit/carriers/dugan_truck_line.rb +29 -0
  95. data/lib/freight_kit/carriers/dupont.rb +10 -0
  96. data/lib/freight_kit/carriers/e_transport_carriers.rb +29 -0
  97. data/lib/freight_kit/carriers/echo_global_logistics.rb +13 -0
  98. data/lib/freight_kit/carriers/ecklund_logistics.rb +10 -0
  99. data/lib/freight_kit/carriers/el_emplumado_transport.rb +10 -0
  100. data/lib/freight_kit/carriers/elite_carriers.rb +28 -0
  101. data/lib/freight_kit/carriers/emerald_express.rb +10 -0
  102. data/lib/freight_kit/carriers/era_transport.rb +10 -0
  103. data/lib/freight_kit/carriers/estes_express_lines.rb +25 -0
  104. data/lib/freight_kit/carriers/euro_kam.rb +28 -0
  105. data/lib/freight_kit/carriers/ew_riverside_trucking.rb +10 -0
  106. data/lib/freight_kit/carriers/express_2000_inc.rb +12 -0
  107. data/lib/freight_kit/carriers/express_services_international.rb +10 -0
  108. data/lib/freight_kit/carriers/f_and_a_express.rb +27 -0
  109. data/lib/freight_kit/carriers/fairmont_logistics.rb +13 -0
  110. data/lib/freight_kit/carriers/fargo_cargo.rb +10 -0
  111. data/lib/freight_kit/carriers/fast_freight_transportation.rb +10 -0
  112. data/lib/freight_kit/carriers/fast_load_transport.rb +10 -0
  113. data/lib/freight_kit/carriers/fed_ex_express.rb +30 -0
  114. data/lib/freight_kit/carriers/fed_ex_ground.rb +24 -0
  115. data/lib/freight_kit/carriers/fed_ex_ltl_economy.rb +11 -0
  116. data/lib/freight_kit/carriers/fed_ex_ltl_priority.rb +11 -0
  117. data/lib/freight_kit/carriers/first_trucking_express.rb +10 -0
  118. data/lib/freight_kit/carriers/flash_trucking.rb +10 -0
  119. data/lib/freight_kit/carriers/fort_transportation_and_service_company_inc.rb +37 -0
  120. data/lib/freight_kit/carriers/forward_air.rb +789 -0
  121. data/lib/freight_kit/carriers/frahtex.rb +10 -0
  122. data/lib/freight_kit/carriers/frozen_food_express.rb +10 -0
  123. data/lib/freight_kit/carriers/gholia_bros_trucking.rb +36 -0
  124. data/lib/freight_kit/carriers/global_cargo.rb +10 -0
  125. data/lib/freight_kit/carriers/global_logistics_and_transportation.rb +10 -0
  126. data/lib/freight_kit/carriers/gls_freight.rb +32 -0
  127. data/lib/freight_kit/carriers/go_trucking_services.rb +10 -0
  128. data/lib/freight_kit/carriers/gold_eagle_transportation.rb +11 -0
  129. data/lib/freight_kit/carriers/golden_drop_trucking.rb +10 -0
  130. data/lib/freight_kit/carriers/gonzalez_transportation.rb +10 -0
  131. data/lib/freight_kit/carriers/gps_transport.rb +10 -0
  132. data/lib/freight_kit/carriers/greene_enterprise.rb +10 -0
  133. data/lib/freight_kit/carriers/gsa_international.rb +10 -0
  134. data/lib/freight_kit/carriers/gsp_express.rb +24 -0
  135. data/lib/freight_kit/carriers/gsv_transportation.rb +10 -0
  136. data/lib/freight_kit/carriers/gta_transportation.rb +10 -0
  137. data/lib/freight_kit/carriers/guam_freight_services.rb +10 -0
  138. data/lib/freight_kit/carriers/harrah_transportation.rb +23 -0
  139. data/lib/freight_kit/carriers/her_trucking.rb +10 -0
  140. data/lib/freight_kit/carriers/hercules_freight.rb +20 -0
  141. data/lib/freight_kit/carriers/highlander_xpress.rb +36 -0
  142. data/lib/freight_kit/carriers/hn_transport.rb +10 -0
  143. data/lib/freight_kit/carriers/honolulu_freight_service.rb +10 -0
  144. data/lib/freight_kit/carriers/hot_line_freight_system_inc.rb +12 -0
  145. data/lib/freight_kit/carriers/hotshot_freight_of_texas.rb +13 -0
  146. data/lib/freight_kit/carriers/houser_transport.rb +27 -0
  147. data/lib/freight_kit/carriers/infiniti_freight_logistics.rb +28 -0
  148. data/lib/freight_kit/carriers/infinity_trucking.rb +10 -0
  149. data/lib/freight_kit/carriers/interstate_tma.rb +10 -0
  150. data/lib/freight_kit/carriers/intrade_industries.rb +10 -0
  151. data/lib/freight_kit/carriers/jasper_trucking.rb +28 -0
  152. data/lib/freight_kit/carriers/jb_hunt.rb +11 -0
  153. data/lib/freight_kit/carriers/jfj_transportation.rb +8 -8
  154. data/lib/freight_kit/carriers/jkb_express.rb +10 -0
  155. data/lib/freight_kit/carriers/jlm_transport.rb +10 -0
  156. data/lib/freight_kit/carriers/johansson_transport.rb +10 -0
  157. data/lib/freight_kit/carriers/jones_express.rb +10 -0
  158. data/lib/freight_kit/carriers/jp_logistics.rb +41 -0
  159. data/lib/freight_kit/carriers/just_in_time_cargo.rb +29 -0
  160. data/lib/freight_kit/carriers/kengkok_times.rb +10 -0
  161. data/lib/freight_kit/carriers/kings_express.rb +10 -0
  162. data/lib/freight_kit/carriers/klc_transportation.rb +10 -0
  163. data/lib/freight_kit/carriers/km_trucking.rb +10 -0
  164. data/lib/freight_kit/carriers/kma_logistics.rb +10 -0
  165. data/lib/freight_kit/carriers/krc_logistics.rb +10 -0
  166. data/lib/freight_kit/carriers/ktx.rb +10 -0
  167. data/lib/freight_kit/carriers/landstar.rb +25 -0
  168. data/lib/freight_kit/carriers/lanter_distributing_llc.rb +30 -0
  169. data/lib/freight_kit/carriers/ld_trucking.rb +10 -0
  170. data/lib/freight_kit/carriers/legacy_logistics_solutions.rb +10 -0
  171. data/lib/freight_kit/carriers/leonards_express.rb +10 -0
  172. data/lib/freight_kit/carriers/liberty_linehaul_west.rb +28 -0
  173. data/lib/freight_kit/carriers/liberty_transport.rb +10 -0
  174. data/lib/freight_kit/carriers/lightning_express.rb +10 -0
  175. data/lib/freight_kit/carriers/lj_express.rb +24 -0
  176. data/lib/freight_kit/carriers/lkp_enterprises.rb +10 -0
  177. data/lib/freight_kit/carriers/ltl_pros.rb +28 -0
  178. data/lib/freight_kit/carriers/m_and_m_and_sons.rb +10 -0
  179. data/lib/freight_kit/carriers/mag_lines_transport.rb +10 -0
  180. data/lib/freight_kit/carriers/magic_messenger.rb +24 -0
  181. data/lib/freight_kit/carriers/majors_transit.rb +10 -0
  182. data/lib/freight_kit/carriers/map_global_logistics.rb +10 -0
  183. data/lib/freight_kit/carriers/matths_trucking.rb +11 -0
  184. data/lib/freight_kit/carriers/mav_canadian_transport.rb +13 -0
  185. data/lib/freight_kit/carriers/mc_systems.rb +35 -0
  186. data/lib/freight_kit/carriers/mega_fleet.rb +10 -0
  187. data/lib/freight_kit/carriers/mega_trans_group.rb +28 -0
  188. data/lib/freight_kit/carriers/meta_express.rb +10 -0
  189. data/lib/freight_kit/carriers/mia_transportation.rb +10 -0
  190. data/lib/freight_kit/carriers/midwest_motor_express.rb +14 -0
  191. data/lib/freight_kit/carriers/midwest_transport_and_trucking.rb +10 -0
  192. data/lib/freight_kit/carriers/mikade_delivery_service.rb +10 -0
  193. data/lib/freight_kit/carriers/mohoff_freight_lines.rb +23 -0
  194. data/lib/freight_kit/carriers/montata_travelers_express.rb +10 -0
  195. data/lib/freight_kit/carriers/morgan_van_lines.rb +29 -0
  196. data/lib/freight_kit/carriers/moto_transportation.rb +24 -0
  197. data/lib/freight_kit/carriers/mountain_valley_express.rb +197 -0
  198. data/lib/freight_kit/carriers/ms_freight.rb +27 -0
  199. data/lib/freight_kit/carriers/mvg_transport.rb +10 -0
  200. data/lib/freight_kit/carriers/n_and_m_transfer_co_inc.rb +29 -0
  201. data/lib/freight_kit/carriers/nabot_transport_solutions.rb +10 -0
  202. data/lib/freight_kit/carriers/national_freight_xpress.rb +10 -0
  203. data/lib/freight_kit/carriers/navigation_group.rb +10 -0
  204. data/lib/freight_kit/carriers/nelson_trucking.rb +10 -0
  205. data/lib/freight_kit/carriers/network_1_transportation.rb +10 -0
  206. data/lib/freight_kit/carriers/new_century_transport.rb +28 -0
  207. data/lib/freight_kit/carriers/new_penn_motor_express.rb +11 -0
  208. data/lib/freight_kit/carriers/nieves_transportation.rb +10 -0
  209. data/lib/freight_kit/carriers/nolan_transportation_group.rb +26 -0
  210. data/lib/freight_kit/carriers/northland_trucking.rb +10 -0
  211. data/lib/freight_kit/carriers/northwest_carrier_logistics.rb +27 -0
  212. data/lib/freight_kit/carriers/nt_usa.rb +10 -0
  213. data/lib/freight_kit/carriers/nu_line_transportation.rb +10 -0
  214. data/lib/freight_kit/carriers/numark_transportation.rb +80 -0
  215. data/lib/freight_kit/carriers/nvk_transport.rb +10 -0
  216. data/lib/freight_kit/carriers/ny_transport.rb +10 -0
  217. data/lib/freight_kit/carriers/oak_harbor.rb +28 -0
  218. data/lib/freight_kit/carriers/oakline_transportation.rb +10 -0
  219. data/lib/freight_kit/carriers/old_dominion_freight_line.rb +30 -0
  220. data/lib/freight_kit/carriers/on_trac.rb +573 -0
  221. data/lib/freight_kit/carriers/one_hundred_one_transport.rb +10 -0
  222. data/lib/freight_kit/carriers/one_way_delivery.rb +10 -0
  223. data/lib/freight_kit/carriers/oracle_transportation_solutions.rb +10 -0
  224. data/lib/freight_kit/carriers/orange_courier.rb +27 -0
  225. data/lib/freight_kit/carriers/ortas_trucking.rb +10 -0
  226. data/lib/freight_kit/carriers/pac_trux_transportation.rb +10 -0
  227. data/lib/freight_kit/carriers/pacer.rb +10 -0
  228. data/lib/freight_kit/carriers/pacific_logistics.rb +10 -0
  229. data/lib/freight_kit/carriers/pacific_states_truck_lines.rb +10 -0
  230. data/lib/freight_kit/carriers/paradise_distributing.rb +10 -0
  231. data/lib/freight_kit/carriers/paramount_freight_systems.rb +10 -0
  232. data/lib/freight_kit/carriers/peninsula_truck_lines.rb +222 -0
  233. data/lib/freight_kit/carriers/pg_transport.rb +10 -0
  234. data/lib/freight_kit/carriers/pgs_360.rb +10 -0
  235. data/lib/freight_kit/carriers/pilot_freight_services.rb +10 -0
  236. data/lib/freight_kit/carriers/pious_trans.rb +27 -0
  237. data/lib/freight_kit/carriers/pitt_ohio_express.rb +30 -0
  238. data/lib/freight_kit/carriers/pki_logistics.rb +12 -0
  239. data/lib/freight_kit/carriers/plana_transportation.rb +28 -0
  240. data/lib/freight_kit/carriers/prestige.rb +10 -0
  241. data/lib/freight_kit/carriers/pro_trans_solutions.rb +28 -0
  242. data/lib/freight_kit/carriers/puma_logistics.rb +10 -0
  243. data/lib/freight_kit/carriers/pwc_international.rb +10 -0
  244. data/lib/freight_kit/carriers/quality_logistics.rb +10 -0
  245. data/lib/freight_kit/carriers/queen_star_trucking.rb +27 -0
  246. data/lib/freight_kit/carriers/r_and_l_carriers.rb +11 -0
  247. data/lib/freight_kit/carriers/rac_transport.rb +10 -0
  248. data/lib/freight_kit/carriers/re_logistics.rb +23 -0
  249. data/lib/freight_kit/carriers/reddaway.rb +11 -0
  250. data/lib/freight_kit/carriers/reefer_van_network.rb +13 -0
  251. data/lib/freight_kit/carriers/refrigerated_trucking_and_ltl_transportation_services.rb +10 -0
  252. data/lib/freight_kit/carriers/ridgeline_express.rb +10 -0
  253. data/lib/freight_kit/carriers/rist_transport.rb +29 -0
  254. data/lib/freight_kit/carriers/river_city_transport.rb +10 -0
  255. data/lib/freight_kit/carriers/roadrunner_transportation_services.rb +675 -0
  256. data/lib/freight_kit/carriers/roadtex.rb +13 -0
  257. data/lib/freight_kit/carriers/ronald_transport_services.rb +10 -0
  258. data/lib/freight_kit/carriers/rose_trucking.rb +24 -0
  259. data/lib/freight_kit/carriers/rp_and_j_transport.rb +24 -0
  260. data/lib/freight_kit/carriers/rpm_transportation.rb +11 -0
  261. data/lib/freight_kit/carriers/rude_transportation.rb +30 -0
  262. data/lib/freight_kit/carriers/s_and_s_logistics.rb +10 -0
  263. data/lib/freight_kit/carriers/saia.rb +470 -361
  264. data/lib/freight_kit/carriers/sb_transportation.rb +27 -0
  265. data/lib/freight_kit/carriers/schneider_national.rb +29 -0
  266. data/lib/freight_kit/carriers/schwarz_trucking.rb +10 -0
  267. data/lib/freight_kit/carriers/sewell_motor_express.rb +29 -0
  268. data/lib/freight_kit/carriers/shawnee_trucking.rb +28 -0
  269. data/lib/freight_kit/carriers/shi_logistics.rb +10 -0
  270. data/lib/freight_kit/carriers/sinbad_transport.rb +10 -0
  271. data/lib/freight_kit/carriers/skyway.rb +10 -0
  272. data/lib/freight_kit/carriers/smith_cargo_transportation_services.rb +23 -0
  273. data/lib/freight_kit/carriers/sna_transportation.rb +10 -0
  274. data/lib/freight_kit/carriers/solid_group.rb +10 -0
  275. data/lib/freight_kit/carriers/solution_carrier_express.rb +10 -0
  276. data/lib/freight_kit/carriers/southeastern_freight_lines.rb +450 -0
  277. data/lib/freight_kit/carriers/southwestern_motor_transport.rb +30 -0
  278. data/lib/freight_kit/carriers/span_alaska.rb +10 -0
  279. data/lib/freight_kit/carriers/specialize_transportation.rb +27 -0
  280. data/lib/freight_kit/carriers/ssi_refrigerated_express.rb +10 -0
  281. data/lib/freight_kit/carriers/standard_forwarding_llc.rb +28 -0
  282. data/lib/freight_kit/carriers/star_american_enterprise.rb +10 -0
  283. data/lib/freight_kit/carriers/sterling_transportation.rb +10 -0
  284. data/lib/freight_kit/carriers/stg.rb +163 -0
  285. data/lib/freight_kit/carriers/supervan_service.rb +10 -0
  286. data/lib/freight_kit/carriers/sutton_transport_inc.rb +12 -0
  287. data/lib/freight_kit/carriers/swift_transportation.rb +28 -0
  288. data/lib/freight_kit/carriers/t_force_worldwide.rb +617 -0
  289. data/lib/freight_kit/carriers/tax_airfreight_inc.rb +35 -0
  290. data/lib/freight_kit/carriers/tforce_freight_inc.rb +30 -0
  291. data/lib/freight_kit/carriers/the_custom_companies.rb +162 -0
  292. data/lib/freight_kit/carriers/thk_trucking.rb +28 -0
  293. data/lib/freight_kit/carriers/tiger_cool_express.rb +11 -0
  294. data/lib/freight_kit/carriers/tili_logistics.rb +10 -0
  295. data/lib/freight_kit/carriers/tmt_industries.rb +10 -0
  296. data/lib/freight_kit/carriers/top_ten_express.rb +28 -0
  297. data/lib/freight_kit/carriers/total_quality_logistics.rb +338 -0
  298. data/lib/freight_kit/carriers/total_transportation.rb +258 -0
  299. data/lib/freight_kit/carriers/trans_international_trucking.rb +29 -0
  300. data/lib/freight_kit/carriers/treasure_transportation.rb +10 -0
  301. data/lib/freight_kit/carriers/tri_state_services.rb +10 -0
  302. data/lib/freight_kit/carriers/tritex_freighters.rb +10 -0
  303. data/lib/freight_kit/carriers/triways.rb +10 -0
  304. data/lib/freight_kit/carriers/tsi_kansas.rb +29 -0
  305. data/lib/freight_kit/carriers/u_and_r_transportation.rb +23 -0
  306. data/lib/freight_kit/carriers/union_pacific.rb +11 -0
  307. data/lib/freight_kit/carriers/united_freight_logistics.rb +10 -0
  308. data/lib/freight_kit/carriers/unlimited_distance_transportation.rb +10 -0
  309. data/lib/freight_kit/carriers/up_streamline.rb +10 -0
  310. data/lib/freight_kit/carriers/ups_freight.rb +12 -0
  311. data/lib/freight_kit/carriers/us_freightways.rb +10 -0
  312. data/lib/freight_kit/carriers/usa_truck.rb +28 -0
  313. data/lib/freight_kit/carriers/usf_holland.rb +11 -0
  314. data/lib/freight_kit/carriers/valley_cartage.rb +11 -0
  315. data/lib/freight_kit/carriers/vc_transport.rb +10 -0
  316. data/lib/freight_kit/carriers/vision_express.rb +11 -0
  317. data/lib/freight_kit/carriers/vision_logistics_group.rb +10 -0
  318. data/lib/freight_kit/carriers/vmg_transportation_group.rb +10 -0
  319. data/lib/freight_kit/carriers/volpe_express.rb +10 -0
  320. data/lib/freight_kit/carriers/ward_trucking.rb +29 -0
  321. data/lib/freight_kit/carriers/wdwb.rb +10 -0
  322. data/lib/freight_kit/carriers/western_flyer_express.rb +28 -0
  323. data/lib/freight_kit/carriers/western_regional_delivery_service.rb +271 -0
  324. data/lib/freight_kit/carriers/western_specialized_trucking.rb +22 -0
  325. data/lib/freight_kit/carriers/win_distribution.rb +28 -0
  326. data/lib/freight_kit/carriers/wlb_transport.rb +10 -0
  327. data/lib/freight_kit/carriers/x_trux.rb +29 -0
  328. data/lib/freight_kit/carriers/xpo_logistics.rb +427 -0
  329. data/lib/freight_kit/carriers/xpress_global_systems.rb +30 -0
  330. data/lib/freight_kit/carriers/xylo_trucking.rb +10 -0
  331. data/lib/freight_kit/carriers/yrc_freight.rb +24 -0
  332. data/lib/freight_kit/carriers/zentner_transportation.rb +28 -0
  333. data/lib/freight_kit/carriers.rb +331 -34
  334. data/lib/freight_kit/countries.rb +22 -0
  335. data/lib/freight_kit/error.rb +0 -2
  336. data/lib/freight_kit/errors/document_not_found_error.rb +0 -2
  337. data/lib/freight_kit/errors/expired_credentials_error.rb +0 -2
  338. data/lib/freight_kit/errors/http_error.rb +0 -2
  339. data/lib/freight_kit/errors/invalid_credentials_error.rb +0 -2
  340. data/lib/freight_kit/errors/response_error.rb +0 -2
  341. data/lib/freight_kit/errors/shipment_not_found_error.rb +0 -2
  342. data/lib/freight_kit/errors/unserviceable_accessorials_error.rb +2 -4
  343. data/lib/freight_kit/errors/unserviceable_error.rb +0 -2
  344. data/lib/freight_kit/helpers/documentable.rb +0 -2
  345. data/lib/freight_kit/helpers/pickupable.rb +3 -5
  346. data/lib/freight_kit/helpers/rateable.rb +0 -2
  347. data/lib/freight_kit/helpers/trackable.rb +0 -2
  348. data/lib/freight_kit/http_client/cache_store.rb +2 -4
  349. data/lib/freight_kit/http_client/log_device.rb +0 -2
  350. data/lib/freight_kit/http_client/response.rb +0 -2
  351. data/lib/freight_kit/http_client/revalidation.rb +0 -2
  352. data/lib/freight_kit/http_client/safe_retries.rb +0 -2
  353. data/lib/freight_kit/http_client/zstd.rb +2 -4
  354. data/lib/freight_kit/http_client.rb +8 -12
  355. data/lib/freight_kit/model.rb +1 -3
  356. data/lib/freight_kit/models/address.rb +15 -0
  357. data/lib/freight_kit/models/contact.rb +3 -4
  358. data/lib/freight_kit/models/country.rb +20 -0
  359. data/lib/freight_kit/models/credential.rb +14 -16
  360. data/lib/freight_kit/models/date_time.rb +0 -2
  361. data/lib/freight_kit/models/document_response.rb +0 -2
  362. data/lib/freight_kit/models/label.rb +0 -2
  363. data/lib/freight_kit/models/location.rb +10 -25
  364. data/lib/freight_kit/models/pickup_response.rb +0 -2
  365. data/lib/freight_kit/models/price.rb +0 -2
  366. data/lib/freight_kit/models/rate.rb +0 -2
  367. data/lib/freight_kit/models/rate_response.rb +0 -2
  368. data/lib/freight_kit/models/region.rb +19 -0
  369. data/lib/freight_kit/models/response.rb +0 -2
  370. data/lib/freight_kit/models/shipment.rb +4 -6
  371. data/lib/freight_kit/models/shipment_event.rb +0 -2
  372. data/lib/freight_kit/models/terminal.rb +10 -0
  373. data/lib/freight_kit/models/tracking_response.rb +0 -2
  374. data/lib/freight_kit/package.rb +51 -53
  375. data/lib/freight_kit/package_item.rb +14 -14
  376. data/lib/freight_kit/packaging.rb +21 -26
  377. data/lib/freight_kit/platform.rb +0 -32
  378. data/lib/freight_kit/platforms/carrier_logistics.rb +331 -345
  379. data/lib/freight_kit/platforms/next_tms.rb +93 -0
  380. data/lib/freight_kit/platforms/the_great_information_factory.rb +500 -425
  381. data/lib/freight_kit/regions.rb +27 -0
  382. data/lib/freight_kit/shipment_packer.rb +36 -38
  383. data/lib/freight_kit/tariff/overlength_rule.rb +1 -5
  384. data/lib/freight_kit/tariff.rb +0 -2
  385. data/lib/freight_kit.rb +84 -11
  386. metadata +361 -51
  387. data/configuration/carriers/abfs.yml +0 -124
  388. data/configuration/carriers/btvp.yml +0 -84
  389. data/configuration/carriers/ccyq.yml +0 -121
  390. data/configuration/carriers/clni.yml +0 -113
  391. data/configuration/carriers/cnwy.yml +0 -113
  392. data/configuration/carriers/ctbv.yml +0 -117
  393. data/configuration/carriers/dcha.yml +0 -105
  394. data/configuration/carriers/dlds.yml +0 -111
  395. data/configuration/carriers/dphe.yml +0 -130
  396. data/configuration/carriers/drrq.yml +0 -131
  397. data/configuration/carriers/fcsy.yml +0 -102
  398. data/configuration/carriers/fwda.yml +0 -137
  399. data/configuration/carriers/jfj_transportation.yml +0 -2
  400. data/configuration/carriers/mtvl.yml +0 -12
  401. data/configuration/carriers/numk.yml +0 -14
  402. data/configuration/carriers/otcl.yml +0 -124
  403. data/configuration/carriers/pens.yml +0 -22
  404. data/configuration/carriers/rdfs.yml +0 -142
  405. data/configuration/carriers/saia.yml +0 -129
  406. data/configuration/carriers/sefl.yml +0 -115
  407. data/configuration/carriers/totl.yml +0 -111
  408. data/configuration/carriers/tqyl.yml +0 -28
  409. data/configuration/carriers/wrds.yml +0 -20
  410. data/configuration/platforms/carrier_logistics.yml +0 -25
  411. data/configuration/platforms/next.yml +0 -12
  412. data/configuration/platforms/the_great_information_factory.yml +0 -122
  413. data/lib/freight_kit/carriers/abfs.rb +0 -421
  414. data/lib/freight_kit/carriers/btvp.rb +0 -29
  415. data/lib/freight_kit/carriers/ccyq.rb +0 -310
  416. data/lib/freight_kit/carriers/clni.rb +0 -396
  417. data/lib/freight_kit/carriers/cnwy.rb +0 -327
  418. data/lib/freight_kit/carriers/ctbv.rb +0 -53
  419. data/lib/freight_kit/carriers/dcha.rb +0 -76
  420. data/lib/freight_kit/carriers/dlds.rb +0 -49
  421. data/lib/freight_kit/carriers/dphe.rb +0 -472
  422. data/lib/freight_kit/carriers/drrq.rb +0 -580
  423. data/lib/freight_kit/carriers/fcsy.rb +0 -57
  424. data/lib/freight_kit/carriers/fwda.rb +0 -744
  425. data/lib/freight_kit/carriers/mtvl.rb +0 -34
  426. data/lib/freight_kit/carriers/numk.rb +0 -58
  427. data/lib/freight_kit/carriers/otcl.rb +0 -520
  428. data/lib/freight_kit/carriers/pens.rb +0 -204
  429. data/lib/freight_kit/carriers/rdfs.rb +0 -521
  430. data/lib/freight_kit/carriers/sefl.rb +0 -342
  431. data/lib/freight_kit/carriers/totl.rb +0 -172
  432. data/lib/freight_kit/carriers/tqyl.rb +0 -337
  433. data/lib/freight_kit/carriers/wrds.rb +0 -246
  434. data/lib/freight_kit/platforms/next.rb +0 -101
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FreightKit
4
- class MTVL < TheGreatInformationFactory
5
- class << self
6
- def maximum_height
7
- Measured::Length.new(105, :inches)
8
- end
9
-
10
- def maximum_weight
11
- Measured::Weight.new(10_000, :pounds)
12
- end
13
-
14
- def minimum_length_for_overlength_fees
15
- Measured::Length.new(8, :feet)
16
- end
17
- end
18
-
19
- REACTIVE_FREIGHT_CARRIER = true
20
-
21
- class << self
22
- attr_reader :name, :scac
23
- end
24
- @name = 'GLS Freight'
25
- @scac = 'MTVL'
26
-
27
- def build_soap_header
28
- soap_header = super
29
- soap_header[:password] = soap_header[:password]&.downcase
30
-
31
- soap_header
32
- end
33
- end
34
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FreightKit
4
- class NUMK < TheGreatInformationFactory
5
- class << self
6
- def maximum_height
7
- Measured::Length.new(105, :inches)
8
- end
9
-
10
- def maximum_weight
11
- Measured::Weight.new(10_000, :pounds)
12
- end
13
-
14
- def minimum_length_for_overlength_fees
15
- Measured::Length.new(4, :ft)
16
- end
17
-
18
- def overlength_fees_require_tariff?
19
- false
20
- end
21
-
22
- def requirements
23
- %i[credentials]
24
- end
25
- end
26
-
27
- include FreightKit::Documentable
28
-
29
- REACTIVE_FREIGHT_CARRIER = true
30
-
31
- class << self
32
- attr_reader :name, :scac
33
- end
34
- @name = 'Numark Transportation'
35
- @scac = 'NUMK'
36
-
37
- def build_calculated_accessorials(packages)
38
- longest_dimension = packages.map { |package| [package.length(:in), package.width(:in)].max }.max.ceil
39
-
40
- return ['OVER'] if longest_dimension > 48
41
-
42
- []
43
- end
44
-
45
- def build_soap_header
46
- soap_header = super
47
- soap_header[:password] = soap_header[:password]&.downcase
48
-
49
- soap_header
50
- end
51
-
52
- protected
53
-
54
- def wrap_request(request)
55
- { 'args0' => request }
56
- end
57
- end
58
- end
@@ -1,520 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FreightKit
4
- class OTCL < FreightKit::Carrier
5
- class << self
6
- def find_rates_with_declared_value?
7
- true
8
- end
9
-
10
- def maximum_height
11
- Measured::Length.new(105, :inches)
12
- end
13
-
14
- def maximum_weight
15
- Measured::Weight.new(150, :pounds)
16
- end
17
-
18
- def minimum_length_for_overlength_fees
19
- Measured::Length.new(6, :feet)
20
- end
21
-
22
- def overlength_fees_require_tariff?
23
- false
24
- end
25
-
26
- def pickup_number_is_tracking_number?
27
- true
28
- end
29
-
30
- def required_credential_types
31
- %i[api_key]
32
- end
33
-
34
- def requirements
35
- %i[credentials]
36
- end
37
- end
38
-
39
- REACTIVE_FREIGHT_CARRIER = true
40
-
41
- class << self
42
- attr_reader :name, :scac
43
- end
44
- @name = 'OnTrac'
45
- @scac = 'OTCL'
46
-
47
- XML_HEADERS = {
48
- Accept: 'application/xml',
49
- charset: 'utf-8',
50
- 'Content-Type': 'application/xml'
51
- }.freeze
52
-
53
- # Override Carrier#serviceable_accessorials? since we have separate delivery/pickup accessorials
54
- def serviceable_accessorials?(accessorials)
55
- return true if accessorials.blank?
56
-
57
- if !self.class::REACTIVE_FREIGHT_CARRIER ||
58
- !@conf.dig(:accessorials, :mappable) ||
59
- !@conf.dig(:accessorials, :unquotable) ||
60
- !@conf.dig(:accessorials, :unserviceable)
61
- raise NotImplementedError, "#{self.class.name}: #serviceable_accessorials? not supported"
62
- end
63
-
64
- serviceable_accessorials = @conf.dig(:accessorials, :mappable).keys +
65
- @conf.dig(:accessorials, :unquotable)
66
- serviceable_count = (serviceable_accessorials & accessorials).size
67
-
68
- unserviceable_accessorials = @conf.dig(:accessorials, :unserviceable)
69
- unserviceable_count = (unserviceable_accessorials & accessorials).size
70
-
71
- if serviceable_count != accessorials.size || !unserviceable_count.zero?
72
- raise FreightKit::UnserviceableError, "#{self.class.name}: Some accessorials unserviceable"
73
- end
74
-
75
- true
76
- end
77
-
78
- # Documents
79
-
80
- # Pickups
81
-
82
- def create_pickup(
83
- delivery_from:,
84
- delivery_to:,
85
- dispatcher:,
86
- pickup_from:,
87
- pickup_to:,
88
- scac:,
89
- service:,
90
- shipment:
91
- )
92
- request = build_shipment_request(
93
- delivery_from:,
94
- delivery_to:,
95
- dispatcher:,
96
- pickup_from:,
97
- pickup_to:,
98
- scac:,
99
- service:,
100
- shipment:,
101
- )
102
-
103
- labels = parse_shipment_response(commit(request))
104
-
105
- request = build_pickup_request(
106
- delivery_from:,
107
- delivery_to:,
108
- dispatcher:,
109
- pickup_from:,
110
- pickup_to:,
111
- scac:,
112
- service:,
113
- shipment:,
114
- )
115
-
116
- parse_pickup_response(response: commit(request), labels:)
117
- end
118
-
119
- # Rates
120
-
121
- def find_rates(shipment:)
122
- begin
123
- validate_packages(shipment.packages)
124
- rescue UnserviceableError => e
125
- return RateResponse.new(error: e)
126
- end
127
-
128
- request = build_rate_request(shipment:)
129
- parse_rate_response(shipment:, response: commit(request))
130
- end
131
-
132
- # Tracking
133
-
134
- protected
135
-
136
- def build_url(action, options = {})
137
- api_credentials = fetch_credential(:api_key)
138
-
139
- env = @test_mode ? :test : :production
140
-
141
- url = "https://#{@conf.dig(:api, :domain)}#{@conf.dig(:api, :endpoints, env, action)}"
142
- url = url.gsub('%ACCOUNT_NUMBER%', api_credentials.account)
143
-
144
- url += "?pw=#{api_credentials.api_key}"
145
- url << "&#{options[:params]}" if options[:params].present?
146
-
147
- url
148
- end
149
-
150
- def build_request(action, options = {})
151
- request = {
152
- url: build_url(action, options),
153
- headers: XML_HEADERS,
154
- method: @conf.dig(:api, :methods, action)
155
- }
156
-
157
- save_request(request)
158
- request
159
- end
160
-
161
- def commit(request)
162
- body = request[:body]
163
- headers = request[:headers]
164
- method = request[:method]
165
- url = request[:url]
166
-
167
- response = case method
168
- when :post
169
- HTTPClient.post(url, headers:, body:)
170
- else
171
- HTTPClient.get(url, headers:)
172
- end
173
-
174
- response.parsed_response if response&.parsed_response
175
- end
176
-
177
- def serviceable_states?(states)
178
- valid_states = ['AZ', 'CA', 'CO', 'ID', 'NV', 'OR', 'UT', 'WA']
179
-
180
- invalid_states = []
181
- states.each do |state|
182
- invalid_states << state if valid_states.exclude?(state)
183
- end
184
-
185
- return true if invalid_states.blank?
186
-
187
- raise FreightKit::UnserviceableError, "No service to #{invalid_states.join(", ")}"
188
- end
189
-
190
- # Documents
191
-
192
- # Pickups
193
-
194
- def build_pickup_request(
195
- delivery_from:,
196
- delivery_to:,
197
- dispatcher:,
198
- pickup_from:,
199
- pickup_to:,
200
- scac:,
201
- service:,
202
- shipment:
203
- )
204
- dispatcher_phone = dispatcher.phone.sub('+1', '').delete('^0-9')
205
-
206
- raise UnserviceableError, 'Palletized freight unsupported' unless shipment.loose?
207
-
208
- request_body = {
209
- Address: shipment.origin.address1,
210
- City: shipment.origin.city,
211
- CloseAt: pickup_to.strftime('%H:%M:00'),
212
- Contact: shipment.origin.contact.name || 'Shipping',
213
- Date: pickup_from.to_date,
214
- DelZip: shipment.destination.postal_code,
215
- Instructions: '',
216
- Name: shipment.origin.contact.company_name,
217
- Phone: dispatcher_phone,
218
- ReadyAt: pickup_from.strftime('%H:%M:00'),
219
- State: shipment.origin.province,
220
- Zip: shipment.origin.postal_code
221
- }.freeze
222
-
223
- request = {
224
- headers: XML_HEADERS,
225
- method: @conf.dig(:api, :methods, :pickups),
226
- url: build_url(:pickups),
227
- body: request_body.to_xml(root: 'OnTracPickupRequest', skip_types: true)
228
- }
229
-
230
- save_request(request)
231
- request
232
- end
233
-
234
- def build_shipment_request(
235
- delivery_from:,
236
- delivery_to:,
237
- dispatcher:,
238
- pickup_from:,
239
- pickup_to:,
240
- scac:,
241
- service:,
242
- shipment:
243
- )
244
- dispatcher_phone = dispatcher.phone.sub('+1', '').delete('^0-9')
245
- receiver_phone = shipment.destination.contact.phone.sub('+1', '').delete('^0-9')
246
-
247
- declared_value = if shipment.declared_value_cents.blank?
248
- '0'
249
- else
250
- format('%.2f', (shipment.declared_value_cents.to_f / 100).ceil)
251
- end
252
-
253
- raise UnserviceableError, 'Palletized freight unsupported' unless shipment.loose?
254
-
255
- base_api_shipment = {
256
- consignee: {
257
- Name: shipment.destination.contact.company_name,
258
- Addr1: shipment.destination.address1,
259
- Addr2: '',
260
- Addr3: '',
261
- City: shipment.destination.city,
262
- Contact: shipment.destination.contact.name || 'Shipping',
263
- Phone: receiver_phone || '',
264
- State: shipment.destination.province,
265
- Zip: shipment.destination.postal_code.to_s
266
- },
267
- shipper: {
268
- Name: shipment.origin.contact.company_name,
269
- Addr1: shipment.origin.address1,
270
- City: shipment.origin.city,
271
- State: shipment.origin.province,
272
- Zip: shipment.origin.postal_code,
273
- Contact: shipment.origin.contact.name || 'Shipping',
274
- Phone: dispatcher_phone
275
- },
276
- BillTo: '0',
277
- CargoType: '0',
278
- COD: '0',
279
- CODType: 'NONE',
280
- Declared: declared_value,
281
- DelEmail: dispatcher.email,
282
- Instructions: '',
283
- LabelType: '1', # PDF label
284
- Reference: shipment.order_number,
285
- Reference2: shipment.po_number,
286
- Reference3: '',
287
- Residential: shipment.accessorials.include?(:residential_delivery) ? 'true' : 'false',
288
- SaturdayDel: 'false',
289
- Service: 'C',
290
- ShipDate: pickup_from.to_date.to_s,
291
- ShipEmail: dispatcher.email,
292
- SignatureRequired: 'true',
293
- Tracking: ''
294
- }.freeze
295
-
296
- api_shipments = []
297
-
298
- shipment.packages.each do |package|
299
- package.quantity.times do
300
- api_shipments << base_api_shipment.merge(
301
- {
302
- DIM: {
303
- Length: package.length(:inches).ceil,
304
- Width: package.width(:inches).ceil,
305
- Height: package.height(:inches).ceil
306
- },
307
- UID: SecureRandom.uuid,
308
- Weight: package.pounds(:each).ceil
309
- },
310
- )
311
- end
312
- end
313
-
314
- request = {
315
- headers: XML_HEADERS,
316
- method: @conf.dig(:api, :methods, :shipments),
317
- url: build_url(:shipments),
318
- body: {
319
- Shipments: api_shipments
320
- }.to_xml(root: 'OnTracShipmentRequest', skip_types: true)
321
- }
322
-
323
- save_request(request)
324
- request
325
- end
326
-
327
- def parse_pickup_response(response:, labels:)
328
- pickup_response = PickupResponse.new(request: last_request, response:)
329
-
330
- if response.blank?
331
- pickup_response.error = FreightKit::ResponseError.new('API Error: Blank response')
332
- return pickup_response
333
- end
334
-
335
- error = response.dig('OnTracPickupResponse', 'Error')
336
-
337
- if error.present?
338
- pickup_response.error = FreightKit::ResponseError.new(error.capitalize)
339
- return pickup_response
340
- end
341
-
342
- pickup_number = response.dig('OnTracPickupResponse', 'Tracking')
343
-
344
- if pickup_number.blank?
345
- pickup_response.error = FreightKit::ResponseError.new('Blank pickup number')
346
- return pickup_response
347
- end
348
-
349
- pickup_response.pickup_number = pickup_number
350
- pickup_response
351
- end
352
-
353
- def parse_shipment_response(response)
354
- raise FreightKit::ResponseError, 'API Error: Blank response' if response.blank?
355
-
356
- error = response.dig('OnTracShipmentResponse', 'Shipments', 'Error')
357
-
358
- if error.blank? && response.dig('OnTracShipmentResponse', 'Shipments', 'Shipment').is_a?(Hash)
359
- error = response.dig('OnTracShipmentResponse', 'Shipments', 'Shipment', 'Error')
360
- end
361
-
362
- if error.present?
363
- error = error.capitalize
364
-
365
- raise FreightKit::InvalidCredentialsError, error if error.downcase.include?('invalid username')
366
-
367
- raise FreightKit::UnserviceableError, error if error.downcase.include?('no valid service')
368
-
369
- raise FreightKit::UnserviceableError, error if error.downcase.include?('not serviced')
370
-
371
- raise FreightKit::ResponseError, "API Error: #{error}"
372
- end
373
-
374
- api_shipments = response.dig('OnTracShipmentResponse', 'Shipments', 'Shipment')
375
- api_shipments = [api_shipments] unless api_shipments.is_a?(Array)
376
-
377
- base64_labels = api_shipments&.map { |s| s['Label'] }
378
- raise FreightKit::ResponseError, 'API Error: Blank label' if base64_labels.blank?
379
-
380
- base64_labels.map { |base64_label| Label.new(data: base64_label) }
381
- end
382
-
383
- # Rates
384
-
385
- def build_rate_request(shipment:)
386
- serviceable_accessorials?(shipment.accessorials)
387
- serviceable_states?([shipment.origin.province, shipment.destination.province])
388
-
389
- # API supports non-loose items (see below) but per OnTrac it shouldn't be quoted. We'll raise an error here but
390
- # leave the support baked-in below anyway.
391
- raise FreightKit::UnserviceableError, 'Palletized freight unsupported' unless shipment.loose?
392
-
393
- dim_weights_too_heavy = shipment.packages.map(&:dim_weight).select { |w| w > self.class.maximum_weight.value }
394
-
395
- if dim_weights_too_heavy.any?
396
- message = <<~MESSAGE.squish
397
- Dimensional weight(s) of #{dim_weights_too_heavy.map(&:round).join("lbs, ")} lbs more than maximum of
398
- #{self.class.maximum_weight.value.round} lbs
399
- MESSAGE
400
- raise FreightKit::UnserviceableError, message
401
- end
402
-
403
- params = ''.dup
404
- params << 'packages='
405
-
406
- total_weight = shipment.packages.map { |p| p.pounds(:total) }.sum
407
-
408
- i = 1
409
- package_param_parts = []
410
-
411
- shipment.packages.each do |package|
412
- package.quantity.times do
413
- declared_value = if shipment.declared_value_cents.blank?
414
- 0
415
- else
416
- shipment.declared_value_cents.to_f * (package.pounds(:each) / total_weight)
417
- end
418
-
419
- declared_value = declared_value.to_s
420
-
421
- parts = []
422
-
423
- parts << "ID#{i}"
424
- parts << shipment.origin.postal_code
425
- parts << shipment.destination.postal_code
426
- parts << shipment.accessorials.include?(:residential_delivery).to_s
427
- parts << '0'
428
- parts << 'false' # Staurday delivery
429
- parts << declared_value
430
- parts << package.pounds(:each).ceil
431
- parts << "#{package.inches(:length).ceil}X#{package.inches(:width).ceil}X#{package.inches(:height).ceil}"
432
- parts << 'C'
433
- parts << '0' # not a letter
434
- parts << '0' # always 0 per documentation
435
-
436
- package_param_parts << parts.join(';')
437
- end
438
- end
439
-
440
- params << package_param_parts.join(',')
441
-
442
- build_request(:rates, { params: })
443
- end
444
-
445
- def parse_rate_response(shipment:, response:)
446
- rate_response = RateResponse.new(request: last_request, response:)
447
-
448
- if response.blank?
449
- rate_response.error = ResponseError.new('Blank response')
450
- return rate_response
451
- end
452
-
453
- error = response.dig('OnTracRateResponse', 'Shipments', 'Shipment', 'Error') ||
454
- response.dig('OnTracRateResponse', 'Shipments', 'Error') ||
455
- response.dig('OnTracRateResponse', 'Error')
456
-
457
- if error.blank? && response.dig('OnTracRateResponse', 'Shipments', 'Shipment').is_a?(Hash)
458
- error = response.dig('OnTracRateResponse', 'Shipments', 'Shipment', 'Rates', 'Rate', 'Error')
459
- end
460
-
461
- if error.present?
462
- case error.downcase
463
- when ->(value) { value.include?('not serviced') }
464
- rate_response.error = UnserviceableError.new(error)
465
- return rate_response
466
- when ->(value) { value.include?('invalid username') }
467
- rate_response.error = InvalidCredentialsError.new(error)
468
- return rate_response
469
- when ->(value) { value.include?('no valid service') }
470
- rate_response.error = UnserviceableError.new(error)
471
- return rate_response
472
- end
473
-
474
- rate_response.error = ResponseError.new(error)
475
- return rate_response
476
- end
477
-
478
- prices = []
479
- transit_days = nil
480
-
481
- api_shipments = response.dig('OnTracRateResponse', 'Shipments', 'Shipment')
482
- api_shipments = [api_shipments] unless api_shipments.is_a?(Array)
483
-
484
- if api_shipments.any? { |api_shipment| api_shipment['Error']&.downcase&.include?('not serviced') }
485
- rate_response.error = UnserviceableError.new
486
- return rate_response
487
- end
488
-
489
- api_shipments.each do |api_shipment|
490
- api_rate = api_shipment.dig('Rates', 'Rate')
491
- api_transit_days = api_rate['TransitDays'].to_i
492
-
493
- transit_days = api_transit_days if transit_days.blank? || transit_days < api_transit_days
494
-
495
- cents = (api_rate['ServiceCharge'].to_f * 100).to_i
496
- prices << Price.new(blame: :api, cents:, description: 'Service charge')
497
-
498
- cents = (api_rate['FuelCharge'].to_f * 100).to_i
499
- prices << Price.new(blame: :api, cents:, description: 'Fuel charge')
500
- end
501
-
502
- rate = Rate.new(
503
- carrier_name: self.class.name,
504
- carrier: self,
505
- currency: 'USD',
506
- prices:,
507
- scac: self.class.scac.upcase,
508
- service_name: :standard,
509
- shipment:,
510
- transit_days:,
511
- with_excessive_length_fees: @conf.dig(:attributes, :rates, :with_excessive_length_fees),
512
- )
513
-
514
- rate_response.rates = [rate]
515
- rate_response
516
- end
517
-
518
- # Tracking
519
- end
520
- end