-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- SIU-GUARANI 3 -- Version 3.0.0 -- Function: f_copiar_comision -- -- Copia una comision en en un nuevo periodo lectivo. -- * Datos de la comision, docentes, instancias, propuestas y planes -- * Subcomisiones -- -- Recibe: -- f_copiar_comision(integer, integer, varchar, boolean) -- 1. ID de la comision -- 2. ID del periodo lectivo destino -- 3. Nombre de la Nueva comision. Default valor NULL -- 4. Parámetro que indica si se copian o no las subcomisiones. Valor: true - Se copian las subcomisiones (default) / false - No se copian las subcomisiones -- -- Retorna: -- 1. un registro con los datos del tipo: type_comision -- -- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- DROP FUNCTION f_copiar_comision(integer, integer, varchar, boolean); CREATE OR REPLACE FUNCTION f_copiar_comision( pComisionOrigen integer, pPeriodoLectivoDestino integer, pComisionNombre varchar(100), pCopiarSubcomisiones boolean) RETURNS SETOF type_comision_copiado_generacion AS $BODY$ DECLARE comision_nueva INTEGER; _periodo_lectivo_destino Integer; _periodo_lectivo_origen Integer; _nombre_comision VARCHAR(100); subcomision_origen INTEGER; subcomision_nueva INTEGER; _observaciones text; _catedra integer; _estado_catedra char(1); _nombre_catedra varchar(100); _fecha_desde DATE; _fecha_hasta DATE; _fecha_desde_doc DATE; _fecha_hasta_doc DATE; _insc_habilitada char(1); _insc_habilitada_orig char(1); _elemento INTEGER; cnt SMALLINT; _actividad text; cur_subc record; cur_docentes record; cur_retorno type_comision_copiado_generacion; -- para retornar datos de la comision creada BEGIN cur_retorno.codigo_retorno := 0; -- OK. COMISION COPIADA _observaciones := NULL; _insc_habilitada := 'S'; -- Recupero datos de la comision origen. SELECT '(' || sga_elementos.codigo || ') ' || sga_elementos.nombre, sga_comisiones.nombre, sga_comisiones.elemento, sga_comisiones.periodo_lectivo, sga_comisiones.inscripcion_habilitada, sga_comisiones.catedra, sga_catedras.nombre, sga_catedras.estado, sga_periodos_lectivos.fecha_inicio_dictado, sga_periodos_lectivos.fecha_fin_dictado INTO _actividad, _nombre_comision, _elemento, _periodo_lectivo_origen, _insc_habilitada_orig, _catedra, _nombre_catedra, _estado_catedra, _fecha_desde, _fecha_hasta FROM sga_comisiones LEFT JOIN sga_catedras ON sga_catedras.catedra = sga_comisiones.catedra, sga_elementos, sga_periodos_lectivos WHERE sga_elementos.elemento = sga_comisiones.elemento AND sga_comisiones.comision = pComisionOrigen AND sga_periodos_lectivos.periodo_lectivo = sga_comisiones.periodo_lectivo; IF NOT FOUND THEN -- Salgo. cur_retorno.codigo_retorno := 1; -- Comision no copiada cur_retorno.observaciones := 'La comisión a copiar no existe'; RETURN NEXT cur_retorno; RETURN; -- Salgo END IF; _fecha_desde_doc = _fecha_desde; _fecha_hasta_doc = _fecha_hasta; -- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Esto es para el caso que se duplica una comision del mismo período lectivo. -- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IF pComisionNombre IS NOT NULL THEN -- Se pasa un nuevo nombre de Comision. _nombre_comision := pComisionNombre; END IF; IF pPeriodoLectivoDestino IS NULL THEN -- Se asigna el mismo periodo lectivo que la comision original _periodo_lectivo_destino := _periodo_lectivo_origen; -- Para que copie la fecha desde y hasta de los docentes de la comision origen _fecha_desde_doc := NULL; _fecha_hasta_doc := NULL; _insc_habilitada := NULL; ELSE _periodo_lectivo_destino := pPeriodoLectivoDestino; END IF; -- Verifico que no exista una comision con el mismo nombre para la actividad y periodo lectivo destino. SELECT Count(*) INTO cnt FROM sga_comisiones WHERE elemento = _elemento AND periodo_lectivo = _periodo_lectivo_destino AND nombre = _nombre_comision; IF cnt > 0 THEN -- Salgo. cur_retorno.codigo_retorno := 1; -- Comision no copiada cur_retorno.observaciones := 'La comisión ' || _nombre_comision || ' no se copió porque ya existe en el período lectivo destino'; RETURN NEXT cur_retorno; RETURN; END IF; -- Verifico si la catedra esta activa IF _catedra IS NOT NULL AND _estado_catedra <> 'A' THEN cur_retorno.codigo_retorno := 1; -- Comision no copiada cur_retorno.observaciones := 'La cátedra ' || _nombre_catedra || ' de la comisión esta dada de baja'; RETURN NEXT cur_retorno; RETURN; END IF; -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Inserto la comision -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ INSERT INTO sga_comisiones (nombre, periodo_lectivo, elemento, turno, catedra, ubicacion, letra_desde, letra_hasta, cupo, inscripcion_habilitada, visible_al_alumno) SELECT _nombre_comision, _periodo_lectivo_destino, elemento, turno, _catedra, ubicacion, letra_desde, letra_hasta, cupo, COALESCE(_insc_habilitada, _insc_habilitada_orig), visible_al_alumno FROM sga_comisiones WHERE comision = pComisionOrigen; -- Recupero el Serial de la comision comision_nueva := (SELECT currval('sga_comisiones_seq')); -- Seteo valores para retorno cur_retorno.comision := comision_nueva; cur_retorno.nombre_comision := _nombre_comision; -- Modalidad de Cursada. INSERT INTO sga_comisiones_modalidad (comision, modalidad) SELECT comision_nueva, modalidad FROM sga_comisiones_modalidad WHERE comision = pComisionOrigen; -- Propuestas y Planes de la comision INSERT INTO sga_comisiones_propuestas (comision, propuesta, plan) SELECT comision_nueva, propuesta, plan FROM sga_comisiones_propuestas WHERE comision = pComisionOrigen; -- Instancias de la comision INSERT INTO sga_comisiones_instancias (comision, instancia, escala_nota, porc_asistencia) SELECT comision_nueva, instancia, escala_nota, porc_asistencia FROM sga_comisiones_instancias WHERE comision = pComisionOrigen; -- Docentes de la comision FOR cur_docentes IN SELECT sga_docentes_comision.docente, sga_docentes_comision.responsabilidad, sga_docentes_comision.fecha_desde, sga_docentes_comision.fecha_hasta, sga_docentes.estado, '(' || sga_docentes.legajo || ') ' || mdp_personas.apellido || ' ' || mdp_personas.nombres as nombre_docente FROM sga_docentes_comision, sga_docentes, mdp_personas WHERE sga_docentes_comision.comision = pComisionOrigen AND sga_docentes.docente = sga_docentes_comision.docente AND mdp_personas.persona = sga_docentes.persona LOOP -- Si el docente esta dado de baja, entonces no copio el docente. IF cur_docentes.estado <> 'A' THEN cur_retorno.codigo_retorno = 2; _observaciones := COALESCE(_observaciones || ' - ', ''); _observaciones := _observaciones || 'El docente ' || cur_docentes.nombre_docente || ' no se copió porque esta dado de baja'; CONTINUE; END IF; INSERT INTO sga_docentes_comision (comision, docente, responsabilidad, fecha_desde, fecha_hasta) VALUES (comision_nueva, cur_docentes.docente, cur_docentes.responsabilidad, COALESCE(_fecha_desde_doc, cur_docentes.fecha_desde), COALESCE(_fecha_hasta_doc, cur_docentes.fecha_hasta) ); -- Docentes - Dedicacion horaria INSERT INTO sga_docentes_dedicacion_hs (comision, docente, tipo_dedicacion, cnt_horas) SELECT comision_nueva, ddh.docente, ddh.tipo_dedicacion, ddh.cnt_horas FROM sga_docentes_dedicacion_hs as ddh WHERE ddh.comision = pComisionOrigen AND ddh.docente = cur_docentes.docente; END LOOP; -- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- SUBCOMISIONES -- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IF pCopiarSubcomisiones OR pCopiarSubcomisiones IS NULL THEN -- Recupero los elementos del Plan (modulos y actividades) FOR cur_subc IN SELECT subcomision, tipo_clase, nombre, letra_desde, letra_hasta, cupo FROM sga_subcomisiones WHERE comision = pComisionOrigen LOOP -- Genero la Subcomision INSERT INTO sga_subcomisiones (comision, tipo_clase, nombre, letra_desde, letra_hasta, cupo, inscripcion_habilitada) VALUES (comision_nueva, cur_subc.tipo_clase, cur_subc.nombre, cur_subc.letra_desde, cur_subc.letra_hasta, cur_subc.cupo, 'S'); -- Recupero el Serial de la subcomision subcomision_nueva := (SELECT currval('sga_subcomisiones_seq')); -- Docentes de la subcomision. Solo docentes Activos. INSERT INTO sga_docentes_subcomision (subcomision, docente, fecha_desde, fecha_hasta) SELECT subcomision_nueva, sga_docentes_subcomision.docente, _fecha_desde, _fecha_hasta FROM sga_docentes_subcomision, sga_docentes WHERE sga_docentes_subcomision.subcomision = cur_subc.subcomision AND sga_docentes.docente = sga_docentes_subcomision.docente AND sga_docentes.estado = 'A'; END LOOP; END IF; -- Subcomisiones -- asigno las observaciones. cur_retorno.observaciones := _observaciones; -- Retorno datos de la comisión. RETURN NEXT cur_retorno; RETURN; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; -- ++++++++++++++++++++++++++++++ Fin Function f_copiar_comision +++++++++++++++++++++++++++++++++ -- REVOKE EXECUTE ON FUNCTION f_copiar_comision (integer, integer, varchar, boolean) FROM public; GRANT EXECUTE ON FUNCTION f_copiar_comision (integer, integer, varchar, boolean) to public;