Class: Calculator::Shipping::TntMercurioBaseCalculator
- Inherits:
-
Spree::ShippingCalculator
- Object
- Spree::ShippingCalculator
- Calculator::Shipping::TntMercurioBaseCalculator
- Defined in:
- app/models/spree/calculator/shipping/tnt_mercurio_base_calculator.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#delivery_time ⇒ Object
readonly
Returns the value of attribute delivery_time.
Instance Method Summary collapse
- #compute_package(object) ⇒ Object
-
#try_calculate_from_orders(zipcode, weight) ⇒ Object
Tenta buscar um pedido feito para o mesmo CEP de entrega e que tenha um peso parecido (diferenca de 1kg para mais ou menos) para recuperar o valor do frete e o tempo de entrega.
Instance Attribute Details
#delivery_time ⇒ Object (readonly)
Returns the value of attribute delivery_time.
4 5 6 |
# File 'app/models/spree/calculator/shipping/tnt_mercurio_base_calculator.rb', line 4 def delivery_time @delivery_time end |
Instance Method Details
#compute_package(object) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'app/models/spree/calculator/shipping/tnt_mercurio_base_calculator.rb', line 6 def compute_package(object) return if object.nil? order = if object.is_a?(Spree::Order) then object else object.order end stock_location = object.stock_location cgc_customer = order.user.attributes[Spree::TntMercurioConfig.customer_field] cgc_type = if cgc_customer.delete('.').delete('-').size <= 11 then 'F' else 'J' end zipcode_from = stock_location.zipcode.gsub(/[.-]/i, '') zipcode_to = order.ship_address.zipcode.gsub(/[.-]/i, '') params = {in0: {login: Spree::TntMercurioConfig.email, senha: Spree::TntMercurioConfig.password, nr_identif_cliente_rem: Spree::TntMercurioConfig.cgc, nr_inscricao_estadual_remetente: Spree::TntMercurioConfig.state_registry, nr_identif_cliente_dest: cgc_customer, tp_situacao_tributaria_remetente: Spree::TntMercurioConfig.tax_situation, tp_pessoa_remetente: Spree::TntMercurioConfig.type_cgc, tp_pessoa_destinatario: cgc_type, tp_situacao_tributaria_destinatario: 'NC', cep_origem: zipcode_from, cep_destino: zipcode_to, vl_mercadoria: order.amount.to_s, ps_real: object.weight.to_s, tp_servico: shipping_method, tp_frete: Spree::TntMercurioConfig.billet_type, cd_divisao_cliente: Spree::TntMercurioConfig.division}} client = Savon.client(wsdl: 'http://ws.tntbrasil.com.br/servicos/CalculoFrete?wsdl') response = client.call(:calcula_frete, message: params).body @delivery_time = response[:calcula_frete_response][:out][:prazo_entrega].to_i + Spree::TntMercurioConfig.additional_days cost = response[:calcula_frete_response][:out][:vl_total_frete].to_f + Spree::TntMercurioConfig.additional_value {cost: cost, delivery_time: @delivery_time} rescue try_calculate_from_orders(zipcode_to, object.weight) end |
#try_calculate_from_orders(zipcode, weight) ⇒ Object
Tenta buscar um pedido feito para o mesmo CEP de entrega e que tenha um peso parecido (diferenca de 1kg para mais ou menos) para recuperar o valor do frete e o tempo de entrega
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'app/models/spree/calculator/shipping/tnt_mercurio_base_calculator.rb', line 49 def try_calculate_from_orders(zipcode, weight) shipping_type = "Spree::Calculator::Shipping::TntMercurio#{shipping_method}" calculator = Spree::Calculator.find_by(type: shipping_type, calculable_type: 'Spree::ShippingMethod') return {} if calculator.nil? shipping_method_id = calculator.calculable_id shipping_rates_id = Spree::ShippingRate.joins(:shipping_method).joins(shipment: :order). joins('INNER JOIN spree_addresses ON spree_addresses.id = spree_orders.ship_address_id'). where(shipping_method_id: shipping_method_id, spree_addresses: { zipcode: zipcode }). group('spree_shipping_rates.id').pluck(:id) init_value = weight - 1 final_value = weight + 1 shipping_rates_id.each do |id| shipping_rate = Spree::ShippingRate.find(id) weight = shipping_rate.shipment.to_package.weight if weight.between?(init_value, final_value) return { cost: shipping_rate.cost.to_f, delivery_time: shipping_rate.delivery_time } end end {} rescue {} end |