SET default_with_oids = true;

drop table compliq;
drop table liqui;
drop table auxint;
drop table calcint;
drop table compliquid;
drop table liquidacion;
drop table comprop;



CREATE TABLE liquidacion (
    l_id serial,
    l_codemp integer NOT NULL,
    l_idptov integer DEFAULT 0 NOT NULL,
    l_division integer,
    l_centro integer DEFAULT 0 NOT NULL,
    l_anio integer NOT NULL,
    l_mes integer NOT NULL,
    l_perim integer NOT NULL,                -- Mes de liquidado
    l_peria integer NOT NULL,                -- Anio Liquidado
    l_feccie date NOT NULL,
    l_fecvto date NOT NULL,
    l_comprob integer NOT NULL,
    l_numero integer NOT NULL,
    l_estado integer DEFAULT 1 NOT NULL,
    l_fecreg timestamp without time zone DEFAULT now() NOT NULL,
    l_operador integer NOT NULL
);


ALTER TABLE public.liquidacion OWNER TO sanjor;
ALTER TABLE ONLY liquidacion ADD CONSTRAINT "$1" FOREIGN KEY (l_codemp) REFERENCES empresa(emp_codigo) MATCH FULL;
ALTER TABLE ONLY liquidacion ADD CONSTRAINT "$2" FOREIGN KEY (l_idptov) REFERENCES ptovta(ptv_id) MATCH FULL;
ALTER TABLE ONLY liquidacion ADD CONSTRAINT "$3" FOREIGN KEY (l_centro) REFERENCES centroc(cco_id) MATCH FULL;
ALTER TABLE ONLY liquidacion ADD CONSTRAINT "$4" FOREIGN KEY (l_division) REFERENCES division(div_id) MATCH FULL;

CREATE UNIQUE INDEX idx_liquidacion_0 ON liquidacion USING btree (l_codemp, l_idptov, l_centro, l_division, l_anio, l_mes);
CREATE INDEX idx_liquidacion_1 ON liquidacion USING btree (l_codemp, l_idptov, l_anio, l_mes);
CREATE INDEX idx_liquidacion_2 ON liquidacion USING btree (l_idptov, l_anio, l_mes);

REVOKE ALL ON TABLE liquidacion FROM PUBLIC;
REVOKE ALL ON TABLE liquidacion FROM sanjor;
GRANT ALL ON TABLE liquidacion TO sanjor;
GRANT ALL ON TABLE liquidacion TO nobody;




CREATE TABLE compliquid (
    cl_id serial,
    cl_idliq integer NOT NULL,
    cl_rubcar integer,
    cl_cargo integer,
    cl_porc integer DEFAULT 1 NOT NULL,
    cl_leyen character varying(240),
    cl_importe numeric(15,2) DEFAULT 0,
    cl_estado integer DEFAULT 1 NOT NULL
);


ALTER TABLE public.compliquid OWNER TO sanjor;
ALTER TABLE ONLY compliquid ADD CONSTRAINT "$1" FOREIGN KEY (cl_idliq) REFERENCES liquidacion(l_id) MATCH FULL;

CREATE INDEX idx_compliquid_1 ON compliquid USING btree (cl_idliq);

REVOKE ALL ON TABLE compliquid FROM PUBLIC;
REVOKE ALL ON TABLE compliquid FROM sanjor;
GRANT ALL ON TABLE compliquid TO sanjor;
GRANT ALL ON TABLE compliquid TO nobody;




CREATE TABLE liqui (
    lq_id serial,
    lq_idliq integer NOT NULL,
    lq_idcopr integer NOT NULL,
    lq_rubcar integer,
    lq_cargo integer,
    lq_canti numeric(15,5) DEFAULT 1,
    lq_precio numeric(15,5) DEFAULT 1,
    lq_importe numeric(15,2) DEFAULT 0,
    lq_leyen text
);


