Current section
Files
Jump to
Current section
Files
lib/vtex_ws/products.ex
defmodule VtexWs.Products do
@moduledoc "Products possui a responsabilidade de pegar todas as informações relacionadas a um produto. São elas: Preço, Estoque e Metadados."
alias VtexWs.Services.{AppManager, Vtex}
alias VtexWs.Products.AppManagerProduct, as: Product
@doc "Retorna os metadados de um produto por SKU."
def get_by_app!(sku, app) do
%{body: body, status_code: 200} = Vtex.get_product_by_app!(sku, app)
%{
"Id" => id,
"Images" => images,
"IsActive" => is_active,
"ManufacturerCode" => manufacturer_code,
"NameComplete" => name_complete,
"ProductDescription" => product_description,
"ProductCategoryIds" => product_categories,
"AlternateIds" => alternate_ids,
"ProductSpecifications" => product_specs
} = Poison.decode!(body)
image_urls = case images do
imgs when is_list(imgs) ->
imgs
|> Enum.map(fn x -> x["ImageUrl"] end)
_ ->
[]
end
bar_codes = case product_specs do
specs when is_list(specs) ->
specs
|> Enum.filter(fn x -> match?(%{"FieldId" => 1107}, x) end)
|> Enum.flat_map(fn y -> Map.get(y, "FieldValues") end)
_ -> []
end
product_category_ids = product_categories
|> String.split("/")
|> Enum.reject(&(&1 == ""))
%Product{
sku: id,
images: image_urls,
bar_codes: bar_codes,
title: name_complete,
is_visible: is_active,
manufacturer_code: manufacturer_code,
description: product_description,
product_category_ids: product_category_ids,
metadata: %{
alternate_ids: alternate_ids
}
}
end
@doc "Retorna o preço de um produto."
def get_price_by_app!(sku, app) do
case Vtex.get_product_price_by_app!(sku, app) do
%{body: body, status_code: 200} ->
body
|> Poison.decode!
|> Enum.find(fn x -> match?(%{"salesChannel" => 1}, x) end)
|> Map.get("price")
%{body: _body, status_code: 404} -> 0
_ -> :nil
end
end
@doc "Retorna o estoque de um produto."
def get_stock_in_store_by_app!(sku, app) do
case Vtex.get_product_stock_in_store_by_app!(sku, app) do
%{body: body, status_code: 200} ->
body
|> Poison.decode!
|> Map.get("balance")
|> Enum.reduce(
0,
fn %{"totalQuantity" => total, "reservedQuantity" => reserved}, acc ->
acc + (total - reserved)
end
)
_ -> :nil
end
end
end