Ethically, if your decision really is final, I can't see any way of letting him think he still has the position he was hired for through the end of the project and then firing him for underperformance, but you do have options.
You've said
I'm certain that there is not another place at the company for him.
and
He...has been helpful in taking simple tasks off my plate
and
...once the project is finished, he will be laid off. I expect this to take another few months.
and that him leaving now, before the end of the project, "would be a setback."
and lastly, you've said
My decision is final...
So apparently, you have a temporary position for a very junior developer / admin staff person to keep small tasks off your plate during this project which winds up in a few months, and he is currently successfully filling that position. He's not successfully filling the position he was hired for, and you're certain he never will.
So we need to balance
- Your responsibilities to the company
- Your responsibilities to your employee as his manager
I had to deal with something very similar many years ago as head of department. Based on that experience, I see these options in your situation:
1. A new position
If (note that this is a tall order to fill)
- other than underperforming, he's a very positive member of staff (enthusiastic, good for the team, just generally a good guy to have around)
- there is a reasonable chance that the very junior-level work he's successfully doing now may continue past the end of the project after all
- you'd be willing to keep him on at his current pay grade to do that work
- your assessment of his character is that he will continue to be a positive, enthusiastic employee and not do something malicious
then tell him now that (regretfully) you've determined he isn't be suitable to the position you hired him for, but that he's making a useful contribution and you appreciate his enthusiasm and positive influence on the team, and that you'd like to keep him on in a new, more junior position. Describe his new responsibilities to him and be certain that he understands that his new position doesn't include the training and career track his old one did. Then ask him if he wants to stay on in that capacity. (You'll obviously follow this up in writing.) If there's still a business case for it, advertise and hire someone to fill the position he no longer fills.
At the end of the project, hopefully the reasonable chance of the work continuing comes up trumps and you can keep him in his junior-level job. And maybe he surprises you, maybe he has the capacity to improve after all and being demoted is the wake-up call he needs.
He may find a new job in the meantime and leave; that would be a setback for your project, which is unfortunate, but there's always that risk anyway.
2. Fire him now, hire a temp
If you couldn't say yes to all of the bullet points at the beginning of #1 above, fire him now and hire a temp to do the work he's currently doing, presumably at a lower pay rate. If there's still a business case for it, advertise and hire someone to fill the position he was originally meant to have.
This will cause disruption, but it's honest and overall good for the business. Perhaps it turns out that the temp shows potential and you keep him/her on past the end of the project. If you don't immediately fill the position your current person can't fulfill, it may turn out that the temp can; if not, he/she is a temp and knew that from the outset, so it's fine that the position ends with the project ends.
I should note that "fire him now" may well be a multi-month process depending on where you are in Europe, what documentation and communications with him you've already amassed, etc. Your company's lawyers are obviously the ones to advise on that, but unlike the U.S., you may well not be able to just walk him to the door and pay him his notice period.
3. Maybe your decision isn't final
I know you've said your decision is final, but there are two reasons this option may be the way to go:
It sounds like you've done only an informal performance improvement process with him. Depending on where you are in Europe and the advice of your HR department and/or company lawyers, you may not be able to fire him without first going through a formal performance improvement process.
Perhaps on reflection you're not 100% sure he's not going to improve. Maybe he does have the capacity to improve and a stark message about his future at the company will be the wakeup call he needs.
So if either of those is the case:
Sit the employee down and say that you like his enthusiasm, but (in no uncertain terms) it isn't currently translating into improvement. Work with him to try to determine why that is. Does he not realize there's a problem? Is it a lack of education? Start a formal, documented performance improvement plan with him, with specific goals for improvement. If he still doesn't improve after several months, go with one of the options above.
But if you think that he knows there's a real problem, and is actively trying to improve, and just isn't getting anywhere, then this isn't going to do him or you any good.
And obviously, don't do this just to keep him around through the end of the project. If you do it, make it real.
Years ago as head of department I had a very similar problem: We'd hired someone on the basis of his being a mid-range developer, definitely not a junior but not quite a senior either. After three months he still wasn't performing at the expected level and we had informal conversations about that. At six months we had more conversations, and at nine months he was still struggling. So we started with option 3 above. Several months later that still wasn't working, so we were left with options 1 and 2.
We went with option 1, because other than underperforming in his original position, he was a great asset to the company: Very well-liked, enthusiastic, and always doing things to make the company a better and happier place — spearheading recycling drives, organizing employee activities, etc. Just a positive person to have around in a bunch of ways. We were certain he wouldn't do anything to sabotage the company and would do his best in his new position. And we could identify junior tasks we thought were in his wheelhouse that would be useful to the company.
He accepted the new junior position and went on to do an adequate job in it. We wouldn't have paid that new position as much as we were paying him, but we were willing to eat the difference for this particular person. Having him doing junior tasks kept those off other developers' plates. If he hadn't been able to do an adequate job in the junior position, we would have fired him, but he was so we didn't. This was successful for two years until we had an unrelated round of layoffs in which his position (and several others) had to be terminated.
From a hard business perspective we might have been better off letting him go and hiring a junior at a junior's salary, not really because of the difference in pay (firing people is expensive, and we weren't paying him that much) but primarily because a junior might have the potential to grow and contribute more over time. I don't regret it and I know the CEO didn't either, but I do accept it was an unusual case. With most other staff I've had, I'd've gone with option 2 if option 3 didn't work.