ALTER TABLE public.liqui OWNER TO sanjor;
ALTER TABLE ONLY liqui ADD CONSTRAINT "$1" FOREIGN KEY (lq_idliq) REFERENCES liqui(l_id) MATCH FULL;
ALTER TABLE ONLY liqui ADD CONSTRAINT "$2" FOREIGN KEY (lq_idcopr) REFERENCES coprop(cop_id) MATCH FULL;
ALTER TABLE ONLY liqui ADD CONSTRAINT "$3" FOREIGN KEY (lq_cargo) REFERENCES cargos(car_id);
CREATE INDEX idx_liqui_1 ON liqui USING btree (lq_idliq, lq_idcopr);

REVOKE ALL ON TABLE liqui FROM PUBLIC;
REVOKE ALL ON TABLE liqui FROM sanjor;
GRANT ALL ON TABLE liqui TO sanjor;
GRANT ALL ON TABLE liqui TO nobody;




CREATE TABLE compliq (
    clq_id integer NOT NULL,
    clq_codemp integer NOT NULL,
    clq_idptov integer NOT NULL,
    clq_division integer,
    clq_centro integer,
    clq_idcopr integer NOT NULL,
    clq_fecha date DEFAULT date(now()),
    clq_fecvto date DEFAULT date(now()),
    clq_anio integer DEFAULT date_part('Y'::text, date(now())) NOT NULL,
    clq_mes integer DEFAULT date_part('month'::text, date(now())) NOT NULL,
    clq_comprob integer,
    clq_numero integer,
    clq_rubcar integer NOT NULL,
    clq_cargo integer NOT NULL,
    clq_canti numeric(15,5) DEFAULT 1,
    clq_precio numeric(15,5) DEFAULT 0,
    clq_importe numeric(15,2) DEFAULT 0,
    clq_interes numeric(15,5) DEFAULT 1,
    clq_estado integer DEFAULT 1,
    clq_fecreg timestamp without time zone DEFAULT now() NOT NULL,
    clq_operad integer,
    clq_leyen text
);

ALTER TABLE public.compliq OWNER TO sanjor;

CREATE SEQUENCE compliq_clq_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;


ALTER TABLE public.compliq_clq_id_seq OWNER TO sanjor;
ALTER SEQUENCE compliq_clq_id_seq OWNED BY compliq.clq_id;
ALTER TABLE ONLY compliq ALTER COLUMN clq_id SET DEFAULT nextval('compliq_clq_id_seq'::regclass);
ALTER TABLE ONLY compliq ADD CONSTRAINT compliq_pkey PRIMARY KEY (clq_id);

CREATE INDEX idx_compliq_2 ON compliq USING btree (clq_codemp, clq_idptov, clq_comprob, clq_numero);
CREATE INDEX idx_compliq_3 ON compliq USING btree (clq_codemp, clq_idptov, clq_anio, clq_mes);
CREATE INDEX idx_compliq_4 ON compliq USING btree (clq_codemp, clq_idptov, clq_anio, clq_mes, clq_rubcar, clq_cargo);

ALTER TABLE ONLY compliq ADD CONSTRAINT "$1" FOREIGN KEY (clq_codemp) REFERENCES empresa(emp_codigo);
ALTER TABLE ONLY compliq ADD CONSTRAINT "$2" FOREIGN KEY (clq_idptov) REFERENCES ptovta(ptv_id);
ALTER TABLE ONLY compliq ADD CONSTRAINT "$3" FOREIGN KEY (clq_division) REFERENCES division(div_id) MATCH FULL;
ALTER TABLE ONLY compliq ADD CONSTRAINT "$4" FOREIGN KEY (clq_centro) REFERENCES centroc(cco_id) MATCH FULL;
ALTER TABLE ONLY compliq ADD CONSTRAINT "$5" FOREIGN KEY (clq_comprob) REFERENCES comprob(comp_id);
ALTER TABLE ONLY compliq ADD CONSTRAINT "$6" FOREIGN KEY (clq_cargo) REFERENCES cargos(car_id);
ALTER TABLE ONLY compliq ADD CONSTRAINT "$7" FOREIGN KEY (clq_idcopr) REFERENCES coprop(cop_id) MATCH FULL;
ALTER TABLE ONLY compliq ADD CONSTRAINT "$8" FOREIGN KEY (clq_cargo) REFERENCES cargos(car_id);

