DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`invoiceOut_newFromClient`(
	IN vClientFk 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 cliente hasta una fecha dada
 * @param vClientFk Id del cliente a facturar 
 * @param vSerial Serie de factura
 * @param vMaxShipped Fecha hasta la cual cogera 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;
	DECLARE vIsExportation BOOLEAN;

	IF vRef 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;    

	SELECT COUNT(*) INTO vIsExportation
		FROM vn.invoiceOutSerial
		WHERE taxAreaFk = 'WORLD'  
			AND `code` = vSerial;

	IF vIsExportation THEN
		CALL invoiceOut_exportationFromClient(vMaxShipped, vClientFk, vCompanyFk);
	ELSE
		CALL invoiceFromClient(vMaxShipped, vClientFk, vCompanyFk);
	END IF;

	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 ;
