Lo que hago es llamar un función postgresql en django, lo cual yo logro llamarla, hago un recorrido en django y por cada objeto voy llamando a la función para que se realice un calculo y una inserción en otra tabla, pero quiero cachar las excepciones en caso de que un dato del objeto que se recorra este mal, como lo es el error violates foreign key constraint para que pueda realizar un delete e impedir que sigan insertándose mas datos. soy nuevo en postgres mi función es básica. la dejo por aqui. saludos.
SELECT calculo_honorario_prueba_edgar(11400,330,16,183,53453,1,2,8554,1845,'honorarios',TRUE ,0);
CREATE OR REPLACE FUNCTION calculo_honorario_prueba_edgar(monto NUMERIC, unidad_id INTEGER, quincena_id INTEGER, proyecto_id INTEGER, empleado_id INTEGER, usuario_id INTEGER,
tipo_nomina INTEGER, pagador INTEGER, object_id INTEGER, tabla TEXT, insertar BOOLEAN, calc_temp_id INTEGER)
RETURNS TEXT AS
$BODY$
DECLARE
mensaje TEXT;
id_new INT;
calculo_isr DECIMAL;
sueldo_grav DECIMAL;
sueldo_liq DECIMAL;
concepto JSON;
ins BOOLEAN;
user_id INTEGER;
BEGIN
calculo_isr :=(SELECT calcular_isr($1));
sueldo_grav := $1 / 2;
sueldo_liq := ROUND(sueldo_grav - calculo_isr, 2);
concepto :='{"nombre":"sueldo","monto":"' || ROUND(sueldo_liq, 2) || '","tipo":1}';
ins:= $11;
calc_temp_id := $12;
user_id =$6;
IF ins = TRUE
THEN
BEGIN
id_new := (SELECT CASE WHEN max(id) NOTNULL
THEN max(id) + 1
ELSE 1 END
FROM calculonomina_periodo_calculo_temp);
EXECUTE
'INSERT INTO calculonomina_periodo_calculo_temp VALUES (' || id_new || ',' || $2 || ',' || calculo_isr || ',' || round(sueldo_grav, 2) || ',' || sueldo_liq || ',NULL,' || $3 ||
',NULL,NULL,' || $4 || ',''' || concepto || ''',' || $5 || ',NULL,' || $6 || ',' || $7 || ',' || $8 || ',' || $9 || ',''HONORARIOS'');';
IF FOUND
THEN
mensaje = 'Error al insertar un procedimiento';
-- EXECUTE 'DELETE FROM calculonomina_periodo_calculo_temp
-- WHERE usuario_id ='||user_id||'AND tabla ='||'''HONORARIOS;''';
ELSE
mensaje = 'Se ha registrado correctamente la informacion';
END IF;
END;
ELSE
BEGIN
id_new = calc_temp_id;
UPDATE calculonomina_periodo_calculo_temp
SET id = calc_temp_id, isr = calculo_isr, sueldo_gravable = round(sueldo_grav, 2), sueldo_liquido = sueldo_liq,
subsidio = NULL, quincena = $3, cat_proyecto_id = $4, conceptos_pago = concepto,
empleado_id = $5, tipo_plaza_id = NULL, usuario_id = $6, tipo_nomina = $7, cat_pagador_id = $8, objecto_id = $9,
tabla = 'HONORARIOS'
WHERE id = calc_temp_id;
IF FOUND
THEN
mensaje = 'Error al insertar un procedimiento';
EXECUTE 'DELETE FROM calculonomina_periodo_calculo_temp
WHERE usuario_id =' || user_id || 'AND tabla =' || '''HONORARIOS;''';
ELSE
mensaje = 'Se ha registrado correctamente la informacion';
END IF;
END;
END IF;
RETURN mensaje;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;