REVOKE ALL ON TABLE compliq FROM PUBLIC;
REVOKE ALL ON TABLE compliq FROM sanjor;
GRANT ALL ON TABLE compliq TO sanjor;
GRANT ALL ON TABLE compliq TO nobody;

REVOKE ALL ON SEQUENCE compliq_clq_id_seq FROM PUBLIC;
REVOKE ALL ON SEQUENCE compliq_clq_id_seq FROM sanjor;
GRANT ALL ON SEQUENCE compliq_clq_id_seq TO sanjor;
GRANT UPDATE ON SEQUENCE compliq_clq_id_seq TO nobody;



CREATE TABLE comprop (
    cmpr_id integer NOT NULL,
    cmpr_codemp integer NOT NULL,
    cmpr_idptov integer NOT NULL,
    cmpr_division integer,
    cmpr_centro integer,
    cmpr_idcopr integer NOT NULL,
    cmpr_rubcar integer NOT NULL,
    cmpr_cargo integer NOT NULL,
    cmpr_canti numeric(15,5) DEFAULT 1,
    cmpr_precio numeric(15,5) DEFAULT 0,
    cmpr_importe numeric(15,2) DEFAULT 0,
    cmpr_estado integer DEFAULT 1,
    cmpr_fecalt date NOT NULL DEFAULT date(now()),
    cmpr_fecbaj date,
    clq_leyen text
);


ALTER TABLE public.comprop OWNER TO sanjor;
CREATE SEQUENCE comprop_cmpr_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;
ALTER TABLE public.comprop_cmpr_id_seq OWNER TO sanjor;
ALTER SEQUENCE comprop_cmpr_id_seq OWNED BY comprop.cmpr_id;

ALTER TABLE ONLY comprop ALTER COLUMN cmpr_id SET DEFAULT nextval('comprop_cmpr_id_seq'::regclass);
ALTER TABLE ONLY comprop ADD CONSTRAINT comprop_pkey PRIMARY KEY (cmpr_id);
CREATE INDEX idx_comprop_1 ON comprop USING btree (cmpr_centro, cmpr_idcopr);
CREATE INDEX idx_comprop_2 ON comprop USING btree (cmpr_codemp, cmpr_idptov, cmpr_idcopr);
CREATE INDEX idx_comprop_3 ON comprop USING btree (cmpr_codemp, cmpr_idptov, cmpr_idcopr, cmpr_rubcar, cmpr_cargo);
ALTER TABLE ONLY comprop ADD CONSTRAINT "$1" FOREIGN KEY (cmpr_codemp) REFERENCES empresa(emp_codigo);
ALTER TABLE ONLY comprop ADD CONSTRAINT "$2" FOREIGN KEY (cmpr_idptov) REFERENCES ptovta(ptv_id);
ALTER TABLE ONLY comprop ADD CONSTRAINT "$3" FOREIGN KEY (cmpr_division) REFERENCES division(div_id) MATCH FULL;
ALTER TABLE ONLY comprop ADD CONSTRAINT "$4" FOREIGN KEY (cmpr_centro) REFERENCES centroc(cco_id) MATCH FULL;
ALTER TABLE ONLY comprop ADD CONSTRAINT "$5" FOREIGN KEY (cmpr_cargo) REFERENCES cargos(car_id);


REVOKE ALL ON TABLE comprop FROM PUBLIC;
REVOKE ALL ON TABLE comprop FROM sanjor;
GRANT ALL ON TABLE comprop TO sanjor;
GRANT ALL ON TABLE comprop TO nobody;

REVOKE ALL ON SEQUENCE comprop_cmpr_id_seq FROM PUBLIC;
REVOKE ALL ON SEQUENCE comprop_cmpr_id_seq FROM sanjor;
GRANT ALL ON SEQUENCE comprop_cmpr_id_seq TO sanjor;
GRANT UPDATE ON SEQUENCE comprop_cmpr_id_seq TO nobody;



