Table of contents
    No headers

     

    /***
        USAGE:
        
        HorizonReport(query, start, iteration)
            show report for designated iteration +n iterations
    ***/
    
    // check that prerequisites are met
    if(!__env.youtrack) {
        return "YouTrack extension is not enabled";
    }
    if(!__env.google) {
        return "Google extension is not enabled";
    }
    
    // read and validate parameters
    var query = $0 ?? $query;
    if(!query) {
        return "Missing query";
    }
    var start = $1 ?? $start ?? date.today;
    var number_of_iterations = $2 ?? $number_of_iterations;
    var iteration = $3 ?? $iteration;
    var availability = $team;
    var capacity = list.sum(availability);
    var prod_capacity = capacity * 0.5;
    var padding_percentage = 0.25;
    var svcs_capacity = (capacity - prod_capacity) * (1 - padding_percentage);
    
    <p>
    'This page pulls YouTrack issues in the "Planning" state.  It identifies the issues tagged "sow" and then builds a stacked bar graph
    based on these SOW.  It only pulls issues that are related to a SOW issue, so random or singeton issues in the "Planning" state
    will be ignored.  You must use YouTrack "required by" or "depends on" linking for issues to show up in this report.'
    </p>
    <br />
    
    // retrieve list of issues and categorize accordingly
    var limit = 1000;
    var sow_issues = youtrack.issues{ query: query .. ' tag:sow', limit: limit };
    
    // build a list of issues in each iteration    
    var iteration_n_issues = [];
    foreach(var i in num.series(1, number_of_iterations-1)){
        let iteration_n_issues ..= youtrack.issues{ query: query .. ' tag: {iteration ' .. iteration+i .. '}', limit: limit };
    };
    
    var iteration_n_plus_one_ids = [];
    foreach (var issue in iteration_n_issues){
        let iteration_n_plus_one_ids ..= [issue.id];
        };
    
    var sow_list = [ "Svcs Capacity"];
    var sow_sums = [[svcs_capacity]];
    var iteration_n_sow = [[0],[0]];
    
    foreach (var issue in sow_issues) {
        let sow_list ..= [issue.summary];
        var story_issues = youtrack.issues{ query: query .. ' required by:' .. issue.id, limit:limit };
        var sumthing = [0,0];
            foreach (var issue in story_issues) {
                if (issue.fields["Hours Planned"]){
                    if (list.contains(iteration_n_plus_one_ids, issue.id)){
                        let sumthing = list.splice(sumthing, 1, 1, [sumthing[1] + issue.fields["Hours Planned"]])
                    } else {
                        let sumthing = list.splice(sumthing, 0, 1, [sumthing[0] + issue.fields["Hours Planned"]])
                    }; // end of if
                }; // end of outer if
            var work_issues = youtrack.issues{ query: query .. ' required by:' .. issue.id, limit:limit };
                foreach (var issue in work_issues) {
                    if (issue.fields["Hours Planned"]){
                   // 'Issue id "'; issue.id; '"  list.contains "'; list.contains(iteration_n_plus_one_ids, issue.id); '"'; <br />
                        if (list.contains(iteration_n_plus_one_ids, issue.id)){
                            let sumthing = list.splice(sumthing, 1, 1, [sumthing[1] + issue.fields["Hours Planned"]])
                        } else {
                            let sumthing = list.splice(sumthing, 0, 1, [sumthing[0] + issue.fields["Hours Planned"]])
                        }; // end of if
                    }; // end of outer if
                }; // end of foreach
            }; // end outer foreach
        let iteration_n_sow = [iteration_n_sow[0] .. [sumthing[0]]] .. [iteration_n_sow[1] .. [sumthing[1]]];
        };
       
    // Append iteration counts to Services Capacity bar
    let sow_sums ..= iteration_n_sow;
        
    // Show breakdown of sprint iterations with SOW stacked
    // web.pre(sow_sums);
    
    <div>
    
    var width = 300;
    var height = 300;
    var colors = [ "ff0000", "0000ff", "00ff00", "00CCCC", "CC00CC", "CCCC00", "7733DD", "33DD77", "DD7733", "aa4400", "00aa44", "4400aa", "ffff00", "00ffff", "ff00ff", "224466", "446622", "662244" ];
    var legends = sow_list;
    var xaxis = [""];
    
    foreach (var i in num.series(0, number_of_iterations-1)){
        let xaxis ..= ["I" .. iteration+i]
    };
    
    google.barchart {
        width: width,
        height: height,
        values: sow_sums,
        colors: colors,
        vertical: true,
        stacked: true,
        legends: legends,
        xaxis: xaxis   
    };
    </div>
    
    <p>
    foreach (var i in num.series(0, number_of_iterations -1)){
        var begin_date = date.adddays(start, 14*i);
        var end_date = date.adddays(start, 14*(i+1));
        <strong>
        'Iteration '; iteration +i;
        </strong><br />
        'Requirements due by: '; date.format(date.adddays(begin_date, -2), "d");
        ',  Development start : '; date.format(begin_date, "d");
        '  Development end: '; date.format(end_date, "d");
        <br />
    }
    </p>
    
    <hr></hr>
    <H3>'SOW/Stories/Tasks: effort needed'</H3>
    <hr></hr>
    
    <div>
    
    foreach (var issue in sow_issues) {
        <br /><strong>
        issue.id; ' ';
        issue.summary;
        </strong>
            var story_issues = youtrack.issues{ query: query .. ' required by:' .. issue.id, limit:limit };
            foreach (var issue in story_issues) {
                <ul>
                <li> issue.id; ' ';
                    issue.summary;
                    if (issue.fields["Hours Planned"]){
                        ' hours: ';
                        issue.fields["Hours Planned"]
                     };
                </li>
                var work_issues = youtrack.issues{ query: query .. ' required by:' .. issue.id, limit:limit };
                foreach (var issue in work_issues) {
                    <ul>
                    <li> issue.id; ' ';
                        issue.summary; ' hours: ';
                        issue.fields["Hours Planned"]
                    </li> 
                    </ul>
                };
            </ul>  
            };
        };
    <br />
    </div>
    
    
    Tag page
    You must login to post a comment.

    Copyright © 2011 MindTouch, Inc. Powered by