Пример #1
0
        /// <summary>
        /// Создание технологической карты.
        /// </summary>
        /// <param name="curRec">текущая рецептура</param>
        /// <param name="useOriginal">флаг использования оригинальных данных</param>
        /// <param name="countVals">перечень значений выхода в шт.</param>
        /// <param name="exitVals">перечень значений выхода в гр.</param>
        /// <returns>HTML документ в виде строки</returns>
        internal string PrintTK(DataRecept curRec)
        {
            if ((Config.Cfg.ReportUseCounts == null || Config.Cfg.ReportUseCounts.Count == 0) &&
                (Config.Cfg.ReportUseExits == null || Config.Cfg.ReportUseExits.Count == 0) &&
                !Config.Cfg.ReportIsShowOriginal)
            {
                if (MessageBox.Show("Не указан выход, хотите настроить?", "Предупреждение", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1, 0) == DialogResult.Yes)
                {
                    this.BtnSettingsClick(null, EventArgs.Empty);
                }
            }

            StringBuilder ret = new StringBuilder("<html><style>h3{text-align:center;}</style>");

            try {
                curRec.CalcRecept();
                //Hashtable groupRaws = curRec.GroupRaws(true);
            } catch (OverflowException ex)
            {
                ret.Append("<p align=center>Невозможно сосчитать рецептуру: " + ex.Message + ". Проверьте правильность заполнения</p></html>");
                return(ret.ToString());
            }

            // шапка
            ret.Append(makeHeader(false, true));
            ret.Append("<p align=center><b><font size=4>ТЕХНОЛОГИЧЕСКАЯ КАРТА № " + curRec.Id.ToString(CultureInfo.CurrentCulture) +
                       "</font><br><font size=5> на " + curRec.Name + "</font></b>");
            if (!String.IsNullOrEmpty(curRec.normativDoc))
            {
                ret.Append("<br>Изготовлено по " + curRec.normativDoc);
            }
            ret.Append("</p>");

            if (!String.IsNullOrEmpty(curRec.preview))
            {
                ret.Append("<h3>Описание изделия</h3><p>" + TextFormatting(curRec.preview) + "</p>");
            }

            ret.Append("<h3>Рецептура</h3>");

            // Шапка
            ret.Append("<table width=\"100%\" border><thead align=center><td> Наименование сырья");
            int cols = 1;

            if (Config.Cfg.ReportIsShowOriginal)
            {
                ret.Append("<td>" + curRec.TotalExit + " г./" + curRec.CountExit + " шт.");
                cols++;
            }

            for (int i = 0; i < Config.Cfg.ReportUseCounts.Count; i++)
            {
                ret.Append("<td>" + Config.Cfg.ReportUseCounts[i] + " шт.");
                cols++;
            }

            for (int i = 0; i < Config.Cfg.ReportUseExits.Count; i++)
            {
                ret.Append("<td>" + Config.Cfg.ReportUseExits[i] + " г.");
                cols++;
            }

            ret.Append("</thead>");

            // тело
            PrintReceptBody(ret, curRec, cols);

            ret.Append("</table>");

            ret.Append("<h3>Технология приготовления</h3><p>" + TextFormatting(curRec.process) + "</p>");

            StringBuilder curElem = makeReceptProperty(curRec);

            if (curElem.Length > 0)
            {
                ret.Append("<h3>Характеристика изделия</h3>");
                ret.Append("<p>" + curElem + "</p>");
            }

            ret.Append(makeFooter());

            // автозамены
            ReplaceSymbols(ret);

            return(ret.ToString());
        }
