@@ -31,6 +31,7 @@ const ReportService = (($, _, App) => ({
3131 move . month = date . month ( ) + 1 ;
3232 move . year = date . year ( ) ;
3333 move . dayOfYear = date . dayOfYear ( ) ;
34+ move . weekOfYear = date . week ( ) ;
3435 move . millis = date . valueOf ( ) ;
3536 move . formatedDate = date . format ( 'DD/MM/YYYY' ) ;
3637
@@ -119,7 +120,7 @@ const ReportService = (($, _, App) => ({
119120 return {
120121 data,
121122 order : column . order ,
122- visible : true ,
123+ visible : column . visible ,
123124 label : column . name ,
124125 borderColor : column . color ,
125126 backgroundColor : Color ( column . color ) . alpha ( 0.3 ) . rgbString ( ) ,
@@ -136,6 +137,85 @@ const ReportService = (($, _, App) => ({
136137 } ;
137138 } ,
138139
140+ /**
141+ * @param data
142+ * @param project
143+ * @param columns
144+ * @return {{labels, datasets} }
145+ */
146+ getLeadTimeData : ( data , project , columns ) => {
147+ const summaries = ReportService . _normalizeData ( data , project , columns ) ;
148+
149+ const labels = _ ( summaries )
150+ . map ( 'board_moves' )
151+ . flatten ( )
152+ . sortBy ( 'millis' )
153+ . map ( 'weekOfYear' )
154+ . uniq ( )
155+ . value ( ) ;
156+
157+ const weeks = _ ( summaries )
158+ . map ( ( summ ) => {
159+ summ . board_moves . forEach ( ( move ) => {
160+ move . issue = summ . issue . number ;
161+ } ) ;
162+ return summ . board_moves ;
163+ } )
164+ . flatten ( )
165+ . filter ( move => move . column . visible )
166+ . groupBy ( 'issue' )
167+ . filter ( ( issue ) => {
168+ const hasFirst = issue . find ( ( move ) => move . column . order === _ ( columns ) . filter ( 'visible' ) . filter ( move => move . order > 0 ) . minBy ( 'order' ) . order ) ;
169+ const hasLast = issue . find ( ( move ) => move . column . order === _ ( columns ) . filter ( 'visible' ) . filter ( move => move . order > 0 ) . maxBy ( 'order' ) . order ) ;
170+ return hasFirst && hasLast ;
171+ } )
172+ . map ( ( issue ) => {
173+ const first = issue . find ( ( move ) => move . column . order === _ ( columns ) . filter ( 'visible' ) . filter ( move => move . order > 0 ) . minBy ( 'order' ) . order ) ;
174+ const last = issue . find ( ( move ) => move . column . order === _ ( columns ) . filter ( 'visible' ) . filter ( move => move . order > 0 ) . maxBy ( 'order' ) . order ) ;
175+ const leadTime = last . dayOfYear - first . dayOfYear ;
176+
177+ return {
178+ week : last . weekOfYear ,
179+ leadTime,
180+ } ;
181+ } )
182+ . groupBy ( 'week' )
183+ . value ( ) ;
184+
185+ const datasets = labels . map ( ( week , index ) => {
186+ let totalWeeksLeadTime = 0 ;
187+ let totalIssuesFromWeeks = 0 ;
188+
189+ const data = [ ] ;
190+
191+ for ( let i = 0 ; i <= index ; i += 1 ) {
192+ const weekNumber = labels [ i ] ;
193+
194+ ( weeks [ weekNumber ] || [ ] ) . forEach ( ( issue ) => {
195+ totalIssuesFromWeeks += 1 ;
196+ totalWeeksLeadTime += issue . leadTime ;
197+ } ) ;
198+
199+ const leadTime = ( totalWeeksLeadTime / totalIssuesFromWeeks ) || 0 ;
200+ data . push ( leadTime . toFixed ( 2 ) ) ;
201+ }
202+
203+ return {
204+ data,
205+ label : week ,
206+ fill : false ,
207+ borderColor : randomColor ( ) ,
208+ pointStyle : 'crossRot' ,
209+ pointRadius : 10 ,
210+ } ;
211+ } ) ;
212+
213+ return {
214+ labels,
215+ datasets,
216+ } ;
217+ } ,
218+
139219 /**
140220 * @param data
141221 * @param project
@@ -190,7 +270,7 @@ const ReportService = (($, _, App) => ({
190270 return {
191271 data,
192272 order : column . order ,
193- visible : true ,
273+ visible : column . visible ,
194274 label : column . name ,
195275 borderColor : column . color ,
196276 backgroundColor : column . color ,
0 commit comments