示例#1
0
        private void writeMainData(XslFOProfileWriter fo, ThisReportData data, int Type)
        {
            #region #1: Основные данные

            _TableSeparator(fo);

            fo.TStart(true, ITRepStyles.TABLE, false);
            fo.TAddColumn("Займ №", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "15%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Тип займа", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "15%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Целевая компания/Сотрудник", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "30%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Дата", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "15%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Сумма", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "15%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

            foreach (IDictionary IO in data.IncOut)
            {
                fo.TRStart();
                _WriteCell(fo, xmlEncode(IO["Number"]));
                _WriteCell(fo, xmlEncode(IO["LoanType"]));
                _WriteCell(fo, xmlEncode(IO["LoanTarget"]));
                _WriteCell(fo, _FormatShortDate(IO["Date"].ToString()));
                _WriteCell(fo, xmlEncode(IO["Sum"]));
                fo.TREnd();
            }
            fo.TEnd();
            #endregion
        }
示例#2
0
        /// <summary>
        /// Отображение в отчете основных свойств лота и тендера
        /// </summary>
        /// <param name="fo"></param>
        /// <param name="data">Данные тендера, данные которого отображаются</param>
        private void writeMainData(XslFOProfileWriter fo, ThisReportData data)
        {
            #region #1: Основные данные

            // ...разделитель
            _TableSeparator(fo);

            fo.TStart(true, ITRepStyles.TABLE, false);

            fo.TAddColumn("Тип транзакции", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "25%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Назначение", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "25%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Дата", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Сумма", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Примечание", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "30%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

            foreach (IDictionary EmpKassTrans in data.Main)
            {
                fo.TRStart();
                _WriteCell(fo, xmlEncode(EmpKassTrans["TransType"]));
                _WriteCell(fo, xmlEncode(EmpKassTrans["Reason"]));
                _WriteCell(fo, xmlEncode(((DateTime)EmpKassTrans["Date"]).ToShortDateString()));
                _WriteCell(fo, xmlEncode(EmpKassTrans["TransSum"]));
                _WriteCell(fo, xmlEncode(EmpKassTrans["Rem"]));
                fo.TREnd();
            }
            fo.TEnd();
            #endregion
        }
示例#3
0
            public void Write(XslFOProfileWriter foWriter, IEnumerable <BaseData> values)
            {
                foWriter.TStart(true, "TABLE", false);
                foWriter.TAddColumn("№", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "5%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                foWriter.TAddColumn("Департамент", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "75%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                foWriter.TAddColumn("Трудозатраты", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "20%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");

                Dictionary <Type, string> rowClasses = new Dictionary <Type, string>();

                rowClasses.Add(typeof(DepartmentData), "GROUP_HEADER");
                rowClasses.Add(typeof(DepartmentDetailData), "TABLE_CELL");
                rowClasses.Add(typeof(OverallData), "TABLE_FOOTER");

                foreach (BaseData value in values)
                {
                    foWriter.TRStart();
                    if (value is OverallData)
                    {
                        foWriter.TRAddCell("Итого", null, 1, 1, rowClasses[value.GetType()]);
                    }
                    else
                    {
                        foWriter.TRAddCell(indexGenerator.Generate(), null, 1, 1, rowClasses[value.GetType()]);
                    }
                    foWriter.TRAddCell(CustomReport.xmlEncode(value.Name), null, 1, 1, rowClasses[value.GetType()]);
                    foWriter.TRAddCell(costsFormatter.Format(value.Costs), null, 1, 1, rowClasses[value.GetType()]);
                    foWriter.TREnd();
                }

                foWriter.TEnd();
            }
示例#4
0
        private void writeExtendedReport(XslFOProfileWriter fo, ThisReportData data)
        {
            _TableSeparator(fo);

            fo.TStart(true, ITRepStyles.TABLE, false);
            fo.TAddColumn("Статья расходов/Контрагент", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "40%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Назначение", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "30%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("С учетом комплектации", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Сумма с НДС", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Сумма без НДС", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

            foreach (IDictionary IO in data.Incomes)
            {
                if ((int)IO["IncType"] < 0)
                {
                    fo.TRStart();
                    _WriteCell(fo, xmlEncode(IO["Type"]));
                    _WriteCell(fo, xmlEncode(IO["Reason"]));
                    _WriteCell(fo, xmlEncode(""));
                    _WriteCell(fo, xmlEncode(IO["Sum"]));
                    _WriteCell(fo, xmlEncode(IO["SumNoNDS"]));
                    fo.TREnd();
                }
                else
                {
                    fo.TRStart();
                    fo.TRAddCell(xmlEncode(IO["Type"]), "string", 3, 1, ITRepStyles.GROUP_HEADER);
                    fo.TRAddCell(xmlEncode(IO["Sum"]), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                    fo.TRAddCell(xmlEncode(IO["SumNoNDS"]), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                    fo.TREnd();
                }
            }

            foreach (IDictionary IO in data.Outcomes)
            {
                if ((int)IO["OutType"] < 10)
                {
                    fo.TRStart();
                    //_WriteCell(fo, _FormatShortDate(IO["Date"].ToString()));
                    _WriteCell(fo, xmlEncode(IO["SupplierName"]));
                    _WriteCell(fo, xmlEncode(IO["Rem"]));
                    _WriteCell(fo, xmlEncode(IO["OutSumExt"]));
                    _WriteCell(fo, xmlEncode(IO["OutSum"]));
                    _WriteCell(fo, xmlEncode(IO["OutSumNoNDS"]));
                    fo.TREnd();
                }
                else
                {
                    fo.TRStart();
                    fo.TRAddCell(xmlEncode(IO["SupplierName"]), "string", 2, 1, ITRepStyles.GROUP_HEADER);
                    fo.TRAddCell(xmlEncode(IO["OutSumExt"]), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                    fo.TRAddCell(xmlEncode(IO["OutSum"]), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                    fo.TRAddCell(xmlEncode(IO["OutSumNoNDS"]), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                    fo.TREnd();
                }
            }
            fo.TEnd();
        }
        /// <summary>
        /// Формирование шапки таблицы отчета
        /// </summary>
        /// <param name="fo"></param>
        /// <returns>Кол-во сформированных колонок</returns>
        private void writeHeader(XslFOProfileWriter fo)
        {
            fo.TAddColumn("Дата", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "20%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
            fo.TAddColumn("Трудозатраты<fo:block font-weight='normal'>(всего, по инцидентам / по списаниям)</fo:block>", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "30%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
            int nColIndex = fo.TAddColumn("Баланс списаний", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, "TABLE_HEADER");

            fo.TAddSubColumn(nColIndex, "за день", align.ALIGN_CENTER, valign.VALIGN_TOP, null, "25%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
            fo.TAddSubColumn(nColIndex, "за период, накопительно", align.ALIGN_CENTER, valign.VALIGN_TOP, null, "25%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
        }
示例#6
0
        /// <summary>
        /// Построение отчета с привязкой к бюджету
        /// </summary>
        /// <param name="fo"></param>
        private void writeBudgetBindedReport(XslFOProfileWriter fo)
        {
            _TableSeparator(fo);

            fo.TStart(true, ITRepStyles.TABLE, false);
            #region Шапка отчета

            fo.TAddColumn("Контрагент", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_CELL_BOLD, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Статья бюджета", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "3%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Сумма в бюджете", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_CELL_BOLD, "2%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("На начало периода", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "2%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

            //Общее количество колонок в таблице отчета
            int i = 6;

            //Заголовки колонок
            foreach (IDictionary Interval in FinanceData.DateIntervals)
            {
                fo.TAddColumn(xmlEncode(Interval["Name"].ToString()), align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                i++;
            }
            fo.TAddColumn("Итого", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("На конец периода", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Остаток", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "5%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            int nRowCount = i++;

            #endregion

            fo.TRStart();
            fo.TRAddCell("ВСЕГО ПО ПРОЕКТУ", "string", nRowCount + 1, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();

            //Итого Сальдо по временному интервалу
            writeIntervalSaldoDataRow(fo, 2, "Сальдо");

            //Итого приходы по проекту
            writeTotalIncomeDataRow(fo, 2, "Приход");

            //Итого расходы по проекту
            writeTotalOutcomeDataRow(fo, 2, "Расход");

            //TODO: Добавить Итого, Остаток, Всего



            fo.TRStart();
            fo.TRAddCell("ПО КАЖДОЙ СТАТЬЕ БЮДЖЕТА", "string", nRowCount + 1, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();

            //Платежи по каждой статье бюджета в разрезе временной шкалы
            writeProjectBudgetBindedOutcomesData(fo);

            fo.TEnd();
        }
示例#7
0
        /// <summary>
        /// Отображение в отчете основных свойств лота и тендера
        /// </summary>
        /// <param name="fo"></param>
        /// <param name="data">Данные тендера, данные которого отображаются</param>
        private void writeMainData(XslFOProfileWriter fo, ThisReportData data)
        {
            #region #1: Основные данные

            // ...разделитель
            _TableSeparator(fo);

            fo.TStart(false, ITRepStyles.TABLE, false);
            fo.TAddColumn("Характеристика", align.ALIGN_LEFT, valign.VALIGN_TOP, null, "30%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Значение", align.ALIGN_LEFT, valign.VALIGN_TOP, null, "70%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

            writeDataPair(fo, "Получено в кассе", xmlEncode(data.Main["KassRecieved"]));
            writeDataPair(fo, "Сдано по АО (после 04/10/2013)", xmlEncode(data.Main["AOSended"]));
            writeDataPair(fo, "Возвращено в кассу", xmlEncode(data.Main["KassReturned"]));
            writeDataPair(fo, "Получено от других содрудников", xmlEncode(data.Main["EmpRecieved"]));
            writeDataPair(fo, "Передано другим сотрудникам", xmlEncode(data.Main["EmpSended"]));
            writeDataPair(fo, "Итоговое сальдо ДС", "<fo:inline font-weight='bold'>" + xmlEncode(data.Main["EmpSaldoDS"]) + "</fo:inline>");

            fo.TEnd();
            #endregion
        }
示例#8
0
            public void Write(XslFOProfileWriter foWriter, IEnumerable <BaseData> values)
            {
                foWriter.TStart(true, "TABLE", false);
                foWriter.TAddColumn("№", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "5%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                foWriter.TAddColumn("Дата и время", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                foWriter.TAddColumn("Пользователь", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                foWriter.TAddColumn("Наименование", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                foWriter.TAddColumn("Краткое наименование", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                foWriter.TAddColumn("Директор клиента", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                foWriter.TAddColumn("Структура организации определена", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                foWriter.TAddColumn("Идентификатор внешней системы", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");

                foreach (BaseData value in values)
                {
                    foWriter.TRStart();
                    foWriter.TRAddCell(indexGenerator.Generate(), null);
                    foWriter.TRAddCell(value.DateTime.ToString("dd.MM.yyyy hh.mm.ss"), null);
                    foWriter.TRAddCell(value.SystemUser, null);

                    if (value is StatusData)
                    {
                        StatusData typedValue = value as StatusData;
                        foWriter.TRAddCell(typedValue.Exists ? "Создана новая организация" : "Организация удалена", null, 5, 1);
                    }
                    else
                    {
                        SnapData typedValue = value as SnapData;
                        foWriter.TRAddCell(typedValue.Name, null);
                        foWriter.TRAddCell(typedValue.ShortName, null);
                        foWriter.TRAddCell(typedValue.Director, null);
                        foWriter.TRAddCell(typedValue.StructureHasDefined ? "Да" : "Нет", null);
                        foWriter.TRAddCell(typedValue.ExternalID, null);
                    }
                    foWriter.TREnd();
                }

                foWriter.TEnd();
            }
示例#9
0
        private void writeMainData(XslFOProfileWriter fo, ThisReportData data, int Type)
        {
            #region #1: Основные данные

            _TableSeparator(fo);

            fo.TStart(true, ITRepStyles.TABLE, false);
            fo.TAddColumn("Дата", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "8%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Сумма", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "8%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Тип", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "20%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Назначение", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "22%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            if (Type == 1)
            {
                fo.TAddColumn("Организация/Сотрудник", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "23%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            }

            fo.TAddColumn("Документ", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "8%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Дата документа", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "8%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

            foreach (IDictionary IO in data.IncOut)
            {
                fo.TRStart();
                _WriteCell(fo, _FormatShortDate(IO["Date"].ToString()));
                _WriteCell(fo, xmlEncode(IO["Sum"]));
                _WriteCell(fo, xmlEncode(IO["Type"]));
                _WriteCell(fo, xmlEncode(IO["Reason"]));
                if (Type == 1)
                {
                    _WriteCell(fo, xmlEncode(IO["Org"]));
                }
                _WriteCell(fo, xmlEncode(IO["Document"]));
                _WriteCell(fo, _FormatShortDate(IO["DocDate"].ToString()));
                fo.TREnd();
            }
            fo.TEnd();
            #endregion
        }
示例#10
0
        /// Отображение основных данных отчета
        private void writeMainData(XslFOProfileWriter fo, ThisReportData data, ReportParams Params)
        {
            _TableSeparator(fo);
            fo.TStart(true, ITRepStyles.TABLE, false);

            #region Шапка отчета

            fo.TAddColumn("", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "1%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("На начало", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

            //Общее количество колонок в таблице отчета
            int i = 4;

            //Заголовки колонок
            foreach (IDictionary Interval in data.DateRatio)
            {
                fo.TAddColumn(xmlEncode(Interval["Name"].ToString()), align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                i++;
            }
            fo.TAddColumn("Итого", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Остаток", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Всего", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            i++;

            #endregion

            #region Общие расходы и расходы по АО

            fo.TRStart();
            fo.TRAddCell("ОБЩИE РАСХОДЫ", "string", i, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();
            writeGenDataRow(fo, data.GenOutSum);

            fo.TRStart();
            fo.TRAddCell("ОБЩИЕ АО", "string", i, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();
            writeGenDataRow(fo, data.AOSum);

            #endregion

            #region Итоговые показатели по займам

            fo.TRStart();
            fo.TRAddCell("ВСЕГО ПО ЗАЙМАМ", "string", i, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();

            writeLoansIncOutDataRow(fo, data, 0, Params);                   //Приходы по займам
            writeLoansIncOutDataRow(fo, data, 1, Params);                   //Расходы по займам

            // Сальдо по займам
            fo.TRStart();
            _WriteCell(fo, "C");
            writeEmptyValueCell(fo, 1);
            foreach (IDictionary fd in data.LoansSumFinData)
            {
                _WriteCell(fo, xmlEncode(fd["SaldoSum"]));
            }
            writeEmptyValueCell(fo, 3);
            fo.TREnd();

            #endregion

            #region Итоговые показатели по группе проектов
            fo.TRStart();
            fo.TRAddCell("ВСЕГО ПО ПРОЕКТАМ", "string", i, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();

            writeSumProjectDataRow(fo, data, "П", "IncSum");                // Приходы по группе проектов
            writeSumProjectDataRow(fo, data, "Р", "OutSum");                // Расходы по группе проектов
            writeSumProjectDataRow(fo, data, "С", "SaldoSum");              // Сальдо по группе проектов

            // Сальдо по группе нарастающим итогом
            fo.TRStart();
            _WriteCell(fo, "НИ");
            writeEmptyValueCell(fo, 1);
            foreach (IDictionary fd in data.GroupFinData)
            {
                _WriteCell(fo, xmlEncode(fd["SaldoSumProg"]));
            }
            writeEmptyValueCell(fo, 3);
            fo.TREnd();
            #endregion

            #region Показатели по проектам
            if ((int)Params.GetParam("IsPrjData").Value != 0)
            {
                foreach (IDictionary Project in data.PrjGroup)
                {
                    //Заголовок проекта
                    fo.TRStart();
                    fo.TRAddCell(xmlEncode(Project["Name"]), "string", i, 1, ITRepStyles.GROUP_HEADER);
                    fo.TREnd();

                    writeProjectsIncOutDataRow(fo, data, Project, 0, Params);                   //Приходы по проекту
                    writeProjectsIncOutDataRow(fo, data, Project, 1, Params);                   //Расходы по проекту

                    // Сальдо по проекту
                    fo.TRStart();
                    _WriteCell(fo, "С");

                    foreach (IDictionary fd in data.ProjectsPreFinData)         //На начало периода
                    {
                        if ((Guid)Project["ObjectID"] == (Guid)fd["ObjectID"])
                        {
                            _WriteCell(fo, xmlEncode(fd["SaldoSum"]));
                        }
                    }
                    foreach (IDictionary fd in data.ProjectsFinData)            //По интервалам
                    {
                        if ((Guid)Project["ObjectID"] == (Guid)fd["ObjectID"])
                        {
                            _WriteCell(fo, xmlEncode(fd["SaldoSum"]));
                        }
                    }
                    foreach (IDictionary fd in data.ProjectsSumFinData)         //Итого сальдо
                    {
                        if ((Guid)Project["ObjectID"] == (Guid)fd["ObjectID"])
                        {
                            _WriteCell(fo, xmlEncode(fd["SaldoSum"]));
                        }
                    }
                    foreach (IDictionary fd in data.ProjectsAfterFinData)       //Остаток
                    {
                        if ((Guid)Project["ObjectID"] == (Guid)fd["ObjectID"])
                        {
                            _WriteCell(fo, xmlEncode(fd["SaldoSum"]));
                        }
                    }
                    foreach (IDictionary fd in data.ProjectsAllFinData)         //Итого
                    {
                        if ((Guid)Project["ObjectID"] == (Guid)fd["ObjectID"])
                        {
                            _WriteCell(fo, xmlEncode(fd["SaldoSum"]));
                        }
                    }
                    fo.TREnd();

                    // Сальдо нарастающим итогом
                    fo.TRStart();
                    _WriteCell(fo, "НИ");
                    writeEmptyValueCell(fo, 1);
                    foreach (IDictionary fd in data.ProjectsFinData)
                    {
                        if ((Guid)Project["ObjectID"] == (Guid)fd["ObjectID"])
                        {
                            _WriteCell(fo, xmlEncode(fd["SaldoSumProg"]));
                        }
                    }
                    writeEmptyValueCell(fo, 3);
                    fo.TREnd();
                }
            }
            #endregion

            fo.TEnd();
        }
示例#11
0
        protected void buildThisReport(XslFOProfileWriter w, ReportParams Params, IReportDataProvider Provider, object CustomData)
        {
            // Получим параметры
            object IntervalBegin = Params.GetParam("IntervalBegin").Value;
            object IntervalEnd   = Params.GetParam("IntervalEnd").Value;
            Guid   Employee      = (Guid)Params.GetParam("Employee").Value;

            int    NonProjectExpences   = (int)Params.GetParam("NonProjectExpences").Value;
            int    IncludeParams        = (int)Params.GetParam("IncludeParams").Value;
            int    AnalysDirection      = (int)Params.GetParam("AnalysDirection").Value;
            int    TimeLossReason       = (int)Params.GetParam("TimeLossReason").Value;
            int    SectionByActivity    = (int)Params.GetParam("SectionByActivity").Value;
            int    ExepenseDetalization = (int)Params.GetParam("ExepenseDetalization").Value;
            int    TimeMeasureUnits     = (int)Params.GetParam("TimeMeasureUnits").Value;
            object ActivityType         = Params.GetParam("ActivityType").Value;
            object ExpenseType          = Params.GetParam("ExpenseType").Value;
            object IncidentState        = Params.GetParam("IncidentState").Value;

            int Sort      = (int)Params.GetParam("Sort").Value;
            int SortOrder = (int)Params.GetParam("SortOrder").Value;

            bool          bIncidentAttributes = 0 != (int)Params.GetParam("IncidentAttributes").Value;
            bool          bDate          = 0 != (int)Params.GetParam("Date").Value;
            bool          bNumberOfTasks = 0 != (int)Params.GetParam("NumberOfTasks").Value;
            bool          bRemaining     = 0 != (int)Params.GetParam("Remaining").Value;
            bool          bNewState      = 0 != (int)Params.GetParam("NewState").Value;
            bool          bComment       = 0 != (int)Params.GetParam("Comment").Value;
            StringBuilder sb             = new StringBuilder();

            switch (ExepenseDetalization)
            {
            case (int)ExpenseDetalization.ByExpences:
                bNumberOfTasks = false;
                break;

            case (int)ExpenseDetalization.BySubActivity:

                bNewState = bComment = bIncidentAttributes = false;
                break;
            }
            using (IDataReader r = Provider.GetDataReader("dsMain", null))
            {
                IDictionary headerData;
                w.WriteLayoutMaster();
                w.StartPageSequence();
                w.StartPageBody();
                sb.Append("<fo:block>Список инцидентов и затрат сотрудника</fo:block>");
                if (!r.Read())
                {
                    //TODO: EmptyBody
                }

                headerData    = _GetDataFromDataRow(r);
                IntervalBegin = headerData["IntervalBegin"];
                IntervalEnd   = headerData["IntervalEnd"];
                // Создадим заголовок
                if (0 != IncludeParams)
                {
                    sb.Append("<fo:block/>");

                    sb.Append("<fo:block font-size='14px'>Параметры отчета:</fo:block>");
                    sb.Append("<fo:table color='#FFFFFF' text-align='left' font-size='12px' font-family='MS Sans-serif'>");
                    sb.Append("<fo:table-column/>");
                    sb.Append("<fo:table-column/>");
                    sb.Append("<fo:table-body>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Направление анализа:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(headerData["AnalysDirection"]) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Период времени:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(headerData["DateInterval"]) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Сотрудник:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block><fo:basic-link color=\"#ffffff\" external-destination=\"vbscript:ShowContextForEmployeeLite(&quot;" + Employee + "&quot;,&quot;" + xmlEncode(headerData["EMail"]) + "&quot;)\">" + headerData["EmployeeName"] + "</fo:basic-link></fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Тип активности:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(headerData["ActivityType"]) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Детализация затрат:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(headerData["ExepenseDetalization"]) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Вид трудозатрат:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(headerData["ExpenseType"]) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Состояние инцидента:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(headerData["IncidentState"]) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Единицы измерения времени:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(TimeMeasureUnitsItem.GetItem((Croc.IncidentTracker.TimeMeasureUnits)TimeMeasureUnits).Description) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>&#160;</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(headerData["NonProjectExpences"]) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("</fo:table-body>");
                    sb.Append("</fo:table>");
                }

                int nActivityColspan = 9;

                int nWorkDayDuration       = (int)headerData["WorkDayDuration"];
                int nReportWorkDayDuration = TimeMeasureUnits == (int)IncidentTracker.TimeMeasureUnits.Hours?int.MaxValue:nWorkDayDuration;
                w.Header(sb.ToString());

                int nRowNum = 0;

                if (!r.NextResult())
                {
                    throw new ApplicationException("Отсутствует основной рекордсет");
                }
                nActivityColspan = 9;
                w.TStart(0 == SectionByActivity, "CELL_CLASS", false);
                w.TAddColumn("№ п/п", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                if (bIncidentAttributes)
                {
                    w.TAddColumn("Причина списания", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                }
                else
                {
                    --nActivityColspan;
                }
                w.TAddColumn("Наименование активности", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                if (bDate)
                {
                    w.TAddColumn("Дата", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                }
                else
                {
                    --nActivityColspan;
                }
                int nTotalColspan = nActivityColspan - 5 - 1;
                if (bNumberOfTasks)
                {
                    w.TAddColumn("Кол-во заданий", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                }
                else
                {
                    --nActivityColspan;
                }
                w.TAddColumn("Затрачено/Списано", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                if (bRemaining)
                {
                    w.TAddColumn("Осталось", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                }
                else
                {
                    --nActivityColspan;
                }
                if (bNewState)
                {
                    w.TAddColumn(ExepenseDetalization == (int)ExpenseDetalization.ByExpences ? "Новое состояние" : "Состояние", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                }
                else
                {
                    --nActivityColspan;
                }
                if (bComment)
                {
                    w.TAddColumn("Комментарии", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                }
                else
                {
                    --nActivityColspan;
                }

                Guid currentTopActivityID = Guid.Empty;

                int totalSpent            = 0;
                int totalLeft             = 0;
                int totalTasks            = 0;
                int totalLost             = 0;
                int totalSpentPerActivity = 0;
                int totalLeftPerActivity  = 0;
                int totalTasksPerActivity = 0;

                int previousCauseType = -1;
                int nCauseType        = -1;

                while (r.Read())
                {
                    IDictionary rec = _GetDataFromDataRow(r);
                    previousCauseType = nCauseType;
                    nCauseType        = (int)rec["CauseType"];
                    bool bMergeIncidentAttributes = (3 == nCauseType) && bIncidentAttributes;

                    if (0 != SectionByActivity)
                    {
                        Guid topActivityID = (Guid)rec["topFolder"];
                        if (currentTopActivityID != topActivityID)
                        {
                            if (currentTopActivityID != Guid.Empty)
                            {
                                w.TRStart();
                                w.TRAddCell("&#160;", null);
                                w.TRAddCell(previousCauseType == 3?"Всего по непроектным списаниям":"Всего по активности:", null, nTotalColspan, 1);
                                if (bNumberOfTasks)
                                {
                                    w.TRAddCell(totalTasksPerActivity, "i4");
                                }
                                w.TRAddCell(this._FormatTimeStringAtServer(totalSpentPerActivity, nReportWorkDayDuration), null);
                                if (bRemaining)
                                {
                                    w.TRAddCell(this._FormatTimeStringAtServer(totalLeftPerActivity, nReportWorkDayDuration), null);
                                }
                                if (bNewState)
                                {
                                    w.TRAddCell("&#160;", null);
                                }
                                if (bComment)
                                {
                                    w.TRAddCell("&#160;", null);
                                }
                                w.TREnd();

                                totalSpentPerActivity = 0;
                                totalLeftPerActivity  = 0;
                                totalTasksPerActivity = 0;
                            }

                            currentTopActivityID = topActivityID;
                            w.TRStart();
                            w.TROmitCell();
                            w.TRAddCell(3 == nActivityColspan?xmlEncode(rec["topName"]):this._GetFolderAnchor(rec["topName"], (Guid)rec["ActivityID"], Employee, true, IntervalBegin != null?(DateTime)IntervalBegin:DateTime.MinValue, IntervalEnd != null?(DateTime)IntervalEnd:DateTime.MaxValue), null, nActivityColspan, 1, "TABLE_HEADER");
                            w.TREnd();
                            w.TRStart();
                            w.TRAddCell("№ п/п", null, 1, 1, "TABLE_HEADER");
                            if (bIncidentAttributes)
                            {
                                w.TRAddCell("Причина списания", null, bMergeIncidentAttributes?2:1, 1, "TABLE_HEADER");
                            }
                            if (!bMergeIncidentAttributes)
                            {
                                w.TRAddCell(3 == nCauseType?"Причина списания":"Наименование активности", null, 1, 1, "TABLE_HEADER");
                            }
                            if (bDate)
                            {
                                w.TRAddCell("Дата", null, 1, 1, "TABLE_HEADER");
                            }
                            if (bNumberOfTasks)
                            {
                                w.TRAddCell(3 == nCauseType?"Кол-во списаний":"Кол-во заданий", null, 1, 1, "TABLE_HEADER");
                            }
                            w.TRAddCell(3 == nCauseType?"Списано":"Затрачено/Списано", null, 1, 1, "TABLE_HEADER");
                            if (bRemaining)
                            {
                                w.TRAddCell("Осталось", null, 1, 1, "TABLE_HEADER");
                            }
                            if (bNewState)
                            {
                                w.TRAddCell("Новое состояние", null, 1, 1, "TABLE_HEADER");
                            }
                            if (bComment)
                            {
                                w.TRAddCell("Комментарии", null, 1, 1, "TABLE_HEADER");
                            }
                            w.TREnd();
                        }
                    }

                    if (3 == nCauseType || 4 == nCauseType)
                    {
                        totalLost += (int)rec["Spent"];
                    }
                    else
                    {
                        totalSpent += (int)rec["Spent"];
                    }
                    totalSpentPerActivity += (int)rec["Spent"];
                    totalTasks            += (3 == nCauseType ? 0 : (null != rec["NumberOfTasks"]?(int)rec["NumberOfTasks"]:0));
                    totalTasksPerActivity += ((1 != nCauseType && 2 != nCauseType)? 0 : null != rec["NumberOfTasks"]? (int)rec["NumberOfTasks"] : 0);
                    totalLeft             += 3 == nCauseType?0:(null != rec["LeftTime"]?(int)rec["LeftTime"]:0);
                    totalLeftPerActivity  += 3 == nCauseType?0:(null != rec["LeftTime"]?(int)rec["LeftTime"]:0);

                    w.TRStart();
                    w.TRAddCell(++nRowNum, "i4");
                    if (bIncidentAttributes)
                    {
                        w.TRAddCell(
                            1 == nCauseType?                                   // только для инцидентов
                            this._GetIncidentAnchor(rec["CauseName"], (Guid)rec["CauseID"], true) :
                            xmlEncode(rec["CauseName"]),
                            null,
                            bMergeIncidentAttributes? 2 : 1,
                            1);
                    }
                    if (!bMergeIncidentAttributes)
                    {
                        if (3 != nCauseType)
                        {
                            w.TRAddCell(this._GetFolderAnchor(rec["ActivityName"], (Guid)rec["ActivityID"], Employee, true, IntervalBegin != null?(DateTime)IntervalBegin : DateTime.MinValue, IntervalEnd != null?(DateTime)IntervalEnd:DateTime.MaxValue), null);
                        }
                        else
                        {
                            w.TRAddCell(xmlEncode(rec["ActivityName"]), null);
                        }
                    }
                    if (bDate)
                    {
                        w.TRAddCell(xmlEncode(rec["DateSpent"]), null);
                    }

                    if (bNumberOfTasks)
                    {
                        // Кол-во инцидентов показваем только для инцидентов или проектов
                        if (1 == nCauseType || 2 == nCauseType)
                        {
                            w.TRAddCell("" + rec["NumberOfTasks"], "i4");
                        }
                        else
                        {
                            w.TRAddCell(" - ", "string");
                        }
                    }

                    w.TRAddCell(this._FormatTimeStringAtServer((int)rec["Spent"], nReportWorkDayDuration), null);
                    if (bRemaining)
                    {
                        object objLeftTime = rec["LeftTime"];
                        w.TRAddCell(objLeftTime == null?string.Empty:this._FormatTimeStringAtServer((int)objLeftTime, nReportWorkDayDuration), null);
                    }
                    if (bNewState)
                    {
                        w.TRAddCell(xmlEncode(rec["NewState"]), null);
                    }
                    if (bComment)
                    {
                        w.TRAddCell(xmlEncode(rec["Comments"]), null);
                    }
                    w.TREnd();
                }

                if (0 != SectionByActivity && currentTopActivityID != Guid.Empty)
                {
                    w.TRStart();
                    w.TRAddCell("&#160;", null);
                    w.TRAddCell(nCauseType == 3?"Всего по непроектным списаниям":"Всего по активности:", null, nTotalColspan, 1);
                    if (bNumberOfTasks)
                    {
                        w.TRAddCell(totalTasksPerActivity, "i4");
                    }
                    w.TRAddCell(this._FormatTimeStringAtServer(totalSpentPerActivity, nReportWorkDayDuration), null);
                    if (bRemaining)
                    {
                        w.TRAddCell(this._FormatTimeStringAtServer(totalLeftPerActivity, nReportWorkDayDuration), null);
                    }
                    if (bNewState)
                    {
                        w.TRAddCell("&#160;", null);
                    }
                    if (bComment)
                    {
                        w.TRAddCell("&#160;", null);
                    }
                    w.TREnd();
                }

                // Итого
                if ((int)ExpencesType.Both == (int)ExpenseType || (int)ExpencesType.Incidents == (int)ExpenseType)
                {
                    w.TRStart();
                    w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");

                    w.TRAddCell("Итого затрачено на задания по инцидентам", null, nTotalColspan, 1, "TABLE_HEADER");
                    if (bNumberOfTasks)
                    {
                        w.TRAddCell(totalTasks, "i4", 1, 1, "TABLE_HEADER");
                    }
                    w.TRAddCell(this._FormatTimeStringAtServer(totalSpent, nReportWorkDayDuration), null, 1, 1, "TABLE_HEADER");
                    if (bRemaining)
                    {
                        w.TRAddCell(this._FormatTimeStringAtServer(totalLeft, nReportWorkDayDuration), null, 1, 1, "TABLE_HEADER");
                    }
                    if (bNewState)
                    {
                        w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    }
                    if (bComment)
                    {
                        w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    }
                    w.TREnd();
                }

                if ((int)ExpencesType.Both == (int)ExpenseType || (int)ExpencesType.Discarding == (int)ExpenseType)
                {
                    w.TRStart();
                    w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    w.TRAddCell("Итого списано ", null, nTotalColspan, 1, "TABLE_HEADER");
                    if (bNumberOfTasks)
                    {
                        w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    }
                    w.TRAddCell(this._FormatTimeStringAtServer(totalLost, nReportWorkDayDuration), null, 1, 1, "TABLE_HEADER");
                    if (bRemaining)
                    {
                        w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    }
                    if (bNewState)
                    {
                        w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    }
                    if (bComment)
                    {
                        w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    }
                    w.TREnd();
                }

                if ((int)ExpencesType.Both == (int)ExpenseType)
                {
                    w.TRStart();
                    w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    w.TRAddCell("Общие трудозатраты  ", null, nTotalColspan, 1, "TABLE_HEADER");
                    if (bNumberOfTasks)
                    {
                        w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    }
                    w.TRAddCell(this._FormatTimeStringAtServer(totalLost + totalSpent, nReportWorkDayDuration), null, 1, 1, "TABLE_HEADER");
                    if (bRemaining)
                    {
                        w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    }
                    if (bNewState)
                    {
                        w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    }
                    if (bComment)
                    {
                        w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                    }
                    w.TREnd();
                }

                w.TRStart();
                w.TRAddCell("&#160;", null, 1, 1, "TABLE_HEADER");
                w.TRAddCell(xmlEncode(string.Format("Всего рабочих дней за период - {0}, Норма рабочего времени за период - {1}", headerData["WorkDays"], this._FormatTimeStringAtServer((int)headerData["WorkDays"] * nWorkDayDuration, int.MaxValue))), null, nActivityColspan - 1, 1, "TABLE_HEADER");
                w.TREnd();

                w.TEnd();
                w.EndPageBody();
                w.EndPageSequence();
            }
        }
示例#12
0
        private void buildThisReport(XslFOProfileWriter w, ReportParams Params, IReportDataProvider Provider)
        {
            DateTime  dtActualBegin;
            DateTime  dtActualEnd;
            DateTime  dtBegin;
            DateTime  dtEnd;
            string    OrganizationName;
            ArrayList arrDates            = new ArrayList();
            object    IntervalBegin       = Params.GetParam("IntervalBegin").Value;
            object    IntervalEnd         = Params.GetParam("IntervalEnd").Value;
            object    Folder              = Params.GetParam("Folder").Value;
            object    Customer            = Params.GetParam("Customer").Value;
            int       ActivityAnalysDepth = (int)Params.GetParam("ActivityAnalysDepth").Value;
            int       InsertRestrictions  = (int)Params.GetParam("InsertRestrictions").Value;
            int       FolderType          = (int)Params.GetParam("FolderType").Value;
            int       SectionByActivity   = (int)Params.GetParam("SectionByActivity").Value;
            int       DateDetalization    = (int)Params.GetParam("DateDetalization").Value;
            int       TimeMeasureUnits    = (int)Params.GetParam("TimeMeasureUnits").Value;
            int       ExpencesType        = (int)Params.GetParam("ExpensesType").Value;
            int       IncludeSubProjects  = (int)Params.GetParam("IncludeSubProjects").Value;

            int SortType  = (int)Params.GetParam("SortType").Value;
            int SortOrder = (int)Params.GetParam("SortOrder").Value;
            int ShowColumnWorkTimeNorm = (int)Params.GetParam("ShowColumnWorkTimeNorm").Value;

            /*int ShowColumnOverheads = (int)Params.GetParam("ShowColumnOverheads").Value;
             * int ShowColumnSalaryExpenses = (int)Params.GetParam("ShowColumnSalaryExpenses").Value;*/
            CustomDataForDS oCustomData = new CustomDataForDS();

            oCustomData.sTempTableName = "##UsersExpences_" + Guid.NewGuid().ToString("n");
            // Первый запрос возвращает 2 рекордсета
            // 1 - Папка, Организация, Начало, Конец
            // 2 - Даты для которых строится отчёт
            using (IDataReader rdr = Provider.GetDataReader("dsUserExpencesPrimary", oCustomData))
            {
                rdr.Read();                         // По любому одна строка :)
                OrganizationName          = rdr.GetString(1);
                dtActualBegin             = rdr.IsDBNull(2)?DateTime.MinValue:rdr.GetDateTime(2);
                dtActualEnd               = rdr.IsDBNull(3)?DateTime.MaxValue:rdr.GetDateTime(3);
                oCustomData.dtActualBegin = dtActualBegin;
                oCustomData.dtActualEnd   = dtActualEnd;
                dtBegin = IntervalBegin == null?dtActualBegin:(DateTime)IntervalBegin;
                dtEnd   = IntervalEnd == null?dtActualEnd:(DateTime)IntervalEnd;
                StringBuilder sb = new StringBuilder("<fo:block>Динамика затрат сотрудников</fo:block>");
                // Создадим заголовок
                if (0 != InsertRestrictions)
                {
                    sb.Append("<fo:block/>");

                    sb.Append("<fo:block font-size='14px'>Параметры отчета:</fo:block>");
                    sb.Append("<fo:table color='#FFFFFF' text-align='left' font-size='12px' font-family='MS Sans-serif'>");
                    sb.Append("<fo:table-column/>");
                    sb.Append("<fo:table-column/>");
                    sb.Append("<fo:table-body>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Период времени:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(rdr.GetString(4)) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");


                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Клиент:</fo:block></fo:table-cell>");
                    if (null == Customer)
                    {
                        sb.Append("<fo:table-cell><fo:block>" + xmlEncode(OrganizationName) + "</fo:block></fo:table-cell>");
                    }
                    else
                    {
                        //																							ShowContextForOrganization(sID, sExtID, sDirectorEMail)
                        sb.Append("<fo:table-cell><fo:block><fo:basic-link color=\"#ffffff\" external-destination=\"vbscript:ShowContextForOrganization(&quot;" + Customer + "&quot;,&quot;" + rdr.GetString(6) + "&quot;,&quot;" + rdr.GetString(7) + "&quot;)\">" + xmlEncode(OrganizationName) + "</fo:basic-link></fo:block></fo:table-cell>");
                    }

                    sb.Append("</fo:table-row>");


                    if (!rdr.IsDBNull(5))
                    {
                        sb.Append("<fo:table-row>");
                        sb.Append("<fo:table-cell width='35%'><fo:block>Активность:</fo:block></fo:table-cell>");
                        sb.Append("<fo:table-cell><fo:block><fo:basic-link color=\"#ffffff\" external-destination=\"vbscript:ShowContextForFolderEx(&quot;" + rdr.GetGuid(5) + "&quot;,true, " + ((dtBegin == DateTime.MinValue)?"NULL":dtBegin.ToString("#MM'/'dd'/'yyyy#")) + ", " + ((dtEnd == DateTime.MaxValue)?"NULL":dtEnd.ToString("#MM'/'dd'/'yyyy#")) + ")\">" + xmlEncode(rdr.GetString(0)) + "</fo:basic-link></fo:block></fo:table-cell>");
                        sb.Append("</fo:table-row>");
                    }

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Тип активности:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(FolderTypeEnumItem.ToStringOfDescriptions((FolderTypeEnum)FolderType)) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");


                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Глубина анализа активностей:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(ActivityAnalysDepthItem.GetItem((ActivityAnalysDepth)ActivityAnalysDepth).Description) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Секционирование по активностям:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(SectionByActivityItem.GetItem((SectionByActivity)SectionByActivity).Description) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Детализация по датам:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(DateDetalizationItem.GetItem((DateDetalization)DateDetalization).Description) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Виды трудозатрат:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(ExpencesTypeItem.GetItem((ExpencesType)ExpencesType).Description) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Включать в проект затраты подпроектов:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + ((IncludeSubProjects == 0)?"нет":"да") + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Сортировка:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(SortExpencesItem.GetItem((SortExpences)SortType).Description) + ", " + xmlEncode(SortOrderItem.GetItem((SortOrder)SortOrder).Description) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("<fo:table-row>");
                    sb.Append("<fo:table-cell width='35%'><fo:block>Единицы измерения времени:</fo:block></fo:table-cell>");
                    sb.Append("<fo:table-cell><fo:block>" + xmlEncode(TimeMeasureUnitsItem.GetItem((TimeMeasureUnits)TimeMeasureUnits).Description) + "</fo:block></fo:table-cell>");
                    sb.Append("</fo:table-row>");

                    sb.Append("</fo:table-body>");
                    sb.Append("</fo:table>");
                }
                if (rdr.NextResult())
                {
                    while (rdr.Read())
                    {
                        arrDates.Add(rdr.GetDateTime(0));
                    }
                }
                oCustomData.arrDates = arrDates;
                w.WriteLayoutMaster();
                w.StartPageSequence();
                w.StartPageBody();
                w.Header(sb.ToString());
            }

            if (dtActualBegin == DateTime.MinValue)
            {
                // Пустой отчёт, данные не нужны, табличка дропнута
                w.EmptyBody("Нет данных");
            }
            else
            {
                // Теперь сформируем вторичный запрос на получение данных
                using (IDataReader rdr2 = Provider.GetDataReader("dsUserExpencesSecondary", oCustomData))
                {
                    int       nActivityColSpan = 2;
                    int       nTotalColspan    = 1;
                    int       nFieldCount      = rdr2.FieldCount;
                    const int nFirstDateColumn = 9;
                    // Выведем тело отчёта
                    w.TStart(true, "CELL_CLASS", false);

                    /*
                     * if(HideGroupColumns)
                     * {
                     ++nActivityColSpan;
                     *      w.TAddColumn("Активность", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, "TABLE_HEADER");
                     * }
                     */
                    w.TAddColumn("Сотрудник", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, "TABLE_HEADER");
                    if (0 != ShowColumnWorkTimeNorm)
                    {
                        w.TAddColumn("Норма рабочего времени", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, "TABLE_HEADER");
                        ++nActivityColSpan;
                        ++nTotalColspan;
                    }
                    w.TAddColumn("Сумма затрат (час)", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, "TABLE_HEADER");
                    //w.TAddColumn("Сумма затрат", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, "TABLE_HEADER");

                    /*if(0!=ShowColumnOverheads)
                     * {
                     *      w.TAddColumn("Накладные расходы", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, "TABLE_HEADER");
                     ++nActivityColSpan;
                     * }
                     * if(0!=ShowColumnSalaryExpenses)
                     * {
                     *      w.TAddColumn("Затраты на з/п", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, "TABLE_HEADER");
                     ++nActivityColSpan;
                     * } */

                    for (int i = nFirstDateColumn; i < nFieldCount; ++i)
                    {
                        w.TAddColumn(rdr2.GetName(i), align.ALIGN_CENTER, valign.VALIGN_MIDDLE, "TABLE_HEADER");
                        ++nActivityColSpan;
                    }

                    Guid  prevFolderID     = Guid.Empty;
                    int[] arrLocalTotals   = new int[nFieldCount];
                    int[] arrGlobalTotals  = new int[nFieldCount];
                    int   nLocalTotalTime  = 0;
                    int   nGlobalTotalTime = 0;

                    int nTimeFormatValue = (TimeMeasureUnits == (int)IncidentTracker.TimeMeasureUnits.Hours)?int.MaxValue:/*rdr.GetInt32(5)*/ 600;

                    while (rdr2.Read())
                    {
                        if (SectionByActivity != (int)Croc.IncidentTracker.SectionByActivity.NoSection)
                        {
                            Guid thisFolderID = rdr2.GetGuid(0);
                            if (thisFolderID != prevFolderID)
                            {
                                if (prevFolderID != Guid.Empty)
                                {
                                    // Итого ;)
                                    w.TRStart("SUBTOTAL");
                                    w.TRAddCell("Итого по активности:", null, nTotalColspan, 1);
                                    w.TRAddCell(xmlEncode(_FormatTimeStringAtServer(nLocalTotalTime, nTimeFormatValue)), null);
                                    //w.TRAddCell(rLocalTotalCost, fixed_14_4);

                                    /*if(0!=ShowColumnOverheads)
                                     *      w.TRAddCell( rLocalTotalOverheads, fixed_14_4);
                                     * if(0!=ShowColumnSalaryExpenses)
                                     *      w.TRAddCell( rLocalTotalSalaryExpenses, fixed_14_4);*/
                                    for (int i = nFirstDateColumn; i < nFieldCount; ++i)
                                    {
                                        w.TRAddCell(xmlEncode(_FormatTimeStringAtServer(arrLocalTotals[i], nTimeFormatValue)), null);
                                    }
                                    w.TREnd();
                                    // Почистим локальный "ИТОГО"
                                    nLocalTotalTime = 0;
                                    System.Array.Clear(arrLocalTotals, 0, arrLocalTotals.Length);
                                }
                                prevFolderID = thisFolderID;
                                // Сформируем подзаголовок
                                w.TRStart("SUBTITLE");
                                w.TRAddCell(this._GetFolderAnchor(rdr2.GetString(1), thisFolderID, Guid.Empty, true, dtBegin, dtEnd), null, nActivityColSpan, 1);
                                w.TREnd();
                            }
                        }

                        bool bIncludeInGlobals = rdr2.GetInt32(7) == 0;

                        w.TRStart("CELL_CLASS");
                        w.TRAddCell(_GetUserMailAnchor(rdr2.GetString(3), rdr2.GetString(4), rdr2.GetGuid(2), Guid.Empty, rdr2.IsDBNull(0)?(Folder == null?Guid.Empty:((Guid)Folder)):rdr2.GetGuid(0)), null);
                        if (0 != ShowColumnWorkTimeNorm)
                        {
                            w.TRAddCell(xmlEncode(this._FormatTimeStringAtServer(rdr2.GetInt32(8), nTimeFormatValue)), null);
                        }
                        int nTempInt32 = rdr2.GetInt32(6);
                        w.TRAddCell(xmlEncode(_FormatTimeStringAtServer(nTempInt32, nTimeFormatValue)), null);
                        if (bIncludeInGlobals)
                        {
                            nGlobalTotalTime += nTempInt32;
                        }
                        nLocalTotalTime += nTempInt32;

                        /*decimal rTempDecimal = rdr2.GetDecimal(11);
                         * w.TRAddCell( rTempDecimal, fixed_14_4);
                         * if(bIncludeInGlobals) rGlobalTotalCost += rTempDecimal;
                         * rLocalTotalCost += rTempDecimal;*/

                        /*if(0!=ShowColumnOverheads)
                         * {
                         *      rTempDecimal = rdr2.GetDecimal(7);
                         *      w.TRAddCell( rTempDecimal, fixed_14_4);
                         *      if(bIncludeInGlobals) rGlobalTotalOverheads += rTempDecimal;
                         *      rLocalTotalOverheads += rTempDecimal;
                         * }
                         * if(0!=ShowColumnSalaryExpenses)
                         * {
                         *      rTempDecimal = rdr2.GetDecimal(8);
                         *      w.TRAddCell( rTempDecimal, fixed_14_4);
                         *      if(bIncludeInGlobals) rGlobalTotalSalaryExpenses += rTempDecimal;
                         *      rLocalTotalSalaryExpenses += rTempDecimal;
                         * }*/
                        for (int i = nFirstDateColumn; i < nFieldCount; ++i)
                        {
                            nTempInt32 = rdr2.GetInt32(i);
                            w.TRAddCell(xmlEncode(_FormatTimeStringAtServer(nTempInt32, nTimeFormatValue)), null);
                            if (bIncludeInGlobals)
                            {
                                arrGlobalTotals[i] = arrGlobalTotals[i] + nTempInt32;
                            }
                            arrLocalTotals[i] = arrLocalTotals[i] + nTempInt32;
                        }

                        w.TREnd();
                    }
                    if (SectionByActivity != (int)Croc.IncidentTracker.SectionByActivity.NoSection)
                    {
                        if (prevFolderID != Guid.Empty)
                        {
                            // Итого ;)
                            w.TRStart("SUBTOTAL");
                            w.TRAddCell("Итого по активности:", null, nTotalColspan, 1);
                            w.TRAddCell(xmlEncode(_FormatTimeStringAtServer(nLocalTotalTime, nTimeFormatValue)), null);
                            //w.TRAddCell(rLocalTotalCost, fixed_14_4);

                            /*if(0!=ShowColumnOverheads)
                             *      w.TRAddCell( rLocalTotalOverheads, fixed_14_4);
                             * if(0!=ShowColumnSalaryExpenses)
                             *      w.TRAddCell( rLocalTotalSalaryExpenses, fixed_14_4); */
                            for (int i = nFirstDateColumn; i < nFieldCount; ++i)
                            {
                                w.TRAddCell(xmlEncode(_FormatTimeStringAtServer(arrLocalTotals[i], nTimeFormatValue)), null);
                            }
                            w.TREnd();
                        }
                    }
                    // Итого ;)
                    w.TRStart("TABLE_FOOTER");
                    w.TRAddCell("Итого:", null, nTotalColspan, 1);
                    w.TRAddCell(xmlEncode(_FormatTimeStringAtServer(nGlobalTotalTime, nTimeFormatValue)), null);
                    //w.TRAddCell(rGlobalTotalCost, fixed_14_4);

                    /*if(0!=ShowColumnOverheads)
                     *      w.TRAddCell( rGlobalTotalOverheads, fixed_14_4);
                     * if(0!=ShowColumnSalaryExpenses)
                     *      w.TRAddCell( rGlobalTotalSalaryExpenses, fixed_14_4); */
                    for (int i = nFirstDateColumn; i < nFieldCount; ++i)
                    {
                        w.TRAddCell(xmlEncode(_FormatTimeStringAtServer(arrGlobalTotals[i], nTimeFormatValue)), null);
                    }
                    w.TREnd();

                    w.TEnd();
                }
            }
            w.EndPageBody();
            w.EndPageSequence();
        }
示例#13
0
        private void writeExtendedReport(XslFOProfileWriter fo, ThisReportData data)
        {
            _TableSeparator(fo);
            CultureInfo culture = new CultureInfo("ru-RU");

            fo.TStart(true, ITRepStyles.TABLE, false);
            fo.TAddColumn("Статья расходов", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "45%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Назначение/Контрагент", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "25%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Примечание", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("с учетом комплектации", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Сумма с НДС", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);


            double fOutcomesSum = 0, fAOLimitSum = 0, fIncomeSum = 0;
            double fExtOutcomesSum = 0, fExtOutLimit = 0;

            // Построение блока отчета по приходам
            if (data.Incomes != null)
            {
                IDictionary arIO = (IDictionary)data.Incomes[0];



                fIncomeSum = Utils.ParseDBString(arIO["Sum"].ToString());

                fo.TRStart();
                fo.TRAddCell(xmlEncode(arIO["Type"]), "string", 3, 1, ITRepStyles.GROUP_HEADER);
                fo.TRAddCell(xmlEncode(fIncomeSum.ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                fo.TRAddCell(xmlEncode(fIncomeSum.ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                fo.TREnd();
            }
            ;


            // расчет блока отчета по прямым расходам
            if (data.Outcomes != null)
            {
                foreach (IDictionary IO in data.Outcomes)
                {
                    string sBugetCost = IO["BudgetCost"].ToString();

                    fOutcomesSum += Utils.ParseDBString(sBugetCost);

                    if (IO["SupplierSum"] != null)
                    {
                        fExtOutcomesSum += Utils.ParseDBString(IO["SupplierSum"].ToString());
                        fExtOutcomesSum += Utils.ParseDBString(IO["SupplierFee"].ToString());
                    }
                    else
                    {
                        fExtOutcomesSum += Utils.ParseDBString(IO["BudgetCost"].ToString());
                    }
                }
            }

            fo.TRStart();
            fo.TRAddCell(xmlEncode("Прямые расходы"), "string", 3, 1, ITRepStyles.GROUP_HEADER);
            fo.TRAddCell(xmlEncode(fExtOutcomesSum.ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            fo.TRAddCell(xmlEncode(fOutcomesSum.ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();

            // построение блока отчета по прямым расходам
            if (data.Outcomes != null)
            {
                foreach (IDictionary IO in data.Outcomes)
                {
                    string sBudgetCost = IO["BudgetCost"].ToString();
                    double fBugetCost  = Utils.ParseDBString(sBudgetCost);
                    if (IO["SupplierSum"] == null)
                    {
                        fo.TRStart();
                        _WriteCell(fo, xmlEncode(IO["BudgetItem"]));
                        _WriteCell(fo, xmlEncode(IO["ContractCompany"]));
                        _WriteCell(fo, xmlEncode(IO["Rem"]));
                        _WriteCell(fo, xmlEncode(Utils.ParseDBString(sBudgetCost).ToString("C2", culture)));
                        _WriteCell(fo, xmlEncode(Utils.ParseDBString(sBudgetCost).ToString("C2", culture)));
                        fo.TREnd();
                    }
                    else
                    {
                        double fSupplierSum = Utils.ParseDBString(IO["SupplierSum"].ToString());
                        fo.TRStart();
                        fo.TRAddCell(xmlEncode(IO["BudgetItem"]), "string", 1, 2, ITRepStyles.TABLE_CELL_BOLD);
                        _WriteCell(fo, xmlEncode(IO["SupplierCompany"]));
                        _WriteCell(fo, xmlEncode(IO["Rem"]));
                        _WriteCell(fo, xmlEncode(fSupplierSum.ToString("C2", culture)));
                        _WriteCell(fo, xmlEncode(fBugetCost.ToString("C2", culture)));
                        fo.TREnd();

                        fo.TRStart();
                        _WriteCell(fo, xmlEncode("Комиссия " + IO["ContractCompany"]));
                        _WriteCell(fo, xmlEncode(IO["Percent"] + "%"));
                        _WriteCell(fo, xmlEncode(Utils.ParseDBString(IO["SupplierFee"].ToString()).ToString("C2", culture)));
                        _WriteCell(fo, xmlEncode());
                        fo.TREnd();
                    }
                }
            }


            // Расчитываем лимитированные расходы по проекту.
            // На текущий момент определились в бухгалтерской
            // форме показывать только Командировочные

            //АО Лимиты
            if (data.AOLimits != null)
            {
                foreach (IDictionary IO in data.AOLimits)
                {
                    // считаем сумму всех АО лимитов
                    fAOLimitSum += Utils.ParseDBString(IO["AOLimitSum"].ToString());
                }
            }

            //АО лимиты с учетом "комплектации"
            if (data.ExtAOLimits != null)
            {
                foreach (IDictionary IO in data.ExtAOLimits)
                {
                    // считаем сумму всех лимитов
                    fExtOutLimit += Utils.ParseDBString(IO["AOLimitSum"].ToString());
                }
            }

            //Лимитированные расходы
            if (data.OutLimits != null)
            {
                foreach (IDictionary IO in data.OutLimits)
                {
                    // считаем сумму всех лимитов
                    fAOLimitSum += Utils.ParseDBString(IO["OutLimitSum"].ToString());
                }
            }

            //Лимитированные расходы с учетом "комплектации"
            if (data.ExtOutLimits != null)
            {
                foreach (IDictionary IO in data.ExtOutLimits)
                {
                    // считаем сумму всех лимитов
                    fExtOutLimit += Utils.ParseDBString(IO["OutLimitSum"].ToString());
                }
            }

            //Итоговая строка расходов
            if (data.AOLimits != null || data.ExtAOLimits != null || data.OutLimits != null || data.ExtOutLimits != null)
            {
                fo.TRStart();
                fo.TRAddCell(xmlEncode("Лимитированные расходы"), "string", 3, 1, ITRepStyles.GROUP_HEADER);
                fo.TRAddCell(xmlEncode(fExtOutLimit.ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                fo.TRAddCell(xmlEncode(fAOLimitSum.ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                fo.TREnd();
            }

            //Выводим лимитированные расходы
            //Лимиты по АО
            if (data.AOLimits != null)
            {
                foreach (IDictionary IO in data.AOLimits)
                {
                    fo.TRStart();
                    _WriteCell(fo, xmlEncode(IO["AOLimitName"]));
                    _WriteCell(fo, xmlEncode());
                    _WriteCell(fo, xmlEncode(IO["AOLimitRem"]));
                    _WriteCell(fo, xmlEncode(Utils.ParseDBString(IO["AOLimitSum"].ToString()).ToString("C2", culture)));
                    _WriteCell(fo, xmlEncode(Utils.ParseDBString(IO["AOLimitSum"].ToString()).ToString("C2", culture)));
                    fo.TREnd();
                }
            }
            //Лимиты по АО с "расширенные"
            if (data.ExtAOLimits != null)
            {
                foreach (IDictionary IO in data.ExtAOLimits)
                {
                    fo.TRStart();
                    _WriteCell(fo, xmlEncode(IO["AOLimitName"]));
                    _WriteCell(fo, xmlEncode());
                    _WriteCell(fo, xmlEncode(IO["AOLimitRem"]));
                    _WriteCell(fo, xmlEncode(Utils.ParseDBString(IO["AOLimitSum"].ToString()).ToString("C2", culture)));
                    _WriteCell(fo, xmlEncode());
                    fo.TREnd();
                }
            }

            //Лимиты по расходам
            if (data.OutLimits != null)
            {
                foreach (IDictionary IO in data.OutLimits)
                {
                    fo.TRStart();
                    _WriteCell(fo, xmlEncode(IO["OutLimitName"]));
                    _WriteCell(fo, xmlEncode());
                    _WriteCell(fo, xmlEncode(IO["OutLimitRem"]));
                    _WriteCell(fo, xmlEncode(Utils.ParseDBString(IO["OutLimitSum"].ToString()).ToString("C2", culture)));
                    _WriteCell(fo, xmlEncode(Utils.ParseDBString(IO["OutLimitSum"].ToString()).ToString("C2", culture)));
                    fo.TREnd();
                }
            }

            //Лимиты по расходам
            if (data.ExtOutLimits != null)
            {
                foreach (IDictionary IO in data.ExtOutLimits)
                {
                    fo.TRStart();
                    _WriteCell(fo, xmlEncode(IO["OutLimitName"]));
                    _WriteCell(fo, xmlEncode());
                    _WriteCell(fo, xmlEncode(IO["OutLimitRem"]));
                    _WriteCell(fo, xmlEncode(Utils.ParseDBString(IO["OutLimitSum"].ToString()).ToString("C2", culture)));
                    _WriteCell(fo, xmlEncode());
                    fo.TREnd();
                }
            }

            fo.TRStart();
            fo.TRAddCell(xmlEncode("ИТОГО Расходы"), "string", 3, 1, ITRepStyles.GROUP_HEADER);
            fo.TRAddCell(xmlEncode((fExtOutcomesSum + fExtOutLimit).ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            fo.TRAddCell(xmlEncode((fAOLimitSum + fOutcomesSum).ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();

            fo.TRStart();
            fo.TRAddCell(xmlEncode("Валовая прибыль"), "string", 3, 1, ITRepStyles.GROUP_HEADER);
            fo.TRAddCell(xmlEncode((fIncomeSum - (fExtOutcomesSum + fExtOutLimit)).ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            fo.TRAddCell(xmlEncode((fIncomeSum - (fAOLimitSum + fOutcomesSum)).ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();

            double fAllOutcomse    = fAOLimitSum + fOutcomesSum;
            double fExtAllOutcomse = fExtOutcomesSum + fExtOutLimit;

            fo.TRStart();
            fo.TRAddCell(xmlEncode("Плановая рентабельность"), "string", 3, 1, ITRepStyles.GROUP_HEADER);

            if (fExtAllOutcomse != 0)
            {
                fo.TRAddCell(xmlEncode(((fIncomeSum - fExtAllOutcomse) * 100 / fExtAllOutcomse).ToString("N2") + "%"), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            }
            else
            {
                fo.TRAddCell(xmlEncode(), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            }

            if (fAllOutcomse != 0)
            {
                fo.TRAddCell(xmlEncode(((fIncomeSum - fAllOutcomse) * 100 / fAllOutcomse).ToString("N2") + "%"), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            }
            else
            {
                fo.TRAddCell(xmlEncode(), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            }


            fo.TREnd();

            fo.TEnd();
        }
示例#14
0
        /// <summary>
        /// Построение стандартного отчета
        /// </summary>
        /// <param name="fo">xml-пул данных отчета</param>
        /// <param name="data">параметры отчета</param>
        private void writeCommonReport(XslFOProfileWriter fo, ThisReportData data)
        {
            // Определим локализацию для парсинга данных из БД
            CultureInfo culture = new CultureInfo("ru-RU");

            _TableSeparator(fo);

            // Шапка отчета
            fo.TStart(true, ITRepStyles.TABLE, false);
            fo.TAddColumn("Статья расходов", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "45%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Назначение/Контрагент", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "35%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Примечание", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Сумма с НДС", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

            double fOutcomesSum = 0, fAOLimitSum = 0, fIncomeSum = 0;


            //Построение блока отчета по приходам

            if (data.Incomes != null)
            {
                IDictionary arIO = (IDictionary)data.Incomes[0];


                fIncomeSum = Utils.ParseDBString(arIO["Sum"].ToString());

                fo.TRStart();
                fo.TRAddCell(xmlEncode(arIO["Type"]), "string", 3, 1, ITRepStyles.GROUP_HEADER);
                fo.TRAddCell(xmlEncode(fIncomeSum.ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                fo.TREnd();
            }
            ;

            // Построение блока отчета по прямым расходам
            if (data.Outcomes != null)
            {
                foreach (IDictionary IO in data.Outcomes)
                {
                    fOutcomesSum += Utils.ParseDBString(IO["BudgetCost"].ToString());
                }
                // Выводим итоговую сумму прямых расходов
                fo.TRStart();
                fo.TRAddCell(xmlEncode("Прямые расходы"), "string", 3, 1, ITRepStyles.GROUP_HEADER);
                fo.TRAddCell(xmlEncode(fOutcomesSum.ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                fo.TREnd();
                // Показываем все расходы по-пунктно
                foreach (IDictionary IO in data.Outcomes)
                {
                    fo.TRStart();
                    _WriteCell(fo, xmlEncode(IO["BudgetItem"]));
                    _WriteCell(fo, xmlEncode(IO["ContractCompany"]));
                    _WriteCell(fo, xmlEncode(IO["Rem"]));
                    _WriteCell(fo, xmlEncode(Utils.ParseDBString(IO["BudgetCost"].ToString()).ToString("C2", culture)));
                    fo.TREnd();
                }
            }

            // Выводим лимитированные расходы по проекту.
            // На текущий момент определились в бухгалтерской
            // форме показывать только Командировочные
            if (data.AOLimits != null)
            {
                foreach (IDictionary IO in data.AOLimits)
                {
                    // считаем сумму всех АО лимитов
                    fAOLimitSum += Utils.ParseDBString(IO["AOLimitSum"].ToString());
                }
            }
            if (data.OutLimits != null)
            {
                foreach (IDictionary IO in data.OutLimits)
                {
                    // считаем сумму всех лимитов
                    fAOLimitSum += Utils.ParseDBString(IO["OutLimitSum"].ToString());
                }
            }

            if (data.AOLimits != null || data.OutLimits != null)
            {
                fo.TRStart();
                fo.TRAddCell(xmlEncode("Лимитированные расходы"), "string", 3, 1, ITRepStyles.GROUP_HEADER);
                fo.TRAddCell(xmlEncode(fAOLimitSum.ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
                fo.TREnd();
            }
            if (data.AOLimits != null)
            {
                foreach (IDictionary IO in data.AOLimits)
                {
                    fo.TRStart();
                    _WriteCell(fo, xmlEncode(IO["AOLimitName"]));
                    _WriteCell(fo, xmlEncode());
                    _WriteCell(fo, xmlEncode(IO["AOLimitRem"]));
                    _WriteCell(fo, xmlEncode(Utils.ParseDBString(IO["AOLimitSum"].ToString()).ToString("C2", culture)));
                    fo.TREnd();
                }
            }
            if (data.OutLimits != null)
            {
                foreach (IDictionary IO in data.OutLimits)
                {
                    fo.TRStart();
                    _WriteCell(fo, xmlEncode(IO["OutLimitName"]));
                    _WriteCell(fo, xmlEncode());
                    _WriteCell(fo, xmlEncode(IO["OutLimitRem"]));
                    _WriteCell(fo, xmlEncode(Utils.ParseDBString(IO["OutLimitSum"].ToString()).ToString("C2", culture)));
                    fo.TREnd();
                }
            }
            fo.TRStart();
            fo.TRAddCell(xmlEncode("ИТОГО Расходы"), "string", 3, 1, ITRepStyles.GROUP_HEADER);
            fo.TRAddCell(xmlEncode((fAOLimitSum + fOutcomesSum).ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();

            fo.TRStart();
            fo.TRAddCell(xmlEncode("Валовая прибыль"), "string", 3, 1, ITRepStyles.GROUP_HEADER);
            fo.TRAddCell(xmlEncode((fIncomeSum - (fAOLimitSum + fOutcomesSum)).ToString("C2", culture)), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();

            double fAllOutcomse = fAOLimitSum + fOutcomesSum;

            fo.TRStart();
            fo.TRAddCell(xmlEncode("Плановая рентабельность"), "string", 3, 1, ITRepStyles.GROUP_HEADER);
            if (fAllOutcomse != 0)
            {
                fo.TRAddCell(xmlEncode(((fIncomeSum - fAllOutcomse) * 100 / fAllOutcomse).ToString("N2") + "%"), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            }
            else
            {
                fo.TRAddCell(xmlEncode(), "string", 1, 1, ITRepStyles.GROUP_HEADER);
            }
            fo.TREnd();

            fo.TEnd();
        }
示例#15
0
        // Отображение в отчете основных свойств лота и тендера
        private void writeMainData(XslFOProfileWriter fo, ThisReportData data, ThisReportParams Params)
        {
            #region #1: Основные данные

            // ...разделитель
            _TableSeparator(fo);

            fo.TStart(true, ITRepStyles.TABLE, false);

            fo.TAddColumn("Сотрудник", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "13%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Балланс ДС", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Балланс ДС на начало", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Балланс ДС за период", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Получено в кассе", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Сдано по АО", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Возвращено в кассу", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Получено от сотрудников", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Передано сотрудникам", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

            foreach (IDictionary EmpDS in data.Main)
            {
                fo.TRStart();
                _WriteCell(fo, xmlEncode(EmpDS["EmpName"]));
                _WriteCell(fo, xmlEncode(EmpDS["EmpSaldoTotal"]));
                _WriteCell(fo, xmlEncode(EmpDS["EmpSaldoDSBegin"]));

                StringBuilder sbLotHRef = new StringBuilder();

                //если существуют кассовые транзакции за данный период по сотруднику
                if ((Int32)EmpDS["IsExistsEmpKassTrans"] == 1)
                {
                    //... то сальдо ДС выводим с сылкой на отчет о детализации кассовых транзакций
                    _StartReportURL(sbLotHRef, "r-EmployeeKassTrans");
                    _AppendParamURL(sbLotHRef, "EmpID", (Guid)EmpDS["EmpID"]);
                    _AppendParamURL(sbLotHRef, "EmpName", EmpDS["EmpName"]);
                    if (Params.IsSpecifiedIntervalBegin)
                    {
                        _AppendParamURL(sbLotHRef, "IntervalBegin", ((DateTime)Params.IntervalBegin).ToString("yyyy-MM-dd"));
                    }
                    if (Params.IsSpecifiedIntervalEnd)
                    {
                        _AppendParamURL(sbLotHRef, "IntervalEnd", ((DateTime)Params.IntervalEnd).ToString("yyyy-MM-dd"));
                    }
                    _EndReportURL(sbLotHRef, "Детализация кассовых транзакций", EmpDS["EmpSaldoDS"]);
                }
                else
                {
                    sbLotHRef.Append(xmlEncode(EmpDS["EmpSaldoDS"]));
                }

                _WriteCell(fo, sbLotHRef, "string", ITRepStyles.TABLE_CELL_BOLD);
                _WriteCell(fo, xmlEncode(EmpDS["KassRecieved"]));
                _WriteCell(fo, xmlEncode(EmpDS["AOSended"]));
                _WriteCell(fo, xmlEncode(EmpDS["KassReturned"]));
                _WriteCell(fo, xmlEncode(EmpDS["EmpRecieved"]));
                _WriteCell(fo, xmlEncode(EmpDS["EmpSended"]));
                fo.TREnd();
            }
            fo.TEnd();
            #endregion
        }
示例#16
0
        /// <summary>
        /// Отображение в отчете основных свойств лота и тендера
        /// </summary>
        /// <param name="fo"></param>
        /// <param name="data">Данные тендера, данные которого отображаются</param>
        private void writeMainData(XslFOProfileWriter fo, ThisReportData data)
        {
            string sValue;

            #region #1: Основные данные

            // ...разделитель
            _TableSeparator(fo);

            fo.TStart(false, ITRepStyles.TABLE, false);
            fo.TAddColumn("Характеристика", align.ALIGN_LEFT, valign.VALIGN_TOP, null, "30%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Значение", align.ALIGN_LEFT, valign.VALIGN_TOP, null, "70%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

            fo.TRStart();
            fo.TRAddCell("Основные реквизиты", "string", 2, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();
            if ((Int32)data.Main["CustEqOrg"] == 1)
            {
                writeDataPair(fo, "Заказчик/Организатор", xmlEncode(data.Main["Customer"]));
            }
            else
            {
                writeDataPair(fo, "Заказчик/Организатор", xmlEncode(data.Main["Customer"]) + " / " + xmlEncode(data.Main["Organizer"]));
            }
            writeDataPair(fo, "Дата подачи документов", _FormatLongDateTime(data.Main["DocFeedingDate"]));
            writeDataPair(fo, "Дата проведения переторжки", _FormatLongDateTime(data.Main["DateTorg1"]));
            writeDataPair(fo, "Дата проведения 2й переторжки", _FormatLongDateTime(data.Main["DateTorg2"]));

            // ...Директор Клиента:
            if (data.ViewType == 0)
            {
                writeDataPair(fo, "Директор Клиента", _GetUserMailAnchor(data.Main["DirectorName"], data.Main["DirectorEMail"]));
            }

            // ...cостояние: цвет фона в зависимости от состояния
            LotState state = (LotState)(Int32.Parse(data.Main["State"].ToString()));
            if (LotState.WasGain == state)
            {
                sValue = ITRepStyles.TABLE_CELL_COLOR_GREEN;
            }
            else if (LotState.WasLoss == state)
            {
                sValue = ITRepStyles.TABLE_CELL_COLOR_RED;
            }
            else
            {
                sValue = ITRepStyles.TABLE_CELL;
            }
            writeDataPair(fo, "Состояние",
                          "<fo:inline font-weight='bold'>" + xmlEncode(data.Main["StateName"]) + "</fo:inline>",
                          sValue);

            // ...Контактное лицо конкурсной комисси:
            fo.TRStart();
            fo.TRAddCell("Контактное лицо конкурсной комисси", "string", 2, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();
            writeDataPair(fo, "Фамилия, имя, отчество ", xmlEncode(data.Main["JuryContactName"]));
            writeDataPair(fo, "Телефон ", xmlEncode(data.Main["JuryContactPhone"]));
            writeDataPair(fo, "Адрес электронной почты", _GetUserMailAnchor(data.Main["JuryContactEMail"], data.Main["JuryContactEMail"]));

            fo.TEnd();
            #endregion

            #region #2: Данные участников конкурса:
            if (null != data.Parts)
            {
                // ...разделитель
                _TableSeparator(fo);

                fo.TStart(true, ITRepStyles.TABLE, false);

                bool isFinalState = (LotState.WasGain == state || LotState.WasLoss == state);
                int  nCol         = fo.TAddColumn("Участники конкурса", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Организация", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "12%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Тип участия", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "8%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Отклонен", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "7%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                if (isFinalState)
                {
                    fo.TAddSubColumn(nCol, "Итоговый статус", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                }
                fo.TAddSubColumn(nCol, "Сумма подачи, " + xmlEncode(data.Main["NDS"]), align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "8%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Сумма переторжки, " + xmlEncode(data.Main["NDS"]), align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "8%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Сумма 2й переторжки, " + xmlEncode(data.Main["NDS"]), align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "8%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Сумма подачи АП, " + xmlEncode(data.Main["NDS"]), align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "8%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Сумма переторжки АП, " + xmlEncode(data.Main["NDS"]), align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "8%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Сумма 2й переторжки АП, " + xmlEncode(data.Main["NDS"]), align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "8%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

                fo.TAddSubColumn(nCol, "Примечание", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, (isFinalState ? "8%" : "13%"), align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

                foreach (IDictionary orgData in data.Parts)
                {
                    fo.TRStart();
                    _WriteCell(fo, xmlEncode(orgData["ParticipantOrganization"]));
                    _WriteCell(fo, xmlEncode(orgData["ParticipationType"]));
                    _WriteCell(fo, xmlEncode(orgData["DeclinedText"]));
                    if (isFinalState)
                    {
                        bool isWinner = (null != orgData["Winner"]);
                        _WriteCell(fo,
                                   "<fo:inline font-weight='bold'>" + (isWinner? "Победитель" : "Проигравший") + "</fo:inline>",
                                   "string",
                                   (isWinner? ITRepStyles.TABLE_CELL_COLOR_GREEN : ITRepStyles.TABLE_CELL_COLOR_RED));
                    }
                    _WriteCell(fo, xmlEncode(orgData["TenderParticipantPrice"]));
                    _WriteCell(fo, xmlEncode(orgData["SumTorg1"]));
                    _WriteCell(fo, xmlEncode(orgData["SumTorg2"]));
                    _WriteCell(fo, xmlEncode(orgData["TenderParticipantPriceAP"]));
                    _WriteCell(fo, xmlEncode(orgData["SumTorg1AP"]));
                    _WriteCell(fo, xmlEncode(orgData["SumTorg2AP"]));
                    _WriteCell(fo, xmlEncode(orgData["Note"]));
                    fo.TREnd();
                }
                fo.TEnd();
            }

            #endregion

            #region #3: Участие подразделений (если такие данные есть)
            if (null != data.DepParts && data.ViewType == 0)
            {
                // ...разделитель
                _TableSeparator(fo);

                fo.TStart(true, ITRepStyles.TABLE, false);

                int nCol = fo.TAddColumn("Участие департаментов", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, null, align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Департамент", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "20%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Исполнитель", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "20%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Ознакомился", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "20%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddSubColumn(nCol, "Примечание", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "40%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

                foreach (IDictionary depData in data.DepParts)
                {
                    fo.TRStart();
                    _WriteCell(fo, xmlEncode(depData["Department"]));

                    // Исполнитель от подразделения:
                    sValue = _GetUserMailAnchor(depData["ExecutorName"], depData["ExecutorEMail"]);
                    if (null != depData["DocsGettingDate"])
                    {
                        sValue = sValue + (String.Empty != sValue ? ", " : "") + "документы получил(а) " + _FormatLongDate(depData["DocsGettingDate"]);
                    }
                    _WriteCell(fo, sValue);

                    _WriteCell(fo, xmlEncode(depData["ExecutorIsAcquaint"]));
                    _WriteCell(fo, xmlEncode(depData["Note"]));
                    fo.TREnd();
                }
                fo.TEnd();
            }

            #endregion

            #region #3: Внешние ссылки (если таковые есть)
            if (null != data.Links && data.ViewType == 0)
            {
                // ...разделитель
                _TableSeparator(fo);

                fo.TStart(false, ITRepStyles.TABLE, false);
                fo.TAddColumn("Тип ссылки", align.ALIGN_LEFT, valign.VALIGN_TOP, null, "15%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
                fo.TAddColumn("Ссылка", align.ALIGN_LEFT, valign.VALIGN_TOP, null, "85%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

                fo.TRStart();
                fo.TRAddCell("Внешние ссылки", "string", 2, 1, ITRepStyles.GROUP_HEADER);
                fo.TREnd();

                foreach (IDictionary linkData in data.Links)
                {
                    string sLinkHRef = String.Format(
                        "<fo:basic-link " +
                        "text-decoration=\"none\" " +
                        "external-destination=\"vbscript:window.OpenExternalLink({0},&quot;{1}&quot;)\">" +
                        "{2}</fo:basic-link> " +
                        "( полный адрес: <fo:basic-link " +
                        "text-decoration=\"none\" " +
                        "external-destination=\"vbscript:window.OpenExternalLink({0},&quot;{1}&quot;)\">" +
                        "{1}</fo:basic-link> )",
                        linkData["LinkServiceType"],                    // {0}, тип обслуживающей системы
                        xmlEncode(linkData["URI"]),                     // {1}, URI ссылки
                        xmlEncode(linkData["LinkName"])                 // {2}, отображаемое значение ссылки
                        );

                    fo.TRStart();
                    _WriteCell(fo, xmlEncode(linkData["ServiceTypeName"]));
                    _WriteCell(fo, sLinkHRef, "string");
                    fo.TREnd();
                }
                fo.TEnd();
            }
            #endregion

            #region #4: Дополнительные данные
            _TableSeparator(fo);

            fo.TStart(false, ITRepStyles.TABLE, false);
            fo.TAddColumn("Характеристика", align.ALIGN_LEFT, valign.VALIGN_TOP, null, "30%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);
            fo.TAddColumn("Значение", align.ALIGN_LEFT, valign.VALIGN_TOP, null, "70%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER);

            fo.TRStart();
            fo.TRAddCell("Дополнительно", "string", 2, 1, ITRepStyles.GROUP_HEADER);
            fo.TREnd();

            writeDataPair(fo, "К обсуждению", xmlEncode(data.Main["QualifyingRequirement"]));
            if (data.ViewType == 0)
            {
                writeDataPair(fo, "Примечание", xmlEncode(data.Main["Note"]));
                writeDataPair(fo, "Обсуждения", xmlEncode(data.Main["Discussion"]));
            }
            fo.TEnd();
            #endregion
        }
示例#17
0
        /// <summary>
        /// Фомрирование "тела" отчета
        /// </summary>
        /// <param name="foWriter"></param>
        /// <param name="oParams"></param>
        /// <param name="cn"></param>
        private void writeBody(XslFOProfileWriter foWriter, ThisReportParams oParams, IReportDataProvider Provider)
        {
            using (IDataReader reader = Provider.GetDataReader("dsMain", oParams))
            {
                // Вне зависимости от параметров в результате первым идет рекордсет с
                // результатами анализа допустимости анализа - это будет или одна строка
                // с текстом "несоответствий не обрнаружено" или массированный рекордсет
                // с перечнем активностей, для которых обнаружены баги.
                // NB! Если рекордсет пришел пустой - это ошибка!
                if (!reader.Read())
                {
                    throw new ApplicationException("Ошибка получения данных отчета: запрос процедуры вернул пустой результирующий набор!");
                }

                // ... проверим набор с данными первого рекордсета: если это строка
                // в один столбец, то это хороший результат; иначе - это набор с перечнем
                // активностей, в которых найдены несоответствия
                IDictionary rowData = _GetDataFromDataRow(reader);
                if (1 != rowData.Count)
                {
                    #region Отображение данных с ошибками

                    // Обнаружены случаи недопустимости выполнения анализа.
                    // В рекордсете идут:
                    //	- CustomerID	- идентификатор организации, Guid
                    //	- CustomerName	- наименование организации
                    //	- FolderID		- иденетификатор активности, в котором обнаружена проблема
                    //	- FullName		- полное наименование (путь) проекта
                    //	- ErrorType		- "тип" проблемы, здесь:
                    //					1 - нет направлений,
                    //					2 - не заданы доли,
                    //					3 - нарушения в задании направлений для подчиненных активностей/каталогов,
                    //					4 - что-то еще (ошибка в определении типа проблемы, по идее так быть не должно)

                    // #1: Служебное сообщение об обнаружении ошибок
                    foWriter.TStart(false, "WARNING_MESSAGE_TABLE", false);
                    foWriter.TAddColumn("Сообщение");
                    foWriter.TRStart();
                    foWriter.TRAddCell(
                        "Внимание! Выполнение анализа затрат невозможно: обнаружены ошибки определения направлений для активностей!",
                        null, 1, 1, "WARNING_MESSAGE");
                    foWriter.TREnd();
                    foWriter.TEnd();

                    // #2: Заголовок таблицы с перечнем активностей, в которых обнаружены нарушения
                    foWriter.TStart(true, "TABLE", false);
                    foWriter.TAddColumn("Активность", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                    foWriter.TAddColumn("Ошибка определения", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, String.Empty, align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");

                    // ... данные сгруппированы по организации-Клиенту:
                    string sCustomerName      = rowData["CustomerName"].ToString();
                    bool   bIsNextCusomerData = true;

                    for (bool bMoreRows = true; bMoreRows;)
                    {
                        // ...если при последнем чтении строки обнаружено условие перехода
                        // к данным следующей организации-Клиента, то выводим заголовок
                        // группы - наименование Клиента:
                        if (bIsNextCusomerData)
                        {
                            foWriter.TRStart();
                            foWriter.TRAddCell(xmlEncode(sCustomerName), null, 2, 1, "GROUP_HEADER");
                            foWriter.TREnd();
                        }

                        // Текстовое представление "типа" нарушения:
                        string sErrorDescription;
                        switch ((int)rowData["ErrorType"])
                        {
                        case 1: sErrorDescription = "(ТИП-1) Для активности не заданы направления"; break;

                        case 2: sErrorDescription = "(ТИП-2) Для направления активности не заданы доли затрат"; break;

                        case 3: sErrorDescription = "(ТИП-3) Для подчиненной активности / каталога указано направление, отличное от направлений, заданных для активности"; break;

                        default: sErrorDescription = "(Ошибка определения типа несоответствия)"; break;
                        }

                        // Выводим данные по одной активности; при этом наименование активности
                        // оформляется как анкер, при клике на который будет отображаться всплывающее
                        // меню с доступными операциями - просмотр, редактирование, отчеты и т.д.
                        foWriter.TRStart();
                        foWriter.TRAddCell(_GetFolderAnchor(rowData["FullName"], (Guid)rowData["FolderID"], true), null, 1, 1, "TABLE_CELL");
                        foWriter.TRAddCell(sErrorDescription, null, 1, 1, "TABLE_CELL");
                        foWriter.TREnd();

                        // Читаем след. строку (если данные еще есть); при этом определяем
                        // условие перехода к следующей грппе данных, по след. Клиенту:
                        bMoreRows = reader.Read();
                        if (bMoreRows)
                        {
                            rowData = _GetDataFromDataRow(reader);
                        }

                        bIsNextCusomerData = (sCustomerName != rowData["CustomerName"].ToString());
                        if (bIsNextCusomerData)
                        {
                            sCustomerName = rowData["CustomerName"].ToString();
                        }
                    }
                    foWriter.TEnd();

                    #endregion

                    // На этом отчет заканчивается!
                    return;
                }

                // Несоответствий нет - выводим данные:
                if (!reader.NextResult())
                {
                    throw new ApplicationException("Отсутствует основной результирующий набор! Текст запроса: ");
                }

                // ЗАГОЛОВОК ОСНОВНОЙ ТАБЛИЦЫ
                string sDirsColumnName;
                bool   bWithActivityQnt = (ThisReportParams.AnalysisDirectionEnum.ByActivity != oParams.AnalysisDirection);

                if (ThisReportParams.AnalysisDirectionEnum.ByCustomer_AllCustomners == oParams.AnalysisDirection && oParams.ShowDetails)
                {
                    sDirsColumnName = "Направления / организации";
                }
                else if (ThisReportParams.AnalysisDirectionEnum.ByActivity == oParams.AnalysisDirection && oParams.ShowDetails)
                {
                    sDirsColumnName = "Направления / активности";
                }
                else
                {
                    sDirsColumnName = "Направления";
                }

                foWriter.TStart(true, "TABLE", false);
                foWriter.TAddColumn("№", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "5%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                foWriter.TAddColumn(sDirsColumnName, align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, (bWithActivityQnt ? "40%" : "55%"), align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                if (bWithActivityQnt)
                {
                    foWriter.TAddColumn("Количество активностей", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "15%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                }
                foWriter.TAddColumn("Затраты", (TimeMeasureUnits.Days == oParams.TimeMeasure ? align.ALIGN_LEFT : align.ALIGN_RIGHT), valign.VALIGN_MIDDLE, null, "20%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");
                //foWriter.TAddColumn("Сумма затрат", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "20%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER");

                // ПОКА - КОНСТАНТА! TODO!
                int nWorkDayDuration = 600;

                if (oParams.ShowDetails)
                {
                    #region ДАННЫЕ С ДЕТАЛИЗАЦИЕЙ
                    //	- DirectionName - Наименование направления;
                    //	- DetailID		- Идентификатор детализирующей сущности (Организация / Активность)
                    //	- DetailName	- Наименование детализируюшей сущности
                    //	- ActivityQnt	- Количество активностей
                    //	- ExpensesSum	- Сумма затрат

                    string sDirectionName = null;
                    int    nSubTotalTime  = 0;                          // промежуточный итог по сумме затраченного времени
                    int    nTotalTime     = 0;                          // общий итог по сумме затраченного времени
                    int    nSubTotalQnt   = 0;                          // промежуточный итог по количеству активностей (по направлению)
                    int    nTotalQnt      = 0;                          // общий итог по количеству активностей
                    int    nRowNum        = 0;                          // сквозная нумерация строк детализации

                    // Признак, что наименование детализирующей сущности есть гиперссылка:
                    // Сейчас это единственный случай - при направлении анализа "Организации..",
                    // в случае указания конкретной организации - когда в кач. детализации
                    // выводятся активности. Для них и формляем анкер с всплывающим меню операций:
                    bool bIsDetailNameAsHref = (ThisReportParams.AnalysisDirectionEnum.ByCustomer_TargetCustomer == oParams.AnalysisDirection);

                    while (reader.Read())
                    {
                        IDictionary rec = _GetDataFromDataRow(reader);

                        // Если очередная рассматриваемая строка относится уже к другой группе,
                        // то сформируем строку отчета с данными подытога
                        if (null == sDirectionName || sDirectionName != rec["DirectionName"].ToString())
                        {
                            if (null != sDirectionName)
                            {
                                foWriter.TRStart();
                                foWriter.TRAddCell("Итого по направлению", "string", 2, 1, "GROUP_FOOTER");

                                if (bWithActivityQnt)
                                {
                                    foWriter.TRAddCell(nSubTotalQnt, "i4", 1, 1, "GROUP_FOOTER");
                                }

                                if (TimeMeasureUnits.Days == oParams.TimeMeasure)
                                {
                                    foWriter.TRAddCell(_FormatTimeStringAtServer(nSubTotalTime, nWorkDayDuration), "string", 1, 1, "GROUP_FOOTER");
                                }
                                else
                                {
                                    foWriter.TRAddCell(string.Format("{0:0.##}", nSubTotalTime / 60.0), "r8", 1, 1, "GROUP_FOOTER");
                                }

                                //foWriter.TRAddCell( (nSubTotalSum / 100.0).ToString("F2"), "fixed.14.4", 1, 1, "GROUP_FOOTER" );
                                foWriter.TREnd();
                            }

                            sDirectionName = rec["DirectionName"].ToString();
                            nSubTotalTime  = 0;
                            nSubTotalQnt   = 0;

                            // Текст с "заголовком" следующей группы:
                            foWriter.TRStart();
                            foWriter.TRAddCell(xmlEncode(sDirectionName), "string", (bWithActivityQnt ? 5 : 4), 1, "GROUP_HEADER");
                            foWriter.TREnd();
                        }

                        // Зачитываем данные
                        int nTime = Int32.Parse(rec["ExpensesTime"].ToString());
                        nSubTotalTime += nTime;
                        nTotalTime    += nTime;

                        /*int nSum = Int32.Parse( rec["ExpensesSum"].ToString() );
                         * nSubTotalSum += nSum;
                         * nTotalSum += nSum;*/

                        int nQnt = Int32.Parse(rec["ActivityQnt"].ToString());
                        nSubTotalQnt += nQnt;
                        nTotalQnt    += nQnt;

                        nRowNum += 1;

                        // Формируем соответствующую строку отчета:
                        foWriter.TRStart();
                        foWriter.TRAddCell(nRowNum, "i4", 1, 1, "TABLE_CELL_ROWNUM");

                        if (bIsDetailNameAsHref)
                        {
                            foWriter.TRAddCell(_GetFolderAnchor(rec["DetailName"].ToString(), (Guid)rec["DetailID"], true), "string", 1, 1, "TABLE_CELL");
                        }
                        else
                        {
                            foWriter.TRAddCell(xmlEncode(rec["DetailName"]), "string", 1, 1, "TABLE_CELL");
                        }

                        if (bWithActivityQnt)
                        {
                            foWriter.TRAddCell(nQnt, "i4", 1, 1, "TABLE_CELL");
                        }

                        if (TimeMeasureUnits.Days == oParams.TimeMeasure)
                        {
                            foWriter.TRAddCell(_FormatTimeStringAtServer(nTime, nWorkDayDuration), "string", 1, 1, "TABLE_CELL");
                        }
                        else
                        {
                            foWriter.TRAddCell(string.Format("{0:0.##}", nTime / 60.0), "r8", 1, 1, "TABLE_CELL");
                        }

                        //foWriter.TRAddCell( (nSum / 100.0).ToString("F2"), "fixed.14.4", 1, 1, "TABLE_CELL" );
                        foWriter.TREnd();
                    }

                    // Строка с последним накопленным подитогом (если такой был)
                    if (null != sDirectionName)
                    {
                        foWriter.TRStart();
                        foWriter.TRAddCell("Итого по направлению", "string", 2, 1, "GROUP_FOOTER");

                        if (bWithActivityQnt)
                        {
                            foWriter.TRAddCell(nSubTotalQnt, "i4", 1, 1, "GROUP_FOOTER");
                        }

                        if (TimeMeasureUnits.Days == oParams.TimeMeasure)
                        {
                            foWriter.TRAddCell(_FormatTimeStringAtServer(nSubTotalTime, nWorkDayDuration), "string", 1, 1, "GROUP_FOOTER");
                        }
                        else
                        {
                            foWriter.TRAddCell(string.Format("{0:0.##}", nSubTotalTime / 60.0), "r8", 1, 1, "GROUP_FOOTER");
                        }

                        //foWriter.TRAddCell( (nSubTotalSum / 100.0).ToString("F2"), "fixed.14.4", 1, 1, "GROUP_FOOTER" );
                        foWriter.TREnd();
                    }

                    // Строка с общим итогом по всему отчету
                    foWriter.TRStart();
                    foWriter.TRAddCell("Итого", "string", 2, 1, "TABLE_FOOTER");

                    if (bWithActivityQnt)
                    {
                        foWriter.TRAddCell(nTotalQnt, "i4", 1, 1, "TABLE_FOOTER");
                    }

                    if (TimeMeasureUnits.Days == oParams.TimeMeasure)
                    {
                        foWriter.TRAddCell(_FormatTimeStringAtServer(nTotalTime, nWorkDayDuration), "string", 1, 1, "TABLE_FOOTER");
                    }
                    else
                    {
                        foWriter.TRAddCell(string.Format("{0:0.##}", nTotalTime / 60.0), "r8", 1, 1, "TABLE_FOOTER");
                    }

                    //foWriter.TRAddCell( (nTotalSum / 100.0).ToString("F2"), "fixed.14.4", 1, 1, "TABLE_FOOTER" );
                    foWriter.TREnd();

                    #endregion
                }
                else
                {
                    #region ДАННЫЕ БЕЗ ДЕТАЛИЗАЦИИ
                    //	- DirectionName - Наименование направления;
                    //	- ActivityQnt	- Количество активностей
                    //	- ExpensesSum	- Сумма затрат

                    int nTotalTime = 0;
                    int nTotalQnt  = 0;
                    int nRowNum    = 0;

                    while (reader.Read())
                    {
                        // Зачитываем значения текущей строки:
                        IDictionary rec = _GetDataFromDataRow(reader);

                        int nTime = Int32.Parse(rec["ExpensesTime"].ToString());
                        nTotalTime += nTime;

                        /* Убираем Фин данные из отчета
                         *   int nSum = Int32.Parse( rec["ExpensesSum"].ToString() );
                         * nTotalSum += nSum;*/

                        int nQnt = Int32.Parse(rec["ActivityQnt"].ToString());
                        nTotalQnt += nQnt;

                        nRowNum += 1;

                        // Формируем представление строки в XSL-FO:
                        foWriter.TRStart();
                        foWriter.TRAddCell(nRowNum, "i4", 1, 1, "TABLE_CELL");
                        foWriter.TRAddCell(xmlEncode(rec["DirectionName"]), "string", 1, 1, "TABLE_CELL");

                        if (bWithActivityQnt)
                        {
                            foWriter.TRAddCell(nQnt, "i4", 1, 1, "TABLE_CELL");
                        }

                        if (TimeMeasureUnits.Days == oParams.TimeMeasure)
                        {
                            foWriter.TRAddCell(_FormatTimeStringAtServer(nTime, nWorkDayDuration), "string", 1, 1, "TABLE_CELL");
                        }
                        else
                        {
                            foWriter.TRAddCell(string.Format("{0:0.##}", nTime / 60.0), "r8", 1, 1, "TABLE_CELL");
                        }

                        //foWriter.TRAddCell( (nSum / 100.0).ToString("F2"), "fixed.14.4", 1, 1, "TABLE_CELL" );
                        foWriter.TREnd();
                    }

                    foWriter.TRStart();
                    foWriter.TRAddCell("Итого", "string", 2, 1, "TABLE_FOOTER");

                    if (bWithActivityQnt)
                    {
                        foWriter.TRAddCell(nTotalQnt, "i4", 1, 1, "TABLE_FOOTER");
                    }

                    if (TimeMeasureUnits.Days == oParams.TimeMeasure)
                    {
                        foWriter.TRAddCell(_FormatTimeStringAtServer(nTotalTime, nWorkDayDuration), "string", 1, 1, "TABLE_FOOTER");
                    }
                    else
                    {
                        foWriter.TRAddCell(string.Format("{0:0.##}", nTotalTime / 60.0), "r8", 1, 1, "TABLE_FOOTER");
                    }

                    //foWriter.TRAddCell( (nTotalSum / 100.0).ToString("F2"), "fixed.14.4", 1, 1, "TABLE_FOOTER" );

                    foWriter.TREnd();

                    #endregion
                }

                foWriter.TEnd();
            }
            #region ДОПОЛНИТЕЛНЫЕ ДАННЫЕ
            // Если направление анализа - "Активность-Направления" и задан признак отображения
            // данных о последнем изменении определения направления для активности:
            if (ThisReportParams.AnalysisDirectionEnum.ByActivity == oParams.AnalysisDirection && oParams.ShowHistoryInfo)
            {
                // Получение исторической информации - когда и кто последний раз изменил определение направлений
                object oScalar   = Provider.GetValue("dsHistory", oParams);
                string sNoteText = String.Format(
                    "<fo:inline>Последнее изменение определения направлений: </fo:inline><fo:inline font-weight=\"bold\">{0}</fo:inline>",
                    (null != oScalar? xmlEncode(oScalar.ToString()) : "(нет данных")
                    );

                // Формируем таблицу с "исторической справкой":
                // NB! Заголовок здесь НЕ ОТОБРАЖАЕТСЯ!
                foWriter.TStart(false, "TABLE_NOTE", false);
                foWriter.TAddColumn("Замечание", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "100%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_NOTE_HEADER");

                foWriter.TRStart();
                foWriter.TRAddCell(sNoteText, null, 1, 1, "TABLE_NOTE_CELL");
                foWriter.TREnd();

                foWriter.TEnd();
            }
            #endregion
        }