From bc2b2590f9a83b9bfdfb21f028f87d8b18239cd5 Mon Sep 17 00:00:00 2001 From: BrunoMartins11 Date: Fri, 29 Jan 2021 14:18:26 +0000 Subject: [PATCH 1/3] Fix add duplicate invoice (#96) --- lib/infin/invoices.ex | 9 ++++ .../controllers/invoice_controller.ex | 53 +++++++++++++------ .../controllers/invoice_controller_test.exs | 10 ++-- 3 files changed, 51 insertions(+), 21 deletions(-) diff --git a/lib/infin/invoices.ex b/lib/infin/invoices.ex index bee3e71..0e765db 100644 --- a/lib/infin/invoices.ex +++ b/lib/infin/invoices.ex @@ -40,6 +40,15 @@ defmodule Infin.Invoices do Repo.paginate(query, params) end + def invoices_by_doc_id_of_company_exist(doc_id, company_id, seller_nif) do + query = from( i in Invoice, + where: i.company_id == ^company_id and i.id_document == ^doc_id, + join: c in assoc(i, :company_seller), + where: c.nif == ^seller_nif + ) + Repo.all(query) + end + def list_company_invoices_unassociated(company_id, page_number) do Invoice |> where(company_id: ^company_id) diff --git a/lib/infin_web/controllers/invoice_controller.ex b/lib/infin_web/controllers/invoice_controller.ex index 459b12b..81aad59 100644 --- a/lib/infin_web/controllers/invoice_controller.ex +++ b/lib/infin_web/controllers/invoice_controller.ex @@ -9,7 +9,12 @@ defmodule InfinWeb.InvoiceController do def index(conn, params, company_id) do page = Invoices.list_company_invoices(company_id, params) company = Companies.get_company(company_id) - render(conn, "index.html", invoices: page.entries, company: company, page: page) + + render(conn, "index.html", + invoices: page.entries, + company: company, + page: page + ) end def new(conn, _params, company_id) do @@ -28,25 +33,37 @@ defmodule InfinWeb.InvoiceController do invoice_params = Map.replace!(invoice_params, "total_value", total_value) if invoice_params["category_id"] != nil do - Map.replace!( - invoice_params, - "category_id", - String.to_integer(invoice_params["category_id"]) - ) + Map.replace!( + invoice_params, + "category_id", + String.to_integer(invoice_params["category_id"]) + ) end invoice_params = check_for_pdf(conn, invoice_params) - case Invoices.create_invoice(invoice_params, company_id) do - {:ok, invoice} -> + if Invoices.invoices_by_doc_id_of_company_exist( + invoice_params["id_document"], + company_id, + invoice_params["company_seller"]["nif"] + ) != [] do + conn + |> put_flash(:error, "Invoice already exists") + |> redirect(to: Routes.invoice_path(conn, :index)) + else + case Invoices.create_invoice(invoice_params, company_id) do + {:ok, _invoice} -> + conn + |> put_flash(:info, "Invoice created successfully.") + |> redirect(to: Routes.invoice_path(conn, :index)) - conn - |> put_flash(:info, "Invoice created successfully.") - |> redirect(to: Routes.invoice_path(conn, :show, invoice)) + {:error, %Ecto.Changeset{} = changeset} -> + categories = + Companies.list_company_categories(company_id) + |> Enum.map(&{&1.name, &1.id}) - {:error, %Ecto.Changeset{} = changeset} -> - categories = Companies.list_company_categories(company_id) |> Enum.map(&{&1.name, &1.id}) - render(conn, "new.html", changeset: changeset, categories: categories) + render(conn, "new.html", changeset: changeset, categories: categories) + end end end @@ -59,10 +76,12 @@ defmodule InfinWeb.InvoiceController do cond do company_id == invoice.company_id -> categories = - Companies.list_company_categories(company_id) |> Enum.map(&{&1.name, &1.id}) + Companies.list_company_categories(company_id) + |> Enum.map(&{&1.name, &1.id}) invoice = Map.replace!(invoice, :tags, convert_tags_to_string(invoice.tags)) changeset = Invoices.change_invoice(invoice) + render(conn, "show.html", invoice: invoice, changeset: changeset, @@ -89,7 +108,8 @@ defmodule InfinWeb.InvoiceController do |> Decimal.round(0, :ceiling) |> Decimal.to_integer() - invoice_params = Map.replace!(invoice_params, "total_value", total_value) + invoice_params = + Map.replace!(invoice_params, "total_value", total_value) if invoice_params["category_id"] != nil do Map.replace!( @@ -131,6 +151,7 @@ defmodule InfinWeb.InvoiceController do if invoice.pdf do {:ok, _pdf} = Storage.delete_pdf(invoice.pdf) end + {:ok, _invoice} = Invoices.delete_invoice(invoice) true -> diff --git a/test/infin_web/controllers/invoice_controller_test.exs b/test/infin_web/controllers/invoice_controller_test.exs index 1285476..c2a751c 100644 --- a/test/infin_web/controllers/invoice_controller_test.exs +++ b/test/infin_web/controllers/invoice_controller_test.exs @@ -39,7 +39,8 @@ defmodule InfinWeb.InvoiceControllerTest do } @update_attrs %{id_document: "some updated id_document"} @invalid_attrs %{ - id_document: nil, + id_document: "2", + doc_emission_date: nil, total_value: "0.00", company_seller: %{ nif: "123", @@ -72,11 +73,10 @@ defmodule InfinWeb.InvoiceControllerTest do test "redirects to show when data is valid", %{conn: conn} do conn = post(conn, Routes.invoice_path(conn, :create), invoice: @create_attrs) - assert %{id: id} = redirected_params(conn) - assert redirected_to(conn) == Routes.invoice_path(conn, :show, id) + assert redirected_to(conn) == Routes.invoice_path(conn, :index) - conn = get(conn, Routes.invoice_path(conn, :show, id)) - assert html_response(conn, 200) =~ "Invoice" + conn = get(conn, Routes.invoice_path(conn, :index)) + assert html_response(conn, 200) =~ "Invoices" end test "renders errors when data is invalid", %{conn: conn} do From 69b3d74ebaa864f0050b0116b1b8279eb83f7b24 Mon Sep 17 00:00:00 2001 From: BrunoMartins11 Date: Fri, 29 Jan 2021 15:51:28 +0000 Subject: [PATCH 2/3] Disable edit company attributes in invoice (#99) --- lib/infin_web/templates/invoice/form.html.eex | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/infin_web/templates/invoice/form.html.eex b/lib/infin_web/templates/invoice/form.html.eex index 1be2208..8965147 100644 --- a/lib/infin_web/templates/invoice/form.html.eex +++ b/lib/infin_web/templates/invoice/form.html.eex @@ -49,6 +49,9 @@ <%= inputs_for f, :company_seller, fn f_company -> %>
+ <%= if contains_invoice? assigns do%> +
+ <% end %> <%= label f_company, :nif, "Emitter Tax Id", class: "label is-floating-label" %>
@@ -64,6 +67,9 @@
+ <%= if contains_invoice? assigns do%> +
+ <% end %> <%= label f_company, :name, "Emitter Name", class: "label is-floating-label" %>
From 4017b4632cb5801670ea60d5c38fa1b3a61981d1 Mon Sep 17 00:00:00 2001 From: BrunoMartins11 Date: Fri, 29 Jan 2021 16:04:23 +0000 Subject: [PATCH 3/3] Add invoices search bar (#98) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jéssica Lemos <32941964+jessicalemos@users.noreply.github.com> --- lib/infin/invoices.ex | 23 ++++++++++++++----- .../controllers/invoice_controller.ex | 14 +++++------ .../templates/invoice/index.html.eex | 12 ++++++++++ 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/lib/infin/invoices.ex b/lib/infin/invoices.ex index 0e765db..8686ba4 100644 --- a/lib/infin/invoices.ex +++ b/lib/infin/invoices.ex @@ -29,14 +29,25 @@ defmodule Infin.Invoices do |> Repo.paginate(params) end + def list_company_invoices_query(company_id, params, query) do + + query = from( i in Invoice, + where: i.company_id == ^company_id, + join: c in assoc(i, :company_seller), + where: c.nif == ^query, + preload: [:company_seller, :category, :company, company: :categories], + order_by: [desc: :doc_emission_date] + ) + Repo.paginate(query, params) + end + def list_company_invoices(company_id, params) do - query = - from(i in Invoice, - where: i.company_id == ^company_id, - preload: [:company_seller, :category, :company, company: :categories], - order_by: [desc: :doc_emission_date] - ) + query = from( i in Invoice, + where: i.company_id == ^company_id, + preload: [:company_seller, :category, :company, company: :categories], + order_by: [desc: :doc_emission_date] + ) Repo.paginate(query, params) end diff --git a/lib/infin_web/controllers/invoice_controller.ex b/lib/infin_web/controllers/invoice_controller.ex index 81aad59..6f4c085 100644 --- a/lib/infin_web/controllers/invoice_controller.ex +++ b/lib/infin_web/controllers/invoice_controller.ex @@ -7,14 +7,14 @@ defmodule InfinWeb.InvoiceController do alias Infin.Storage def index(conn, params, company_id) do - page = Invoices.list_company_invoices(company_id, params) company = Companies.get_company(company_id) - - render(conn, "index.html", - invoices: page.entries, - company: company, - page: page - ) + if is_nil(params["query"]) or params["query"] == "" do + page = Invoices.list_company_invoices(company_id, params) + render(conn, "index.html", invoices: page.entries, company: company, page: page) + else + page = Invoices.list_company_invoices_query(company_id, params, params["query"]) + render(conn, "index.html", invoices: page.entries, company: company, page: page) + end end def new(conn, _params, company_id) do diff --git a/lib/infin_web/templates/invoice/index.html.eex b/lib/infin_web/templates/invoice/index.html.eex index 00cc65f..a1b90d1 100644 --- a/lib/infin_web/templates/invoice/index.html.eex +++ b/lib/infin_web/templates/invoice/index.html.eex @@ -1,5 +1,17 @@

Invoices

+ + <%= form_for @conn, Routes.invoice_path(@conn, :index), [method: :get, class: "pull-right"], fn f -> %> +
+

+ <%= search_input f, :query, class: "input has-icons-right", placeholder: "Search by Emitter Tax ID" %> +

+

+ <%= submit "Search", class: "button is-primary is-outlined" %> +

+
+ <% end %> + <%= if length(@invoices) > 0 do %>