/// <summary>
        /// Override of FormResultPdfReport.PrintGenericSection
        ///
        /// This will delegate to the special-case section printing methods above, or use the base PrintGenericSection implimentation
        /// </summary>
        /// <param name="output"></param>
        /// <param name="section"></param>
        /// <param name="indentLevel"></param>
        override protected void PrintGenericSection(PdfOutput output, def_Sections section, int indentLevel)
        {
            if (sectionsToSkip.Contains(section.identifier))
            {
                Debug.WriteLine("AdapPdfReport.PrintGenericSection  Skip it: " + section.identifier);
                return;
            }
            else if (specialCaseSections.ContainsKey(section.identifier))
            {
                if (output.drawY < 1.5)
                {
                    output.appendPageBreak();
                }

                if (indentLevel < 2)
                {
                    output.appendSectionBreak();
                }

                double sectionLabelIndent = .5 + labelIndent * (indentLevel - 1);
                double itemLabelIndent    = labelIndent * indentLevel;
                double responseIndent     = valueIndent + labelIndent * (indentLevel - 1);

                //print section content using special case handler
                specialCaseSections[section.identifier].Invoke(section, indentLevel, sectionLabelIndent, itemLabelIndent, responseIndent);
            }
            else
            {
                //print section header and content generically, excluding application comments except in the "finalCert" section
                Dictionary <string, string> responsesByItemVariable = GetResponsesByItemVariableIdentifierThroughLookupTables(section);
                if (section.identifier != "ADAP_finalCert")
                {
                    responsesByItemVariable.Remove("ADAP_Application_Comments_txt");
                }

                Debug.WriteLine("AdapPdfReport.base.PrintGenericSection: " + section.identifier);
                base.PrintGenericSection(output, section, indentLevel, responsesByItemVariable);
            }
        }
        protected void PrintGenericSection(
            PdfOutput output,
            def_Sections section,
            int indentLevel,
            Dictionary <string, string> responsesByItemVariable)
        {
            if (output.drawY < 1.5)
            {
                output.appendPageBreak();
            }

            if (indentLevel < 2)
            {
                output.appendSectionBreak();
            }

            //print section title + identifier
            double sectionLabelIndent = .5 + labelIndent * (indentLevel - 1);
            double itemLabelIndent    = labelIndent * indentLevel;
            double responseIndent     = valueIndent + labelIndent * (indentLevel - 1);

            output.appendWrappedText(buildSectionHeaderText(section),
                                     sectionLabelIndent, 8 - sectionLabelIndent, output.sectionHeaderFontSize);
            output.drawY -= .1;

            List <def_Items> ignoreList = new List <def_Items>();
            int singleBoolCount         = 0;

            formsRepo.GetSectionItems(section);

            //add items wtihout responses to the ignore list, count the number of single-boolean items
            Debug.WriteLine("FormResultPdfReport.PrintGenericSection section: " + section.identifier);
            foreach (def_SectionItems si in section.def_SectionItems.Where(si => !si.subSectionId.HasValue))
            {
                def_Items itm = formsRepo.GetItemById(si.itemId);
                Debug.WriteLine("   itm: " + itm.identifier);
                ICollection <def_ItemVariables> ivs = formsRepo.GetItemVariablesByItemId(itm.itemId);
                if (ivs.Any(iv => !responsesByItemVariable.ContainsKey(iv.identifier) || String.IsNullOrWhiteSpace(responsesByItemVariable[iv.identifier])))
                {
                    ignoreList.Add(itm);
                }

                if ((ivs.Count == 1) && (ivs.First().baseTypeId == 1))
                {
                    singleBoolCount++;
                }
            }

            //if there at least 4 boolean items in this section, ignore all labeled items with single negative boolean responses
            if (singleBoolCount >= 4)
            {
                foreach (def_SectionItems si in section.def_SectionItems.Where(si => !si.subSectionId.HasValue))
                {
                    def_Items itm = formsRepo.GetItemById(si.itemId);
                    ICollection <def_ItemVariables> ivs = formsRepo.GetItemVariablesByItemId(itm.itemId);
                    if (ignoreList.Contains(itm) || itm.label.Trim().Length == 0)
                    {
                        continue;
                    }

                    if (ivs.Count == 1)
                    {
                        def_ItemVariables iv = ivs.First();
                        if ((iv.baseTypeId == 1) && (!responsesByItemVariable.ContainsKey(iv.identifier) || responsesByItemVariable[iv.identifier].Equals("No")))
                        {
                            ignoreList.Add(itm);
                        }
                    }
                }
            }

            //iterate through section items, printing to pdf output
            foreach (def_SectionItems si in section.def_SectionItems)
            {
                if (si.subSectionId.HasValue)
                {
                    PrintGenericSection(output, formsRepo.GetSubSectionById(si.subSectionId.Value), indentLevel + 1);
                }
                else
                {
                    def_Items itm = formsRepo.GetItemById(si.itemId);
                    if (ignoreList.Where(x => x.itemId == itm.itemId).Any())
                    {
                        continue;
                    }

                    formsRepo.GetEnterpriseItems(new def_Items[] { itm }.ToList(), formResults.EnterpriseID.Value);
                    appendItemLabelAndResponses(itm, itemLabelIndent, responseIndent, responsesByItemVariable);
                }
            }
        }
