Program: 178315
Project: 178315
Buggy source:
public PlanSummary process(ArrayList<Chargeable> data){
  PlanSummary ret=new PlanSummary(this);
  double globalPrice=0;
  long yoigoSeconds=0;
  String dateCallYoigo="String_Node_Str";
  for (  Chargeable chargeable : data) {
    if (chargeable.getChargeableType() == Chargeable.CHARGEABLE_TYPE_CALL) {
      Call call=(Call)chargeable;
      if (call.getType() != Call.CALL_TYPE_SENT) {
        continue;
      }
      double callPrice=0;
      if (call.getContact().getMsisdnType() == MsisdnType.ES_SPECIAL_ZER0) {
        callPrice=0;
      }
 else       if (call.getContact().getMsisdnType() == MsisdnType.ES_YOIGO) {
        String formattedDate=Formatter.formatDate(call.getDate());
        if (dateCallYoigo.equals(formattedDate)) {
          yoigoSeconds=yoigoSeconds + call.getDuration();
        }
 else {
          dateCallYoigo=formattedDate;
          yoigoSeconds=call.getDuration();
        }
        if (yoigoSeconds <= maxYoigoSeconds) {
          callPrice=initialPrice;
        }
 else {
          long duration=call.getDuration();
          if (yoigoSeconds - call.getDuration() < maxYoigoSeconds) {
            duration=yoigoSeconds - call.getDuration();
          }
          callPrice=initialPrice + (duration * pricePerSecond);
        }
      }
 else {
        callPrice=initialPrice + (call.getDuration() * pricePerSecond);
      }
      globalPrice+=callPrice;
      ret.addPlanCall(new PlanChargeable(call,callPrice,this.getCurrency()));
    }
 else     if (chargeable.getChargeableType() == Chargeable.CHARGEABLE_TYPE_SMS) {
      Sms sms=(Sms)chargeable;
      if (sms.getType() == Sms.SMS_TYPE_RECEIVED) {
        continue;
      }
      globalPrice+=smsPrice;
      ret.addPlanCall(new PlanChargeable(chargeable,smsPrice,this.getCurrency()));
    }
  }
  if (globalPrice < minimumMonthFee) {
    ret.addPlanCall(new PlanChargeable(new ChargeableMessage(ChargeableMessage.MESSAGE_MONTH_FEE),minimumMonthFee - globalPrice,this.getCurrency()));
  }
  return ret;
}

Fixed version (ground truth):
public PlanSummary process(ArrayList<Chargeable> data){
  PlanSummary ret=new PlanSummary(this);
  double globalPrice=0;
  long yoigoSeconds=0;
  String dateCallYoigo="String_Node_Str";
  for (  Chargeable chargeable : data) {
    if (chargeable.getChargeableType() == Chargeable.CHARGEABLE_TYPE_CALL) {
      Call call=(Call)chargeable;
      if (call.getType() != Call.CALL_TYPE_SENT) {
        continue;
      }
      double callPrice=0;
      if (call.getContact().getMsisdnType() == MsisdnType.ES_SPECIAL_ZER0) {
        callPrice=0;
      }
 else       if (call.getContact().getMsisdnType() == MsisdnType.ES_YOIGO) {
        String formattedDate=Formatter.formatDate(call.getDate());
        if (dateCallYoigo.equals(formattedDate)) {
          yoigoSeconds=yoigoSeconds + call.getDuration();
        }
 else {
          dateCallYoigo=formattedDate;
          yoigoSeconds=call.getDuration();
        }
        if (yoigoSeconds <= maxYoigoSeconds) {
          callPrice=initialPrice;
        }
 else {
          long duration=call.getDuration();
          if (yoigoSeconds - call.getDuration() < maxYoigoSeconds) {
            duration=yoigoSeconds - call.getDuration();
          }
          callPrice=initialPrice + (duration * pricePerSecond);
        }
      }
 else {
        callPrice=initialPrice + (call.getDuration() * pricePerSecond);
      }
      globalPrice+=callPrice;
      ret.addPlanCall(new PlanChargeable(call,callPrice,this.getCurrency()));
    }
 else     if (chargeable.getChargeableType() == Chargeable.CHARGEABLE_TYPE_SMS) {
      Sms sms=(Sms)chargeable;
      if (sms.getType() == Sms.SMS_TYPE_RECEIVED) {
        continue;
      }
      globalPrice+=smsPrice;
      ret.addPlanCall(new PlanChargeable(chargeable,smsPrice,this.getCurrency()));
    }
  }
  if (globalPrice < minimumMonthFee) {
    ret.addPlanCall(new PlanChargeable(new ChargeableMessage(ChargeableMessage.MESSAGE_MINIMUM_MONTH_FEE),minimumMonthFee - globalPrice,this.getCurrency()));
  }
  return ret;
}