Пример #2
0
        /// <summary>
        /// расчет рецептуры
        /// </summary>
        /// <returns>результаты расчета</returns>
        internal void CalcRecept()
        {
            // инициализация
            this.myCalcProperty = new DataRawStruct(null);
            this.myCalcSumNetto = 0;
            this.myCalcSumSuhie = 0;

            // Потери текущего элемента.
            DataRawStruct prLoss;

            // расчет закладки по количеству и сухим веществам
            foreach (DataBase curRec in Components)
            {
                Decimal       netto  = 0;
                DataRawStruct curRaw = null;

                if (curRec is DataRecept)
                {
                    // расчет вложенной рецептуры
                    DataRecept introRec = (DataRecept)curRec;
                    introRec.CalcRecept();
                    netto  = introRec.CalcSumNetto;
                    curRaw = introRec.CalcProperty;
                    prLoss = new DataRawStruct(null);
                    this.myCalcSumSuhie += introRec.CalcSumSuhie;
                }
                else
                {
                    // Расчет компоненты
                    DataRaw dr = (DataRaw)curRec;
                    netto  = dr.Quantity;
                    curRaw = dr.RawStruct;
                    // если элемент пустой, то пропускаем его
                    if (curRaw == null)
                    {
                        continue;
                    }

                    if (dr.Brutto == 0 && netto != 0 && curRaw.Brutto != 0)
                    {
                        dr.Brutto = netto * curRaw.Brutto;
                    }

                    if (dr.Brutto != 0 && netto == 0 && curRaw.Brutto != 0)
                    {
                        netto = dr.Brutto / curRaw.Brutto;
                    }

                    // если не заданы потери, то создаем пустые (без потерь)
                    if (dr.ProcessLoss != null)
                    {
                        prLoss = dr.ProcessLoss;
                    }
                    else
                    {
                        prLoss = new DataRawStruct(null);
                    }

                    // добавление сухих веществ
                    this.myCalcSumSuhie += netto * (100 - curRaw.Water) * (100 - prLoss.Brutto) / 10000;
                }

                // расчет = сумма (количество, уменьшенное на потерю при термической обработке и умноженное на присутствие
                // исходные данные указаны в % (кроме веса и калорийности)
                this.myCalcSumNetto             += netto * (100 - prLoss.Brutto) / 100;
                this.myCalcProperty.Water       += curRaw.Water * netto * (100 - prLoss.Water) / 10000;
                this.myCalcProperty.Caloric     += curRaw.Caloric * netto * (100 - prLoss.Caloric) / 10000; // калории на 100г., поэтому еще делим и на 100
                this.myCalcProperty.starch      += curRaw.starch * netto * (100 - prLoss.starch) / 10000;
                this.myCalcProperty.saccharides += curRaw.saccharides * netto * (100 - prLoss.saccharides) / 10000;
                this.myCalcProperty.cellulose   += curRaw.cellulose * netto * (100 - prLoss.cellulose) / 10000;
                this.myCalcProperty.cholesterol += curRaw.cholesterol * netto * (100 - prLoss.cholesterol) / 10000;
                this.myCalcProperty.fat         += curRaw.fat * netto * (100 - prLoss.fat) / 10000;
                this.myCalcProperty.acid        += curRaw.acid * netto * (100 - prLoss.acid) / 10000;
                this.myCalcProperty.ash         += curRaw.ash * netto * (100 - prLoss.ash) / 10000;
                this.myCalcProperty.MineralCA   += curRaw.MineralCA * netto * (100 - prLoss.MineralCA) / 10000;
                this.myCalcProperty.MineralFE   += curRaw.MineralFE * netto * (100 - prLoss.MineralFE) / 10000;
                this.myCalcProperty.MineralK    += curRaw.MineralK * netto * (100 - prLoss.MineralK) / 10000;
                this.myCalcProperty.MineralMG   += curRaw.MineralMG * netto * (100 - prLoss.MineralMG) / 10000;
                this.myCalcProperty.MineralNA   += curRaw.MineralNA * netto * (100 - prLoss.MineralNA) / 10000;
                this.myCalcProperty.MineralP    += curRaw.MineralP * netto * (100 - prLoss.MineralP) / 10000;
                this.myCalcProperty.protein     += curRaw.protein * netto * (100 - prLoss.protein) / 10000;
                this.myCalcProperty.vitaminA    += curRaw.vitaminA * netto * (100 - prLoss.vitaminA) / 10000;
                this.myCalcProperty.VitaminB    += curRaw.VitaminB * netto * (100 - prLoss.VitaminB) / 10000;
                this.myCalcProperty.VitaminB1   += curRaw.VitaminB1 * netto * (100 - prLoss.VitaminB1) / 10000;
                this.myCalcProperty.VitaminB2   += curRaw.VitaminB2 * netto * (100 - prLoss.VitaminB2) / 10000;
                this.myCalcProperty.VitaminC    += curRaw.VitaminC * netto * (100 - prLoss.VitaminC) / 10000;
                this.myCalcProperty.VitaminPP   += curRaw.VitaminPP * netto * (100 - prLoss.VitaminPP) / 10000;
            }

            // Расчет по выходу
            if (myIsCalcExit && this.myTotalExit > 0)
            {
                if (this._totalLoss != null)
                {
                    this.myCalcExitSuhie = this.myCalcSumSuhie * (100 - this._totalLoss.Quantity) / 100;
                }
                else
                {
                    this.myCalcExitSuhie = this.myCalcSumSuhie;
                }

                this.myCalcExitNetto = this.myTotalExit;
            }
            else

            // расчет по воде
            if (myIsCalcWater && this.water > 0)
            {
                if (this._totalLoss != null)
                {
                    this.myCalcExitSuhie = this.myCalcSumSuhie * (100 - this._totalLoss.Quantity) / 100;
                }
                else
                {
                    this.myCalcExitSuhie = this.myCalcSumSuhie;
                }

                this.myCalcExitNetto = this.myCalcExitSuhie / (100 - this._water) * 100;
            }
            else

            // расчет воды по выходу и влажности
            if (myIsSetWater && this._water > 0 && this.myTotalExit > 0)
            {
                DataRawStruct waterRaw = Config.DP.GetRawByNum(Config.Cfg.WaterId);
                if (waterRaw == null)
                {
                    throw new InvalidDataException("Не задана вода для расчета в рецептуре");
                }

                if (this._totalLoss != null)
                {
                    this.myCalcExitSuhie = this.myCalcSumSuhie * (100 - this._totalLoss.Quantity) / 100;
                }
                else
                {
                    this.myCalcExitSuhie = this.myCalcSumSuhie;
                }

                this.myCalcExitNetto = this.myTotalExit;
                //decimal waterVal = this.myCalcExitSuhie / (100 - this._water) * 100 - this.myCalcExitNetto;
                throw new NotImplementedException("Дописать расчет воды по выходу и влажности");
            }
            else
            { // Просто без расчета
                this.myCalcExitNetto = this.myCalcSumNetto;
                this.myCalcExitSuhie = this.myCalcSumSuhie;
            }
            if (this.myCalcExitNetto <= 0)
            {
                throw new OverflowException("Выход у рецептуры меньше или равен нулю");
            }

            // пересчет значений в процентах
            this.myCalcProperty.Water       /= this.myCalcExitNetto / 100;
            this.myCalcProperty.Caloric     /= this.myCalcExitNetto / 100;
            this.myCalcProperty.starch      /= this.myCalcExitNetto / 100;
            this.myCalcProperty.saccharides /= this.myCalcExitNetto / 100;
            this.myCalcProperty.cellulose   /= this.myCalcExitNetto / 100;
            this.myCalcProperty.cholesterol /= this.myCalcExitNetto / 100;
            this.myCalcProperty.fat         /= this.myCalcExitNetto / 100;
            this.myCalcProperty.acid        /= this.myCalcExitNetto / 100;
            this.myCalcProperty.ash         /= this.myCalcExitNetto / 100;
            this.myCalcProperty.MineralCA   /= this.myCalcExitNetto / 100;
            this.myCalcProperty.MineralFE   /= this.myCalcExitNetto / 100;
            this.myCalcProperty.MineralK    /= this.myCalcExitNetto / 100;
            this.myCalcProperty.MineralMG   /= this.myCalcExitNetto / 100;
            this.myCalcProperty.MineralNA   /= this.myCalcExitNetto / 100;
            this.myCalcProperty.MineralP    /= this.myCalcExitNetto / 100;
            this.myCalcProperty.protein     /= this.myCalcExitNetto / 100;
            this.myCalcProperty.vitaminA    /= this.myCalcExitNetto / 100;
            this.myCalcProperty.VitaminB    /= this.myCalcExitNetto / 100;
            this.myCalcProperty.VitaminB1   /= this.myCalcExitNetto / 100;
            this.myCalcProperty.VitaminB2   /= this.myCalcExitNetto / 100;
            this.myCalcProperty.VitaminC    /= this.myCalcExitNetto / 100;
            this.myCalcProperty.VitaminPP   /= this.myCalcExitNetto / 100;
        }
