diff options
| author | Bobby <[email protected]> | 2022-05-04 06:33:20 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-05-04 06:33:20 -0400 |
| commit | 9f2fce806826e36831c851d3a4de3d1ece6a1953 (patch) | |
| tree | 143c74f33f364c5fe53183975b06100818c63e07 | |
| parent | 698336a618c0457b5b63544861ae6409145a2d1e (diff) | |
| parent | 376d976c3dc9d335653808f3fcb518a78d5f073f (diff) | |
| download | Welfare-Schemes-DMQL-9f2fce806826e36831c851d3a4de3d1ece6a1953.tar.xz Welfare-Schemes-DMQL-9f2fce806826e36831c851d3a4de3d1ece6a1953.zip | |
Merge pull request #8 from luciferreeves/main
Working demo
| -rw-r--r-- | .DS_Store | bin | 6148 -> 6148 bytes | |||
| -rw-r--r-- | ddl.sql | 1016 | ||||
| -rw-r--r-- | interface/controllers/citizens.controller.js | 103 | ||||
| -rw-r--r-- | interface/controllers/transactions.controller.js | 65 | ||||
| -rw-r--r-- | interface/models/aggriculture_transaction.js | 0 | ||||
| -rw-r--r-- | interface/public/beneficiaries.js | 6 | ||||
| -rw-r--r-- | interface/public/citizens.js | 25 | ||||
| -rw-r--r-- | interface/routes/index.js | 133 | ||||
| -rw-r--r-- | interface/routes/transactions.js | 85 | ||||
| -rw-r--r-- | interface/server.js | 2 | ||||
| -rw-r--r-- | interface/views/agriculture.ejs | 198 | ||||
| -rw-r--r-- | interface/views/citizens.ejs | 9 | ||||
| -rw-r--r-- | interface/views/hospital.ejs | 198 | ||||
| -rw-r--r-- | interface/views/index.ejs | 23 | ||||
| -rw-r--r-- | interface/views/lpg.ejs | 198 | ||||
| -rw-r--r-- | interface/views/nregs.ejs | 196 | ||||
| -rw-r--r-- | interface/views/partials/navbar.ejs | 33 | ||||
| -rw-r--r-- | interface/views/partials/scripts.ejs | 8 | ||||
| -rw-r--r-- | interface/views/pension.ejs | 196 |
19 files changed, 2378 insertions, 116 deletions
| Binary files differ @@ -0,0 +1,1016 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 14.2 +-- Dumped by pg_dump version 14.2 + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: f_concat_ws(text, text[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.f_concat_ws(text, VARIADIC text[]) RETURNS text + LANGUAGE sql IMMUTABLE + AS $_$SELECT array_to_string($2, $1)$_$; + + +ALTER FUNCTION public.f_concat_ws(text, VARIADIC text[]) OWNER TO postgres; + +-- +-- Name: getaggriculturedetails(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.getaggriculturedetails() RETURNS TABLE(first_name character varying, last_name character varying, amount_remitted numeric, crop character varying, disbursed_date date) + LANGUAGE plpgsql + AS $$ +BEGIN + RETURN QUERY ( SELECT cs.first_name, cs.last_name, agt.amt_remitted, agt.crop_seaon, agt.date_of_disbursed + FROM agri_trasaction agt + join citizens cs on cs.citizen_id = agt.citizen_id); +END; +$$; + + +ALTER FUNCTION public.getaggriculturedetails() OWNER TO postgres; + +-- +-- Name: gethospitaldetails(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.gethospitaldetails() RETURNS TABLE(first_name character varying, last_name character varying, disease_category character varying, disease_sub_category character varying, amount_charged numeric) + LANGUAGE plpgsql + AS $$ +BEGIN + RETURN QUERY ( SELECT cs.first_name, cs.last_name, ht.disease_category, ht.disease_sub_category, ht.amount_charged + FROM hospital_transaction ht + join citizens cs on cs.citizen_id = ht.citizen_id); +END; +$$; + + +ALTER FUNCTION public.gethospitaldetails() OWNER TO postgres; + +-- +-- Name: getlpgdetails(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.getlpgdetails() RETURNS TABLE(first_name character varying, last_name character varying, booking_date date, amount_paid numeric, amount_remitted numeric) + LANGUAGE plpgsql + AS $$ +BEGIN + RETURN QUERY ( SELECT cs.first_name, cs.last_name, lpgt.booking_date, lpgt.amount_paid, lpgt.amount_remitted + FROM lpg_transaction lpgt + join citizens cs on cs.citizen_id = lpgt.citizen_id + join village_master vm on cs.village_id = vm.village_id); +END; +$$; + + +ALTER FUNCTION public.getlpgdetails() OWNER TO postgres; + +-- +-- Name: getnregsdetails(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.getnregsdetails() RETURNS TABLE(first_name character varying, last_name character varying, days_of_attended integer, amount_remitted numeric) + LANGUAGE plpgsql + AS $$ +BEGIN + RETURN QUERY ( SELECT cs.first_name, cs.last_name, NREGS.days_of_attended, NREGS.amount_remitted + FROM nregs_transaction NREGS + join nregs_master nm + on nm.nregs_id = NREGS.nregs_id + join citizens cs on cs.citizen_id = nm.citizen_id); +END; +$$; + + +ALTER FUNCTION public.getnregsdetails() OWNER TO postgres; + +-- +-- Name: getpensiondetails(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.getpensiondetails() RETURNS TABLE(first_name character varying, last_name character varying, pen_date_disbursment date, pen_amount numeric) + LANGUAGE plpgsql + AS $$ +BEGIN + RETURN QUERY ( SELECT cs.first_name, cs.last_name, pt.pen_date_disbursment, pt.pen_amount + FROM pension_transaction pt + join citizens cs on cs.citizen_id = pt.citizen_id); +END; +$$; + + +ALTER FUNCTION public.getpensiondetails() OWNER TO postgres; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: agri_trasaction; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.agri_trasaction ( + aggri_id integer NOT NULL, + citizen_id character varying(12) NOT NULL, + dbt_id integer NOT NULL, + amt_remitted numeric(10,2), + crop_seaon character varying(25) NOT NULL, + date_of_disbursed date NOT NULL, + CONSTRAINT agri_trasaction_amt_remitted_check CHECK ((amt_remitted > (0)::numeric)) +); + + +ALTER TABLE public.agri_trasaction OWNER TO postgres; + +-- +-- Name: bank_master; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.bank_master ( + bank_account integer NOT NULL, + ifsc_code character varying(12) NOT NULL, + bank_name character varying(100) NOT NULL, + branch_name character varying(50) NOT NULL, + citizen_id character varying(12) NOT NULL +); + + +ALTER TABLE public.bank_master OWNER TO postgres; + +-- +-- Name: bank_masters; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.bank_masters ( + bank_account integer NOT NULL, + ifsc_code character varying(12) NOT NULL, + bank_name character varying(100) NOT NULL, + branch_name character varying(50) NOT NULL, + citizen_id character varying(12) NOT NULL +); + + +ALTER TABLE public.bank_masters OWNER TO postgres; + +-- +-- Name: citizens; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.citizens ( + citizen_id character varying(12) NOT NULL, + first_name character varying(255) NOT NULL, + middle_name character varying(255), + last_name character varying(255) NOT NULL, + address character varying(500) NOT NULL, + mobile_num character varying(15) NOT NULL, + dob date NOT NULL, + gender character varying(1) NOT NULL, + marital_status character varying(5) NOT NULL, + disabled character(3) DEFAULT 'No'::bpchar, + disbaled_percentage numeric(10,3), + caste character(2) NOT NULL, + village_id integer NOT NULL +); + + +ALTER TABLE public.citizens OWNER TO postgres; + +-- +-- Name: civil_supplies; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.civil_supplies ( + civil_supply_id bigint NOT NULL, + annual_income_year numeric(10,2) NOT NULL, + job_type character varying(20) NOT NULL, + ration_shopno character varying(10) NOT NULL, + citizen_id character varying(12) NOT NULL, + age integer NOT NULL, + CONSTRAINT civil_supplies_annual_income_year_check CHECK ((annual_income_year > (10000)::numeric)) +); + + +ALTER TABLE public.civil_supplies OWNER TO postgres; + +-- +-- Name: dbt_master; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.dbt_master ( + bdt_id integer NOT NULL, + dbt_schem_name character varying(50) NOT NULL, + amount numeric(10,2) NOT NULL, + CONSTRAINT dbt_master_amount_check CHECK ((amount > (0)::numeric)) +); + + +ALTER TABLE public.dbt_master OWNER TO postgres; + +-- +-- Name: district_master; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.district_master ( + district_id integer NOT NULL, + district_name character varying(100) NOT NULL, + state_id integer NOT NULL +); + + +ALTER TABLE public.district_master OWNER TO postgres; + +-- +-- Name: district_masters; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.district_masters ( + district_id integer NOT NULL, + district_name character varying(155) NOT NULL, + state_id integer NOT NULL +); + + +ALTER TABLE public.district_masters OWNER TO postgres; + +-- +-- Name: district_masters_district_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.district_masters_district_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.district_masters_district_id_seq OWNER TO postgres; + +-- +-- Name: district_masters_district_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.district_masters_district_id_seq OWNED BY public.district_masters.district_id; + + +-- +-- Name: education_master; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.education_master ( + education_id character varying(20) NOT NULL, + citizen_id character varying(12), + degree_type character varying(10), + acedemic_year character varying(10), + scholarship_id integer, + amount numeric(10,2) +); + + +ALTER TABLE public.education_master OWNER TO postgres; + +-- +-- Name: hospital_master; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.hospital_master ( + hospital_id integer NOT NULL, + hospital_name character varying(100) NOT NULL, + address character varying(255) NOT NULL +); + + +ALTER TABLE public.hospital_master OWNER TO postgres; + +-- +-- Name: hospital_transaction; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.hospital_transaction ( + hospital_trans_id integer NOT NULL, + hospital_id integer NOT NULL, + citizen_id character varying(12) NOT NULL, + disease_category character varying(25) NOT NULL, + disease_sub_category character varying(25) NOT NULL, + amount_charged numeric(10,2) NOT NULL +); + + +ALTER TABLE public.hospital_transaction OWNER TO postgres; + +-- +-- Name: lpg_transaction; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.lpg_transaction ( + lpg_transaction_id integer NOT NULL, + dbt_id integer NOT NULL, + citizen_id character varying(12) NOT NULL, + booking_date date NOT NULL, + amount_paid numeric(10,2) NOT NULL, + amount_remitted numeric(5,2) DEFAULT 0 +); + + +ALTER TABLE public.lpg_transaction OWNER TO postgres; + +-- +-- Name: mandal_master; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.mandal_master ( + mandal_id integer NOT NULL, + mandal_name character varying(100) NOT NULL, + district_id integer NOT NULL +); + + +ALTER TABLE public.mandal_master OWNER TO postgres; + +-- +-- Name: mandal_masters; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.mandal_masters ( + mandal_id integer NOT NULL, + mandal_name character varying(155) NOT NULL, + district_id integer NOT NULL +); + + +ALTER TABLE public.mandal_masters OWNER TO postgres; + +-- +-- Name: mandal_masters_mandal_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.mandal_masters_mandal_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.mandal_masters_mandal_id_seq OWNER TO postgres; + +-- +-- Name: mandal_masters_mandal_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.mandal_masters_mandal_id_seq OWNED BY public.mandal_masters.mandal_id; + + +-- +-- Name: nregs_master; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.nregs_master ( + nregs_id integer NOT NULL, + citizen_id character varying(12) NOT NULL, + bdt_id integer NOT NULL +); + + +ALTER TABLE public.nregs_master OWNER TO postgres; + +-- +-- Name: nregs_transaction; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.nregs_transaction ( + nregs_tran_id integer NOT NULL, + nregs_id integer NOT NULL, + days_of_attended integer NOT NULL, + amount_remitted numeric(10,2), + CONSTRAINT nregs_transaction_amount_remitted_check CHECK ((amount_remitted > (0)::numeric)) +); + + +ALTER TABLE public.nregs_transaction OWNER TO postgres; + +-- +-- Name: pension_master; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.pension_master ( + pension_schem_id integer NOT NULL, + schem_name character varying(100), + pension_amount numeric(10,2) +); + + +ALTER TABLE public.pension_master OWNER TO postgres; + +-- +-- Name: pension_transaction; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.pension_transaction ( + pen_transaction_id integer NOT NULL, + citizen_id character varying(12) NOT NULL, + pen_date_disbursment date NOT NULL, + pen_amount numeric(10,2), + pension_schem_id integer NOT NULL, + CONSTRAINT pension_transaction_pen_amount_check CHECK ((pen_amount > (0)::numeric)) +); + + +ALTER TABLE public.pension_transaction OWNER TO postgres; + +-- +-- Name: scholarship_master; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.scholarship_master ( + scholarship_id integer NOT NULL, + type character varying(10), + amount numeric(10,2) +); + + +ALTER TABLE public.scholarship_master OWNER TO postgres; + +-- +-- Name: state_master; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.state_master ( + state_id integer NOT NULL, + state_name character varying(100) NOT NULL +); + + +ALTER TABLE public.state_master OWNER TO postgres; + +-- +-- Name: state_masters; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.state_masters ( + state_id integer NOT NULL, + state_name character varying(155) NOT NULL +); + + +ALTER TABLE public.state_masters OWNER TO postgres; + +-- +-- Name: state_masters_state_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.state_masters_state_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.state_masters_state_id_seq OWNER TO postgres; + +-- +-- Name: state_masters_state_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.state_masters_state_id_seq OWNED BY public.state_masters.state_id; + + +-- +-- Name: users; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.users ( + user_id integer NOT NULL, + username character varying(155) NOT NULL, + password character varying(155) NOT NULL +); + + +ALTER TABLE public.users OWNER TO postgres; + +-- +-- Name: users_user_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.users_user_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.users_user_id_seq OWNER TO postgres; + +-- +-- Name: users_user_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.users_user_id_seq OWNED BY public.users.user_id; + + +-- +-- Name: village_master; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.village_master ( + village_id integer NOT NULL, + village_name character varying(100) NOT NULL, + mandal_id integer NOT NULL +); + + +ALTER TABLE public.village_master OWNER TO postgres; + +-- +-- Name: village_masters; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.village_masters ( + village_id integer NOT NULL, + village_name character varying(155) NOT NULL, + mandal_id integer NOT NULL, + "createdAt" timestamp with time zone NOT NULL, + "updatedAt" timestamp with time zone NOT NULL +); + + +ALTER TABLE public.village_masters OWNER TO postgres; + +-- +-- Name: village_masters_village_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.village_masters_village_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.village_masters_village_id_seq OWNER TO postgres; + +-- +-- Name: village_masters_village_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.village_masters_village_id_seq OWNED BY public.village_masters.village_id; + + +-- +-- Name: district_masters district_id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.district_masters ALTER COLUMN district_id SET DEFAULT nextval('public.district_masters_district_id_seq'::regclass); + + +-- +-- Name: mandal_masters mandal_id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.mandal_masters ALTER COLUMN mandal_id SET DEFAULT nextval('public.mandal_masters_mandal_id_seq'::regclass); + + +-- +-- Name: state_masters state_id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.state_masters ALTER COLUMN state_id SET DEFAULT nextval('public.state_masters_state_id_seq'::regclass); + + +-- +-- Name: users user_id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.users ALTER COLUMN user_id SET DEFAULT nextval('public.users_user_id_seq'::regclass); + + +-- +-- Name: village_masters village_id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.village_masters ALTER COLUMN village_id SET DEFAULT nextval('public.village_masters_village_id_seq'::regclass); + + +-- +-- Name: agri_trasaction agri_trasaction_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.agri_trasaction + ADD CONSTRAINT agri_trasaction_pkey PRIMARY KEY (aggri_id); + + +-- +-- Name: bank_master bank_master_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.bank_master + ADD CONSTRAINT bank_master_pkey PRIMARY KEY (bank_account); + + +-- +-- Name: bank_masters bank_masters_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.bank_masters + ADD CONSTRAINT bank_masters_pkey PRIMARY KEY (bank_account); + + +-- +-- Name: citizens citizens_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.citizens + ADD CONSTRAINT citizens_pkey PRIMARY KEY (citizen_id); + + +-- +-- Name: civil_supplies civil_supplies_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.civil_supplies + ADD CONSTRAINT civil_supplies_pkey PRIMARY KEY (citizen_id); + + +-- +-- Name: dbt_master dbt_master_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.dbt_master + ADD CONSTRAINT dbt_master_pkey PRIMARY KEY (bdt_id); + + +-- +-- Name: district_master district_master_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.district_master + ADD CONSTRAINT district_master_pkey PRIMARY KEY (district_id); + + +-- +-- Name: district_masters district_masters_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.district_masters + ADD CONSTRAINT district_masters_pkey PRIMARY KEY (district_id); + + +-- +-- Name: education_master education_master_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.education_master + ADD CONSTRAINT education_master_pkey PRIMARY KEY (education_id); + + +-- +-- Name: hospital_master hospital_master_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.hospital_master + ADD CONSTRAINT hospital_master_pkey PRIMARY KEY (hospital_id); + + +-- +-- Name: hospital_transaction hospital_transaction_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.hospital_transaction + ADD CONSTRAINT hospital_transaction_pkey PRIMARY KEY (hospital_trans_id); + + +-- +-- Name: lpg_transaction lpg_transaction_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.lpg_transaction + ADD CONSTRAINT lpg_transaction_pkey PRIMARY KEY (lpg_transaction_id); + + +-- +-- Name: mandal_master mandal_master_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.mandal_master + ADD CONSTRAINT mandal_master_pkey PRIMARY KEY (mandal_id); + + +-- +-- Name: mandal_masters mandal_masters_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.mandal_masters + ADD CONSTRAINT mandal_masters_pkey PRIMARY KEY (mandal_id); + + +-- +-- Name: nregs_master nregs_master_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nregs_master + ADD CONSTRAINT nregs_master_pkey PRIMARY KEY (nregs_id); + + +-- +-- Name: nregs_transaction nregs_transaction_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nregs_transaction + ADD CONSTRAINT nregs_transaction_pkey PRIMARY KEY (nregs_tran_id); + + +-- +-- Name: pension_master pension_master_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.pension_master + ADD CONSTRAINT pension_master_pkey PRIMARY KEY (pension_schem_id); + + +-- +-- Name: pension_transaction pension_transaction_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.pension_transaction + ADD CONSTRAINT pension_transaction_pkey PRIMARY KEY (pen_transaction_id); + + +-- +-- Name: scholarship_master scholarship_master_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.scholarship_master + ADD CONSTRAINT scholarship_master_pkey PRIMARY KEY (scholarship_id); + + +-- +-- Name: state_master state_master_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.state_master + ADD CONSTRAINT state_master_pkey PRIMARY KEY (state_id); + + +-- +-- Name: state_masters state_masters_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.state_masters + ADD CONSTRAINT state_masters_pkey PRIMARY KEY (state_id); + + +-- +-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.users + ADD CONSTRAINT users_pkey PRIMARY KEY (user_id); + + +-- +-- Name: village_master village_master_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.village_master + ADD CONSTRAINT village_master_pkey PRIMARY KEY (village_id); + + +-- +-- Name: village_masters village_masters_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.village_masters + ADD CONSTRAINT village_masters_pkey PRIMARY KEY (village_id); + + +-- +-- Name: citizen_index; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE UNIQUE INDEX citizen_index ON public.citizens USING btree (citizen_id, village_id) INCLUDE (citizen_id, first_name, last_name, village_id); + + +-- +-- Name: civil_supplies_index; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX civil_supplies_index ON public.civil_supplies USING btree (citizen_id) INCLUDE (citizen_id); + + +-- +-- Name: nt_index; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE UNIQUE INDEX nt_index ON public.nregs_transaction USING btree (nregs_id); + + +-- +-- Name: agri_trasaction agri_trasaction_citizen_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.agri_trasaction + ADD CONSTRAINT agri_trasaction_citizen_id_fkey FOREIGN KEY (citizen_id) REFERENCES public.civil_supplies(citizen_id) ON DELETE CASCADE; + + +-- +-- Name: agri_trasaction agri_trasaction_dbt_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.agri_trasaction + ADD CONSTRAINT agri_trasaction_dbt_id_fkey FOREIGN KEY (dbt_id) REFERENCES public.dbt_master(bdt_id) ON DELETE CASCADE; + + +-- +-- Name: bank_master bank_master_citizen_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.bank_master + ADD CONSTRAINT bank_master_citizen_id_fkey FOREIGN KEY (citizen_id) REFERENCES public.citizens(citizen_id) ON DELETE CASCADE; + + +-- +-- Name: bank_masters bank_masters_citizen_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.bank_masters + ADD CONSTRAINT bank_masters_citizen_id_fkey FOREIGN KEY (citizen_id) REFERENCES public.citizens(citizen_id); + + +-- +-- Name: citizens citizens_village_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.citizens + ADD CONSTRAINT citizens_village_id_fkey FOREIGN KEY (village_id) REFERENCES public.village_master(village_id) ON DELETE CASCADE; + + +-- +-- Name: civil_supplies civil_supplies_citizen_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.civil_supplies + ADD CONSTRAINT civil_supplies_citizen_id_fkey FOREIGN KEY (citizen_id) REFERENCES public.citizens(citizen_id) ON DELETE CASCADE; + + +-- +-- Name: district_master district_master_state_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.district_master + ADD CONSTRAINT district_master_state_id_fkey FOREIGN KEY (state_id) REFERENCES public.state_master(state_id) ON DELETE CASCADE; + + +-- +-- Name: district_masters district_masters_state_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.district_masters + ADD CONSTRAINT district_masters_state_id_fkey FOREIGN KEY (state_id) REFERENCES public.state_master(state_id); + + +-- +-- Name: education_master education_master_citizen_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.education_master + ADD CONSTRAINT education_master_citizen_id_fkey FOREIGN KEY (citizen_id) REFERENCES public.civil_supplies(citizen_id) ON DELETE CASCADE; + + +-- +-- Name: education_master education_master_scholarship_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.education_master + ADD CONSTRAINT education_master_scholarship_id_fkey FOREIGN KEY (scholarship_id) REFERENCES public.scholarship_master(scholarship_id) ON DELETE CASCADE; + + +-- +-- Name: hospital_transaction hospital_transaction_citizen_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.hospital_transaction + ADD CONSTRAINT hospital_transaction_citizen_id_fkey FOREIGN KEY (citizen_id) REFERENCES public.civil_supplies(citizen_id) ON DELETE CASCADE; + + +-- +-- Name: hospital_transaction hospital_transaction_hospital_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.hospital_transaction + ADD CONSTRAINT hospital_transaction_hospital_id_fkey FOREIGN KEY (hospital_id) REFERENCES public.hospital_master(hospital_id) ON DELETE CASCADE; + + +-- +-- Name: lpg_transaction lpg_transaction_citizen_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.lpg_transaction + ADD CONSTRAINT lpg_transaction_citizen_id_fkey FOREIGN KEY (citizen_id) REFERENCES public.citizens(citizen_id) ON DELETE CASCADE; + + +-- +-- Name: lpg_transaction lpg_transaction_dbt_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.lpg_transaction + ADD CONSTRAINT lpg_transaction_dbt_id_fkey FOREIGN KEY (dbt_id) REFERENCES public.dbt_master(bdt_id) ON DELETE CASCADE; + + +-- +-- Name: mandal_master mandal_master_district_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.mandal_master + ADD CONSTRAINT mandal_master_district_id_fkey FOREIGN KEY (district_id) REFERENCES public.district_master(district_id) ON DELETE CASCADE; + + +-- +-- Name: mandal_masters mandal_masters_district_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.mandal_masters + ADD CONSTRAINT mandal_masters_district_id_fkey FOREIGN KEY (district_id) REFERENCES public.district_master(district_id); + + +-- +-- Name: nregs_master nregs_master_bdt_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nregs_master + ADD CONSTRAINT nregs_master_bdt_id_fkey FOREIGN KEY (bdt_id) REFERENCES public.dbt_master(bdt_id) ON DELETE CASCADE; + + +-- +-- Name: nregs_master nregs_master_citizen_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nregs_master + ADD CONSTRAINT nregs_master_citizen_id_fkey FOREIGN KEY (citizen_id) REFERENCES public.civil_supplies(citizen_id) ON DELETE CASCADE; + + +-- +-- Name: nregs_transaction nregs_transaction_nregs_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nregs_transaction + ADD CONSTRAINT nregs_transaction_nregs_id_fkey FOREIGN KEY (nregs_id) REFERENCES public.nregs_master(nregs_id) ON DELETE CASCADE; + + +-- +-- Name: pension_transaction pension_transaction_citizen_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.pension_transaction + ADD CONSTRAINT pension_transaction_citizen_id_fkey FOREIGN KEY (citizen_id) REFERENCES public.civil_supplies(citizen_id) ON DELETE CASCADE; + + +-- +-- Name: pension_transaction pension_transaction_pension_schem_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.pension_transaction + ADD CONSTRAINT pension_transaction_pension_schem_id_fkey FOREIGN KEY (pension_schem_id) REFERENCES public.pension_master(pension_schem_id) ON DELETE CASCADE; + + +-- +-- Name: village_master village_master_mandal_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.village_master + ADD CONSTRAINT village_master_mandal_id_fkey FOREIGN KEY (mandal_id) REFERENCES public.mandal_master(mandal_id) ON DELETE CASCADE; + + +-- +-- Name: village_masters village_masters_mandal_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.village_masters + ADD CONSTRAINT village_masters_mandal_id_fkey FOREIGN KEY (mandal_id) REFERENCES public.mandal_master(mandal_id); + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/interface/controllers/citizens.controller.js b/interface/controllers/citizens.controller.js index b611fad..ae0204e 100644 --- a/interface/controllers/citizens.controller.js +++ b/interface/controllers/citizens.controller.js @@ -1,9 +1,8 @@ const db = require("../models"); const citizens = db.citizens; -const {QueryTypes} = require('sequelize'); +const { QueryTypes } = require("sequelize"); const { sequelize } = require("../models"); - // Retrieve all citizens from the database. Limit the number of citizens returned to 10. exports.findXCitizens = (limit, offset) => { const query = `select c.citizen_id, c.first_name, c.last_name, c.address, c.mobile_num, c.dob, c.gender, c.marital_status, c.village_id, v.village_name @@ -12,7 +11,7 @@ exports.findXCitizens = (limit, offset) => { on c.village_id = v.village_id order by citizen_id limit ${limit} offset ${offset};`; - return sequelize.query(query, { type: QueryTypes.SELECT }) + return sequelize.query(query, { type: QueryTypes.SELECT }); }; exports.getBeneficiaries = (limit, offset) => { @@ -41,50 +40,44 @@ exports.getBeneficiaries = (limit, offset) => { left join nregs_transaction nt on (nm.nregs_id=nt.nregs_id) left join hospital_transaction ht on (cs.citizen_id = ht.citizen_id) group by c.citizen_id,c.first_name , c.last_name ,c.gender - ,cs.job_type ,pension_schem,education_schem,agri_schem, lpg_schem,Nregs_schem,Health_schem limit ${limit} offset ${offset};` - - return sequelize.query(query, { type: QueryTypes.SELECT }) + ,cs.job_type ,pension_schem,education_schem,agri_schem, lpg_schem,Nregs_schem,Health_schem limit ${limit} offset ${offset};`; -} + return sequelize.query(query, { type: QueryTypes.SELECT }); +}; exports.getCountOfCitizens = () => { const query = `select count(*) as count from citizens;`; - return sequelize.query(query, { type: QueryTypes.SELECT }) -} - + return sequelize.query(query, { type: QueryTypes.SELECT }); +}; -exports.deleteCitizenbyId = (citizen_id) =>{ - return citizens.destroy({ - where: { citizen_id } - }) +exports.deleteCitizenbyId = (citizen_id) => { + const query = `delete from citizens where citizen_id = ${citizen_id};`; + return sequelize.query(query, { type: QueryTypes.DELETE }); }; -exports.editCitizen = (citizen_id, address, mobile_num, dob, marital_status) => { - return citizens.update({ - address, mobile_num, dob, marital_status - }, { - where: { - citizen_id - } - }); +exports.editCitizen = ( + citizen_id, + address, + mobile_num, + dob, + marital_status +) => { + const query = `update citizens set address = '${address}', mobile_num = '${mobile_num}', dob = '${dob}', marital_status = '${marital_status}' where citizen_id = ${citizen_id};`; + return sequelize.query(query, { type: QueryTypes.UPDATE }); }; //Check Citizen exists or not exports.checkCitizenId = (citizen_id) => { - return citizens.findOne({ - where: { - citizen_id - } - }).then( - citizen_id => { + const query = `select * from citizens where citizen_id = ${citizen_id};`; + return sequelize + .query(query, { type: QueryTypes.SELECT }) + .then((citizen_id) => { if (citizen_id) { return true; } return false; - } - ) -} - + }); +}; // Get total number of male and female citizens exports.findGenderDistribution = () => { @@ -98,17 +91,53 @@ exports.findGenderDistribution = () => { return citizens.findAll({ group: ["gender"], attributes: ["gender", [db.sequelize.fn("COUNT", "gender"), "genderCount"]], - raw: true + raw: true, }); }; - // add new citizen -exports.addNewCitizen = (citizen_id, first_name, last_name, address, mobile_num, dob, gender, marital_status, disabled, disbaled_percentage, caste, village_id) => { +exports.addNewCitizen = ( + citizen_id, + first_name, + last_name, + address, + mobile_num, + dob, + gender, + marital_status, + disabled, + disbaled_percentage, + caste, + village_id +) => { return citizens.create({ - citizen_id, first_name, last_name, address, mobile_num, dob, gender, marital_status, disabled, disbaled_percentage, caste, village_id + citizen_id, + first_name, + last_name, + address, + mobile_num, + dob, + gender, + marital_status, + disabled, + disbaled_percentage, + caste, + village_id, }); }; +exports.searchCitizens = (query, limit, offset) => { + const searchQuery = `SELECT * FROM citizens JOIN village_master on + citizens.village_id = village_master.village_id + WHERE to_tsvector(f_concat_ws(' ', first_name, last_name)) + @@ plainto_tsquery('${query}') limit ${limit} offset ${offset};`; + return sequelize.query(searchQuery, { type: QueryTypes.SELECT }); +} - +exports.countSearchedCitizens = (query) => { + const searchQuery = `SELECT count(*) FROM citizens JOIN village_master + on citizens.village_id = village_master.village_id + WHERE to_tsvector(f_concat_ws(' ', first_name, last_name)) + @@ plainto_tsquery('${query}');`; + return sequelize.query(searchQuery, { type: QueryTypes.SELECT }); +} diff --git a/interface/controllers/transactions.controller.js b/interface/controllers/transactions.controller.js new file mode 100644 index 0000000..2627a0f --- /dev/null +++ b/interface/controllers/transactions.controller.js @@ -0,0 +1,65 @@ +const {QueryTypes} = require('sequelize'); +const { sequelize } = require("../models"); + +const getAgricultureTransactions = (limit, offset) => { + const query = `SELECT * FROM getAggricultureDetails() limit ${limit} offset ${offset};`; + return sequelize.query(query, { type: QueryTypes.SELECT }) +} + +const getAgricultureTransactionsCount = () => { + const query = `SELECT count(*) as count FROM getAggricultureDetails();`; + return sequelize.query(query, { type: QueryTypes.SELECT }) +} + +const getHospitalTransactions = (limit, offset) => { + const query = `SELECT * FROM getHospitalDetails() limit ${limit} offset ${offset};`; + return sequelize.query(query, { type: QueryTypes.SELECT }) +} + +const getHospitalTransactionsCount = () => { + const query = `SELECT count(*) as count FROM getHospitalDetails();`; + return sequelize.query(query, { type: QueryTypes.SELECT }) +} + +const getLPGTransactions = (limit, offset) => { + const query = `SELECT * FROM getLPGDetails() limit ${limit} offset ${offset};`; + return sequelize.query(query, { type: QueryTypes.SELECT }) +} + +const getLPGTransactionsCount = () => { + const query = `SELECT count(*) as count FROM getLPGDetails();`; + return sequelize.query(query, { type: QueryTypes.SELECT }) +} + +const getNREGSTransactions = (limit, offset) => { + const query = `SELECT * FROM getNREGSDetails() limit ${limit} offset ${offset};`; + return sequelize.query(query, { type: QueryTypes.SELECT }) +} + +const getNREGSTransactionsCount = () => { + const query = `SELECT count(*) as count FROM getNREGSDetails();`; + return sequelize.query(query, { type: QueryTypes.SELECT }) +} + +const getPensionTransactions = (limit, offset) => { + const query = `SELECT * FROM getPensionDetails() limit ${limit} offset ${offset};`; + return sequelize.query(query, { type: QueryTypes.SELECT }) +} + +const getPensionTransactionsCount = () => { + const query = `SELECT count(*) as count FROM getPensionDetails();`; + return sequelize.query(query, { type: QueryTypes.SELECT }) +} + +module.exports = { + getAgricultureTransactions, + getAgricultureTransactionsCount, + getHospitalTransactions, + getHospitalTransactionsCount, + getLPGTransactions, + getLPGTransactionsCount, + getNREGSTransactions, + getNREGSTransactionsCount, + getPensionTransactions, + getPensionTransactionsCount +} diff --git a/interface/models/aggriculture_transaction.js b/interface/models/aggriculture_transaction.js deleted file mode 100644 index e69de29..0000000 --- a/interface/models/aggriculture_transaction.js +++ /dev/null diff --git a/interface/public/beneficiaries.js b/interface/public/beneficiaries.js index 4db118e..3b35e53 100644 --- a/interface/public/beneficiaries.js +++ b/interface/public/beneficiaries.js @@ -2,20 +2,20 @@ const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const page = urlParams.get("page") || 1; -const limit = urlParams.get("limit") || 10; +const limit = urlParams.get("limit") || 100; const numberOfPages = Math.ceil(count / limit); const pagination = $(".pagination"); const pageLeft = $('#pageLeft'); const pageRight = $('#pageRight'); if (page > 1) { pageLeft.removeClass("disabled"); - pageLeft.attr("href", `/beneficiaries?page=${page - 1}&limit=${limit}`); + pageLeft.attr("href", `/beneficiaries?page=${parseInt(page) - 1}&limit=${limit}`); } else { pageLeft.addClass("disabled"); } if (page < numberOfPages) { pageRight.removeClass("disabled"); - pageRight.attr("href", `/beneficiaries?page=${page + 1}&limit=${limit}`); + pageRight.attr("href", `/beneficiaries?page=${parseInt(page) + 1}&limit=${limit}`); } else { pageRight.addClass("disabled"); } diff --git a/interface/public/citizens.js b/interface/public/citizens.js index ebfcd74..ea00aa5 100644 --- a/interface/public/citizens.js +++ b/interface/public/citizens.js @@ -12,25 +12,26 @@ const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const page = urlParams.get("page") || 1; const limit = urlParams.get("limit") || 10; +const query = urlParams.get("query") || ""; const numberOfPages = Math.ceil(count / limit); const pagination = $(".pagination"); const pageLeft = $('#pageLeft'); const pageRight = $('#pageRight'); if (page > 1) { pageLeft.removeClass("disabled"); - pageLeft.attr("href", `/citizens?page=${page - 1}&limit=${limit}`); + pageLeft.attr("href", `${window.location.pathname}?page=${parseInt(page) - 1}&limit=${limit}&query=${query}`); } else { pageLeft.addClass("disabled"); } if (page < numberOfPages) { pageRight.removeClass("disabled"); - pageRight.attr("href", `/citizens?page=${page + 1}&limit=${limit}`); + pageRight.attr("href", `${window.location.pathname}?page=${parseInt(page) + 1}&limit=${limit}&query=${query}`); } else { pageRight.addClass("disabled"); } function redirectToLimit(limit) { - window.location.href = `/citizens?page=1&limit=${limit}`; + window.location.href = `${window.location.pathname}?page=1&limit=${limit}&query=${query}`; } addPageNumbers(numberOfPages); @@ -49,7 +50,7 @@ function addPageNumbers(numberOfPages) { for (let i = startingPoint; i < startingPoint + 5; i++) { const linkElement = document.createElement("a"); linkElement.innerHTML = i; - linkElement.setAttribute("href", `/citizens?page=${i}&limit=${limit}`); + linkElement.setAttribute("href", `${window.location.pathname}?page=${i}&limit=${limit}&query=${query}`); linkElement.setAttribute("id", `page${i}`); linkElement.classList.add("item"); pageRight.before(linkElement); @@ -64,7 +65,7 @@ function addPageNumbers(numberOfPages) { if (page > 3) { const firstPage = document.createElement("a"); firstPage.innerHTML = 1; - firstPage.setAttribute("href", `/citizens?page=1&limit=${limit}`); + firstPage.setAttribute("href", `${window.location.pathname}?page=1&limit=${limit}&query=${query}`); firstPage.setAttribute("id", `page1`); firstPage.classList.add("item"); pageLeft.after(dots); @@ -75,7 +76,7 @@ function addPageNumbers(numberOfPages) { if (page != numberOfPages) { const lastPage = document.createElement("a"); lastPage.innerHTML = numberOfPages; - lastPage.setAttribute("href", `/citizens?page=${numberOfPages}&limit=${limit}`); + lastPage.setAttribute("href", `${window.location.pathname}?page=${numberOfPages}&limit=${limit}&query=${query}`); lastPage.classList.add("item"); pageRight.before(lastPage); } @@ -85,14 +86,16 @@ function addPageNumbers(numberOfPages) { // Insert before pageRight const linkElement = document.createElement("a"); linkElement.innerHTML = i; - linkElement.setAttribute("href", `/citizens?page=${i}&limit=${limit}`); + linkElement.setAttribute("href", `${window.location.pathname}?page=${i}&limit=${limit}&query=${query}`); linkElement.setAttribute("id", `page${i}`); linkElement.classList.add("item"); pageRight.before(linkElement); } } - const currentPageElement = document.getElementById(`page${page}`); - currentPageElement.classList.add("active"); + const currentPageElement = document.getElementById(`page${page}&query=${query}`); + try { + currentPageElement.classList.add("active"); + } catch (error) {} } function editCitizensRecord(citizen) { @@ -119,7 +122,7 @@ function editCitizen(event) { citizen_id: $("#citizen_id").html(), }; $.ajax({ - url: "/api/citizens/edit", + url: "/api${window.location.pathname}/edit", type: "POST", data: data, success: function (response) { @@ -133,7 +136,7 @@ function editCitizen(event) { function deleteCitizenRecord(citizen) { citizen_id = JSON.parse(citizen).citizen_id; $.ajax({ - url: "/api/citizens/delete", + url: "/api${window.location.pathname}/delete", type: "POST", data: { citizen_id }, success: function (response) { diff --git a/interface/routes/index.js b/interface/routes/index.js index fd4a0d5..1068941 100644 --- a/interface/routes/index.js +++ b/interface/routes/index.js @@ -1,70 +1,107 @@ const express = require("express"); const router = express.Router(); -const dashboardController = require('../controllers/dashboard.controller'); -const citizensController = require('../controllers/citizens.controller'); -const api = require('./api'); -const citizensAPI = require('./api/citizens'); -const geographyAPI = require('./api/geography'); +const dashboardController = require("../controllers/dashboard.controller"); +const citizensController = require("../controllers/citizens.controller"); +const api = require("./api"); +const citizensAPI = require("./api/citizens"); +const geographyAPI = require("./api/geography"); +const transactionsRoute = require("./transactions"); // Setup api routes -router.use('/api', api); -router.use('/api/citizens', citizensAPI); -router.use('/api/geography', geographyAPI); +router.use("/api", api); +router.use("/api/citizens", citizensAPI); +router.use("/api/geography", geographyAPI); +router.use("/transactions", transactionsRoute); - -router.get('/', (req, res) => { - Promise.all([dashboardController.genderDist(), dashboardController.ageDist(), dashboardController.casteDist(), - dashboardController.maritalDist(), dashboardController.disablePercentage(), dashboardController.citizensByDistrict()]).then(results => { - const [genderDist, ageDist, casteDist, maritalDist, disableDist, citizenDist] = results; - res.render('index', { - title: 'Home Page', - genderDist, - ageDist, - casteDist, - maritalDist, - disableDist, - citizenDist - }); +router.get("/", (req, res) => { + Promise.all([ + dashboardController.genderDist(), + dashboardController.ageDist(), + dashboardController.casteDist(), + dashboardController.maritalDist(), + dashboardController.disablePercentage(), + dashboardController.citizensByDistrict(), + ]).then((results) => { + const [ + genderDist, + ageDist, + casteDist, + maritalDist, + disableDist, + citizenDist, + ] = results; + res.render("index", { + title: "Home Page", + genderDist, + ageDist, + casteDist, + maritalDist, + disableDist, + citizenDist, }); + }); }); router.get("/citizens", (req, res) => { - // Get the limit and offset from the query string - const limit = parseInt(req.query.limit, 10) || 10; - const page = req.query.page ? (req.query.page - 1) * limit : 0; + // Get the limit and offset from the query string + const limit = parseInt(req.query.limit, 10) || 10; + const page = req.query.page ? (req.query.page - 1) * limit : 0; - // Get the citizens from the database - Promise.all([citizensController.findXCitizens(limit, page), citizensController.getCountOfCitizens()]).then(results => { - const [citizens, count] = results; - res.render('citizens', { - title: 'Citizens', - citizens, - count: count[0].count, - }); + // Get the citizens from the database + Promise.all([ + citizensController.findXCitizens(limit, page), + citizensController.getCountOfCitizens(), + ]).then((results) => { + const [citizens, count] = results; + res.render("citizens", { + title: "Citizens", + citizens, + count: count[0].count, }); + }); }); +router.get("/search", (req, res) => { + // Get the limit and offset from the query string + const limit = parseInt(req.query.limit, 10) || 10; + const page = req.query.page ? (req.query.page - 1) * limit : 0; + const query = req.query.query; + + // Get the citizens from the database + Promise.all([ + citizensController.searchCitizens(query, limit, page), + citizensController.countSearchedCitizens(query), + ]).then((results) => { + const [citizens, count] = results; + res.render("citizens", { + title: `Search results for "${query}"`, + citizens, + count: count[0].count, + }); + }); +}); router.get("/addUser", (req, res) => { - res.render("addUser", { - title: "Add User" - }); - } -); + res.render("addUser", { + title: "Add User", + }); +}); router.get("/beneficiaries", (req, res) => { - const limit = parseInt(req.query.limit, 10) || 100; - const page = req.query.page ? (req.query.page - 1) * limit : 0; - Promise.all([citizensController.getBeneficiaries(limit, page), citizensController.getCountOfCitizens()]).then(results => { - const [beneficiaries, count] = results; - res.render('beneficiaries', { - title: 'Beneficiaries', - beneficiaries, - count: count[0].count, - }); + const limit = parseInt(req.query.limit, 10) || 100; + const page = req.query.page ? (req.query.page - 1) * limit : 0; + Promise.all([ + citizensController.getBeneficiaries(limit, page), + citizensController.getCountOfCitizens(), + ]).then((results) => { + const [beneficiaries, count] = results; + res.render("beneficiaries", { + title: "Beneficiaries", + beneficiaries, + count: count[0].count, }); + }); }); - // export the router module.exports = router; diff --git a/interface/routes/transactions.js b/interface/routes/transactions.js new file mode 100644 index 0000000..751cc32 --- /dev/null +++ b/interface/routes/transactions.js @@ -0,0 +1,85 @@ +const express = require("express"); +const router = express.Router(); +const transactionsController = require("../controllers/transactions.controller"); + +router.get("/agriculture", (req, res) => { + const limit = parseInt(req.query.limit, 10) || 100; + const page = req.query.page ? (req.query.page - 1) * limit : 0; + Promise.all([ + transactionsController.getAgricultureTransactions(limit, page), + transactionsController.getAgricultureTransactionsCount(), + ]).then((results) => { + const [transactions, count] = results; + res.render("agriculture", { + title: "Agriculture Transactions", + transactions, + count: count[0].count, + }); + }); +}); + +router.get("/hospital", (req, res) => { + const limit = parseInt(req.query.limit, 10) || 100; + const page = req.query.page ? (req.query.page - 1) * limit : 0; + Promise.all([ + transactionsController.getHospitalTransactions(limit, page), + transactionsController.getHospitalTransactionsCount(), + ]).then((results) => { + const [transactions, count] = results; + res.render("hospital", { + title: "Hospital Transactions", + transactions, + count: count[0].count, + }); + }); +}); + +router.get("/lpg", (req, res) => { + const limit = parseInt(req.query.limit, 10) || 100; + const page = req.query.page ? (req.query.page - 1) * limit : 0; + Promise.all([ + transactionsController.getLPGTransactions(limit, page), + transactionsController.getLPGTransactionsCount(), + ]).then((results) => { + const [transactions, count] = results; + res.render("lpg", { + title: "LPG Transactions", + transactions, + count: count[0].count, + }); + }); +}); + +router.get("/nregs", (req, res) => { + const limit = parseInt(req.query.limit, 10) || 100; + const page = req.query.page ? (req.query.page - 1) * limit : 0; + Promise.all([ + transactionsController.getNREGSTransactions(limit, page), + transactionsController.getNREGSTransactionsCount(), + ]).then((results) => { + const [transactions, count] = results; + res.render("nregs", { + title: "NREGS Transactions", + transactions, + count: count[0].count, + }); + }); +}); + +router.get("/pension", (req, res) => { + const limit = parseInt(req.query.limit, 10) || 100; + const page = req.query.page ? (req.query.page - 1) * limit : 0; + Promise.all([ + transactionsController.getPensionTransactions(limit, page), + transactionsController.getPensionTransactionsCount(), + ]).then((results) => { + const [transactions, count] = results; + res.render("pension", { + title: "Pension Transactions", + transactions, + count: count[0].count, + }); + }); +}); + +module.exports = router; diff --git a/interface/server.js b/interface/server.js index 4173d2f..5736d4c 100644 --- a/interface/server.js +++ b/interface/server.js @@ -2,7 +2,7 @@ const express = require("express"); const app = express(); const cors = require("cors"); const db = require("./models"); -db.sequelize.sync(); +// db.sequelize.sync(); app.use(cors()); app.use(express.json()); diff --git a/interface/views/agriculture.ejs b/interface/views/agriculture.ejs new file mode 100644 index 0000000..95e3052 --- /dev/null +++ b/interface/views/agriculture.ejs @@ -0,0 +1,198 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <%- include('partials/head') %> + <style> + .ui.menu { + margin-top: 0; + } + .scrollY { + max-height: calc(100vh - 8rem); + margin-top: 1rem; + overflow-y: scroll; + } + .ui.table thead tr:first-child > th { + position: sticky !important; + top: 0; + z-index: 2; + } + .ui.table tfoot tr:first-child > th { + position: sticky !important; + bottom: 0; + z-index: 2; + } + </style> + </head> + + <body> + <%- include('partials/navbar') %> + + <!-- Drop down for selecting limit --> + + <div class="ui container"> + <div class="ui floating labeled icon dropdown button"> + <i class="list icon"></i> + <span class="text">Items</span> + <div class="menu"> + <div class="item" onclick="redirectToLimit(100)">100</div> + <div class="item" onclick="redirectToLimit(250)">250</div> + <div class="item" onclick="redirectToLimit(500)">500</div> + <div class="item" onclick="redirectToLimit(1000)">1000</div> + </div> + </div> + </div> + + <div class="scrollY"> + <table class="ui selectable table"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Amount Remitted</th> + <th>Crop</th> + <th>Disbursed Date</th> + </tr> + </thead> + <tbody> + <% for(var i=0; i < transactions.length; i++) { %> + <tr> + <td><%= transactions[i].first_name %></td> + <td><%= transactions[i].last_name %></td> + <td><%= transactions[i].amount_remitted %></td> + <td><%= transactions[i].crop %></td> + <td><%= transactions[i].disbursed_date %></td> + <% } %> + </tr> + </tbody> + + <!-- Display a pagination --> + <tfoot> + <tr> + <th colspan="9"> + <div class="ui right floated pagination menu"> + <a class="icon item" id="pageLeft"> + <i class="left chevron disabled icon"></i> + </a> + + <a class="icon item" id="pageRight"> + <i class="right chevron disabled icon"></i> + </a> + </div> + </th> + </tr> + </tfoot> + </table> + </div> + </body> + <%- include('partials/scripts') %> + <script> + const count = "<%= count %>"; + </script> + <script> + // Get current page and limit query parameter + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const page = urlParams.get("page") || 1; + const limit = urlParams.get("limit") || 100; + const numberOfPages = Math.ceil(count / limit); + const pagination = $(".pagination"); + const pageLeft = $("#pageLeft"); + const pageRight = $("#pageRight"); + if (page > 1) { + pageLeft.removeClass("disabled"); + pageLeft.attr( + "href", + `/transactions/agriculture?page=${parseInt(page) - 1}&limit=${limit}` + ); + } else { + pageLeft.addClass("disabled"); + } + if (page < numberOfPages) { + pageRight.removeClass("disabled"); + pageRight.attr( + "href", + `/transactions/agriculture?page=${parseInt(page) + 1}&limit=${limit}` + ); + } else { + pageRight.addClass("disabled"); + } + + function redirectToLimit(limit) { + window.location.href = `/transactions/agriculture?page=1&limit=${limit}`; + } + + addPageNumbers(numberOfPages); + + function addPageNumbers(numberOfPages) { + // Add page numbers from current page to 2 pages before and 2 pages after, if there are more than 5 pages + if (numberOfPages > 5) { + let startingPoint = page - 2; + if (page < 3) { + startingPoint = 1; + } else if (page > numberOfPages - 2) { + startingPoint = numberOfPages - 4; + } else { + startingPoint = page - 2; + } + for (let i = startingPoint; i < startingPoint + 5; i++) { + const linkElement = document.createElement("a"); + linkElement.innerHTML = i; + linkElement.setAttribute( + "href", + `/transactions/agriculture?page=${i}&limit=${limit}` + ); + linkElement.setAttribute("id", `page${i}`); + linkElement.classList.add("item"); + pageRight.before(linkElement); + } + // add dots + const dots = document.createElement("a"); + dots.innerHTML = "..."; + dots.classList.add("item"); + pageRight.before(dots); + + // add first page if page > 3 + if (page > 3) { + const firstPage = document.createElement("a"); + firstPage.innerHTML = 1; + firstPage.setAttribute( + "href", + `/transactions/agriculture?page=1&limit=${limit}` + ); + firstPage.setAttribute("id", `page1`); + firstPage.classList.add("item"); + pageLeft.after(dots); + pageLeft.after(firstPage); + } + + // add last page + if (page != numberOfPages) { + const lastPage = document.createElement("a"); + lastPage.innerHTML = numberOfPages; + lastPage.setAttribute( + "href", + `/transactions/agriculture?page=${numberOfPages}&limit=${limit}` + ); + lastPage.classList.add("item"); + pageRight.before(lastPage); + } + } else { + // add page numbers + for (let i = 1; i <= numberOfPages; i++) { + // Insert before pageRight + const linkElement = document.createElement("a"); + linkElement.innerHTML = i; + linkElement.setAttribute( + "href", + `/transactions/agriculture?page=${i}&limit=${limit}` + ); + linkElement.setAttribute("id", `page${i}`); + linkElement.classList.add("item"); + pageRight.before(linkElement); + } + } + const currentPageElement = document.getElementById(`page${page}`); + currentPageElement.classList.add("active"); + } + </script> +</html> diff --git a/interface/views/citizens.ejs b/interface/views/citizens.ejs index 2cb4ecf..5513bc3 100644 --- a/interface/views/citizens.ejs +++ b/interface/views/citizens.ejs @@ -72,7 +72,7 @@ <%- include('partials/navbar') %> <!-- Drop down for selecting limit --> - + <% if(citizens.length){ %> <div class="ui container"> <div class="ui floating labeled icon dropdown button"> <i class="list icon"></i> @@ -85,7 +85,11 @@ </div> </div> </div> - + <% } %> + <% if(!citizens.length){ %> + <h1 style="text-align: center;">No Data Found</h1> + <% } %> + <% if(citizens.length){ %> <div class="scrollY"> <table class="ui selectable table"> <thead> @@ -154,6 +158,7 @@ </tfoot> </table> </div> + <% } %> </body> <%- include('partials/scripts') %> <script> diff --git a/interface/views/hospital.ejs b/interface/views/hospital.ejs new file mode 100644 index 0000000..962c742 --- /dev/null +++ b/interface/views/hospital.ejs @@ -0,0 +1,198 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <%- include('partials/head') %> + <style> + .ui.menu { + margin-top: 0; + } + .scrollY { + max-height: calc(100vh - 8rem); + margin-top: 1rem; + overflow-y: scroll; + } + .ui.table thead tr:first-child > th { + position: sticky !important; + top: 0; + z-index: 2; + } + .ui.table tfoot tr:first-child > th { + position: sticky !important; + bottom: 0; + z-index: 2; + } + </style> + </head> + + <body> + <%- include('partials/navbar') %> + + <!-- Drop down for selecting limit --> + + <div class="ui container"> + <div class="ui floating labeled icon dropdown button"> + <i class="list icon"></i> + <span class="text">Items</span> + <div class="menu"> + <div class="item" onclick="redirectToLimit(100)">100</div> + <div class="item" onclick="redirectToLimit(250)">250</div> + <div class="item" onclick="redirectToLimit(500)">500</div> + <div class="item" onclick="redirectToLimit(1000)">1000</div> + </div> + </div> + </div> + + <div class="scrollY"> + <table class="ui selectable table"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Disease Category</th> + <th>Disease Sub Category</th> + <th>Amount Charged</th> + </tr> + </thead> + <tbody> + <% for(var i=0; i < transactions.length; i++) { %> + <tr> + <td><%= transactions[i].first_name %></td> + <td><%= transactions[i].last_name %></td> + <td><%= transactions[i].disease_category %></td> + <td><%= transactions[i].disease_sub_category %></td> + <td><%= transactions[i].amount_charged %></td> + <% } %> + </tr> + </tbody> + + <!-- Display a pagination --> + <tfoot> + <tr> + <th colspan="9"> + <div class="ui right floated pagination menu"> + <a class="icon item" id="pageLeft"> + <i class="left chevron disabled icon"></i> + </a> + + <a class="icon item" id="pageRight"> + <i class="right chevron disabled icon"></i> + </a> + </div> + </th> + </tr> + </tfoot> + </table> + </div> + </body> + <%- include('partials/scripts') %> + <script> + const count = "<%= count %>"; + </script> + <script> + // Get current page and limit query parameter + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const page = urlParams.get("page") || 1; + const limit = urlParams.get("limit") || 100; + const numberOfPages = Math.ceil(count / limit); + const pagination = $(".pagination"); + const pageLeft = $("#pageLeft"); + const pageRight = $("#pageRight"); + if (page > 1) { + pageLeft.removeClass("disabled"); + pageLeft.attr( + "href", + `/transactions/hospital?page=${parseInt(page) - 1}&limit=${limit}` + ); + } else { + pageLeft.addClass("disabled"); + } + if (page < numberOfPages) { + pageRight.removeClass("disabled"); + pageRight.attr( + "href", + `/transactions/hospital?page=${parseInt(page) + 1}&limit=${limit}` + ); + } else { + pageRight.addClass("disabled"); + } + + function redirectToLimit(limit) { + window.location.href = `/transactions/hospital?page=1&limit=${limit}`; + } + + addPageNumbers(numberOfPages); + + function addPageNumbers(numberOfPages) { + // Add page numbers from current page to 2 pages before and 2 pages after, if there are more than 5 pages + if (numberOfPages > 5) { + let startingPoint = page - 2; + if (page < 3) { + startingPoint = 1; + } else if (page > numberOfPages - 2) { + startingPoint = numberOfPages - 4; + } else { + startingPoint = page - 2; + } + for (let i = startingPoint; i < startingPoint + 5; i++) { + const linkElement = document.createElement("a"); + linkElement.innerHTML = i; + linkElement.setAttribute( + "href", + `/transactions/hospital?page=${i}&limit=${limit}` + ); + linkElement.setAttribute("id", `page${i}`); + linkElement.classList.add("item"); + pageRight.before(linkElement); + } + // add dots + const dots = document.createElement("a"); + dots.innerHTML = "..."; + dots.classList.add("item"); + pageRight.before(dots); + + // add first page if page > 3 + if (page > 3) { + const firstPage = document.createElement("a"); + firstPage.innerHTML = 1; + firstPage.setAttribute( + "href", + `/transactions/hospital?page=1&limit=${limit}` + ); + firstPage.setAttribute("id", `page1`); + firstPage.classList.add("item"); + pageLeft.after(dots); + pageLeft.after(firstPage); + } + + // add last page + if (page != numberOfPages) { + const lastPage = document.createElement("a"); + lastPage.innerHTML = numberOfPages; + lastPage.setAttribute( + "href", + `/transactions/hospital?page=${numberOfPages}&limit=${limit}` + ); + lastPage.classList.add("item"); + pageRight.before(lastPage); + } + } else { + // add page numbers + for (let i = 1; i <= numberOfPages; i++) { + // Insert before pageRight + const linkElement = document.createElement("a"); + linkElement.innerHTML = i; + linkElement.setAttribute( + "href", + `/transactions/hospital?page=${i}&limit=${limit}` + ); + linkElement.setAttribute("id", `page${i}`); + linkElement.classList.add("item"); + pageRight.before(linkElement); + } + } + const currentPageElement = document.getElementById(`page${page}`); + currentPageElement.classList.add("active"); + } + </script> +</html> diff --git a/interface/views/index.ejs b/interface/views/index.ejs index eebd413..14c98d4 100644 --- a/interface/views/index.ejs +++ b/interface/views/index.ejs @@ -2,6 +2,11 @@ <html lang="en"> <head> <%- include('partials/head') %> + <style> + .ui.menu { + margin-bottom: 0; + } + </style> </head> <body> @@ -38,7 +43,18 @@ </div> </div> <%- include('partials/navbar') %> - <div class="ui main container segment"> + <div class="ui inverted vertical masthead center aligned segment" style="background: linear-gradient( rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5) ), url('https://media-exp1.licdn.com/dms/image/C561BAQH2gmHaPvj2UA/company-background_10000/0/1622700188261?e=2147483647&v=beta&t=cANraogFmQmMwo8_3XlLnOFTNp-sHwzNk94uezmJmIk');; background-position: 0 30%; background-repeat: no-repeat; background-size: cover;"> + <div class="ui text container" style="margin: 8rem 0px;"> + <h1 class="ui inverted header"> + Unified Framework for Welfare Schemes + </h1> + <h2>Demonstrating various welfare schemes under a single dashboard</h2> + <div class="ui huge primary button" onclick="route('/citizens')"> + View Citizens <i class="right arrow icon"></i> + </div> + </div> + </div> + <div class="ui main container segment" style="width: 80vw"> <div class="ui three column grid"> <div class="column"> <div class="ui cards" id="genderdist"></div> @@ -155,7 +171,6 @@ // marital dist const maritalDist = JSON.parse(`<%- JSON.stringify(maritalDist) %>`); - var x = []; var y = []; for (var i = 0; i < maritalDist.length; i++) { @@ -225,7 +240,7 @@ y.push(citizenDist[i].district_dist); } - // plot bubble chart + // plot bubble chart var trace6 = { x: x, y: y, @@ -242,7 +257,5 @@ }; var config = { responsive: true }; Plotly.newPlot("citizendist", data, layout, config); - - </script> </html> diff --git a/interface/views/lpg.ejs b/interface/views/lpg.ejs new file mode 100644 index 0000000..b91954f --- /dev/null +++ b/interface/views/lpg.ejs @@ -0,0 +1,198 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <%- include('partials/head') %> + <style> + .ui.menu { + margin-top: 0; + } + .scrollY { + max-height: calc(100vh - 8rem); + margin-top: 1rem; + overflow-y: scroll; + } + .ui.table thead tr:first-child > th { + position: sticky !important; + top: 0; + z-index: 2; + } + .ui.table tfoot tr:first-child > th { + position: sticky !important; + bottom: 0; + z-index: 2; + } + </style> + </head> + + <body> + <%- include('partials/navbar') %> + + <!-- Drop down for selecting limit --> + + <div class="ui container"> + <div class="ui floating labeled icon dropdown button"> + <i class="list icon"></i> + <span class="text">Items</span> + <div class="menu"> + <div class="item" onclick="redirectToLimit(100)">100</div> + <div class="item" onclick="redirectToLimit(250)">250</div> + <div class="item" onclick="redirectToLimit(500)">500</div> + <div class="item" onclick="redirectToLimit(1000)">1000</div> + </div> + </div> + </div> + + <div class="scrollY"> + <table class="ui selectable table"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Booking Date</th> + <th>Amount Paid</th> + <th>Amount Remitted</th> + </tr> + </thead> + <tbody> + <% for(var i=0; i < transactions.length; i++) { %> + <tr> + <td><%= transactions[i].first_name %></td> + <td><%= transactions[i].last_name %></td> + <td><%= transactions[i].booking_date %></td> + <td><%= transactions[i].amount_paid %></td> + <td><%= transactions[i].amount_remitted %></td> + <% } %> + </tr> + </tbody> + + <!-- Display a pagination --> + <tfoot> + <tr> + <th colspan="9"> + <div class="ui right floated pagination menu"> + <a class="icon item" id="pageLeft"> + <i class="left chevron disabled icon"></i> + </a> + + <a class="icon item" id="pageRight"> + <i class="right chevron disabled icon"></i> + </a> + </div> + </th> + </tr> + </tfoot> + </table> + </div> + </body> + <%- include('partials/scripts') %> + <script> + const count = "<%= count %>"; + </script> + <script> + // Get current page and limit query parameter + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const page = urlParams.get("page") || 1; + const limit = urlParams.get("limit") || 100; + const numberOfPages = Math.ceil(count / limit); + const pagination = $(".pagination"); + const pageLeft = $("#pageLeft"); + const pageRight = $("#pageRight"); + if (page > 1) { + pageLeft.removeClass("disabled"); + pageLeft.attr( + "href", + `/transactions/lpg?page=${parseInt(page) - 1}&limit=${limit}` + ); + } else { + pageLeft.addClass("disabled"); + } + if (page < numberOfPages) { + pageRight.removeClass("disabled"); + pageRight.attr( + "href", + `/transactions/lpg?page=${parseInt(page) + 1}&limit=${limit}` + ); + } else { + pageRight.addClass("disabled"); + } + + function redirectToLimit(limit) { + window.location.href = `/transactions/lpg?page=1&limit=${limit}`; + } + + addPageNumbers(numberOfPages); + + function addPageNumbers(numberOfPages) { + // Add page numbers from current page to 2 pages before and 2 pages after, if there are more than 5 pages + if (numberOfPages > 5) { + let startingPoint = page - 2; + if (page < 3) { + startingPoint = 1; + } else if (page > numberOfPages - 2) { + startingPoint = numberOfPages - 4; + } else { + startingPoint = page - 2; + } + for (let i = startingPoint; i < startingPoint + 5; i++) { + const linkElement = document.createElement("a"); + linkElement.innerHTML = i; + linkElement.setAttribute( + "href", + `/transactions/lpg?page=${i}&limit=${limit}` + ); + linkElement.setAttribute("id", `page${i}`); + linkElement.classList.add("item"); + pageRight.before(linkElement); + } + // add dots + const dots = document.createElement("a"); + dots.innerHTML = "..."; + dots.classList.add("item"); + pageRight.before(dots); + + // add first page if page > 3 + if (page > 3) { + const firstPage = document.createElement("a"); + firstPage.innerHTML = 1; + firstPage.setAttribute( + "href", + `/transactions/lpg?page=1&limit=${limit}` + ); + firstPage.setAttribute("id", `page1`); + firstPage.classList.add("item"); + pageLeft.after(dots); + pageLeft.after(firstPage); + } + + // add last page + if (page != numberOfPages) { + const lastPage = document.createElement("a"); + lastPage.innerHTML = numberOfPages; + lastPage.setAttribute( + "href", + `/transactions/lpg?page=${numberOfPages}&limit=${limit}` + ); + lastPage.classList.add("item"); + pageRight.before(lastPage); + } + } else { + // add page numbers + for (let i = 1; i <= numberOfPages; i++) { + // Insert before pageRight + const linkElement = document.createElement("a"); + linkElement.innerHTML = i; + linkElement.setAttribute( + "href", + `/transactions/lpg?page=${i}&limit=${limit}` + ); + linkElement.setAttribute("id", `page${i}`); + linkElement.classList.add("item"); + pageRight.before(linkElement); + } + } + const currentPageElement = document.getElementById(`page${page}`); + currentPageElement.classList.add("active"); + } + </script> +</html> diff --git a/interface/views/nregs.ejs b/interface/views/nregs.ejs new file mode 100644 index 0000000..dd2a20d --- /dev/null +++ b/interface/views/nregs.ejs @@ -0,0 +1,196 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <%- include('partials/head') %> + <style> + .ui.menu { + margin-top: 0; + } + .scrollY { + max-height: calc(100vh - 8rem); + margin-top: 1rem; + overflow-y: scroll; + } + .ui.table thead tr:first-child > th { + position: sticky !important; + top: 0; + z-index: 2; + } + .ui.table tfoot tr:first-child > th { + position: sticky !important; + bottom: 0; + z-index: 2; + } + </style> + </head> + + <body> + <%- include('partials/navbar') %> + + <!-- Drop down for selecting limit --> + + <div class="ui container"> + <div class="ui floating labeled icon dropdown button"> + <i class="list icon"></i> + <span class="text">Items</span> + <div class="menu"> + <div class="item" onclick="redirectToLimit(100)">100</div> + <div class="item" onclick="redirectToLimit(250)">250</div> + <div class="item" onclick="redirectToLimit(500)">500</div> + <div class="item" onclick="redirectToLimit(1000)">1000</div> + </div> + </div> + </div> + + <div class="scrollY"> + <table class="ui selectable table"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Days Attended</th> + <th>Amount Remitted</th> + </tr> + </thead> + <tbody> + <% for(var i=0; i < transactions.length; i++) { %> + <tr> + <td><%= transactions[i].first_name %></td> + <td><%= transactions[i].last_name %></td> + <td><%= transactions[i].days_of_attended %></td> + <td><%= transactions[i].amount_remitted %></td> + <% } %> + </tr> + </tbody> + + <!-- Display a pagination --> + <tfoot> + <tr> + <th colspan="9"> + <div class="ui right floated pagination menu"> + <a class="icon item" id="pageLeft"> + <i class="left chevron disabled icon"></i> + </a> + + <a class="icon item" id="pageRight"> + <i class="right chevron disabled icon"></i> + </a> + </div> + </th> + </tr> + </tfoot> + </table> + </div> + </body> + <%- include('partials/scripts') %> + <script> + const count = "<%= count %>"; + </script> + <script> + // Get current page and limit query parameter + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const page = urlParams.get("page") || 1; + const limit = urlParams.get("limit") || 100; + const numberOfPages = Math.ceil(count / limit); + const pagination = $(".pagination"); + const pageLeft = $("#pageLeft"); + const pageRight = $("#pageRight"); + if (page > 1) { + pageLeft.removeClass("disabled"); + pageLeft.attr( + "href", + `/transactions/nregs?page=${parseInt(page) - 1}&limit=${limit}` + ); + } else { + pageLeft.addClass("disabled"); + } + if (page < numberOfPages) { + pageRight.removeClass("disabled"); + pageRight.attr( + "href", + `/transactions/nregs?page=${parseInt(page) + 1}&limit=${limit}` + ); + } else { + pageRight.addClass("disabled"); + } + + function redirectToLimit(limit) { + window.location.href = `/transactions/nregs?page=1&limit=${limit}`; + } + + addPageNumbers(numberOfPages); + + function addPageNumbers(numberOfPages) { + // Add page numbers from current page to 2 pages before and 2 pages after, if there are more than 5 pages + if (numberOfPages > 5) { + let startingPoint = page - 2; + if (page < 3) { + startingPoint = 1; + } else if (page > numberOfPages - 2) { + startingPoint = numberOfPages - 4; + } else { + startingPoint = page - 2; + } + for (let i = startingPoint; i < startingPoint + 5; i++) { + const linkElement = document.createElement("a"); + linkElement.innerHTML = i; + linkElement.setAttribute( + "href", + `/transactions/nregs?page=${i}&limit=${limit}` + ); + linkElement.setAttribute("id", `page${i}`); + linkElement.classList.add("item"); + pageRight.before(linkElement); + } + // add dots + const dots = document.createElement("a"); + dots.innerHTML = "..."; + dots.classList.add("item"); + pageRight.before(dots); + + // add first page if page > 3 + if (page > 3) { + const firstPage = document.createElement("a"); + firstPage.innerHTML = 1; + firstPage.setAttribute( + "href", + `/transactions/nregs?page=1&limit=${limit}` + ); + firstPage.setAttribute("id", `page1`); + firstPage.classList.add("item"); + pageLeft.after(dots); + pageLeft.after(firstPage); + } + + // add last page + if (page != numberOfPages) { + const lastPage = document.createElement("a"); + lastPage.innerHTML = numberOfPages; + lastPage.setAttribute( + "href", + `/transactions/nregs?page=${numberOfPages}&limit=${limit}` + ); + lastPage.classList.add("item"); + pageRight.before(lastPage); + } + } else { + // add page numbers + for (let i = 1; i <= numberOfPages; i++) { + // Insert before pageRight + const linkElement = document.createElement("a"); + linkElement.innerHTML = i; + linkElement.setAttribute( + "href", + `/transactions/nregs?page=${i}&limit=${limit}` + ); + linkElement.setAttribute("id", `page${i}`); + linkElement.classList.add("item"); + pageRight.before(linkElement); + } + } + const currentPageElement = document.getElementById(`page${page}`); + currentPageElement.classList.add("active"); + } + </script> +</html> diff --git a/interface/views/partials/navbar.ejs b/interface/views/partials/navbar.ejs index 30289d2..9585454 100644 --- a/interface/views/partials/navbar.ejs +++ b/interface/views/partials/navbar.ejs @@ -1,3 +1,10 @@ +<style> + .ui.menu { + position: sticky !important; + top: 0; + z-index: 2; + } +</style> <div class="ui menu"> <a class="item" onclick="route('/')"> Home </a> <div class="ui pointing dropdown link item"> @@ -5,7 +12,7 @@ <i class="dropdown icon"></i> <div class="menu"> <div class="item" onclick="route('citizens')">Citizens</div> - <div class="item"> + <!-- <div class="item"> <i class="dropdown icon"></i> <span class="text">Amenities</span> <div class="menu"> @@ -28,28 +35,36 @@ <div class="item">State</div> <div class="item">Village</div> </div> - </div> + </div> --> <div class="item"> <i class="dropdown icon"></i> <span class="text">Transactions</span> <div class="menu"> - <div class="item">Agricultural</div> - <div class="item">Hospital</div> - <div class="item">LPG</div> - <div class="item">NRegs</div> - <div class="item">Pension</div> + <div class="item" onclick="route('/transactions/agriculture')"> + Agricultural + </div> + <div class="item" onclick="route('/transactions/hospital')"> + Hospital + </div> + <div class="item" onclick="route('/transactions/lpg')">LPG</div> + <div class="item" onclick="route('/transactions/nregs')">NRegs</div> + <div class="item" onclick="route('/transactions/pension')"> + Pension + </div> </div> </div> </div> </div> - <a class="item" onclick="route('beneficiaries')"> Scheme Wise Beneficiaries </a> + <a class="item" onclick="route('beneficiaries')"> + Scheme Wise Beneficiaries + </a> <a class="item" onclick="route('addUser')"> Add User </a> <div class="right menu"> <div class="item"> <div class="ui icon input"> - <input type="text" placeholder="Search..." /> + <input type="text" placeholder="Search..." id="searchInput"/> <i class="search link icon"></i> </div> </div> diff --git a/interface/views/partials/scripts.ejs b/interface/views/partials/scripts.ejs index 1f0e375..85051fa 100644 --- a/interface/views/partials/scripts.ejs +++ b/interface/views/partials/scripts.ejs @@ -10,4 +10,12 @@ <script src='https://cdn.plot.ly/plotly-2.11.1.min.js'></script> <script> $(".ui.dropdown").dropdown(); + $(document).ready(function() { + // listen for return key press on search input + $("#searchInput").keyup(function(event) { + if (event.keyCode === 13 && $("#searchInput").val() !== "") { + route("/search?query=" + $("#searchInput").val()); + } + }); + }); </script>
\ No newline at end of file diff --git a/interface/views/pension.ejs b/interface/views/pension.ejs new file mode 100644 index 0000000..8cab043 --- /dev/null +++ b/interface/views/pension.ejs @@ -0,0 +1,196 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <%- include('partials/head') %> + <style> + .ui.menu { + margin-top: 0; + } + .scrollY { + max-height: calc(100vh - 8rem); + margin-top: 1rem; + overflow-y: scroll; + } + .ui.table thead tr:first-child > th { + position: sticky !important; + top: 0; + z-index: 2; + } + .ui.table tfoot tr:first-child > th { + position: sticky !important; + bottom: 0; + z-index: 2; + } + </style> + </head> + + <body> + <%- include('partials/navbar') %> + + <!-- Drop down for selecting limit --> + + <div class="ui container"> + <div class="ui floating labeled icon dropdown button"> + <i class="list icon"></i> + <span class="text">Items</span> + <div class="menu"> + <div class="item" onclick="redirectToLimit(100)">100</div> + <div class="item" onclick="redirectToLimit(250)">250</div> + <div class="item" onclick="redirectToLimit(500)">500</div> + <div class="item" onclick="redirectToLimit(1000)">1000</div> + </div> + </div> + </div> + + <div class="scrollY"> + <table class="ui selectable table"> + <thead> + <tr> + <th>First Name</th> + <th>Last Name</th> + <th>Date of Disbursement</th> + <th>Pension Amount</th> + </tr> + </thead> + <tbody> + <% for(var i=0; i < transactions.length; i++) { %> + <tr> + <td><%= transactions[i].first_name %></td> + <td><%= transactions[i].last_name %></td> + <td><%= transactions[i].pen_date_disbursment %></td> + <td><%= transactions[i].pen_amount %></td> + <% } %> + </tr> + </tbody> + + <!-- Display a pagination --> + <tfoot> + <tr> + <th colspan="9"> + <div class="ui right floated pagination menu"> + <a class="icon item" id="pageLeft"> + <i class="left chevron disabled icon"></i> + </a> + + <a class="icon item" id="pageRight"> + <i class="right chevron disabled icon"></i> + </a> + </div> + </th> + </tr> + </tfoot> + </table> + </div> + </body> + <%- include('partials/scripts') %> + <script> + const count = "<%= count %>"; + </script> + <script> + // Get current page and limit query parameter + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const page = urlParams.get("page") || 1; + const limit = urlParams.get("limit") || 100; + const numberOfPages = Math.ceil(count / limit); + const pagination = $(".pagination"); + const pageLeft = $("#pageLeft"); + const pageRight = $("#pageRight"); + if (page > 1) { + pageLeft.removeClass("disabled"); + pageLeft.attr( + "href", + `/transactions/pension?page=${parseInt(page) - 1}&limit=${limit}` + ); + } else { + pageLeft.addClass("disabled"); + } + if (page < numberOfPages) { + pageRight.removeClass("disabled"); + pageRight.attr( + "href", + `/transactions/pension?page=${parseInt(page) + 1}&limit=${limit}` + ); + } else { + pageRight.addClass("disabled"); + } + + function redirectToLimit(limit) { + window.location.href = `/transactions/pension?page=1&limit=${limit}`; + } + + addPageNumbers(numberOfPages); + + function addPageNumbers(numberOfPages) { + // Add page numbers from current page to 2 pages before and 2 pages after, if there are more than 5 pages + if (numberOfPages > 5) { + let startingPoint = page - 2; + if (page < 3) { + startingPoint = 1; + } else if (page > numberOfPages - 2) { + startingPoint = numberOfPages - 4; + } else { + startingPoint = page - 2; + } + for (let i = startingPoint; i < startingPoint + 5; i++) { + const linkElement = document.createElement("a"); + linkElement.innerHTML = i; + linkElement.setAttribute( + "href", + `/transactions/pension?page=${i}&limit=${limit}` + ); + linkElement.setAttribute("id", `page${i}`); + linkElement.classList.add("item"); + pageRight.before(linkElement); + } + // add dots + const dots = document.createElement("a"); + dots.innerHTML = "..."; + dots.classList.add("item"); + pageRight.before(dots); + + // add first page if page > 3 + if (page > 3) { + const firstPage = document.createElement("a"); + firstPage.innerHTML = 1; + firstPage.setAttribute( + "href", + `/transactions/pension?page=1&limit=${limit}` + ); + firstPage.setAttribute("id", `page1`); + firstPage.classList.add("item"); + pageLeft.after(dots); + pageLeft.after(firstPage); + } + + // add last page + if (page != numberOfPages) { + const lastPage = document.createElement("a"); + lastPage.innerHTML = numberOfPages; + lastPage.setAttribute( + "href", + `/transactions/pension?page=${numberOfPages}&limit=${limit}` + ); + lastPage.classList.add("item"); + pageRight.before(lastPage); + } + } else { + // add page numbers + for (let i = 1; i <= numberOfPages; i++) { + // Insert before pageRight + const linkElement = document.createElement("a"); + linkElement.innerHTML = i; + linkElement.setAttribute( + "href", + `/transactions/pension?page=${i}&limit=${limit}` + ); + linkElement.setAttribute("id", `page${i}`); + linkElement.classList.add("item"); + pageRight.before(linkElement); + } + } + const currentPageElement = document.getElementById(`page${page}`); + currentPageElement.classList.add("active"); + } + </script> +</html> |
