Changeset 1494


Ignore:
Timestamp:
Dec 16, 2011, 2:00:58 PM (10 years ago)
Author:
Martin Svensson
Message:

References #339 The report-generator has been re-made. The columns are now automatically adjusting to the period given by the user.

Location:
extensions/net.sf.basedb.reggie/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • extensions/net.sf.basedb.reggie/trunk/resources/reggie.js

    r1491 r1494  
    205205    weeknum = nday < 4 ? 1 : 53;
    206206  }
    207  
    208    
    209  
    210207  return weeknum;
    211208}
  • extensions/net.sf.basedb.reggie/trunk/resources/samplereportgenerator.jsp

    r1491 r1494  
    2828  var currentStep = 1;
    2929  var debug = true;
    30   var maxCols = 30;
    3130  var sitesCombined;
    3231  var numCols;
     32 
     33  var month=new Array(12);
     34    month[0]="Jan";
     35    month[1]="Feb";
     36    month[2]="Mar";
     37    month[3]="Apr";
     38    month[4]="May";
     39    month[5]="Jun";
     40    month[6]="Jul";
     41    month[7]="Aug";
     42    month[8]="Sep";
     43    month[9]="Oct";
     44    month[10]="Nov";
     45    month[11]="Dec";
     46 
     47  var intervalIsValid = true;
    3348 
    3449  function goNext()
     
    5166    Main.show('gocreate');   
    5267    Main.hide('gonext');
     68    frm.fromdate.focus();
    5369    currentStep = 2;
    5470  }
    5571 
     72  function dateOnChange()
     73  {
     74    var frm = document.forms['reggie'];   
     75    var fdate;
     76    var tdate;
     77   
     78    intervalIsValid = false;
     79    setInputStatus('displayInterval','','valid');
     80    if (frm.fromdate.value != null && frm.fromdate.value != '')
     81    {
     82      frm.fromdate.value = autoFillDate(frm.fromdate.value);     
     83      if (!Dates.isDate(frm.fromdate.value, 'yyyyMMdd'))
     84      {
     85        setInputStatus('displayInterval','Not a valid from-date', 'invalid');
     86        return;
     87      }
     88      else
     89      {
     90        fdate = frm.fromdate.value;
     91        fdate = new Date(fdate.substr(0,4), parseInt(fdate.substr(4,2))-1, fdate.substr(6,2));
     92      }
     93    }
     94   
     95    if (frm.todate.value != null && frm.todate.value != '')
     96    {
     97      frm.todate.value = autoFillDate(frm.todate.value);
     98      if (!Dates.isDate(frm.todate.value, 'yyyyMMdd'))
     99      {
     100        setInputStatus('displayInterval', 'Not a valid to-date', 'invalid');
     101        return;
     102      }
     103      else
     104      {
     105        tdate = frm.todate.value;
     106        tdate = new Date(tdate.substr(0,4), parseInt(tdate.substr(4,2))-1, tdate.substr(6,2));
     107      }
     108    }
     109   
     110    if (tdate != null && fdate != null)
     111    {
     112      if (fdate > tdate)
     113      {
     114        setInputStatus('displayInterval', 'Invalid period', 'invalid')
     115        return;
     116      }     
     117    }
     118    intervalIsValid = true;
     119  }
     120 
    56121  function goCreate()
    57122  {
    58     var frm = document.forms['reggie'];
    59     for (var i=0; i< frm.view.length; i++)
    60     {
    61       frm.view[i].disabled = true;
    62     }
    63     var reportType = frm.reporttype[frm.reporttype.selectedIndex].value;
    64    
    65     var url = 'SampleReport.servlet?ID=<%=ID%>&cmd='+reportType;
    66     var columnView = Forms.getCheckedRadio(frm.view).value;
     123    if (!intervalIsValid) return;
     124    var cellElement = document.getElementById('reportcell');
     125    var frm = document.forms['reggie'];   
     126    frm.fromdate.disabled = true;
     127    frm.todate.disabled = true;
     128    Main.hide('gocreate');
     129    Main.show('reportSection');
     130    var reportType = frm.reporttype[frm.reporttype.selectedIndex].value;   
     131    var url = 'SampleReport.servlet?ID=<%=ID%>&cmd='+reportType;   
     132   
    67133    if (reportType == 'samplecount')
    68     {
    69       url += '&columnview=' + columnView;
     134    {     
     135      if (frm.fromdate.value != null) url += '&fdate='+frm.fromdate.value;
     136      if (frm.todate.value != null) url += '&tdate='+frm.todate.value;
    70137    }
    71138    var request = Ajax.getXmlHttpRequest();
     
    81148    }
    82149    var report = response.report;
     150    var reportTable;
     151   
     152    if (report != null)
     153    {
     154      if ('samplecount' == reportType)
     155      {     
     156        reportTable = createSampleCountReport(report);
     157      }
     158    }
     159    else
     160    {
     161      var messageCell = getTableCellElement('No values could be found during given period', 'reportheader');
     162      var messageRow = document.createElement('tr');
     163      messageRow.appendChild(messageCell);     
     164      var messageTable = getReportTable();
     165      messageTable.appendChild(messageRow);
     166      reportTable = messageTable;     
     167    }
     168    cellElement.appendChild(reportTable);   
     169    Main.show('gorestart');   
     170  }
     171 
     172  function createSampleCountReport(report)
     173  {
    83174    var reportTable = getReportTable();
    84     if ('samplecount' == reportType)
    85     {
    86       var fdString = report.firstDate;
    87       var ldString = report.latestDate;
    88       var firstDate = new Date();
    89       firstDate.setYear(fdString.substr(0,4));
    90       firstDate.setMonth(fdString.substr(4,2)-1);
    91       firstDate.setDate(fdString.substr(6));
    92       var latestDate = new Date();
    93       latestDate.setYear(ldString.substr(0,4));
    94       latestDate.setMonth(ldString.substr(4,2)-1);
    95       latestDate.setDate(ldString.substr(6));
     175    var sdString = report.startDate;
     176    var edString = report.endDate;
     177    var ldString = report.latestDate;   
     178    var startDate = new Date();
     179    startDate.setYear(sdString.substr(0,4));
     180    startDate.setMonth(sdString.substr(4,2)-1);
     181    startDate.setDate(sdString.substr(6));
     182    var endDate = new Date();
     183    endDate.setYear(edString.substr(0,4));
     184    endDate.setMonth(edString.substr(4,2)-1);
     185    endDate.setDate(edString.substr(6));
     186    var latestDate = new Date();
     187    latestDate.setYear(ldString.substr(0,4));
     188    latestDate.setMonth(ldString.substr(4,2)-1);
     189    latestDate.setDate(ldString.substr(6));
     190    var viewType = report.viewType;   
     191 
     192    var headerRow = document.createElement('tr');   
     193    var subHeaderRowYear = document.createElement('tr');
     194    var columnHeaderRow = document.createElement('tr');
     195   
     196    var headerText = '# Specimen by ';
     197    if (viewType == 'WEEK')
     198    {
     199      var startWeek = getWeekByDate(startDate);
     200      var endWeek = getWeekByDate(endDate);
     201      var tempDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate()-startDate.getDay()+1);
     202      numCols = 0;
     203      while (tempDate < endDate)
     204      {
     205        numCols++;
     206        tempDate.setDate(tempDate.getDate()+7);
     207      }
     208      headerText += 'weeks';
     209    }
     210    else if (viewType == 'MONTH')
     211    {
     212      numCols = (endDate.getFullYear()-startDate.getFullYear())*12 + endDate.getMonth()-startDate.getMonth()+1;
     213      headerText += 'months';
     214    }
     215    else if (viewType == 'QUARTER')
     216    {
     217      numCols = (endDate.getFullYear()-startDate.getFullYear())*4 + Math.ceil((endDate.getMonth()-startDate.getMonth())/3);
     218      headerText += 'quarters';
     219    }
     220    else
     221    {
     222      numCols = endDate.getFullYear() - startDate.getFullYear() + 1;
     223      headerText += 'years';
     224    }
     225    sitesCombined = Array(numCols);
    96226     
    97       // Calculate number of datacolumns
    98       if (columnView == 'MONTH')
    99       {
    100         var numYears = latestDate.getFullYear() - firstDate.getFullYear();
    101         numCols = (12*(numYears-1)) + (12-parseInt(firstDate.getMonth())) + parseInt(ldString.substr(4,2));               
    102       }
    103       else
    104       {       
    105         var diffTime = latestDate.getTime() - firstDate.getTime();
    106         var milliSecPerWeek = 1000*60*60*24*7;
    107         numCols = Math.ceil(diffTime/milliSecPerWeek)+1;       
    108       }
    109       sitesCombined = Array(numCols);
    110      
    111       // Set table header
    112       var headerText = '# Specimen by ';
    113       headerText += columnView == 'WEEK' ? 'week' : 'month';
    114       headerText += '(through '+latestDate.getFullYear()+'-';
    115       if ((latestDate.getMonth()+1) < 10) headerText += '0' + (latestDate.getMonth()+1);
    116       else headerText += (latestDate.getMonth()+1);
    117       headerText += '-';
    118       if (latestDate.getDate() < 10) headerText += '0' + latestDate.getDate();
    119       else headerText += latestDate.getDate();
    120       headerText += ')';
    121       var headerRow = document.createElement('tr');
    122       headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+4)));
     227    // Set table header
     228    headerText += '\n(' + startDate.getFullYear()+'-';
     229    if ((startDate.getMonth()+1) < 10) headerText += '0' + (startDate.getMonth()+1);
     230    else headerText += (startDate.getMonth()+1);
     231    headerText += '-';
     232    if (startDate.getDate() < 10) headerText += '0' + startDate.getDate();
     233    else headerText += startDate.getDate();
     234    headerText += ' through ';
     235    headerText += endDate.getFullYear()+'-';
     236    if ((endDate.getMonth()+1) < 10) headerText += '0' + (endDate.getMonth()+1);
     237    else headerText += (endDate.getMonth()+1);
     238    headerText += '-';
     239    if (endDate.getDate() < 10) headerText += '0' + endDate.getDate();
     240    else headerText += endDate.getDate();
     241    headerText += ')';   
     242    headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+3)));
     243   
     244    // Sub headers
     245    // Only if each datacol is less then a year
     246    if (viewType != 'YEAR')
     247    {
     248      subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 2));
     249      addYearSubHeaders(startDate, endDate, latestDate, subHeaderRowYear, viewType);     
     250      subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader'));
     251    }   
     252         
     253    // Columnsheader   
     254    var siteHeader = getTableCellElement('Site', 'reportsubheader');     
     255    var startDateHeader = getTableCellElement('Start date','reportsubheader');
     256    columnHeaderRow.appendChild(siteHeader);
     257    columnHeaderRow.appendChild(startDateHeader);
     258   
     259    if (viewType == 'MONTH') addMonthColumnHeaders(columnHeaderRow, startDate);
     260    else if (viewType == 'WEEK') addWeekColumnHeaders(columnHeaderRow, startDate);
     261    else if (viewType == 'QUARTER') addQuarterColumnHeaders(columnHeaderRow, startDate);
     262    else if (viewType == 'YEAR') addYearSubHeaders(startDate, endDate, latestDate, columnHeaderRow, viewType);
     263   
     264   
     265    columnHeaderRow.appendChild(getTableCellElement('Grand\ntotal', 'reportsubheader'));
     266
     267    // Build table     
     268    reportTable.appendChild(headerRow);
     269    reportTable.appendChild(subHeaderRowYear);
     270    reportTable.appendChild(columnHeaderRow);
     271         
     272    // Data rows     
     273    addDataRowsToTable(report, reportTable);
    123274     
    124       // Sub headers
    125       var subHeaderRowYear = document.createElement('tr');
    126       addYearSubHeaders(firstDate, latestDate, subHeaderRowYear, columnView);     
    127       subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader'));
    128            
    129       //Columnsheader
    130       var columnHeaderRow = document.createElement('tr');
    131       var siteHeader = getTableCellElement('Site', 'reportsubheader');     
    132       var startDateHeader = getTableCellElement('Start date','reportsubheader');     
    133       columnHeaderRow.appendChild(siteHeader);
    134       columnHeaderRow.appendChild(startDateHeader);     
    135       if (columnView == 'MONTH') addMonthColumnHeaders(columnHeaderRow, firstDate, latestDate);
    136       else addWeekColumnHeaders(columnHeaderRow, firstDate,latestDate);
    137       columnHeaderRow.appendChild(getTableCellElement('Grand\ntotal', 'reportsubheader'));
    138 
    139       // Build table     
    140       reportTable.appendChild(headerRow);
    141       reportTable.appendChild(subHeaderRowYear);
    142       reportTable.appendChild(columnHeaderRow);
    143            
    144       // Data rows     
    145       addDataRowsToTable(report, reportTable, columnView);
    146      
    147       // Add a row with the combined number of each month-column
    148       var sitesCombinedRow = document.createElement('tr');
    149       sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
    150       sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary'));
    151       var gt = 0;
    152       for (key in sitesCombined)
    153       {
    154         sitesCombinedRow.appendChild(getTableCellElement(sitesCombined[key],'colsummary'));
    155         gt += sitesCombined[key];
    156       }
    157       sitesCombinedRow.appendChild(getTableCellElement(gt, 'colsummary'));
    158       reportTable.appendChild(sitesCombinedRow);     
    159     }
    160     var cellElement = document.getElementById('reportcell');
    161     cellElement.appendChild(reportTable);
    162     Main.hide('gocreate');
    163     Main.show('gorestart');
    164     Main.show('reportSection');
    165   }
    166  
    167   function addWeekColumnHeaders(columnHeaderRow, firstDate, latestDate)
    168   {
    169     var currentDate = firstDate;   
     275    // Add a row with the combined number of each month-column
     276    var sitesCombinedRow = document.createElement('tr');
     277    sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
     278    sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary'));
     279    var gt = 0;
     280    for (key in sitesCombined)
     281    {
     282      sitesCombinedRow.appendChild(getTableCellElement(sitesCombined[key],'colsummary'));
     283      gt += sitesCombined[key];
     284    }
     285    sitesCombinedRow.appendChild(getTableCellElement(gt, 'colsummary'));
     286    reportTable.appendChild(sitesCombinedRow); 
     287    return reportTable;
     288  }
     289 
     290  function addQuarterColumnHeaders(columnHeaderRow, startDate)
     291  {
     292    var currentDate = startDate;
    170293    for (var i=0;i<numCols;i++)
    171294    {
     295      var quarter = Math.floor(currentDate.getMonth()/3)+1;
     296      var columnText = 'Q'+quarter;
     297      var quarterHeader = getTableCellElement(columnText, 'reportsubheader');
     298      columnHeaderRow.appendChild(quarterHeader);
     299      currentDate.setMonth(currentDate.getMonth()+3);     
     300    }
     301  }
     302 
     303  function addWeekColumnHeaders(columnHeaderRow, startDate)
     304  {
     305    var currentDate = startDate;
     306    var day = currentDate.getDay()-1;
     307    day = day>=0 ? day: day + 7;
     308    currentDate.setDate(currentDate.getDate()-day);
     309    for (var i=0;i<numCols;i++)
     310    {     
    172311      var weekNum = getWeekByDate(currentDate);
    173312      var columnText = weekNum;
    174       if (weekNum < 10) columnText = '0'+columnText;
     313      if (weekNum < 10) columnText = '0'+columnText;     
    175314      columnHeaderRow.appendChild(getTableCellElement(columnText, 'reportsubheader'));
    176       currentDate.setDate(currentDate.getDate()+7);
    177     }
    178   }
    179  
    180   function addMonthColumnHeaders(columnHeaderRow, firstDate, latestDate)
    181   {
    182     var month=new Array(12);
    183       month[0]="Jan";
    184       month[1]="Feb";
    185       month[2]="March";
    186       month[3]="April";
    187       month[4]="May";
    188       month[5]="June";
    189       month[6]="July";
    190       month[7]="Aug";
    191       month[8]="Sept";
    192       month[9]="Oct";
    193       month[10]="Nov";
    194       month[11]="Dec";
    195      
    196     var currentDate = new Date(firstDate.getFullYear(), firstDate.getMonth());
     315      currentDate.setDate(currentDate.getDate()+7);     
     316    }
     317  }
     318 
     319  function addMonthColumnHeaders(columnHeaderRow, startDate)
     320  {   
     321    var currentDate = new Date(startDate.getFullYear(), startDate.getMonth());
    197322    for (var i=0;i<numCols;i++)
    198     {
    199       var currentMonth = new Date(0,firstDate.getMonth());
    200       var columnText = month[currentDate.getMonth()];
    201       if ((i+1) == numCols)
    202       {
    203         columnText += '\n(to ' + latestDate.getDate();
    204         if (latestDate.getDate() == 1) columnText += 'st';
    205         else if (latestDate.getDate() == 2) columnText += 'nd';
    206         else if (latestDate.getDate() == 3) columnText += 'rd';
    207         else columnText += 'th';
    208         columnText += ')';
    209       }       
    210       var monthHeader = getTableCellElement(columnText, 'reportsubheader');
     323    {             
     324      var monthHeader = getTableCellElement(month[currentDate.getMonth()], 'reportsubheader');
    211325      columnHeaderRow.appendChild(monthHeader);       
    212326      currentDate.setMonth(currentDate.getMonth() +1);
     
    214328  }
    215329 
    216   function addYearSubHeaders(firstDate, latestDate, subHeaderRowYear, viewType)
    217   {
    218     subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 2));
    219     var currentYear = firstDate.getFullYear();     
     330  function addYearSubHeaders(startDate, endDate, latestDate, subHeaderRowYear, vt)
     331  {   
     332    var currentYear = startDate.getFullYear(); 
     333   
     334    var columnCounter = 0;   
    220335    do
    221336    {
    222337      var colspan;
    223       if (viewType == "MONTH")
    224       {
    225         if (currentYear == firstDate.getFullYear())
    226           colspan =  (12-parseInt(firstDate.getMonth()+1)+1);
    227         else if (currentYear == latestDate.getFullYear())
    228           colspan = parseInt(latestDate.getMonth()+1);
     338      var headerText = currentYear;
     339      if (vt == "MONTH")
     340      {
     341        if (currentYear == startDate.getFullYear())
     342          colspan =  (12-parseInt(startDate.getMonth()+1)+1);
     343        else if (currentYear == endDate.getFullYear())
     344          colspan = parseInt(endDate.getMonth()+1);
    229345        else
    230           colspan = 12;       
    231       }
    232       else
    233       {       
    234         if (currentYear == firstDate.getFullYear())
    235         {
    236           var startWeek = getWeekByDate(firstDate);
    237           var lastDay = new Date(firstDate.getFullYear(), 11, 31);
     346          colspan = 12;
     347      }
     348      else if (vt == "WEEK")
     349      {
     350        if (startDate.getFullYear() == endDate.getFullYear())
     351        {
     352          colspan = numCols;
     353        }
     354        else if (currentYear == startDate.getFullYear())
     355        {
     356          var startWeek = getWeekByDate(startDate);
     357          var lastDay = new Date(startDate.getFullYear(), 11, 31);
    238358          var endWeek = getWeekByDate(lastDay);
    239359          if (endWeek == 1) endWeek = getWeekByDate(lastDay.setDate(lastDay.getDate()-7));
    240360          colspan = endWeek - startWeek +1;
    241361        }
    242         else if (currentYear == latestDate.getFullYear())
    243         {
    244           var endWeek = getWeekByDate(latestDate);
     362        else if (currentYear == endDate.getFullYear())
     363        {
     364          var endWeek = getWeekByDate(endDate);
    245365          colspan = endWeek;
    246366        }
     
    251371          if (endWeek == 1) endWeek = getWeekByDate(dateInLastWeek.setDate(dateInLastWeek.getDate()-7));
    252372          colspan = endWeek;
    253         }
    254       }
    255       subHeaderRowYear.appendChild(getTableCellElement(currentYear, 'reportsubheader', colspan));
    256     }while(!(++currentYear>latestDate.getFullYear()));
    257   }
    258  
    259   function addDataRowsToTable(report, reportTable, viewType)
    260   {
    261     var fdString = report.firstDate;
    262     var ldString = report.latestDate;
    263     var firstDate = new Date();
    264     firstDate.setYear(fdString.substr(0,4));
    265     firstDate.setMonth(fdString.substr(4,2)-1);
    266     firstDate.setDate(fdString.substr(6));
    267     var latestDate = new Date();
    268     latestDate.setYear(ldString.substr(0,4));
    269     latestDate.setMonth(ldString.substr(4,2)-1);
    270     latestDate.setDate(ldString.substr(6));
     373        }               
     374      }
     375      else if (vt == "QUARTER")
     376      {
     377        if (currentYear == startDate.getFullYear())
     378        {
     379          if (startDate.getFullYear() == endDate.getFullYear())
     380          {
     381            colspan = Math.floor((endDate.getMonth()-startDate.getMonth())/3)+1;
     382          }
     383          else
     384          {
     385            colspan = Math.floor((11-startDate.getMonth())/3) +1;
     386          }
     387        }
     388        else if(currentYear == endDate.getFullYear())
     389        {
     390          colspan = Math.floor(endDate.getMonth()/3)+1;
     391        }
     392        else
     393        {
     394          colspan = 4;
     395        }
     396      }
     397      else if (vt == "YEAR")
     398      {
     399        colspan = 1;       
     400      }
     401      columnCounter += colspan;           
     402      subHeaderRowYear.appendChild(getTableCellElement(headerText, 'reportsubheader', colspan));
     403    }while(!(++currentYear>endDate.getFullYear()));
     404  }
     405 
     406  function addDataRowsToTable(report, reportTable)
     407  {
     408    var fdString = report.startDate;
     409    var ldString = report.endDate;
     410    var startDate = new Date();
     411    startDate.setYear(fdString.substr(0,4));
     412    startDate.setMonth(fdString.substr(4,2)-1);
     413    startDate.setDate(fdString.substr(6));
     414    var endDate = new Date();
     415    endDate.setYear(ldString.substr(0,4));
     416    endDate.setMonth(ldString.substr(4,2)-1);
     417    endDate.setDate(ldString.substr(6));
     418    var viewType = report.viewType;
    271419   
    272420    var sites = report.sites;
     
    286434      tableRow.appendChild(tableCol);
    287435      tableRow.appendChild(getTableCellElement(year+'-'+(month)+'-'+date, 'reportdata'));
    288      
    289       var cDate = new Date(firstDate.getFullYear(), firstDate.getMonth(), firstDate.getDate());     
     436      var currentDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());     
    290437      var grandTotal = 0;
     438      var columnCounter = 0;
    291439      do
    292440      {
    293         var dataCol = getTableCellElement('', 'reportdata');
    294         if (!(cDate < siteStartDate)) dataCol = getTableCellElement('0','reportdata');
    295         var yearIndex = cDate.getFullYear();       
    296         var keyIndex;       
    297         if (siteData != null)
    298         {                   
    299           if (viewType == 'MONTH')
    300           {
    301             var monthIndex = cDate.getMonth()+1;
    302             var rowfill = monthIndex < 10 ? '0' : '';
    303             keyIndex = yearIndex + rowfill + monthIndex;           
    304           }
    305           else
    306           {
    307             var weekIndex = getWeekByDate(cDate);
    308             var rowfill = weekIndex < 10 ? '0' : '';
    309             keyIndex = yearIndex + rowfill + weekIndex;
    310           }
    311           var data = siteData[keyIndex];
    312           if (data != null)
    313           {
    314             dataCol = getTableCellElement(data, 'reportdata');           
     441        var data = 0;
     442        var keyIndex;
     443        var yearIndex = currentDate.getFullYear();
     444       
     445        if (viewType == 'YEAR')
     446        {
     447          keyIndex = yearIndex;
     448          if (siteData != null)
     449          {
     450            if (siteData[keyIndex] != null) data = siteData[keyIndex];
     451          }
     452          grandTotal += data;         
     453          if (currentDate.getFullYear() < siteStartDate.getFullYear()) data = '';
     454          else if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
     455          else sitesCombined[keyIndex] += data;
     456          currentDate.setFullYear(currentDate.getFullYear()+1);
     457        }
     458        else if (viewType == 'QUARTER')
     459        {
     460          var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
     461          var startQuarter = Math.floor(siteStartDate.getMonth()/3)+1;
     462          keyIndex = yearIndex + '' + qIndex;
     463          if (siteData != null)
     464          {
     465            if (siteData[keyIndex] != null) data = siteData[keyIndex];           
    315466          }         
    316           else
    317             data = 0;
    318           if (sitesCombined[keyIndex] != null)
    319             sitesCombined[keyIndex] += parseInt(data);
    320           else
    321             sitesCombined[keyIndex] = parseInt(data);
    322467          grandTotal += data;
    323         }
    324         tableRow.appendChild(dataCol);
     468          if ( currentDate.getFullYear() <= siteStartDate.getFullYear() && qIndex<startQuarter)
     469          {
     470            data = '';
     471            sitesCombined[keyIndex] = 0;
     472          }
     473          else if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
     474          else sitesCombined[keyIndex] += data;
     475          currentDate.setMonth(currentDate.getMonth()+3);         
     476        }
     477        else if (viewType == 'MONTH')
     478        {
     479          var monthIndex = currentDate.getMonth()+1;
     480          var rowFill = monthIndex < 10 ? '0' : '';
     481          keyIndex = yearIndex + rowFill + monthIndex;
     482          if (siteData != null)
     483          {
     484            if (siteData[keyIndex] != null) data = siteData[keyIndex];
     485          }
     486          grandTotal += data;         
     487          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && (monthIndex-1) < siteStartDate.getMonth())
     488          {
     489            data = '';           
     490          }
     491          else if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
     492          else sitesCombined[keyIndex] += data;
     493         
     494          currentDate.setMonth(currentDate.getMonth()+1);
     495        }
     496        else if (viewType == 'WEEK')
     497        {
     498          var weekIndex = getWeekByDate(currentDate);
     499          keyIndex = yearIndex + '' + weekIndex;
     500          if (siteData != null)
     501          {
     502            if (siteData[keyIndex] != null) data = siteData[keyIndex];
     503          }
     504          grandTotal += data;         
     505          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && getWeekByDate(currentDate) < getWeekByDate(siteStartDate))
     506          {
     507            data = '';
     508          }
     509          else if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
     510          else sitesCombined[keyIndex] += data;
     511          currentDate.setDate(currentDate.getDate()+7);
     512        }
    325513       
    326         var isLastCol;
    327         if (viewType == 'MONTH')
    328         {
    329           cDate.setMonth(cDate.getMonth()+1);         
    330           isLastCol = cDate > latestDate;
    331         }
    332         else
    333         {
    334           cDate.setDate(cDate.getDate()+7);
    335           isLastCol = getWeekByDate(cDate) > getWeekByDate(latestDate);
    336           isLastCol = isLastCol && (cDate > latestDate);
    337          
    338         }       
    339       }while (!isLastCol)     
     514        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
     515        columnCounter++;       
     516      }while (columnCounter< numCols)     
    340517      tableRow.appendChild(getTableCellElement(grandTotal, 'rowsummary'));
    341518      reportTable.appendChild(tableRow);
     
    347524      var reportTable = document.createElement('table');
    348525      reportTable.setAttribute('class','reporttable');
    349       reportTable.setAttribute('border','1');
     526      reportTable.setAttribute('border','1');     
    350527      return reportTable;
    351528  }
     
    434611        <tr>
    435612          <td class="stepfields">
    436             <table border="0" cellspacing="0" cellpadding="0" width="100%">
    437             <tr valign="top">
    438               <td class="prompt">View</td>
    439               <td class="input">
    440                 per Month<input type="radio" value="MONTH" checked name="view"/>&nbsp;
    441                 per Week<input type="radio" value="WEEK" name="view" />
     613            <table border="0" cellspacing="0" cellpadding="0" width="100%">           
     614            <tr>
     615              <td valign="top" class="prompt">Report period</td>
     616              <td valign="top" class="input">
     617                From<input type="text" onChange="dateOnChange()" size=7 name="fromdate"/>&nbsp;
     618                To<input type="text" onChange="dateOnChange()" size=7 name="todate" />
    442619              </td>
    443               <td class="status" id="displayInterval.status"></td>
     620              <td valign="top" class="status" id="displayInterval.status"></td>
    444621              <td class="help">
    445622                <span id="displayInterval.message" class="message" style="display: none;"></span>
    446                 Select if the posts should be viewed per month or per week.
     623                Define which period the report should cover. Empty fields will include all tubes.<br>
     624                The report will adjust itself depending on the size of the period.
     625                <ul>
     626                  <li>Period shorter then 3 months - specimens per week</li>
     627                  <li>Period shorter then 13 months - specimens per month</li>
     628                  <li>Period shorter then 3 year - specimens per quarter</li>
     629                  <li>Period is 3 year or greater - specimens per year</li>
     630                </ul>                 
    447631              </td>
    448             </tr>
     632            </tr>           
    449633            </table>
    450634          </td>
  • extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/servlet/SampleReportServlet.java

    r1492 r1494  
    33import java.io.IOException;
    44import java.text.SimpleDateFormat;
     5import java.util.ArrayList;
    56import java.util.Calendar;
    67import java.util.Date;
    7 import java.util.HashMap;
     8import java.util.GregorianCalendar;
     9import java.util.List;
    810
    911import javax.servlet.ServletException;
     
    1315
    1416import net.sf.basedb.core.Application;
     17import net.sf.basedb.core.BioMaterialEvent;
    1518import net.sf.basedb.core.DbControl;
    1619import net.sf.basedb.core.Include;
    1720import net.sf.basedb.core.ItemQuery;
    1821import net.sf.basedb.core.ItemResultIterator;
     22import net.sf.basedb.core.ItemSubtype;
    1923import net.sf.basedb.core.Sample;
    2024import net.sf.basedb.core.SessionControl;
    21 import net.sf.basedb.core.Type;
    2225import net.sf.basedb.core.query.Expressions;
    2326import net.sf.basedb.core.query.Hql;
     27import net.sf.basedb.core.query.Orders;
     28import net.sf.basedb.core.query.Restriction;
    2429import net.sf.basedb.core.query.Restrictions;
    2530import net.sf.basedb.reggie.converter.DateToStringConverter;
     31import net.sf.basedb.reggie.converter.StringToDateConverter;
    2632import net.sf.basedb.reggie.dao.Subtype;
    2733import net.sf.basedb.util.Values;
     
    3440{
    3541  private static final long serialVersionUID = 9211971419478625406L;
     42 
     43  private static final String weekView = "WEEK";
     44  private static final String monthView = "MONTH";
     45  private static final String quarterView = "QUARTER";
     46  private static final String yearView = "YEAR";
     47 
     48  private static final int weekViewLimit = 3;
     49  private static final int monthViewLimit = 13;
     50  private static final int quarterViewLimit= 3;
    3651 
    3752  public SampleReportServlet()
     
    6277      if ("samplecount".equals(cmd))
    6378      {       
    64         dc = sc.newDbControl();
    65         String columnview = Values.getString(req.getParameter("columnview"), "MONTH");       
     79        dc = sc.newDbControl();       
     80        ItemSubtype subType = Subtype.SPECIMEN.load(dc);
     81       
     82        String startDateParameter = Values.getString(req.getParameter("fdate"), null);
     83        String endDateParameter = Values.getString(req.getParameter("tdate"), null);
     84        StringToDateConverter string2DateConverter = new StringToDateConverter(new SimpleDateFormat("yyyyMMdd"));
     85        Date startDate = string2DateConverter.convert(startDateParameter);
     86        Date endDate = string2DateConverter.convert(endDateParameter);
     87       
     88        List<Restriction> restrictions = new ArrayList<Restriction>();
    6689        ItemQuery<Sample> sampleQuery = Sample.getQuery();
     90        sampleQuery.joinPermanent(Hql.innerJoin("creationEvent", "ce"));
     91       
     92        restrictions.add(Restrictions.eq(Hql.property("itemSubtype"), Hql.entity(subType)));
     93        if (endDate != null)
     94          restrictions.add(Restrictions.lteq(Hql.property("ce", "eventDate"), Expressions.parameter("endDate", endDate)));
     95        else endDate = new Date();
     96        if (startDate != null) restrictions.add(Restrictions.gteq(Hql.property("ce", "eventDate"), Expressions.parameter("startDate", startDate)));
     97        else
     98        {
     99          // Get the when the first site started
     100          for (Object obj : sites.keySet())
     101          {
     102            JSONObject site = (JSONObject)sites.get(obj);
     103            Date siteDate = string2DateConverter.convert(((String)site.get("startdate")).replaceAll("-", ""));
     104            if (siteDate != null && (startDate == null || startDate.after(siteDate))) startDate = siteDate;           
     105          }
     106        }
     107        Restriction[] restr = new Restriction[restrictions.size()];
     108        for (Restriction r : restrictions)
     109        {
     110          restr[restrictions.indexOf(r)] = r;
     111        }
     112       
     113        sampleQuery.restrict(Restrictions.and(restr));
    67114        Subtype.SPECIMEN.addFilter(sampleQuery);
     115
    68116        sampleQuery.include(Include.ALL);
     117        sampleQuery.order(Orders.asc(Hql.property("name")));
     118        sampleQuery.order(Orders.asc(Hql.property("ce", "eventDate")));
    69119        sampleQuery.setCacheResult(true);
    70120        ItemResultIterator<Sample> sampleIterator = sampleQuery.iterate(dc);       
    71        
     121               
    72122        DateToStringConverter date2StringConverter = new DateToStringConverter(new SimpleDateFormat("yyyyMMdd"));       
    73123        Date latestDate = null;
    74124        Date firstDate = null;
    75         JSONObject jsonSitesCombined = new JSONObject();       
     125        JSONObject jsonSitesCombined = new JSONObject();
     126        String viewType = null;   
    76127        while (sampleIterator.hasNext())
    77128        {
    78129          Sample s = sampleIterator.next();
    79           Date creationDate = s.getCreationEvent().getEventDate();         
    80          
     130          BioMaterialEvent creationEvent = s.getCreationEvent();
     131          Date creationDate = creationEvent.getEventDate();
    81132          if (creationDate != null)
    82133          {
    83             // Get site info
    84             String currentSitePrefix = s.getName().substring(0,2);
    85             JSONObject jsonSite = (JSONObject)jsonReport.get(currentSitePrefix);
    86             if (jsonSite == null)jsonSite = new JSONObject();
    87            
    88             // Increase the counter for current period on the site
    89             String currentPeriod = null;
    90             if (columnview.equals("MONTH"))
     134            if (viewType == null) viewType = getViewType(startDate, endDate);
     135            if (creationDate != null)
    91136            {           
    92               currentPeriod = date2StringConverter.convert(creationDate).substring(0,6);           
    93             }
    94             else
    95             {
    96               SimpleDateFormat sdf = new SimpleDateFormat("yyyyw");
    97               Calendar c = Calendar.getInstance();
    98               c.setFirstDayOfWeek(Calendar.MONDAY);
    99               c.setMinimalDaysInFirstWeek(5);
    100               sdf.setCalendar(c);
    101               DateToStringConverter date2WeekStringConverter = new DateToStringConverter(sdf);
    102               currentPeriod = date2WeekStringConverter.convert(creationDate).substring(0,6);           
     137              // Get site info
     138              String currentSitePrefix = s.getName().substring(0,2);
     139              JSONObject jsonSite = (JSONObject)jsonReport.get(currentSitePrefix);
     140              if (jsonSite == null)jsonSite = new JSONObject();
     141             
     142              // Increase the counter for current period on the site
     143              String currentPeriod = getCurrentPeriod(creationDate, viewType);                       
     144              Integer periodCounter = (Integer)jsonSite.get(currentPeriod);
     145              if (periodCounter == null) periodCounter = 0;
     146              Integer combinedCounter = (Integer)jsonSitesCombined.get(currentPeriod);
     147              if (combinedCounter == null) combinedCounter = 0;
     148              periodCounter++;
     149              combinedCounter++;
     150              jsonSite.put(currentPeriod, periodCounter);
     151              jsonSitesCombined.put(currentPeriod, combinedCounter);
     152             
     153              // Put current site info back into the report info.
     154              jsonReport.put(currentSitePrefix, jsonSite);
     155             
     156              // Find out if current creation-date is the latest so far.
     157              if (latestDate == null || latestDate.before(creationDate))
     158              {
     159                latestDate = creationDate;
     160              }
     161              /* Find out if current creation-date is the oldest so far.
     162               * Update variable if creation date isn't before start date of current site.             
     163               */
     164              if (firstDate == null || firstDate.after(creationDate))
     165              {
     166                JSONObject site = (JSONObject)sites.get(currentSitePrefix);
     167                if (site!= null)
     168                {
     169                  String siteStart = (String)site.get("startdate");
     170                  Date siteStartDate = string2DateConverter.convert(siteStart.replaceAll("-", ""));
     171                  if (!siteStartDate.after(creationDate))
     172                    firstDate = creationDate;
     173                }
     174              }         
    103175            }         
    104             Integer periodCounter = (Integer)jsonSite.get(currentPeriod);
    105             if (periodCounter == null) periodCounter = 0;
    106             Integer combinedCounter = (Integer)jsonSitesCombined.get(currentPeriod);
    107             if (combinedCounter == null) combinedCounter = 0;
    108             periodCounter++;
    109             combinedCounter++;
    110             jsonSite.put(currentPeriod, periodCounter);
    111             jsonSitesCombined.put(currentPeriod, combinedCounter);
    112            
    113             // Put current site info back into the report info.
    114             jsonReport.put(currentSitePrefix, jsonSite);
    115            
    116             // Find out if current creation-date is the latest so far.
    117             if (latestDate == null || latestDate.before(creationDate))
    118             {
    119               latestDate = creationDate;
    120             }
    121             if (firstDate == null || firstDate.after(creationDate))
    122             {
    123               firstDate = creationDate;
    124             }
    125           }         
     176          }
    126177        }
    127         jsonReport.put("firstDate", date2StringConverter.convert(firstDate));
    128         jsonReport.put("latestDate", date2StringConverter.convert(latestDate));
    129         json.put("report", jsonReport);
     178        if (jsonReport.size() > 0)
     179        {
     180          jsonReport.put("viewType", viewType);
     181          jsonReport.put("startDate", date2StringConverter.convert(startDate));
     182          jsonReport.put("endDate", date2StringConverter.convert(endDate));
     183          jsonReport.put("latestDate", date2StringConverter.convert(latestDate));
     184          json.put("report", jsonReport);
     185        }
    130186      }
    131187    }
     
    145201  }
    146202 
     203  private String getCurrentPeriod(Date currentDate, String viewType)
     204  {   
     205    String currentPeriod = null;
     206    if (viewType.equals(quarterView))
     207    {
     208      DateToStringConverter converter = new DateToStringConverter(new SimpleDateFormat("yyyy"));
     209      currentPeriod = converter.convert(currentDate);
     210      Calendar cal = GregorianCalendar.getInstance();
     211      cal.setTime(currentDate);
     212      if (cal.get(Calendar.MONTH)<3) currentPeriod += "1";
     213      else if (cal.get(Calendar.MONTH)<6) currentPeriod += "2";
     214      else if (cal.get(Calendar.MONTH) < 9) currentPeriod +="3";
     215      else currentPeriod += "4";
     216    }
     217    else
     218    {     
     219      String dateFormat = null;
     220      if (viewType.equals(weekView)) dateFormat = "yyyyw";
     221      else if (viewType.equals(monthView)) dateFormat = "yyyyMM";
     222      else dateFormat = "yyyy";
     223      DateToStringConverter converter = new DateToStringConverter(new SimpleDateFormat(dateFormat));
     224      currentPeriod = converter.convert(currentDate);
     225    }
     226   
     227    return currentPeriod;
     228  }
     229 
     230  private String getViewType(Date start, Date end)
     231  {
     232    String viewType = null;
     233   
     234    Calendar cal = GregorianCalendar.getInstance();
     235    cal.setTime(start);
     236   
     237    Calendar endCal = GregorianCalendar.getInstance();
     238    endCal.setTime(end);
     239   
     240    Calendar limitWeekView = (Calendar)cal.clone();   
     241    limitWeekView.add(Calendar.MONTH, weekViewLimit);
     242    int daysToWeekend = 9-limitWeekView.get(Calendar.DAY_OF_WEEK);
     243    limitWeekView.add(Calendar.DATE, daysToWeekend);
     244   
     245    Calendar limitMonthView = (Calendar)cal.clone();
     246    limitMonthView.add(Calendar.MONTH, monthViewLimit+1);
     247    limitMonthView.add(Calendar.DATE, -1);
     248   
     249    Calendar limitQuarterView = (Calendar)cal.clone();   
     250    limitQuarterView.add(Calendar.YEAR, quarterViewLimit);
     251    int currentQuarter = limitQuarterView.get(Calendar.MONTH)/3;
     252    limitQuarterView.add(Calendar.MONTH, (3*currentQuarter)-limitQuarterView.get(Calendar.MONTH));
     253   
     254    System.out.println(limitWeekView.getTime());       
     255    if (limitWeekView.after(endCal)) viewType = weekView;
     256    else if (limitMonthView.after(endCal)) viewType = monthView;
     257    else if (limitQuarterView.after(endCal)) viewType = quarterView;
     258    else viewType = yearView;
     259   
     260    return viewType;
     261  }
     262
    147263  @SuppressWarnings("unchecked")
    148264  private static JSONObject getJSONSites()
    149265  {
    150266    JSONObject sites = new JSONObject();
    151     JSONObject site = new JSONObject();
    152     site.put("name", "Malmö");
    153     site.put("startdate", "2010-08-30");
    154     sites.put("11", site);
    155    
    156     site = new JSONObject();
    157     site.put("name", "Lund");
    158     site.put("startdate", "2010-11-10");
    159     sites.put("22",site);
    160    
    161     site = new JSONObject();
    162     site.put("name", "Halmstad");
    163     site.put("startdate", "2010-10-01");
    164     sites.put("33",site);
    165    
    166     site = new JSONObject();
    167     site.put("name", "Helsingborg");
    168     site.put("startdate", "2010-11-01");
    169     sites.put("44",site);
    170    
    171     site = new JSONObject();
    172     site.put("name", "Kristianstad");
    173     site.put("startdate", "2010-09-15");
    174     sites.put("55",site);
    175    
    176     site = new JSONObject();
    177     site.put("name", "Karlskrona");
    178     site.put("startdate", "2010-10-04");
    179     sites.put("66",site);
    180    
    181     site = new JSONObject();
    182     site.put("name", "Växjö");
    183     site.put("startdate", "2010-10-01");
    184     sites.put("77",site);
    185    
     267    JSONObject malmoSite = new JSONObject();
     268    malmoSite.put("name", "Malmö");
     269    malmoSite.put("startdate", "2010-08-30");
     270   
     271   
     272    JSONObject lundSite = new JSONObject();
     273    lundSite.put("name", "Lund");
     274    lundSite.put("startdate", "2010-11-10");   
     275   
     276    JSONObject halmstadSite = new JSONObject();
     277    halmstadSite.put("name", "Halmstad");
     278    halmstadSite.put("startdate", "2010-10-01");   
     279   
     280    JSONObject helsingborgSite = new JSONObject();
     281    helsingborgSite.put("name", "Helsingborg");
     282    helsingborgSite.put("startdate", "2010-11-01");   
     283   
     284    JSONObject kristianstadSite = new JSONObject();
     285    kristianstadSite.put("name", "Kristianstad");
     286    kristianstadSite.put("startdate", "2010-09-15");
     287       
     288    JSONObject karlskronaSite = new JSONObject();
     289    karlskronaSite.put("name", "Karlskrona");
     290    karlskronaSite.put("startdate", "2010-10-04");   
     291   
     292    JSONObject vaxsjoSite = new JSONObject();
     293    vaxsjoSite.put("name", "Växjö");
     294    vaxsjoSite.put("startdate", "2010-10-01");   
     295       
     296    sites.put("11",halmstadSite);
     297    sites.put("22",helsingborgSite);
     298    sites.put("33", karlskronaSite);
     299    sites.put("44",kristianstadSite);
     300    sites.put("55",lundSite);
     301    sites.put("66", malmoSite);
     302    sites.put("77",vaxsjoSite);
    186303    return sites;
    187304  }
Note: See TracChangeset for help on using the changeset viewer.