예제 #3
0
        protected void PrintSupplementalQuestions(PdfOutput output)
        {
            def_Parts part = formsRepo.GetPartByFormAndIdentifier(form, "Supplemental Questions");

            AppendPartHeader(output, part.identifier);

            def_Sections topSct = formsRepo.GetSectionsInPart(part).FirstOrDefault();

            if (topSct == null)
            {
                throw new Exception("not sections found in part with partId " + part.partId);
            }

            List <def_Sections> sectionList = new List <def_Sections>();

            formsRepo.SortSectionItems(topSct);
            foreach (def_SectionItems sctnItm in topSct.def_SectionItems)
            {
                if (sctnItm.display == false)
                {
                    continue;
                }
                def_Sections subSctns = formsRepo.GetSubSectionById(sctnItm.subSectionId);// sctnItm.def_SubSections.def_Sections;
                sectionList.Add(subSctns);
            }

            int  grayCount          = 0;
            bool showWhiteQuestions = true;

            foreach (def_Sections sct in sectionList)
            {
                formsRepo.SortSectionItems(sct);
                foreach (def_SectionItems si in sct.def_SectionItems)
                {
                    if (si.display == false)
                    {
                        continue;
                    }

                    //if this is a "gray" question... (high-level questions pertaining to a set of "white" questions)
                    if (si.subSectionId == null)
                    {
                        grayCount++;
                        if (grayCount > 1)
                        {
                            output.drawY -= .5;
                        }
                        def_Items         itm = si.def_Items;
                        def_ItemVariables iv  = itm.def_ItemVariables.FirstOrDefault();
                        if (iv == null)
                        {
                            throw new Exception("no item variable for question with itemId " + si.itemId);
                        }
                        def_ResponseVariables rv = formsRepo.GetResponseVariablesByFormResultItemVarId(formResultId, iv.itemVariableId);//iv.def_ResponseVariables.FirstOrDefault();
                        if (rv == null)
                        {
                            continue;
                        }

                        //don't show the white questions if the response value is false
                        if (iv.baseTypeId == 1 && (rv.rspValue.ToLower().Equals("false") || rv.rspValue.Equals("0")))
                        {
                            showWhiteQuestions = false;
                        }
                        else
                        {
                            showWhiteQuestions = true;
                        }

                        if (output.drawY < .5)
                        {
                            output.appendPageBreak();
                        }

                        if (!itm.label.Equals("Page Notes"))
                        {
                            double y = output.drawY;
                            output.appendWrappedText(grayCount + ".", .8, 6, output.boldFont);
                            output.drawY = y;
                        }
                        output.appendWrappedText(itm.label, 1, 7, output.boldFont);
                        output.appendWrappedText(GetSupplementalResponseText(iv, rv), 1.5, 6, output.boldFont);
                        output.drawY -= PdfOutput.itemSpacing;
                    }

                    // if this is a "white" question-set
                    else
                    {
                        if (!showWhiteQuestions)
                        {
                            continue;
                        }
                        foreach (def_SectionItems ssi in si.def_SubSections.def_Sections.def_SectionItems)
                        {
                            def_Items itm = ssi.def_Items;
                            if (itm == null)
                            {
                                throw new Exception("no item for setionItems with sectionItemId " + ssi.sectionItemId);
                            }
                            def_ItemVariables iv = itm.def_ItemVariables.FirstOrDefault();
                            if (iv == null)
                            {
                                throw new Exception("no item variable for item with itemId " + itm.itemId);
                            }
                            def_ResponseVariables rv = formsRepo.GetResponseVariablesByFormResultItemVarId(formResultId, iv.itemVariableId);

                            try
                            {
                                output.appendWrappedText(itm.label, 1.1, 6);
                            }
                            catch (ApplicationException e)
                            {
                                string msg = "Exception appending label \"" +
                                             itm.label + "\" for item with itemId " + itm.itemId + "\nchars:";
                                foreach (char c in itm.label.ToCharArray())
                                {
                                    msg += " " + c + "(" + ((int)c) + ")";
                                }
                                throw new Exception(msg, e);
                            }

                            output.appendWrappedText(GetSupplementalResponseText(iv, rv), 1.5, 6);
                            output.drawY -= PdfOutput.itemSpacing;
                        }
                    }
                }
            }
        }