Пример #3
0
        /// <summary>
        /// Создание технико-технологической карты
        /// </summary>
        /// <returns></returns>
        internal string PrintTTK(DataRecept curRec)
        {
            Hashtable   groupRaws = curRec.GroupRaws(true);
            FormCounter cc        = new FormCounter();

            StringBuilder ret = new StringBuilder("<html><style>h3{text-align:center;}</style>");

            try{
                curRec.CalcRecept();
            }catch (OverflowException ex)
            {
                ret.Append("<p align=center>Невозможно сосчитать рецептуру:" + ex.Message + ". Проверьте правильность заполнения</p></html>");
                return(ret.ToString());
            }

            // шапка
            ret.Append(makeHeader(true, true));
            ret.Append("<p align=center><b><font size=4>ТЕХНИКО-ТЕХНОЛОГИЧЕСКАЯ КАРТА № " + curRec.Id.ToString(CultureInfo.CurrentCulture) +
                       "</font><br><font size=5> на " + curRec.Name + "</font></b>");
            if (!String.IsNullOrEmpty(curRec.normativDoc))
            {
                ret.Append("<br>Изготовлено по " + curRec.normativDoc);
            }
            ret.Append("</p>");

            // область применения
            ret.Append("<h3>" + cc.moveUp() + " Область применения</h3>" +
                       "<p align=justify>" + cc.next() + " Настоящая технико-технологическая карта распространяется на изделие \"" +
                       curRec.Name + "\", вырабатываемое " + DataBook.Book.company + ".");
            if (!String.IsNullOrEmpty(curRec.preview))
            {
                ret.Append("<br>" + cc.next() + " Описание изделия. " + curRec.preview);
            }
            ret.Append("</p>");

            // перечень сырья и гостов
            ret.Append("<h3>" + cc.moveUp() + " Перечень сырья</h3>");
            StringBuilder curElem = new StringBuilder();

            foreach (DataRawStruct curRaw in groupRaws.Keys)
            {
                if (String.IsNullOrEmpty(curRaw.NormativDoc) || !curRaw.InRecept)
                {
                    continue;
                }
                curElem.Append("<tr><td><span>" + curRaw.Name + "</span><td><span>" + curRaw.NormativDoc + "</span></tr>");
            }
            if (curElem.Length > 0)
            {
                ret.Append("<p align=justify>" + cc.next() + " Для приготовления \"" + curRec.Name + "\" используют следующее сырье: <table>");
                ret.Append(curElem);
                ret.Append("</table>или продукты зарубежных фирм, имеющие сертификаты и удостоверения качества РФ.</p>");
            }

            ret.Append("<p align=justify>" + cc.next() + " Сырье, используемое для приготовления \"" + curRec.Name + "\", должно соответствовать требованиям" +
                       " нормативной документации, иметь сертификаты и удостоверения качества.</p>");

            // рецептура
            ret.Append("<h3>" + cc.moveUp() + " Рецептура</h3><p align=justify>Рецептура изделия \"" + curRec.Name +
                       "\"<table width=\"100%\" border><tr><td align=center> Наименование сырья <td align=center>Масса брутто, г<td align=center> Масса нетто, г</tr>");
            decimal brSum = 0, ntSum = 0;

            // пробегаем по вложенным рецептурам
            foreach (DataBase dbase in curRec.Components)
            {
                if (dbase is DataRecept)
                {
                    groupRaws = (dbase as DataRecept).GroupRaws(false);
                    Decimal curbrSum = 0;
                    Decimal curntSum = 0;
                    foreach (DataRawStruct curRaw in groupRaws.Keys)
                    {
                        if (!curRaw.InRecept)
                        {
                            continue;
                        }

                        decimal brutto = (groupRaws[curRaw] as DataRaw).Brutto * Config.Cfg.TotalExit / curRec.CalcExitNetto;
                        decimal netto  = (groupRaws[curRaw] as DataRaw).Quantity * Config.Cfg.TotalExit / curRec.CalcExitNetto;
                        ret.Append("<tr><td>" + curRaw.Name + "<td align=center>" +
                                   CommonFunctions.Round(brutto) +
                                   "<td align=center>" + CommonFunctions.Round(netto) + "</tr>");
                        curbrSum += brutto;
                        curntSum += netto;
                    }
                    ret.Append("<tr style=\"background-color: #808080\"><td>Итого " + dbase.Name + "<td align=center>" + CommonFunctions.Round(curbrSum) + "<td align=center>" + CommonFunctions.Round(curntSum) + "</tr>");
                    brSum += curbrSum;
                    ntSum += curntSum;
                }
            }

            // отстатки основной рецептуры
            groupRaws = curRec.GroupRaws(false);

            foreach (DataRawStruct curRaw in groupRaws.Keys)
            {
                if (!curRaw.InRecept)
                {
                    continue;
                }

                decimal brutto = (groupRaws[curRaw] as DataRaw).Brutto * Config.Cfg.TotalExit / curRec.CalcExitNetto;
                decimal netto  = (groupRaws[curRaw] as DataRaw).Quantity * Config.Cfg.TotalExit / curRec.CalcExitNetto;
                ret.Append("<tr><td>" + curRaw.Name + "<td align=center>" +
                           CommonFunctions.Round(brutto) +
                           "<td align=center>" + CommonFunctions.Round(netto) + "</tr>");
                brSum += brutto;
                ntSum += netto;
            }
            ret.Append("<tr><td>Итого<td align=center>" + CommonFunctions.Round(brSum) + "<td align=center>" + CommonFunctions.Round(ntSum) + "</tr>");
            ret.Append("<tr><td>Выход<td>&nbsp;<td align=center>" + CommonFunctions.Round(Config.Cfg.TotalExit) + "</tr>");
            ret.Append("</table></p>");

            // технологический процесс
            ret.Append("<h3>" + cc.moveUp() + " Технологический процесс</h3>");
            ret.Append("<p align=justify> " + cc.next() + " Подготовка сырья к производству изделия \"" + curRec.Name + "\" производится в соответствии со \"Сборником рецептур блюд и кулинарных изделий для предприятий общественного питания\" (1996 г.).</p>");
            if (!String.IsNullOrEmpty(curRec.process))
            {
                ret.Append("<p align=justify> " + cc.next() + " " + curRec.process + "</p>");
            }

            // оформление подача и т.д.
            if (!String.IsNullOrEmpty(curRec.design) || !String.IsNullOrEmpty(curRec.delivery) ||
                !String.IsNullOrEmpty(curRec.sale) || !String.IsNullOrEmpty(curRec.storage))
            {
                ret.Append("<h3>" + cc.moveUp() + " Оформление, подача, реализация и хранение</h3>");
                if (!String.IsNullOrEmpty(curRec.design))
                {
                    ret.Append("<p align=justify> " + cc.next() + " " + curRec.design + "</p>");
                }
                if (!String.IsNullOrEmpty(curRec.delivery))
                {
                    ret.Append("<p align=justify> " + cc.next() + " " + curRec.delivery + "</p>");
                }
                if (!String.IsNullOrEmpty(curRec.sale))
                {
                    ret.Append("<p align=justify> " + cc.next() + " " + curRec.sale + "</p>");
                }
                if (!String.IsNullOrEmpty(curRec.storage))
                {
                    ret.Append("<p align=justify> " + cc.next() + " " + curRec.storage + "</p>");
                }
            }

            // физ-хим показатели
            ret.Append("<h3>" + cc.moveUp() + " Показатели качества и безопасности</h3>");
            curElem = makeReceptProperty(curRec);
            if (curElem.Length > 0)
            {
                ret.Append("<p align=justify>" + cc.next() + " Органолептические показатели изделия:<br>");
                ret.Append(curElem + "</p>");
            }

            ret.Append("<p align=justify>" + cc.next() + " Физико-химические показатели:<br>");
            if (curRec.CalcWater != 0)
            {
                string waterApp = "";
                if (curRec.waterPlus == curRec.waterMinus)
                {
                    if (curRec.waterPlus != 0)
                    {
                        waterApp = " &plusmn;" + curRec.waterPlus;
                    }
                }
                else
                {
                    waterApp = " +" + curRec.waterPlus + " -" + curRec.waterMinus;
                }
                ret.AppendLine("Влажность: " + CommonFunctions.Round(curRec.CalcWater) + "%" + waterApp + "<br>");
            }
            if (curRec.Acidity != 0)
            {
                ret.AppendLine("Кислотность: " + CommonFunctions.Round(curRec.Acidity) + "Ph<br>");
            }
            if (curRec.CalcProperty.starch != 0)
            {
                ret.AppendLine("Крахмал: " + CommonFunctions.Round(curRec.CalcProperty.starch) + "%<br>");
            }
            if (curRec.CalcProperty.saccharides != 0)
            {
                ret.Append("Моно и дисахариды: " + CommonFunctions.Round(curRec.CalcProperty.saccharides) + "%<br>");
            }
            if (curRec.CalcProperty.acid != 0)
            {
                ret.Append("Жирные кислоты: " + CommonFunctions.Round(curRec.CalcProperty.acid) + "%<br>");
            }
            if (curRec.CalcProperty.ash != 0)
            {
                ret.Append("Зола: " + CommonFunctions.Round(curRec.CalcProperty.ash) + "%<br>");
            }
            if (curRec.CalcProperty.cellulose != 0)
            {
                ret.Append("Целлюлоза: " + CommonFunctions.Round(curRec.CalcProperty.cellulose) + "%<br>");
            }
            if (curRec.CalcProperty.cholesterol != 0)
            {
                ret.Append("Холестерин: " + CommonFunctions.Round(curRec.CalcProperty.cholesterol) + "%<br>");
            }
            if (curRec.CalcProperty.protein != 0)
            {
                ret.Append("Протеины: " + CommonFunctions.Round(curRec.CalcProperty.protein) + "%<br>");
            }

            // макроэлементы
            curElem = new StringBuilder();
            if (curRec.CalcProperty.MineralK != 0)
            {
                curElem.Append("<li>Калий (K): " + CommonFunctions.Round(curRec.CalcProperty.MineralK));
            }
            if (curRec.CalcProperty.MineralCA != 0)
            {
                curElem.Append("<li>Кальций (Ca): " + CommonFunctions.Round(curRec.CalcProperty.MineralCA));
            }
            if (curRec.CalcProperty.MineralMG != 0)
            {
                curElem.Append("<li>Магний (Mg): " + CommonFunctions.Round(curRec.CalcProperty.MineralMG));
            }
            if (curRec.CalcProperty.MineralNA != 0)
            {
                curElem.Append("<li>Натрий (Na): " + CommonFunctions.Round(curRec.CalcProperty.MineralNA));
            }
            if (curRec.CalcProperty.MineralP != 0)
            {
                curElem.Append("<li>Фосфор (P): " + CommonFunctions.Round(curRec.CalcProperty.MineralP));
            }
            if (curElem.Length > 0)
            {
                ret.Append("<div>Макроэлементы, мг<ul>");
                ret.Append(curElem);
                ret.Append("</ul></div>");
            }

            // микроэлементы
            curElem = new StringBuilder();
            if (curRec.CalcProperty.MineralFE != 0)
            {
                curElem.Append("<li>Железо (Fe): " + CommonFunctions.Round(curRec.CalcProperty.MineralFE));
            }
            if (curElem.Length > 0)
            {
                ret.Append("<div>Микроэлементы, мкг<ul>");
                ret.Append(curElem);
                ret.Append("</ul></div>");
            }

            // витамины
            curElem = new StringBuilder();
            if (curRec.CalcProperty.vitaminA != 0)
            {
                curElem.Append("<li>Ретинол (А): " + CommonFunctions.Round(curRec.CalcProperty.vitaminA));
            }
            if (curRec.CalcProperty.VitaminB != 0)
            {
                curElem.Append("<li>Бета-каротин (B): " + CommonFunctions.Round(curRec.CalcProperty.VitaminB));
            }
            if (curRec.CalcProperty.VitaminB1 != 0)
            {
                curElem.Append("<li>Тиамин (B1): " + CommonFunctions.Round(curRec.CalcProperty.VitaminB1));
            }
            if (curRec.CalcProperty.VitaminB2 != 0)
            {
                curElem.Append("<li>Рибофлавин (B2): " + CommonFunctions.Round(curRec.CalcProperty.VitaminB2));
            }
            if (curRec.CalcProperty.VitaminC != 0)
            {
                curElem.Append("<li>Аскорбиновая кислота (C): " + CommonFunctions.Round(curRec.CalcProperty.VitaminC));
            }
            if (curRec.CalcProperty.VitaminPP != 0)
            {
                curElem.Append("<li>Ниацин (PP): " + CommonFunctions.Round(curRec.CalcProperty.VitaminPP));
            }
            if (curElem.Length > 0)
            {
                ret.Append("<div>Витамины<ul>");
                ret.Append(curElem);
                ret.Append("</ul></div>");
            }

            if (curRec.MicroBiology != null)
            {
                ret.Append("<p align=justify>" + cc.next() + " Микробиологические показатели:" + "</p>");
                throw new NotImplementedException("Нарисовать табличку с микробиологией");
            }
            ret.Append("<h3>" + cc.moveUp() + " Пищевая и энергетическая ценность</h3>");
            ret.Append("<p><table width=\"100%\"  border><tr><td align=\"center\"><span>Белки</span><td align=\"center\"><span>Жиры</span><td align=\"center\"><span>Углеводы</span><td align=\"center\"><span>Энергетическая ценность, ккал/кДж</span></tr>");
            ret.Append("<tr><td align=\"center\"><span>" + CommonFunctions.Round((Decimal)curRec.CalcProperty.protein) + "</span>" +
                       "<td align=\"center\"><span>" + CommonFunctions.Round((Decimal)curRec.CalcProperty.fat) + "</span>" +
                       "<td align=\"center\"><span>" + CommonFunctions.Round((Decimal)(curRec.CalcProperty.saccharides + curRec.CalcProperty.starch)) + "</span>" +
                       "<td align=\"center\"><span>" + CommonFunctions.Round((Decimal)curRec.CalcProperty.Caloric) + "/" +
                       CommonFunctions.Round((Decimal)curRec.CalcProperty.Caloric * (Decimal)4.184) + "</span>" + "</tr></table></p>");

            ret.Append(makeFooter());

            // автозамены
            ReplaceSymbols(ret);

            return(ret.ToString());
        }