DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`packingSite_startCollection`(vSelf INT, vTicketFk INT)
proc: BEGIN
/**
 * @param vSelf packingSite id
 * @param vTicketFk A ticket id from the collection to start
 */
	DECLARE vExists BOOL;
    DECLARE vIsAdvanced BOOL;
    DECLARE vNewCollectionFk INT;
    DECLARE vOldCollectionFk INT;
    DECLARE vIsPackingByOther BOOL;

    SELECT id, collectionFk
        INTO vExists, vOldCollectionFk
        FROM packingSite
        WHERE id = vSelf;

    IF NOT vExists THEN
        CALL util.throw('packingSiteNotExists');
    END IF;

    SELECT COUNT(*) > 0
        INTO vIsAdvanced
        FROM packingSiteAdvanced
        WHERE ticketFk = vTicketFk;

    IF vIsAdvanced THEN
        LEAVE proc;
    END IF;

    SELECT collectionFk INTO vNewCollectionFk
        FROM ticketCollection WHERE ticketFk = vTicketFk;

    IF vOldCollectionFk IS NOT NULL
    AND vOldCollectionFk <> vNewCollectionFk THEN
        SELECT COUNT(*) > 0
            INTO vIsPackingByOther
            FROM packingSite
            WHERE id <> vSelf
                AND collectionFk = vOldCollectionFk;

        IF NOT vIsPackingByOther AND NOT collection_isPacked(vOldCollectionFk) THEN
            CALL util.throw('cannotChangeCollection');
        END IF;
    END IF;

    UPDATE packingSite SET collectionFk = vNewCollectionFk
        WHERE id = vSelf;
END$$
DELIMITER ;