예제 #4
0
        //this is for the sections in the "Exceptional medical... needs" part
        private void PrintExceptMedNeedsTable(def_Parts part, PdfOutput output, def_Sections sct)
        {
            int nCols = 4;

            string[] headers = { sct.title, "", "Score", "Important \"To\" or \"For\"" };
            double[] indents = { .5, .75, 5.6, 6.75 };

            //headers
            output.drawY -= .1;
            for (int i = 0; i < nCols; i++)
            {
                output.DrawText(output.boldFont, output.fontSize, indents[i], output.drawY, headers[i]);
            }
            output.drawY += .13; output.appendSectionBreak();
            output.drawY -= PdfOutput.itemSpacing;

            indents = new double[] { .5, .75, 5.73, 6.75 };
            List <def_Items> itms = new List <def_Items>();

            formsRepo.SortSectionItems(sct);
            foreach (def_SectionItems si in sct.def_SectionItems)
            {
                if (si.subSectionId == null)    // NOTE: this case probably never occurs for this Part
                {
                    itms.Add(formsRepo.GetItemById(si.itemId));
                }
                else
                {
                    def_Sections sctn = formsRepo.GetSubSectionById(si.subSectionId);
                    formsRepo.SortSectionItems(sctn);
                    foreach (def_SectionItems ssi in sctn.def_SectionItems)
                    {
                        if (ssi.subSectionId == null)
                        {
                            itms.Add(formsRepo.GetItemById(ssi.itemId));
                        }
                    }
                }
            }
            int nRows = itms.Count() + 1;

            // Load the Values
            for (int row = 0; row < itms.Count; row++)
            {
                def_Items itm = itms[row];
                formsRepo.GetItemResultByFormResItem(formResultId, itm.itemId);
                def_ItemResults itmResults = itm.def_ItemResults.SingleOrDefault(ir => (ir.formResultId == formResultId));
                formsRepo.GetItemResultsResponseVariables(itmResults);
                foreach (def_ResponseVariables rv in itmResults.def_ResponseVariables)
                {
                    rv.def_ItemVariables = formsRepo.GetItemVariableById(rv.itemVariableId);
                }

                output.drawY -= .1;
                for (int col = 0; col < nCols; col++)
                {
                    string s = "ERROR";
                    switch (col)
                    {
                    case 0:
                        s = (row + 1).ToString();
                        break;

                    case 1:
                        s = itm.label;
                        break;

                    case 2:
                        def_ResponseVariables rv = itmResults.def_ResponseVariables.SingleOrDefault(r => r.def_ItemVariables.identifier.EndsWith("_ExMedSupport"));
                        s = ((rv == null) ? "" : rv.rspValue);
                        break;

                    case 3:
                        s = String.Empty;
                        break;
                    }
                    output.DrawText(output.contentFont, output.fontSize, indents[col], output.drawY, s);
                }
                output.drawY -= PdfOutput.itemSpacing * 2.5;
                if (output.drawY < 1)
                {
                    output.appendPageBreak();
                }
            }

            output.drawY -= .1;
            output.DrawText(output.boldFont, output.fontSize, indents[1], output.drawY, "Page Notes:");
            output.drawY -= PdfOutput.itemSpacing * 4;
            if (output.drawY < 1)
            {
                output.appendPageBreak();
            }
        }