CREATE TABLE cargos (
    car_id integer NOT NULL,
    car_codemp integer DEFAULT 0 NOT NULL,
    car_idptov integer,
    car_division integer,
    car_centro integer,
    car_codigo integer,
    car_nombre character varying(340),
    car_rubcar integer,
    car_srubcar integer,
    car_genint integer DEFAULT 1 NOT NULL,
    car_interes numeric(15,5) DEFAULT 1,
    car_precio numeric(15,5) DEFAULT 0,
    car_tasa numeric(15,5) DEFAULT 0,
    car_estado integer DEFAULT 1,
    car_funcion text,
    car_leyen text
);


ALTER TABLE public.cargos OWNER TO sanjor;

CREATE SEQUENCE cargos_car_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;

ALTER TABLE public.cargos_car_id_seq OWNER TO sanjor;
ALTER SEQUENCE cargos_car_id_seq OWNED BY cargos.car_id;
ALTER TABLE ONLY cargos ALTER COLUMN car_id SET DEFAULT nextval('cargos_car_id_seq'::regclass);
ALTER TABLE ONLY cargos ADD CONSTRAINT cargos_pkey PRIMARY KEY (car_id);
ALTER TABLE ONLY cargos ADD CONSTRAINT "$1" FOREIGN KEY (car_codemp) REFERENCES empresa(emp_codigo);
CREATE INDEX idx_cargos_1 ON cargos USING btree (car_codemp, car_idptov, acr_division, car_centro, car_codigo);
CREATE INDEX idx_cargos_2 ON cargos USING btree (car_codemp, car_idptov, car_codigo);
CREATE INDEX idx_cargos_3 ON cargos USING btree (car_codemp, car_idptov, car_rubcar, car_srubcar);

REVOKE ALL ON TABLE cargos FROM PUBLIC;
REVOKE ALL ON TABLE cargos FROM sanjor;
GRANT ALL ON TABLE cargos TO sanjor;
GRANT ALL ON TABLE cargos TO nobody;


--
-- Name: cargos_car_id_seq; Type: ACL; Schema: public; Owner: sanjor
--

REVOKE ALL ON SEQUENCE cargos_car_id_seq FROM PUBLIC;
REVOKE ALL ON SEQUENCE cargos_car_id_seq FROM sanjor;
GRANT ALL ON SEQUENCE cargos_car_id_seq TO sanjor;
GRANT UPDATE ON SEQUENCE cargos_car_id_seq TO nobody;





CREATE TABLE auxint (
    ai_id serial,
    ai_idliq integer NOT NULL,
    ai_idcopr integer NOT NULL,
    ai_impgi  numeric(15,2) DEFAULT 0,     -- Saldo que genera intereses
    ai_impngi numeric(15,2) DEFAULT 0,     -- Saldo que no genera intereses
    ai_intacu  numeric(15,2) DEFAULT 0     -- Interes acumulado
);


ALTER TABLE public.auxint OWNER TO sanjor;
ALTER TABLE ONLY auxint ADD CONSTRAINT "$1" FOREIGN KEY (ai_idliq) REFERENCES auxint(l_id) MATCH FULL;
ALTER TABLE ONLY auxint ADD CONSTRAINT "$2" FOREIGN KEY (ai_idcopr) REFERENCES coprop(cop_id) MATCH FULL;
CREATE INDEX idx_auxint_1 ON auxint USING btree (ai_idliq, ai_idcopr);

REVOKE ALL ON TABLE auxint FROM PUBLIC;
REVOKE ALL ON TABLE auxint FROM sanjor;
GRANT ALL ON TABLE auxint TO sanjor;
GRANT ALL ON TABLE auxint TO nobody;



