defmodule Banking.Fio.TransparentAccount do @moduledoc """ FIO Banka - transparent account. """ @public_accounts_url "https://www.fio.cz/bankovni-sluzby/bankovni-ucty/transparentni-ucet/vypis-transparentnich-uctu" @doc """ Fetch links to all transparent accounts. ## Examples iex> Banking.Fio.TransparentAccount.fetch_all [%{account: "2600088789", link: "https://www.fio.cz/ib2/transparent?a=2600088789", name: "A centrum - Váš průvodce těhotenstvím a rodičovstvím, o. p. s.", url: "http://www.acentrum.eu/"}, %{account: "2800396030", link: "https://www.fio.cz/ib2/transparent?a=2800396030", name: "AA - anonymní alkoholici o.s.", url: nil}, %{account: "2801230649", link: "https://www.fio.cz/ib2/transparent?a=2801230649", ...}, %{account: "2101191407", ...}, %{...}, ...] """ def fetch_all do case HTTPoison.get(@public_accounts_url) do {:ok, res} -> last = Floki.find(:iconv.convert("windows-1250", "utf-8", res.body), "div.paginator a") |> List.last {_, href, childs} = last {_, link} = List.first(href) {last_offset, _} = Regex.run(~r/.*offset=(\d+)/, link) |> List.last |> Integer.parse {last_page, _} = Floki.text(childs) |> Integer.parse per_page = round(last_offset / (last_page - 1)) 1..(last_page) |> Enum.map(fn(a) -> "https://www.fio.cz/bankovni-sluzby/bankovni-ucty/transparentni-ucet/vypis-transparentnich-uctu?offset=#{(a - 1) * per_page}" end) |> Enum.map(&Banking.Fio.TransparentAccount.fetch/1) |> List.flatten _ -> [] end end @doc """ Fetch links to transparent accounts on specified page. ## Examples iex> Banking.Fio.TransparentAccount.fetch("https://www.fio.cz/bankovni-sluzby/bankovni-ucty/transparentni-ucet/vypis-transparentnich-uctu") [%{account: "2600088789", link: "https://www.fio.cz/ib2/transparent?a=2600088789", name: "A centrum - Váš průvodce těhotenstvím a rodičovstvím, o. p. s.", url: "http://www.acentrum.eu/"}, %{account: "2800396030", link: "https://www.fio.cz/ib2/transparent?a=2800396030", name: "AA - anonymní alkoholici o.s.", url: nil}, %{account: "2801230649", link: "https://www.fio.cz/ib2/transparent?a=2801230649", ...}, %{account: "2101191407", ...}, %{...}, ...] """ def fetch(url) do case HTTPoison.get(url) do {:ok, res} -> Floki.find(:iconv.convert("windows-1250", "utf-8", res.body), "table.tbl2.tbl-sazby tbody tr") |> Enum.map(fn({_, _, e}) -> first = Enum.fetch!(e, 0) url = Floki.find(first, "a") |> Floki.attribute("href") |> List.first account = Floki.text(Enum.fetch!(e, 1)) %{ name: Floki.text(first), account: account, url: url, link: "https://www.fio.cz/ib2/transparent?a=#{account}" } end) _ -> [] end end end