예제 #5
0
        // This is for the sets of items that have 3 numerical response values
        private void BuildDetailedResponseTable(def_Parts part, PdfOutput output, def_Sections sct)
        {
            int nCols = 6;

            string[] headers = { sct.title, "", "Freq", "Time", "Type", "Important \"To\" or \"For\"" };
            double[] indents = { .5, .75, 5.3, 5.6, 5.95, 6.75 };

            //headers
            output.drawY -= .1;
            for (int i = 0; i < nCols; i++)
            {
                output.DrawText(output.boldFont, output.fontSize, indents[i], output.drawY, headers[i]);
            }
            output.drawY += .13; output.appendSectionBreak();
            output.drawY -= PdfOutput.itemSpacing;

            indents = new double[] { .5, .75, 5.38, 5.73, 6.05, 6.75 };
            List <def_Items> itms = formsRepo.GetSectionItems(sct);

            // Values
            for (int row = 0; row < itms.Count; row++)
            {
                def_Items       itm        = itms[row];
                def_ItemResults itmResults = formsRepo.GetItemResultByFormResItem(formResultId, itm.itemId);
                formsRepo.GetItemResultsResponseVariables(itmResults);
                foreach (def_ResponseVariables rv in itmResults.def_ResponseVariables)
                {
                    rv.def_ItemVariables = formsRepo.GetItemVariableById(rv.itemVariableId);
                }

                output.drawY -= .1;
                for (int col = 0; col < nCols; col++)
                {
                    string s = "ERROR";
                    switch (col)
                    {
                    case 0:
                        s = (row + 1).ToString();
                        break;

                    case 1:
                        s = itm.label;
                        break;

                    case 2:
                    case 3:
                    case 4:
                        s = null;
                        string suffix = SupportNeedsColumnSuffixes[col - 2];
                        try
                        {
                            //Debug.WriteLine("\titemvariableId= " + ivEnum.Current.itemVariableId);
                            s = itmResults.def_ResponseVariables.SingleOrDefault(rv => rv.def_ItemVariables.identifier.EndsWith(suffix)).rspValue;
                        }
                        catch (System.NullReferenceException ex)
                        {
                            Debug.Print("for itemId " + itm.itemId + ", could not find responseVariable linked to itemVariableIdentifier with suffix \"" + suffix + "\"");
                            Debug.Print("   NullReferenceException: " + ex.Message);
                        }
                        s = String.IsNullOrEmpty(s) ? "N/A" : s;
                        break;

                    case 5:
                        s = String.Empty;
                        break;
                    }
                    output.DrawText(output.contentFont, output.fontSize, indents[col], output.drawY, s);
                }
                output.drawY -= PdfOutput.itemSpacing * 2.5;
                if (output.drawY < 1)
                {
                    output.appendPageBreak();
                }
            }

            output.drawY -= .1;
            output.DrawText(output.boldFont, output.fontSize, indents[1], output.drawY, "Page Notes:");
            output.drawY -= PdfOutput.itemSpacing * 4;
            if (output.drawY < 1)
            {
                output.appendPageBreak();
            }
        }