CREATE TABLE interes (
    int_codemp integer DEFAULT 0 NOT NULL,
    int_idptov integer DEFAULT 0 NOT NULL,
    int_centro integer,
    int_division integer,
    int_fecha date NOT NULL,
    int_valor numeric(15,5) DEFAULT 0
);
ALTER TABLE public.interes OWNER TO sanjor;
ALTER TABLE ONLY interes ADD CONSTRAINT interes_pkey PRIMARY KEY (int_codemp, int_fecha);
ALTER TABLE ONLY interes ADD CONSTRAINT interes_int_codemp_fkey FOREIGN KEY (int_codemp) REFERENCES empresa(emp_codigo) MATCH FULL;
ALTER TABLE ONLY interes ADD CONSTRAINT interes_int_idptov_fkey FOREIGN KEY (int_idptov) REFERENCES ptovta(ptv_id) MATCH FULL;

REVOKE ALL ON TABLE interes FROM PUBLIC;
REVOKE ALL ON TABLE interes FROM sanjor;
GRANT ALL ON TABLE interes TO sanjor;
GRANT ALL ON TABLE interes TO nobody;




CREATE OR REPLACE FUNCTION ultcie(integer) RETURNS date
    LANGUAGE sql
    AS $_$select l_feccie from liquidacion where l_estado=1 and l_centro= $1 order by 1 desc limit 1;$_$;

ALTER FUNCTION public.ultcie(integer) OWNER TO sanjor;

CREATE OR REPLACE FUNCTION cargocint(integer) RETURNS integer
    LANGUAGE sql
    AS $_$select car_genint from cargos where car_id= $1 ;$_$;

ALTER FUNCTION public.cargocint(integer) OWNER TO sanjor;


CREATE OR REPLACE FUNCTION intercentro(integer) RETURNS integer
    LANGUAGE sql
    AS $_$select int_valor from interes where int_centro= $1 order by int_fecha desc limit 1;$_$;

ALTER FUNCTION public.intercentro(integer) OWNER TO sanjor;







CREATE FUNCTION liquido(integer) RETURNS integer
    LANGUAGE plpgsql
    AS $_$
    DECLARE
	idliq		 ALIAS FOR $1; 
	codemp		 integer;
	idptov		 integer;
	centro		 integer;
	division	 integer;
	anio		 integer;
	mes		 integer;
	feccie		 date;
	fecvto		 date;
	comprob		 integer;
	numero		 integer;
	operador	 integer;
	idcopr		 integer;
	importe		 numeric(15,2);
	retval 		 integer;
	registro	 record;
	regi		 record;
	regis		 record;
    BEGIN

    retval:=0;

    select l_codemp,l_idptov,l_centro,l_division,l_anio,l_mes,l_feccie,l_fecvto,l_comprob,l_numero,l_operador 
	into codemp,idptov,centro,division,anio,mes,feccie,fecvto,comprob,numero,operador from liquidacion where l_id=idliq; 


    for regis in select * from comprop where cmpr_centro=centro and cmpr_estado=1 
	loop
	    insert into compliq clq_codemp,clq_idptov,clq_centro,clq_division,clq_anio,clq_mes,clq_fecha,clq_fecvto,clq_comprob,clq_numero,clq_operad,clq_rubcar,clq_cargo,clq_leyen,clq_canti,clq_interes,clq_precio,clq_importe,clq_idcopr)
		values (codemp,idptov,centro,division,anio,mes,feccie,fecvto,comprob,numero,operador,regis.cmpr_rubcar,regis.cmpr_cargo,regis.cmpr_leyen,regis.cmpr_canti,0,regis.cmpr_precio,regis.cmpr_importe,regis.cmpr_idcopr);
	end loop;


    for registro in select * from compliquid where cl_idliq=idliq 
	loop
	for regi in select * from coprop where cop_centro=centro and cop_estado=1
	    loop
		if int4eq(registro.cl_porc,1) then
		    importe:=registro.cl_importe * regi.cop_porc1;
		  else
		if int4eq(registro.cl_porc,2) then
		    importe:=registro.cl_importe * regi.cop_porc2;
		  else
		if int4eq(registro.cl_porc,3) then
		    importe:=registro.cl_importe * regi.cop_porc3;
		  else
		if int4eq(registro.cl_porc,4) then
		    importe:=registro.cl_importe * regi.cop_porc4;
		  else
		if int4eq(registro.cl_porc,5) then
		    importe:=registro.cl_importe * regi.cop_porc5;
		end if;

		if numeric_ne(importe,0) then
		    insert into compliq clq_codemp,clq_idptov,clq_centro,clq_division,clq_anio,clq_mes,clq_fecha,clq_fecvto,clq_comprob,clq_numero,clq_operad,clq_rubcar,clq_cargo,clq_leyen,clq_canti,clq_interes,clq_precio,clq_importe,clq_idcopr)
			values (codemp,idptov,centro,division,anio,mes,feccie,fecvto,comprob,numero,operador,registro.cl_rubcar,registro.cl_cargo,registro.cl_leyen,1,0,importe,importe,regi.cop_id);
		end if;
	    importe:=0;
	    end loop;
	end loop;

    select calc_intliq(idliq) into retval;

    RETURN retval;
    END;$_$;


