int nbperiods = ...;
range periods 1..nbperiods;
range periods0 0..nbperiods;
int demand[periods] = ...;
int prodcost[periods] = ...;
int fixedcost[periods] = ...;
int storagecost[periods] = ...;
int maxprodperperiod = ...;

var int producein[periods] in 0..maxprodperperiod;
var int stock[periods0] in 0..maxprodperperiod*nbperiods;
var int productionin[periods] in 0..1;

minimize
   sum (t in periods) prodcost[t]*producein[t] +
   sum (t in periods) storagecost[t]*stock[t]+
   sum (t in periods) fixedcost[t]*productionin[t]

subject to {

   forall (t in periods) stock[t-1] + producein[t] = demand[t] + stock[t];
   forall (t in periods) producein[t] <= productionin[t]*nbperiods*maxprodperperiod;
   stock[0]= 0;};