CREATE OR REPLACE FUNCTION public.__agenda_04_add_comments_or_signature_to_student(
__p_id_colaborator INTEGER,
__p_id_sede INTEGER,
__p_data JSONB)
RETURNS jsonb
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
DECLARE
--CONSTANTES
__ERROR_ANP CONSTANT CHARACTER VARYING DEFAULT 'Acción no permitida';
__ERROR_NEE CONSTANT CHARACTER VARYING DEFAULT 'No existen estudiantes en este curso';
__ERROR_EA CONSTANT CHARACTER VARYING DEFAULT 'Se ingreso un array vacio';
__MSJ_ERROR CONSTANT CHARACTER VARYING DEFAULT 'Hubo un error';
__MSJ_SUCCESS CONSTANT CHARACTER VARYING DEFAULT 'Se actualizó';
__STATUS_500 CONSTANT INTEGER DEFAULT 500;
__STATUS_ERROR CONSTANT INTEGER DEFAULT 400;
__STATUS_SUCCESS CONSTANT INTEGER DEFAULT 200;
__MAX_LENGTH CONSTANT INTEGER DEFAULT 250;
__FORMAT_DATE CONSTANT CHARACTER VARYING DEFAULT 'dd/mm/yyyy';
__FORMAT_TIME CONSTANT CHARACTER VARYING DEFAULT 'hh12:mi am';
--VARIABLES
__result JSONB;
__result_json JSONB;
__msj_excep TEXT;
__v_id_estudiante INTEGER;
__v_id_colaborador INTEGER;
__v_comentario CHARACTER VARYING(280);
__v_id_tutor INTEGER;
__v_year_actual INTEGER;
-- VARIABLES PARA HALLAR EL TUTOR
__v_nid_aula INTEGER;
__v_id_programa INTEGER;
__v_fec_fin DATE;
BEGIN
IF __p_id_colaborator IS NULL THEN
RAISE EXCEPTION USING ERRCODE = 'SMILE', MESSAGE = __ERROR_ANP;
END IF;
IF __p_id_sede IS NULL THEN
RAISE EXCEPTION USING ERRCODE = 'SMILE', MESSAGE = __ERROR_ANP;
END IF;
IF __p_data = '[]' THEN
RAISE EXCEPTION USING ERRCODE = 'SMILE', MESSAGE = __ERROR_EA;
END IF;
---------------------------------
---- OBTENEMOS EL AULA ACTUAL ----
SELECT EXTRACT(YEAR FROM NOW())::INTEGER
INTO __v_year_actual;
------------------------------------------------------------------------------------------
---- ITERAMOS SOBRE LA EL OBJETO DATA QUE MANDAMOS PARA ASIGNAR LOS COMENTARIOS
------------------------------------------------------------------------------------------
FOR __v_id_estudiante, __v_comentario IN SELECT unw->>'id_estudiante', unw->>'comentario' FROM JSONB_ARRAY_ELEMENTS(__p_data) AS unw LOOP
---VALIDAMOS SI EL COMENTARIO NO SOBREPASA EL LIMITE ESTABLECIDO
IF LENGTH(__v_comentario) > __MAX_LENGTH THEN
RAISE EXCEPTION USING ERRCODE = 'SMILE', MESSAGE = __ERROR_ANP;
END IF;
---OBTENEMOS EL ID DEL TUTOR POR CADA ALUMNO QUE TENGAMOS
SELECT p.tipo_programa,
p.fec_fin
INTO __v_id_programa,
__v_fec_fin
FROM PLAN_INST.periodo p,
(SELECT _id_tipo_programa
FROM persona_x_aula
WHERE __id_persona = __v_id_estudiante
AND _id_sede = __p_id_sede
AND year_academico = __v_year_actual) p_x_a
WHERE p._id_sede = __p_id_sede
AND p.year_acad = __v_year_actual
AND p.tipo_programa = p_x_a._id_tipo_programa
GROUP BY tipo_programa, p.fec_fin
ORDER BY p.fec_fin;
----
SELECT __id_aula
INTO __v_nid_aula
FROM persona_x_aula
WHERE __id_persona = __v_id_estudiante
AND _id_sede = __p_id_sede
AND _id_tipo_programa = __v_id_programa
AND year_academico = __v_year_actual;
---- OBTENEMOS LA INFORMACION DEL TUTOR --
SELECT p.nid_persona
INTO __v_id_tutor
FROM persona p,
aula a
WHERE p.nid_persona = a.id_tutor
AND a.nid_aula = __v_nid_aula;
UPDATE sima.detalle_alumno sd
SET agenda_comentarios = (SELECT JSONB_SET(COALESCE(sd.agenda_comentarios,'[]'::JSONB),
ARRAY[JSONB_ARRAY_LENGTH(COALESCE(sd.agenda_comentarios,('[]')::JSONB))::TEXT],
JSONB_BUILD_OBJECT('idx' , gen_random_uuid(),
'id_estudiante' , __v_id_estudiante,
'id_colaborador' , __p_id_colaborator,
'fecha' , CONCAT(to_char(now()::DATE, __FORMAT_DATE), ' ', to_char(current_timestamp, __FORMAT_TIME)),
'comentario' , __v_comentario,
-- SI EL ID QUE HAYAMOS DEL TUTOR ES IGUAL AL ID DE LA PERSONA QUE ASIGNO EL COMENTARIO MARCAMOS COMO
'firmado' , CASE WHEN __p_id_colaborator = __v_id_tutor THEN true ELSE false END
),
TRUE
))
WHERE nid_persona = __v_id_estudiante;
END LOOP;
-------------- FIN --------------
__result = JSONB_BUILD_OBJECT('msj' , 'Ejecución correcta');
RETURN __result;
EXCEPTION
WHEN SQLSTATE 'SMILE' THEN
__result = JSONB_BUILD_OBJECT('status', __STATUS_ERROR , 'msj' , SQLERRM);
RETURN __result;
WHEN OTHERS THEN
GET STACKED DIAGNOSTICS __msj_excep = PG_EXCEPTION_CONTEXT;
__result = JSONB_BUILD_OBJECT('status', __STATUS_500, 'msj' , 'Hubo un error', 'stack_error', CONCAT(SQLERRM, ' - ', __msj_excep));
RETURN __result;
END;
$BODY$;
Be the first to comment
You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.