module SolidusBling class Order def initialize spree_order @order = spree_order end def send @account = SolidusBling::Account.first @account.check_token BlingApi.configure { |config| config.access_token = @account.access_token } contato = customer items = products parcelas = installments observacoes_internas = internal_observations transporte = shipment id_vendedor = seller_external_id bling_order = BlingApi::Order.new( id_contato: contato.id, pessoa_juridica: @order.tax_id.length > 14, numero_documento: @order.tax_id, items: items, parcelas: parcelas, numero_loja: @order.number, data: @order.completed_at.strftime("%Y-%m-%d"), total_produtos: @order.item_total.to_f, total: @order.total.to_f, id_loja: @account.external_store_id, observacoes: "NĂºmero do pedido loja: #{@order.number}", observacoes_internas: observacoes_internas, valor_desconto: @order.adjustment_total.abs, id_categoria: @account.incoming_category_id, transporte: transporte, id_vendedor: id_vendedor ).create if bling_order @order.update(bling_order_id: bling_order.id) end end def customer contato = BlingApi::Customer.find_by_tax_id(@order.tax_id) if contato contato.update( pessoa_juridica: @order.tax_id.length > 14, numero_documento: @order.tax_id, situacao: "A", codigo: contato.codigo, vendedor: contato.vendedor, dados_adicionais: contato.dados_adicionais, financeiro: contato.financeiro, pais: contato.pais, tipos_contato: contato.tipos_contato, pessoa_contato: contato.pessoa_contato, **build_customer ) else contato = BlingApi::Customer.new( pessoa_juridica: @order.tax_id.length > 14, numero_documento: @order.tax_id, cod_contribuinte: @order.tax_id.length > 14 ? nil : "9", situacao: "A", **build_customer ).create end contato end def products @order.line_items.map do |item| product = BlingApi::Product.find_by_sku(item.sku) { id: product.id, quantidade: item.quantity, valor: item.price.to_f, produto: { id: product.id } } end.compact end def installments @parcelas = @order.payments.last.source.try(:installments) || 1 valor_parcela = @order.total.to_f / @parcelas 1.upto(@parcelas).map do |parcela| { dataVencimento: (@order.completed_at + parcela.months).strftime("%Y-%m-%d"), valor: valor_parcela, formaPagamento: { id: @account.payment_methods.find_by(spree_payment_method_id: @order.payments.last.payment_method_id).external_id } } end end def internal_observations "Pagamento: #{@parcelas}x R$ #{(@order.total.to_f / @parcelas).round(2)}" \ "\n" \ "Forma de envio: #{@order.shipments.last.selected_shipping_rate.name}" \ "\n" + build_cupons(@order.adjustments.where(source_type: "Spree::PromotionAction", eligible: true)).to_s + "\n" + build_order_url.to_s end def shipment shipping_method = @account.shipping_methods.find_by(spree_shipping_method_id: @order.shipments.last.shipping_method.id) servico = shipping_method.nil? ? "" : shipping_method.alias transportadora = shipping_method.nil? ? "" : shipping_method.company { fretePorConta: 1, frete: @order.shipment_total.to_f, quantidadeVolumes: 1, contato: { nome: transportadora }, etiqueta: { nome: @order.ship_address.name.strip, endereco: @order.ship_address.address1.strip, numero: @order.ship_address.number.strip, complemento: @order.ship_address.address2.strip, municipio: @order.ship_address.city.strip, uf: @order.ship_address.state.abbr.strip, bairro: @order.ship_address.district.strip, cep: @order.ship_address.zipcode.strip, nomePais: "Brasil" }, volumes: [ { servico: servico, codigoRastreamento: "" } ] } end def seller_external_id @order.solidus_bling_seller_id ? @account.sellers.find(@order.solidus_bling_seller_id).external_id : SolidusBling::Seller.default.external_id end def build_customer { nome: @order.bill_address.name.strip, telefone: @order.bill_address.phone.strip, email: @order.email.strip, endereco: { "endereco" => @order.bill_address.address1.strip, "cep" => @order.bill_address.zipcode.strip, "bairro" => @order.bill_address.district.strip, "municipio" => @order.bill_address.city.strip, "uf" => @order.bill_address.state.abbr.strip, "numero" => @order.bill_address.number.strip, "complemento" => @order.bill_address.address2.strip }, endereco_cobranca: { "endereco" => @order.bill_address.address1.strip, "cep" => @order.bill_address.zipcode.strip, "bairro" => @order.bill_address.district.strip, "municipio" => @order.bill_address.city.strip, "uf" => @order.bill_address.state.abbr.strip, "numero" => @order.bill_address.number.strip, "complemento" => @order.bill_address.address2.strip } } end def build_cupons cupons string_cupons = "" if !cupons.empty? string_cupons = "Cupons utilizados: #{cupons.pluck(:label).join(", ")}" end string_cupons end def build_order_url "Link para o pedido: #{@order.store.url}/pedidos/#{@order.number}" end def self.needs_approval?(order) payment_method = order.payments.valid.last&.payment_method importation_rules = SolidusBling.config.importation_rules if importation_rules order.total >= importation_rules[:amount] && importation_rules[:payment_methods].include?(payment_method&.type) else false end end end end