예제 #6
0
        public void printTable(PdfOutput output)
        {
            if (rows.Count == 0)
            {
                throw new Exception("Cannot print a table with no rows");
            }

            //draw top table border
            output.SetColor(Color.Black);
            output.DrawLine(bordersX[0], output.drawY,
                            bordersX[columnCount], output.drawY, cellBorderWidth);

            foreach (Row r in rows)
            {
                //compute row thickness before drawing, add page break if necessary
                double rowThickness = getRowThickness(output, r);
                if (output.drawY - rowThickness < 0)
                {
                    output.appendPageBreak();
                }

                if (r is RegularRow)
                {
                    string[] rowVals = ((RegularRow)r).contents;

                    //draw row background, if applicable
                    double y = output.drawY;
                    if (!r.background.Equals(Color.White))
                    {
                        output.SetColor(r.background);
                        output.FillRectangle(bordersX[0], output.drawY - rowThickness,
                                             bordersX[columnCount] - bordersX[0], rowThickness);
                        output.drawY = y;
                        output.SetColor(Color.Black);
                    }

                    //draw cell contents
                    for (int col = 0; col < columnCount; col++)
                    {
                        output.DrawWrappedText(
                            r.font, r.fontSize,
                            bordersX[col] + cellPaddingLeft,
                            output.drawY - cellContentsDy,
                            bordersX[col + 1] - bordersX[col] - cellPaddingRight,
                            TextJustify.Left,
                            rowVals[col] == null ? "N/A" : rowVals[col]);
                        output.drawY = y;
                    }

                    //draw cell borders
                    for (int col = 0; col <= columnCount; col++)
                    {
                        output.DrawLine(bordersX[col], output.drawY,
                                        bordersX[col], output.drawY - rowThickness, cellBorderWidth);
                    }
                    output.DrawLine(bordersX[0], output.drawY - rowThickness,
                                    bordersX[columnCount], output.drawY - rowThickness, cellBorderWidth);

                    //move down the page for the next row
                    output.drawY -= rowThickness;
                }
                else if (r is MergedRow)
                {
                    string content = ((MergedRow)r).contents;

                    //draw row background, if applicable
                    double y = output.drawY;
                    if (!r.background.Equals(Color.White))
                    {
                        output.SetColor(r.background);
                        output.FillRectangle(bordersX[0], output.drawY - rowThickness,
                                             bordersX[columnCount] - bordersX[0], rowThickness);
                        output.drawY = y;
                        output.SetColor(Color.Black);
                    }

                    //draw cell content
                    output.DrawWrappedText(
                        r.font, r.fontSize,
                        bordersX[0] + cellPaddingLeft,
                        output.drawY - cellContentsDy,
                        bordersX[columnCount] - bordersX[0] - cellPaddingRight,
                        TextJustify.Left,
                        content);
                    output.drawY = y;

                    //draw cell borders
                    output.DrawLine(bordersX[0], output.drawY,
                                    bordersX[0], output.drawY - rowThickness, cellBorderWidth);
                    output.DrawLine(bordersX[columnCount], output.drawY,
                                    bordersX[columnCount], output.drawY - rowThickness, cellBorderWidth);
                    output.DrawLine(bordersX[0], output.drawY - rowThickness,
                                    bordersX[columnCount], output.drawY - rowThickness, cellBorderWidth);

                    //move down the page for the next row
                    output.drawY -= rowThickness;
                }
                else
                {
                    throw new Exception("Unrecognized row subclass \"" + r.GetType() + "\"");
                }
            }
        }