public static bool UpdateInvoiceSpreads(InvoiceSpreadCollection coll_)
    {
      var startDate = coll_.Lines == null || coll_.Lines.Count == 0
        ? new DateTime(2010, 6, 1)
        : MyCalendar.NextWeekDay(coll_.Lines.Last().Date);

      bool updated = false;

      if (startDate >= DateTime.Today)
        return updated;

      var curve = (Symmetry.Data.Enums.KnownCurve)Enum.Parse(typeof(Symmetry.Data.Enums.KnownCurve), coll_.Curve);

      var contractList = GetList(futureStart_: coll_.Contract);

      while (startDate < DateTime.Today)
      {
        Logger.Info(
          string.Format("Generating {0}.{1} invoice spreads on {2}", coll_.Curve, coll_.Contract,
            startDate.ToString("dd-MMM-yyyy")), typeof(Generator));

        var subList = contractList.Where(x => x.LastTrade >= startDate).ToArray();

        if (subList.Length == 0)
        {
          Logger.Error(string.Format("No contract found for date={0}", startDate.ToString("dd-MMM-yyyy")),
            typeof(Generator));
          continue;
        }

        Logger.DebugFormat(typeof(Generator), "Generating line for {0} over {1} on {2}", coll_.Contract, coll_.Curve,
          startDate.ToString("dd-MMM-yyyy"));

        var item = new InvoiceSpreadLine(
          date_: startDate,
          contractBondSpecifics: subList[coll_.Series],
          curve_: curve);

        coll_.Lines.Add(item);

        updated = true;

        startDate = MyCalendar.NextWeekDay(startDate);
      }

      return updated;
    }
    public static void UpdateInvoiceSpreads()
    {
      var dateToRegenerateFrom = DateTime.Today.AddYears(1); // don't want to regenerate

      foreach (var t in invoiceSpreadConfigs())
      {
        var coll = getInvoiceSpreadsCollectionFromMongo(t);

        Logger.Info(string.Format("Updating Invoice spreads for config : {0}.{1}", t.Curve, t.Future),
          typeof(Generator));

        if (coll == null) coll = new Strategy.CTDs.InvoiceSpreadCollection(t);


        while (coll.Lines.Count > 0 && coll.Lines.Last().Date >= dateToRegenerateFrom)
          coll.Lines.RemoveAt(coll.Lines.Count - 1);


        var updated = UpdateInvoiceSpreads(coll);

        if (!updated)
          continue;

        // save to mongo
        SI.DB.MongoDB.UpsertInCollection(INVOICE_SPREADS_MONGO_SVR_REFERENCE, INVOICE_SPREADS_MONGO_DB,
          INVOICE_SPREADS_MONGO_COLLECTION, coll, x => x.Id == coll.Id);
      }

      Symmetry.Interop.Carbon.OT.CarbonDataSource.ClearUp();
    }