DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getSalesPerson`(vClientFk INT, vDated DATE) RETURNS int(11) DETERMINISTIC BEGIN /** * Dado un id cliente y una fecha, devuelve su comercial para ese dia, teniendo * en cuenta la jerarquía de las tablas: 1º la de sharingclient, 2º la de * sharingcart y tercero la de clientes. * * @param vClientFk El id del cliente * @param vDated Fecha a comprobar * @return El id del comercial para la fecha dada **/ DECLARE vSalesPersonFk INT DEFAULT NULL; DECLARE vWorkerSubstituteFk INT DEFAULT NULL; DECLARE vLoop BOOLEAN; -- Obtiene el comercial original y el de sharingclient SELECT c.salesPersonFk, s.workerFk INTO vSalesPersonFk, vWorkerSubstituteFk FROM client c LEFT JOIN sharingClient s ON c.id = s.clientFk AND vDated BETWEEN s.started AND s.ended WHERE c.id = vClientFk ORDER BY s.id LIMIT 1; -- Si no hay ninguno en sharingclient busca en sharingcart IF vWorkerSubstituteFk IS NOT NULL THEN SET vSalesPersonFk = vWorkerSubstituteFk; ELSEIF vSalesPersonFk IS NOT NULL THEN DROP TEMPORARY TABLE IF EXISTS tmp.stack; CREATE TEMPORARY TABLE tmp.stack (INDEX (substitute)) ENGINE = MEMORY SELECT vSalesPersonFk substitute; l: LOOP SELECT workerSubstitute INTO vWorkerSubstituteFk FROM sharingCart WHERE util.VN_CURDATE() BETWEEN started AND ended AND workerFk = vSalesPersonFk ORDER BY id LIMIT 1; IF vWorkerSubstituteFk IS NULL THEN LEAVE l; END IF; SELECT COUNT(*) > 0 INTO vLoop FROM tmp.stack WHERE substitute = vWorkerSubstituteFk; IF vLoop THEN LEAVE l; END IF; INSERT INTO tmp.stack SET substitute = vWorkerSubstituteFk; SET vSalesPersonFk = vWorkerSubstituteFk; END LOOP; DROP TEMPORARY TABLE tmp.stack; END IF; RETURN vSalesPersonFk; END$$ DELIMITER ;