diff --git a/app/controllers/admin/local_census_records_controller.rb b/app/controllers/admin/local_census_records_controller.rb
new file mode 100644
index 000000000..ded94c371
--- /dev/null
+++ b/app/controllers/admin/local_census_records_controller.rb
@@ -0,0 +1,8 @@
+class Admin::LocalCensusRecordsController < Admin::BaseController
+ load_and_authorize_resource
+
+ def index
+ @local_census_records = @local_census_records.search(params[:search])
+ @local_census_records = @local_census_records.page(params[:page])
+ end
+end
diff --git a/app/models/local_census_record.rb b/app/models/local_census_record.rb
index d275ec130..12e4d2795 100644
--- a/app/models/local_census_record.rb
+++ b/app/models/local_census_record.rb
@@ -3,4 +3,6 @@ class LocalCensusRecord < ApplicationRecord
validates :document_type, presence: true
validates :date_of_birth, presence: true
validates :postal_code, presence: true
+
+ scope :search, -> (terms) { where("document_number ILIKE ?", "%#{terms}%") }
end
diff --git a/app/views/admin/local_census_records/_local_census_record.html.erb b/app/views/admin/local_census_records/_local_census_record.html.erb
new file mode 100644
index 000000000..e9fd12582
--- /dev/null
+++ b/app/views/admin/local_census_records/_local_census_record.html.erb
@@ -0,0 +1,25 @@
+
+ |
+ <%= local_census_record.document_type %>
+ |
+
+ <%= local_census_record.document_number %>
+ |
+
+ <%= l local_census_record.date_of_birth %>
+ |
+
+ <%= local_census_record.postal_code %>
+ |
+
+ <%= link_to t("admin.actions.edit"),
+ edit_admin_local_census_record_path(local_census_record),
+ class: "button hollow" %>
+
+ <%= link_to t("admin.actions.delete"),
+ admin_local_census_record_path(local_census_record),
+ method: :delete,
+ class: "button hollow alert",
+ data: { confirm: t("admin.actions.confirm") } %>
+ |
+
diff --git a/app/views/admin/local_census_records/_local_census_records.html.erb b/app/views/admin/local_census_records/_local_census_records.html.erb
new file mode 100644
index 000000000..d8549ab30
--- /dev/null
+++ b/app/views/admin/local_census_records/_local_census_records.html.erb
@@ -0,0 +1,23 @@
+<% if @local_census_records.any? %>
+ <%= page_entries_info @local_census_records %>
+
+
+
+ | <%= t("admin.local_census_records.index.document_type") %> |
+ <%= t("admin.local_census_records.index.document_number") %> |
+ <%= t("admin.local_census_records.index.date_of_birth") %> |
+ <%= t("admin.local_census_records.index.postal_code") %> |
+ <%= t("admin.actions.actions") %> |
+
+
+
+ <%= render @local_census_records %>
+
+
+
+ <%= paginate @local_census_records %>
+<% else %>
+
+ <%= t("admin.local_census_records.index.no_local_census_records") %>
+
+<% end %>
diff --git a/app/views/admin/local_census_records/index.html.erb b/app/views/admin/local_census_records/index.html.erb
new file mode 100644
index 000000000..616bc9693
--- /dev/null
+++ b/app/views/admin/local_census_records/index.html.erb
@@ -0,0 +1,20 @@
+<%= t("admin.local_census_records.index.title") %>
+
+<%= link_to t("admin.local_census_records.index.create"),
+ new_admin_local_census_record_path,
+ class: "button float-right" %>
+
+
+ <%= form_tag admin_local_census_records_path, method: :get, remote: true do %>
+
+ <% end %>
+
+
+
+ <%= render "local_census_records" %>
+
diff --git a/app/views/admin/local_census_records/index.js.erb b/app/views/admin/local_census_records/index.js.erb
new file mode 100644
index 000000000..0e38d6f1b
--- /dev/null
+++ b/app/views/admin/local_census_records/index.js.erb
@@ -0,0 +1 @@
+$("#local_census_records").html("<%= j render "local_census_records" %>");
diff --git a/config/locales/en/admin.yml b/config/locales/en/admin.yml
index 74c854237..531b8c43f 100644
--- a/config/locales/en/admin.yml
+++ b/config/locales/en/admin.yml
@@ -1664,3 +1664,19 @@ en:
progress_bars:
index:
title: "Progress bars"
+ local_census_records:
+ index:
+ title: Manage local census
+ create: Create new local census record
+ no_local_census_records: There are no local census records.
+ document_type: Document type
+ document_number: Document number
+ date_of_birth: Date of birth
+ postal_code: Postal code
+ search:
+ placeholder: Search by document number
+ search: Search
+ new:
+ creating: Creating new local census record
+ create:
+ notice: New local census record created successfully!
diff --git a/config/locales/es/admin.yml b/config/locales/es/admin.yml
index 6aebd1ae2..7982eb5ac 100644
--- a/config/locales/es/admin.yml
+++ b/config/locales/es/admin.yml
@@ -1662,3 +1662,19 @@ es:
progress_bars:
index:
title: "Barras de progreso"
+ local_census_records:
+ index:
+ title: Gestionar censo local
+ create: Crear nuevo registro en el censo local
+ no_local_census_records: No hay registros de censo local
+ document_type: Tipo de documento
+ document_number: Número de documento
+ date_of_birth: Fecha de nacimiento
+ postal_code: Código postal
+ search:
+ placeholder: Búsqueda por número de documento
+ search: Buscar
+ new:
+ creating: Creando nuevo registro de censo local
+ create:
+ notice: ¡Nuevo registro de censo local creado correctamente!
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index 2b850a27d..557811a03 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -255,4 +255,6 @@ namespace :admin do
put 'download_settings/:resource', to: 'download_settings#update', as: 'update_download_settings'
get "/change_log/:id", to: "budget_investments#show_investment_log", as: "change_log"
+
+ resources :local_census_records
end
diff --git a/spec/features/admin/local_census_records_spec.rb b/spec/features/admin/local_census_records_spec.rb
new file mode 100644
index 000000000..4eae4440b
--- /dev/null
+++ b/spec/features/admin/local_census_records_spec.rb
@@ -0,0 +1,75 @@
+require "rails_helper"
+
+feature "Admin local census records" do
+
+ background do
+ login_as(create(:administrator).user)
+ end
+
+ context "Index" do
+ let!(:local_census_record) { create(:local_census_record) }
+
+ scenario "Should show empty message when no local census records exists" do
+ LocalCensusRecord.delete_all
+ visit admin_local_census_records_path
+
+ expect(page).to have_content("There are no local census records.")
+ end
+
+ scenario "Should show existing local census records" do
+ visit admin_local_census_records_path
+
+ expect(page).to have_content(local_census_record.document_type)
+ expect(page).to have_content(local_census_record.document_number)
+ expect(page).to have_content(local_census_record.date_of_birth)
+ expect(page).to have_content(local_census_record.postal_code)
+ end
+
+ scenario "Should show edit and destroy actions for each record" do
+ visit admin_local_census_records_path
+
+ within "#local_census_record_#{local_census_record.id}" do
+ expect(page).to have_link "Edit"
+ expect(page).to have_link "Delete"
+ end
+ end
+
+ scenario "Should show page entries info" do
+ visit admin_local_census_records_path
+
+ expect(page).to have_content("There is 1 local census record")
+ end
+
+ scenario "Should show paginator" do
+ create_list(:local_census_record, 25)
+ visit admin_local_census_records_path
+
+ within ".pagination" do
+ expect(page).to have_link("2")
+ end
+ end
+
+ context "Search" do
+ background do
+ create(:local_census_record, document_number: "X66777888" )
+ end
+
+ scenario "Should show matching records by document number at first visit" do
+ visit admin_local_census_records_path(search: "X66777888")
+
+ expect(page).to have_content "X66777888"
+ expect(page).not_to have_content local_census_record.document_number
+ end
+
+ scenario "Should show matching records by document number", :js do
+ visit admin_local_census_records_path
+
+ fill_in :search, with: "X66777888"
+ click_on "Search"
+
+ expect(page).to have_content "X66777888"
+ expect(page).not_to have_content local_census_record.document_number
+ end
+ end
+ end
+end
diff --git a/spec/models/local_census_record_spec.rb b/spec/models/local_census_record_spec.rb
new file mode 100644
index 000000000..ef64ef19e
--- /dev/null
+++ b/spec/models/local_census_record_spec.rb
@@ -0,0 +1,51 @@
+require "rails_helper"
+
+describe LocalCensusRecord do
+ let(:local_census_record) { build(:local_census_record) }
+
+ context "validations" do
+ it "is valid" do
+ expect(local_census_record).to be_valid
+ end
+
+ it "is not valid without document_number" do
+ local_census_record.document_number = nil
+
+ expect(local_census_record).not_to be_valid
+ end
+
+ it "is not valid without document_type" do
+ local_census_record.document_type = nil
+
+ expect(local_census_record).not_to be_valid
+ end
+
+ it "is not valid without date_of_birth" do
+ local_census_record.date_of_birth = nil
+
+ expect(local_census_record).not_to be_valid
+ end
+
+ it "is not valid without postal_code" do
+ local_census_record.postal_code = nil
+
+ expect(local_census_record).not_to be_valid
+ end
+ end
+
+ context "scopes" do
+ let!(:a_local_census_record) { create(:local_census_record, document_number: "AAAA") }
+ let!(:b_local_census_record) { create(:local_census_record, document_number: "BBBB") }
+
+ context "search" do
+ it "filter document_numbers by given terms" do
+ expect(LocalCensusRecord.search("A")).to include a_local_census_record
+ expect(LocalCensusRecord.search("A")).not_to include b_local_census_record
+ end
+
+ it "ignores terms case" do
+ expect(LocalCensusRecord.search("a")).to eq [a_local_census_record]
+ end
+ end
+ end
+end