<<Correct version, since I can't edit the original post>>
In these type of sentences 'Di' and 'Li' are used to convey the present-perfect aspect like has/have in English and they imply that the action completed in past has some impact on present. The difference in 'Li' and "Di' is that "Di' tells that the subject did the task for someone else not himself. And 'Li' tells he did it for himself. E.g. Consider these sentences:
1. Ram ne bana di roti. 2. Ram ne bana li roti.
In (1) 'LI' tells that Ram has made the food for himself, perhaps he was hungry. In (2) 'DI' implies that Ram made the food for someone else perhaps his wife who is hungry. The correct translations of (1) and (2) are:
1. Ram ne bana li roti. = Ram has made the food. (...For himself in the past and now at present he is going to eat it)
2. Ram ne bana di roti. = Ram has made the food. (For someone else, say his wife and now at present his wife will eat that food)
The simple past versions are:
1. Ram ne banai roti. = Ram made the food.(..For himself, then he ate it and went to his office.)
2. Ram ne banai roti. = Ram made the food.(For someone else, then he went to his office.)
'Di' and "Li" are changed to "De/Do" and "Le/Lo" when you ask something
1. Ram roti bana lo/le. = Ram, make the food.(For yourself)
2. Ram roti bana de/do. = Ram, make the food.(For someone else)
"Do" and "Lo" are used to represent respect for example when we talk to elder people. "Di" and "Li" are also used in interogative sentences, e.g.
1. Kya Ram ne roti bana li. = Has Ram made the food.(For himself)
2. Kya Ram ne roti bana di. = Has Ram made the food(For someone else)
There might be other usages and meanings of "De" and "Le". I think this much explanation is sufficient for the time being.