DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`invoiceOut_newFromAddress`(
	IN vAddressFk INT,
	IN vSerial CHAR(2),
	IN vMaxShipped DATE,
	IN vCompanyFk INT,
	IN vTaxArea VARCHAR(25),
	IN vRef VARCHAR(25),
	OUT vInvoiceId INT)
BEGIN
/**
 * Factura los tickets de un consignatario hasta una fecha dada
 * @param vAddressFk Id del consignatario a facturar
 * @param vSerial Serie de factura
 * @param vMaxShipped Fecha hasta la cual cogerá tickets para facturar
 * @param vCompanyFk Id de la empresa desde la que se factura
 * @param vTaxArea Tipo de iva en relacion a la empresa y al cliente, NULL por defecto
 * @param vRef Referencia de la factura en caso que se quiera forzar, NULL por defecto
 * @return vInvoiceId factura
 */
	DECLARE vIsRefEditable BOOLEAN;

	IF vRef IS NOT NULL AND vSerial IS NOT NULL THEN
		SELECT isRefEditable INTO vIsRefEditable
			FROM invoiceOutSerial
			WHERE code = vSerial;

		IF NOT vIsRefEditable THEN
			CALL util.throw('serial non editable');
		END IF;
	END IF;

	DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`;
	CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice`
		(PRIMARY KEY  (`id`))
		ENGINE = MEMORY
		SELECT id FROM ticket t
			WHERE t.addressFk = vAddressFk
				AND t.refFk IS NULL
				AND t.companyFk = vCompanyFk
				AND t.shipped BETWEEN
					util.firstDayOfYear(vMaxShipped - INTERVAL 1 YEAR)
					AND	util.dayend(vMaxShipped);

	CALL invoiceOut_new(vSerial, util.VN_CURDATE(), vTaxArea, vInvoiceId);

	UPDATE invoiceOut
		SET `ref` = vRef
		WHERE id = vInvoiceId
			AND vRef IS NOT NULL;

	IF vSerial <> 'R' AND NOT ISNULL(vInvoiceId) AND vInvoiceId <> 0 THEN
		CALL invoiceOutBooking(vInvoiceId);
	END IF;
END$$
DELIMITER ;