ALTER FUNCTION public.liquido(integer) OWNER TO sanjor;







CREATE FUNCTION calc_intliq(integer) RETURNS integer
    LANGUAGE plpgsql
    AS $_$
    DECLARE
	idliq		 ALIAS FOR $1; 
	codemp		 integer;
	idptov		 integer;
	centro		 integer;
	division	 integer;
	anio		 integer;
	mes		 integer;
	feccie		 date;
	fecvto		 date;
	comprob		 integer;
	numero		 integer;
	operador	 integer;
	idultcie	 integer;
	impgia		 numeric(15,2);
	cobranz		 numeric(15,2);
	import		 numeric(15,2);
	tasaint		 numeric(15,5);
	interes		 numeric(15,2);

	rubro		 integer;
	cargo		 integer;
	leyenda		 character varying(240);

	importe		 numeric(15,2);
	retval 		 integer;
	registro	 record;
	regi		 record;
	regis		 record;
BEGIN

retval:=1;
importe:=0;

select l_codemp,l_idptov,l_centro,l_division,l_anio,l_mes,l_feccie,l_fecvto,l_comprob,l_numero,l_operador 
    into codemp,idptov,centro,division,anio,mes,feccie,fecvto,comprob,numero,operador from liquidacion where l_id=idliq; 

select l_id into idultcie from liquidacion where l_id!=idliq and l_estado=1 order by l_feccie desc limit 1;

select intercentro(centro) into tasaint;
if tasaint is null then
    tasaint:=0;
end if;

select vari_valor into cargo from varambi where int4eq(idptov,vari_idptov) and int4eq(codemp,vari_codemp) and bpchareq('CARGOINT',vari_codigo);
if found then
    select car_rubcar, car_leyen into rubro, leyenda from cargos where car_id=cargo;

    if idultcie is not null then
	for regi in select * from auxint where ai_idliq=idultcie
	    loop
		impgia:=regi.impgi;
		if impgia is null then
		    impgia:=0;
		end if;

		select sum(clq_importe) into cobranz from compliq where clq_importe<0 and clq_anio=anio and clq_mes=mes and clq_estado=1 and cargocint(clq_cargo)=1 and clq_idcopr=regi.ai_idcopr;
		if cobranz is null then
		    cobranz:=0;
		end if;

		import:= impgia - cobranz ;

		if numeric_gt(import,0) then
		    interes:=import * tasaint / 100;
		end if;

		if numeric_gt(interes,0) then
		    insert into compliq clq_codemp,clq_idptov,clq_centro,clq_division,clq_anio,clq_mes,clq_fecha,clq_fecvto,clq_comprob,clq_numero,clq_operad,clq_rubcar,clq_cargo,clq_leyen,clq_canti,clq_interes,clq_precio,clq_importe,clq_idcopr)
			values (codemp,idptov,centro,division,anio,mes,feccie,fecvto,comprob,numero,operador,rubro,cargo,leyenda,1,interes,1,interes,regi.ai_idcopr);
		end if;

	    interes:=0;
	    end loop;
    end if;
end if;

RETURN retval;
END;$_$;


ALTER FUNCTION public.calc_intliq(integer) OWNER TO sanjor;





