00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef REPORTS_HPP
00012 #define REPORTS_HPP
00013
00014 #include <iostream>
00015 #include <iomanip>
00016 #include "cgiTemplates.h"
00017 #include "connectstring"
00018 #include "forms.h"
00019 #include "ocTypes.h"
00020 #include "ocString.h"
00021 #include "cgiTemplates.h"
00022 #include "openLogin.h"
00023
00024 #include "Report.hpp"
00025
00026 #include "superlist_base.hpp"
00027
00028 #include "col_handling_rep.hpp"
00029
00030 #include "Composite_Query.hpp"
00031
00032 #include "siteLimit.h"
00033
00034 #include "lookup.hpp"
00035
00036
00037 using namespace std;
00038
00039 class WorkItems: public list_base
00040 {
00041
00042 Composite_Query_Obj cQuery;
00043 ocString sql;
00044 string workDescription;
00045 string workUser;
00046 string workUser_Group;
00047 string workUser_Role;
00048 string workURL;
00049 string workSearch;
00050
00051 protected:
00052 ocString part( string id )
00053 {
00054 return listTemplate.getParagraph(id);
00055 }
00056
00057 public:
00058 bool setQuery( identifier key )
00059 {
00060 bool bret=false;
00061 cQuery.key(key);
00062 if(cQuery.get_data())
00063 {
00064 sql = cQuery.asSQL();
00065 bret = true;
00066 }
00067 return bret;
00068 }
00069
00070
00071 WorkItems(cgiScript&sc, Session_Obj & session):list_base(sc,session)
00072 {
00073 itemsPerPg = 9999;
00074 }
00075 ~WorkItems(){;}
00076
00077 bool list_display( string workDescription,
00078 string workUser,
00079 string workUser_Group,
00080 string workUser_Role,
00081 string workURL,
00082 string workSearch )
00083 {
00084 bool breturn = true;
00085 this->workDescription = workDescription;
00086 this->workUser = workUser;
00087 this->workUser_Group = workUser_Group;
00088 this->workUser_Role = workUser_Role;
00089 this->workURL = workURL;
00090 this->workSearch = workSearch;
00091 hotCol=-1;
00092 skipCol=0;
00093 editLink = listTemplate.getParagraph("hotcolumn");
00094 editLink = editLink.replace("$prog$","Reports.cgi").replace("_self","report");
00095
00096
00097 if( roleFilter() )
00098 {
00099 if( getData( sql ) )
00100 {
00101 webIO << "<br /><em>" << workDescription << "</em>" << endl;
00102 webIO << listTemplate.getParagraph("list_begin");
00103 emitHeadings();
00104 emitData();
00105 emitEnd();
00106 webIO << "<!--" << sql << "-->" << endl;
00107 }
00108 else
00109 {
00110 webIO << "<!--" << sql << "-->" << endl;
00111 }
00112 }
00113 return breturn;
00114 }
00115 bool roleFilter( void )
00116 {
00117
00118 ocString uid;
00119 uid.append(oLogin.Id());
00120 string gid = oLogin.GroupId();
00121
00122 bool bret=true;
00123
00124 if( workUser.length() && workUser != "-1" )
00125 {
00126
00127 if( uid != workUser )
00128 {
00129 bret=false;
00130 webIO << "<!--oLogin.Id() != " << workUser << "-->" << endl;
00131 }
00132 else
00133 {
00134 sql = sql.replaceAll("{{user}}",workUser.c_str());
00135 }
00136 }
00137 if( bret && workUser_Group.length() && workUser_Group != "-1" )
00138 {
00139
00140 if( gid != workUser_Group )
00141 {
00142 bret=false;
00143 webIO << "<!--oLogin.GroupId() != " << workUser_Group << "-->" << endl;
00144 }
00145 else
00146 {
00147 sql = sql.replaceAll("{{group}}",workUser_Group.c_str());
00148 }
00149 }
00150 if( bret && workUser_Role.length() && workUser_Role != "-1" )
00151 {
00152
00153 string sql2 = "select count(*) from user_roles where user_id = ";
00154 sql2 += uid;
00155 sql2 += " and role_id = ";
00156 sql2 += workUser_Role;
00157 string cnt = tableLookup ( sql2 );
00158 if( cnt == "0" )
00159 {
00160 bret=false;
00161 webIO << "<!--'0' role result from query: " << sql2 << "-->" << endl;
00162 }
00163 else
00164 {
00165 sql = sql.replaceAll("{{role}}",workUser_Role.c_str());
00166 }
00167 }
00168 if( bret )
00169 {
00170
00171
00172
00173 sql = sql.replaceAll( "{{login}}", uid.c_str() );
00174
00175
00176 sql = sql.replaceAll( "{{staff}}",oLogin.myStaff().c_str() );
00177
00178
00179 ocString sessionFilters = session.GetData("LoginFilters");
00180 if( sessionFilters.length() )
00181 {
00182 ocString sessionFilter = sessionFilters.parse("&");
00183 while( sessionFilter.length() )
00184 {
00185 string name = sessionFilter.parse("=");
00186 string value = sessionFilter.parse("=");
00187
00188 sql = sql.replaceAll(name,value);
00189 sessionFilter = sessionFilters.parse("&");
00190 }
00191 }
00192 }
00193
00194 return bret;
00195 }
00196
00197 list_base & emitHeadings( void )
00198 {
00199
00200 ocString head = part("tr");
00201 ocString th = part("th");
00202 for( int i=0; i < rs.getFieldCount(); ++i )
00203 {
00204 if( i != skipCol )
00205 {
00206 string heading = rs.getField(i).getName();
00207 head += th.replace( "$data$", heading.c_str() );
00208 }
00209 }
00210
00211 head += part("end_tr");
00212 webIO << head;
00213 return * this;
00214 }
00215
00216 virtual void sendField( int iField, ocString & td )
00217 {
00218 td.parseInit();
00219 string tdStart = td.parse("$data$");
00220 string tdEnd = td.parse("$data$");
00221
00222 webIO << tdStart;
00223 if( workURL.length() )
00224 {
00225 ocString workURLParts = workURL;
00226 webIO << "<a href='" << workURLParts.parse("$$") << "?Id=" << rs.getField(0).format();
00227 if( workSearch.length() )
00228 {
00229
00230 ocString searchTemplate = workSearch;
00231 string searchMore = searchTemplate.parse("{{");
00232 string column = searchTemplate.parse("}}");
00233 if( column.length() )
00234 {
00235 int col = atoi(column.c_str());
00236 searchMore += rs.getField(col).format();
00237 }
00238 webIO << "&" << searchMore;
00239 }
00240 webIO << workURLParts.remainder() << "'>";
00241 }
00242 webIO << rs.getField(iField).format();
00243 if( workURL.length() )
00244 {
00245 webIO << "</a>";
00246 }
00247 webIO << tdEnd;
00248 }
00249
00250 };
00251 class Work_List: public list_base
00252 {
00253
00254 public:
00255
00256 Work_List(cgiScript&sc, Session_Obj & session):list_base(sc,session)
00257 {
00258 itemsPerPg = 9999;
00259 }
00260 ~Work_List(){;}
00261
00262 bool list_display( void )
00263 {
00264 bool breturn = true;
00265
00266 hotCol=-1;
00267 skipCol=0;
00268 editLink = listTemplate.getParagraph("hotcolumn");
00269 editLink = editLink.replace("$prog$","Reports.cgi").replace("_self","report");
00270
00271 if( getData( "select Id, Name, Description, Query, User, User_Group, User_Role, URL, Search "
00272 "from Work order by Sequence" ) )
00273 {
00274 webIO << listTemplate.getParagraph("list_begin");
00275 emitData();
00276 emitEnd();
00277 }
00278
00279 return breturn;
00280 }
00281
00282 bool roleFilter( string workUser,
00283 string workUser_Group,
00284 string workUser_Role )
00285 {
00286
00287 ocString uid;
00288 uid.append(oLogin.Id());
00289 string gid = oLogin.GroupId();
00290
00291 bool bret=true;
00292
00293 if( workUser.length() && workUser != "-1" )
00294 {
00295
00296 if( uid != workUser )
00297 {
00298 bret=false;
00299 webIO << "<!--oLogin.Id() != " << workUser << "-->" << endl;
00300 }
00301 }
00302 if( bret && workUser_Group.length() && workUser_Group != "-1" )
00303 {
00304
00305 if( gid != workUser_Group )
00306 {
00307 bret=false;
00308 webIO << "<!--oLogin.GroupId() != " << workUser_Group << "-->" << endl;
00309 }
00310 }
00311 if( bret && workUser_Role.length() && workUser_Role != "-1" )
00312 {
00313
00314 string sql2 = "select count(*) from user_roles where user_id = ";
00315 sql2 += uid;
00316 sql2 += " and role_id = ";
00317 sql2 += workUser_Role;
00318 string cnt = tableLookup ( sql2 );
00319 if( cnt == "0" )
00320 {
00321 bret=false;
00322 webIO << "<!--'0' role result from query: " << sql2 << "-->" << endl;
00323 }
00324 }
00325 return bret;
00326 }
00327 bool derived_predata_event( void )
00328 {
00329 bool btrue = true;
00330
00331 btrue = roleFilter( rs.getField(4).format(),
00332 rs.getField(5).format(),
00333 rs.getField(6).format() );
00334 return btrue;
00335 }
00336 virtual void sendField( int iField, ocString & td )
00337 {
00338 if( iField == 1 )
00339 {
00340 td.parseInit();
00341 string tdStart = td.parse("$data$");
00342 string tdEnd = td.parse("$data$");
00343 webIO << tdStart << rs.getField(iField).format();
00344
00345 WorkItems workItems(webIO,session);
00346 workItems.copyListTemplates( listTemplate );
00347 workItems.setQuery( atoll( rs.getField(3).format().c_str() ) );
00348
00349 workItems.list_display( rs.getField(2).format(),
00350 rs.getField(4).format(),
00351 rs.getField(5).format(),
00352 rs.getField(6).format(),
00353 rs.getField(7).format(),
00354 rs.getField(8).format()
00355 );
00356
00357 webIO << tdEnd;
00358 }
00359 }
00360 };
00361 #endif
00362
00363
00364