only last row is inserting in table when having "instead of insert" trigger on that table
The issue is your comparison is working against a single record but the INSERTED pseudo table contains multiple rows (all of the rows being inserted in the transaction). You can get around this using something like the following:

CREATE TRIGGER inTrigger ON Data
INSTEAD OF INSERT
AS
BEGIN

  IF EXISTS(
    SELECT * 
    FROM INSERTED i 
    INNER JOIN Faculty f ON f.Id = i.Fid
    WHERE f.fopd &gt; i.Date
  )
  BEGIN
    RAISERROR('Cannot insert ',16,1);
  END

  INSERT INTO test (id, fid, date)
  SELECT i.* 
  FROM INSERTED i
  INNER JOIN Faculty f ON f.Id = i.Fid
  WHERE f.fopd &lt;= i.Date

END


This trigger identifies any records in the INSERTED table that match the failing criteria and if encountered it raises an error. It then proceeds with the insertion of the records that do not violate the condition. You could easily amend this to rollback the whole transaction if that is preferred.