-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- SIU-GUARANI 3 -- Version 3.0.0 -- Function: f_crear_version_plan -- -- Crea una nueva version de plan de estudios en base a la "version actual" del plan de estudios. -- * Estructura del Plan -- * Matrices de equivalencias activas (menos las matrices que tienen como origen otra versin del mismo plan de estudios) -- * Correlativas -- * Certificados y formas de cumplimiento -- -- Recibe: -- f_crear_version_plan(integer,varchar, varchar) -- 1. ID de la Versión del Plan de la cual se hará un copia. -- 2. Código de la nueva version del Plan (sga_planes_versiones.version) -- 3. Nombre de la nueva Version del Plan (sga_planes_versiones.nombre) -- -- Retorna: -- 1. Text: codigo + "," + mensaje. Codigo: 1 = OK / -1 = Error -- -- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- DROP FUNCTION f_crear_version_plan(integer, varchar(10), varchar(100)); CREATE OR REPLACE FUNCTION f_crear_version_plan(_plan_version_old INTEGER, _version varchar(10), _nombre varchar(100)) RETURNS TEXT AS $BODY$ DECLARE _revision_modulo_raiz_old INTEGER; _revision_modulo_raiz_new INTEGER; cnt SMALLINT; _codigo_plan varchar(10); _plan INTEGER; _plan_version_new INTEGER; _elemento_revision_old INTEGER; _elemento_revision_new INTEGER; _entidad_subtipo INTEGER; _entidad_tipo INTEGER; _compartible char(1); _rtn_mensaje text; _cnt_matrices integer; _condicion_new INTEGER; _grupo_new INTEGER; cursor1 record; cursor2 record; cursor3 record; cursor4 record; BEGIN _rtn_mensaje := '1,OK'; /* SELECT codigo, version_actual INTO _codigo_plan, _plan_version_old FROM sga_planes, WHERE plan = _plan; IF NOT FOUND THEN _rtn_mensaje := '-1, El plan de Estudios "' || _codigo_plan || '" no existe'; RETURN _rtn_mensaje; END IF; */ -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Recupero la revision del modulo raiz de la version del plan -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELECT elemento_revision, plan INTO _revision_modulo_raiz_old, _plan FROM sga_planes_versiones WHERE plan_version = _plan_version_old; IF _revision_modulo_raiz_old IS NULL OR NOT FOUND THEN _rtn_mensaje := '-1,No existe la versión actual del Plan de Estudios. ID Versión: ' || _plan_version_old::varchar; RETURN _rtn_mensaje; END IF; -- Si hay otra version nueva del Plan de Estudios, no la dejo crear. SELECT count(*) INTO cnt FROM sga_planes_versiones WHERE plan = _plan AND estado = 'N'; IF cnt > 0 THEN _rtn_mensaje := '-1, Ya existe una versión del Plan de Estudios en estado "Nuevo". No se permite crear otra version del plan de estudios.'; RETURN _rtn_mensaje; END IF; -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Recorro los elementos del plan. -- Genero revisiones nuevas de los modulos no compartibles. -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CREATE TEMP TABLE tmp_elementos (elemento_revision_old integer, elemento_revision_new integer); INSERT INTO tmp_elementos (elemento_revision_old, elemento_revision_new) SELECT elemento_revision, elemento_revision FROM sga_elementos_plan WHERE plan_version = _plan_version_old; -- Recupero los elementos del Plan (modulos y actividades) FOR cursor1 IN SELECT ep.elemento_revision, e.compartible, e.entidad_subtipo, e.entidad_tipo FROM sga_elementos_plan as ep, vw_elementos as e WHERE ep.plan_version = _plan_version_old AND e.elemento_revision = ep.elemento_revision LOOP -- Si es un módulo verifico si debo generar una nueva revision al mismo. IF cursor1.entidad_tipo = 1 THEN -- MODULOS: -- a. Que no sea compartible -- b. Que no sea una materia Genérica IF cursor1.compartible = 'N' AND cursor1.entidad_subtipo <> 2 THEN -- Genero una nueva revision de los modulos que no son compartibles. Copia de la revision original INSERT INTO sga_elementos_revision (elemento, regla, parametros, origen_creditos) SELECT elemento, regla, parametros, origen_creditos FROM sga_elementos_revision WHERE elemento_revision = cursor1.elemento_revision; -- Recupero el Serial (entidad). _elemento_revision_new := (SELECT currval('sga_elementos_revision_seq')); -- Actualizo la tabla temporal con el nuevo nro de revision. No importa si es actividad. UPDATE tmp_elementos SET elemento_revision_new = _elemento_revision_new WHERE elemento_revision_old = cursor1.elemento_revision; ELSE -- Modulos Compartibles END IF; ELSE -- ACTIVIDADES END IF; END LOOP; -- Cursor de la tabla temporal con los elementos del plan. Solo los módulos con revisiones nuevas. -- Creo las componentes de las nuevas revisiones de módulos generados. FOR cursor2 IN SELECT elemento_revision_old, elemento_revision_new FROM tmp_elementos WHERE elemento_revision_old <> elemento_revision_new LOOP -- Genero las componentes de la nueva revisión del módulo. INSERT INTO sga_elementos_comp (elemento_padre, elemento_hijo, puntaje, orden) SELECT cursor2.elemento_revision_new, (select elemento_revision_new FROM tmp_elementos WHERE elemento_revision_old = sga_elementos_comp.elemento_hijo), puntaje, orden FROM sga_elementos_comp WHERE elemento_padre = cursor2.elemento_revision_old; END LOOP; -- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Creo version del Plan -- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELECT elemento_revision_new INTO _revision_modulo_raiz_new FROM tmp_elementos WHERE elemento_revision_old = _revision_modulo_raiz_old; INSERT INTO sga_planes_versiones (version, nombre, plan, elemento_revision, cnt_materias, cnt_optativas, cnt_idiomas, estado) SELECT _version, _nombre, plan, _revision_modulo_raiz_new, cnt_materias, cnt_optativas, cnt_idiomas, 'N' FROM sga_planes_versiones WHERE plan_version = _plan_version_old; -- Recupero el id de la nueva version del plan. _plan_version_new := (SELECT currval('sga_planes_versiones_seq')); -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Inserto los elementos del Plan en la nueva version. -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ INSERT INTO sga_elementos_plan ( plan_version, elemento_revision, nombre, nombre_abreviado, anio_de_cursada, periodo_de_cursada , escala_nota_cursada , escala_nota_examen , escala_nota_equivalencia , creditos, creditos_min, creditos_max, coeficiente, horas_semanales, horas_totales, requiere_cursada, requiere_examen, permite_promocion, permite_rendir_libre, aprobacion_x_resolucion, vigencia, plazo, promediable, sale_listado, cantidad_de_aplazos ) SELECT _plan_version_new, t.elemento_revision_new, ep.nombre, ep.nombre_abreviado, ep.anio_de_cursada, ep.periodo_de_cursada , ep.escala_nota_cursada , ep.escala_nota_examen , ep.escala_nota_equivalencia , ep.creditos, ep.creditos_min, ep.creditos_max, ep.coeficiente, ep.horas_semanales, ep.horas_totales, ep.requiere_cursada, ep.requiere_examen, ep.permite_promocion, ep.permite_rendir_libre, ep.aprobacion_x_resolucion, ep.vigencia, ep.plazo, ep.promediable, ep.sale_listado, ep.cantidad_de_aplazos FROM sga_elementos_plan as ep, tmp_elementos as t WHERE ep.plan_version = _plan_version_old AND t.elemento_revision_old = ep.elemento_revision; -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Modalidad de los Elementos del Plan -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ INSERT INTO sga_elementos_plan_modalidad (elemento_plan, modalidad) SELECT ep2.elemento_plan, m.modalidad FROM sga_elementos_plan as ep1, sga_elementos_plan_modalidad as m, tmp_elementos as t, sga_elementos_plan as ep2 WHERE ep1.plan_version = _plan_version_old AND m.elemento_plan = ep1.elemento_plan AND t.elemento_revision_old = ep1.elemento_revision AND ep2.plan_version = _plan_version_new AND ep2.elemento_revision = t.elemento_revision_new; -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Matrices de Equivalencias que tenga definida la version de plan de estudios origen con otros planes -- de la misma propuesta o con otras propuestas o general. -- No se copian las matrices que el Plan-version tenga definida con otra version del mismo plan de estudios. -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ _cnt_matrices := f_copiar_matrices_equivalencia(_plan_version_old, _plan_version_new, NULL::integer); -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Correlativas y Certificados -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Certificados INSERT INTO sga_planes_certificados (plan_version, certificado) SELECT _plan_version_new, certificado FROM sga_planes_certificados WHERE plan_version = _plan_version_old; -- 1. Recorro la cabecera FOR cursor3 IN SELECT condicion FROM sga_condiciones WHERE plan_version = _plan_version_old LOOP -- Inserto registro en la cabecera INSERT INTO sga_condiciones (entidad, condicion_tipo, plan_version) SELECT entidad, condicion_tipo, _plan_version_new FROM sga_condiciones WHERE condicion = cursor3.condicion; -- Recupero el serial. _condicion_new := (SELECT currval('sga_condiciones_seq')); -- 2. Grupos de Condiciones FOR cursor4 IN SELECT sga_condiciones_grupos.condicion, sga_condiciones_grupos.grupo_condicion, sga_condiciones_grupos.orden FROM sga_condiciones, sga_condiciones_grupos WHERE sga_condiciones.condicion = sga_condiciones_grupos.condicion AND sga_condiciones.plan_version = _plan_version_old AND sga_condiciones_grupos.condicion = cursor3.condicion LOOP -- Grupo de condiciones INSERT INTO sga_condiciones_grupos (condicion, orden) VALUES (_condicion_new, cursor4.orden); _grupo_new := (SELECT currval('sga_condiciones_grupos_seq')); -- Requisitos del Grupo. INSERT INTO sga_condiciones_requisitos (grupo_condicion, orden, operador_not, tipo, requisito, origen, entidad, estado, regla, parametros) SELECT _grupo_new, orden, operador_not, tipo, requisito, origen, entidad, estado, regla, parametros FROM sga_condiciones_requisitos WHERE grupo_condicion = cursor4.grupo_condicion; END LOOP; -- Grupos de Condiciones. END LOOP; -- Condiciones. -- Salgo. _rtn_mensaje := _plan_version_new::varchar || ',OK'; RETURN _rtn_mensaje; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; -- ++++++++++++++++++++++++++++++ Fin Function f_crear_version_plan(integer) ++++++++++++++++ -- REVOKE EXECUTE ON FUNCTION f_crear_version_plan (integer, varchar(10), varchar(100)) FROM public; GRANT EXECUTE ON FUNCTION f_crear_version_plan (integer, varchar(10), varchar(100)) to public; /* select * from f_crear_version_plan(2) select * from sga_g3entidades where entidad > 20057 */