diff --git a/cgireport.pas b/cgireport.pas
index a2d2f5c..9bd0c0b 100644
--- a/cgireport.pas
+++ b/cgireport.pas
@@ -5,7 +5,7 @@ unit cgiReport;
interface
uses
- Classes, SysUtils, baseconnection, extTypes;
+ Classes, SysUtils, baseconnection, extTypes, xpMemParamManagerUnit;
type
{ TReportCommand }
@@ -25,6 +25,7 @@ type
procedure Prepare; virtual;
procedure PrepareVars; virtual;
procedure FillVars;
+ procedure OnFillVariables(AVariables: TxpMemParamManager); virtual;
function Run: boolean; override;
function ParseArguments(Args: TStrings; out Errors: TStrings): boolean; override;
function ProcessOptionValues(ParamName: string; out Answer: string; out RetValue: QWORD; out OptionValues: TStrings): boolean; override;
@@ -160,6 +161,11 @@ begin
connect.Processor.ExecuteSQL(script);
end;
+procedure TReportCommand.OnFillVariables(AVariables: TxpMemParamManager);
+begin
+
+end;
+
function TReportCommand.Run: boolean;
var
i: integer;
@@ -203,7 +209,7 @@ begin
end;
fcurrentStage := 'исполняется ()';
try
- connect.ReportProcessor.ExportReport(ftPDF,fileData,@SetStage);
+ connect.ReportProcessor.ExportReport(ftPDF,fileData,@SetStage,@OnFillVariables);
except on e: Exception do
begin
connect.Processor.LogError(self,e,'ExportReport');
diff --git a/lms_cgi.lpi b/lms_cgi.lpi
index 2529cfe..ac9887b 100644
--- a/lms_cgi.lpi
+++ b/lms_cgi.lpi
@@ -76,7 +76,6 @@
-
+
+
+
+
@@ -129,6 +133,7 @@
+
diff --git a/lms_cgi_server.lpr b/lms_cgi_server.lpr
index 917b707..77705fa 100644
--- a/lms_cgi_server.lpr
+++ b/lms_cgi_server.lpr
@@ -11,7 +11,7 @@ Uses
sysutils,
DaemonApp, lazdaemonapp, cgi_mapper, cgi_daemon, tcpthreadhelper,
ConnectionsDmUnit, baseconnection, tcpserver, cgiReport, cgiDM, extTypes,
- reportDMUnit, abbrevia, lnetbase
+ reportDMUnit, abbrevia, lnetbase, applicantlist
{ add your units here };
begin
diff --git a/reportdmunit.pas b/reportdmunit.pas
index 25d0661..870d4e6 100644
--- a/reportdmunit.pas
+++ b/reportdmunit.pas
@@ -13,7 +13,7 @@ type
{ TReportDM }
TReportQuery=class;
- { TReportQuery }
+ TVariableFillProc=procedure(AVariables: TxpMemParamManager) of object;
TReportQuery=class
private
@@ -54,6 +54,8 @@ type
DetailDataSets: TStringList; // Список Detail-датасетов. В Objects - TStringList (id query + Detail-датасет(TfrxDBDataset))
ReportVariables: TxpMemParamManager;
ReportQueries: TReportQuery;
+ fOnVars: TVariableFillProc;
+
procedure CreateDBDataSet(Query:TReportQuery; EditReport: Boolean = False);
procedure CreateSignaturesDataSet(EditReport: Boolean = False);
procedure CreateLogosDataSet(EditReport: Boolean = False);
@@ -82,7 +84,8 @@ type
public
RecordID: integer;
NidbData: TNIDBDM;
- procedure ExportReport( ExportType: TExportFileType; Data: TStream; OnStage: TLogger);
+ procedure ExportReport( ExportType: TExportFileType; Data: TStream; OnStage: TLogger; OnVars: TVariableFillProc);
+
end;
var
@@ -407,6 +410,8 @@ var
SQL: string;
l: TStrings;
i: integer;
+ OptionName,
+ OptionValue: String;
begin
NidbData.log(mtDebug,self,'LoadDefaultVariables');
@@ -421,7 +426,20 @@ begin
finally
free;
end;
-
+ for i := 1 to 5 do
+ AVariables['GOU_Name'+inttostr(i)] := AVariables['GOU_Name'];
+ with NidbData.GetData('SELECT name,value from options WHERE name like ''GOU_Name%'' ') do
+ try
+ while not eof do
+ begin
+ OptionName := fieldByName('name').AsString;
+ OptionValue := AnsiString(FieldByName('Value').AsString);
+ AVariables[OptionName] := trim(OptionValue);
+ Next;
+ end;
+ finally
+ Free;
+ end;
end;
procedure TReportDM.LoadLogos(AVariables: TxpMemParamManager);
@@ -605,13 +623,14 @@ end;
procedure TReportDM.ExportReport(ExportType: TExportFileType; Data: TStream;
- OnStage: TLogger);
+ OnStage: TLogger; OnVars: TVariableFillProc);
var
I : Integer;
flt : TfrxCustomExportFilter;
v : Variant;
AVariables, AParam: TxpMemParamManager;
begin
+ fOnVars:=OnVars;
frxReport.EngineOptions.EnableThreadSafe:=true;
NidbData.log(mtDebug,self,'ExportReport');
ReportQueries := TReportQuery.Create;
@@ -624,6 +643,7 @@ begin
LoadDefaultVariables(AVariables);
LoadLogos(AVariables);
LoadVariables(AVariables,AParam);
+ if assigned(fOnVars) then fOnVars(AVariables);
frxReport.EngineOptions.DestroyForms := False;
// Создаём источники данных
if assigned(OnStage) then
diff --git a/reports/applicantlist.pas b/reports/applicantlist.pas
new file mode 100644
index 0000000..58ee617
--- /dev/null
+++ b/reports/applicantlist.pas
@@ -0,0 +1,158 @@
+unit applicantlist;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, cgiReport,xpMemParamManagerUnit;
+type
+
+ { TRepApplicantList }
+
+ TRepApplicantList=class(TReportCommand)
+ private
+ edtMode: integer;
+ cbStream: integer;
+ idYear: integer;
+ public
+ class function CommandSubClass: string; override;
+ procedure Prepare; override;
+ procedure OnFillVariables(AVariables: TxpMemParamManager); override;
+ end;
+
+implementation
+uses
+ cgiDM,dateutils,baseconnection;
+{ TRepApplicantList }
+
+class function TRepApplicantList.CommandSubClass: string;
+begin
+ Result:='applicant_list';
+end;
+
+procedure TRepApplicantList.Prepare;
+
+var
+ SQL: string;
+ filter: string;
+ DateFilter: string;
+begin
+ inherited prepare;
+ edtMode := strtointdef(self.Arguments.Keys.Values['mode'],0);
+ cbStream := strtointdef(self.Arguments.Keys.Values['stream'],0);
+ idyear := strtointdef(self.Arguments.Keys.Values['year'],0);
+ case edtMode of
+ 0: filter := ' AND a1.testready<>0 ';
+ 1: filter := ' AND (a1.testready=0) ';
+ end;
+ if cbStream = 1 then //Донабор
+ begin
+ DateFilter := Format(' AND cast(date as DATE) BETWEEN %0:s AND %1:s ',
+ [TNIDBDM.StringAsSQL(Arguments.Keys.Values['fromdate']), TNIDBDM.StringAsSQL(Arguments.Keys.Values['todate'])]);
+ end;
+ SQL := format(
+ 'DROP TABLE IF EXISTS tmp_applicant; '+
+ 'CREATE TEMPORARY TABLE tmp_applicant AS '+
+ 'SELECT '+
+ ' a.xp_key, '+
+ ' subj.Subject, '+
+ ' CONCAT_WS('' '',UPPER(a.Child_LastName),a.Child_FirstName,a.Child_MidName) AS FIO, '+
+ ' a.Child_Birth, '+
+ ' a.Child_Class, '+
+ ' CASE WHEN a.testready<>0 THEN ''годен'' ELSE ''не годен'' END AS isready, '+
+ ' COALESCE(a.coeff,1) as coeff, '+
+ ' a.sex, '+
+ ' a.child_mark, '+
+ ' a.Child_Mark_Russ, '+
+ ' a.Child_Mark_Math, '+
+ ' a.Child_Mark_Lang, '+
+ ' a.Child_Mark_Phys, '+
+ ' a.Child_Mark_Info, '+
+ ' COALESCE(NULLIF(a2.Privilege,''''),''нет'') as Privilege, '+
+ ' (SELECT GROUP_CONCAT(l.course_name SEPARATOR '', '') FROM xp_applicant_file_lang l WHERE l.mid=a.xp_key ) as languages, '+
+// ' %1:s as status, ' +
+ ' a.CauseFailure '+
+ 'FROM ( '+
+ ' SELECT a1.xp_key, '+
+ ' GROUP_CONCAT(distinct ' +
+ ' CASE WHEN np.code = ''Л'' THEN ''Указ Президента РФ от 09.05.2022 г. №268 п.3/ч.1.'' '+
+ ' WHEN np.code = ''Л1'' THEN ''Указ Президента РФ от 09.05.2022 г. №268 п.3/ч.2.'' '+
+ ' WHEN np.code = ''М'' THEN ''Федеральный закон от 29 декабря 2022 года «641-ФЗ, статья 86, часть 6.1»'' '+
+ ' WHEN np.code IS NOT NULL THEN priv.PrivilegeCode ' +
+ ' ELSE priv.PrivilegeName END order by priv.PrivilegeCode SEPARATOR '', '') AS Privilege '+
+ ' FROM xp_applicant a1 '+
+ ' LEFT JOIN xp_applicant_file_privilege priv ON priv.mid=a1.xp_key AND priv.PrivilegeCode <> ''-'' '+
+ ' LEFT JOIN c_privilege np ON np.code=priv.PrivilegeCode ' +
+ ' WHERE a1.s_year_id=%0:d AND applicant_status_id <> 4'+
+ ' AND (%1:d=COALESCE(a1.stream,0)) '+
+ filter+
+ DateFilter+
+ ' GROUP BY a1.xp_key '+
+ ') a2 '+
+ ' JOIN xp_applicant a ON a.xp_key = a2.xp_key '+
+ ' LEFT JOIN xp_subjects subj ON subj.Subject = a.Subject; ',
+ [idyear,cbStream]);
+
+ Connect.Processor.ExecuteSQL(SQL);
+ SQL :=
+ 'DROP TABLE IF EXISTS tmp_app_sex; '+
+ 'CREATE TEMPORARY TABLE tmp_app_sex AS '+
+ 'SELECT child_class, count(*) as sex_count FROM '+
+ '(SELECT child_class,sex FROM tmp_applicant WHERE sex IS NOT NULL GROUP BY child_class,sex) t '+
+ 'GROUP BY Child_class; ';
+ Connect.Processor.ExecuteSQL(SQL);
+ SQL := format(
+ 'DROP TABLE IF EXISTS tmp_members; '+
+ 'CREATE TEMPORARY TABLE tmp_members AS '+
+ ' SELECT xp_f_get_mid_fio(m.mid,0) as member FROM enroll_comitet c '+
+ ' JOIN enroll_comitet_members m ON m.enroll_comitet = c.id '+
+ 'WHERE c.school_year=%0:d AND coalesce(c.stream,0)=%1:d ORDER BY 1' ,
+ [idYear,cbStream]);
+ Connect.Processor.ExecuteSQL(SQL);
+end;
+
+
+procedure TRepApplicantList.OnFillVariables(AVariables: TxpMemParamManager);
+var
+ SQL: string;
+ Z2: string;
+begin
+ case edtMode of
+ 0: AVariables['mode'] := '';
+ 1: AVariables['mode'] := '';
+ end;
+ AVariables['mode_id'] := edtMode;
+ AVariables['Year'] := YearOf(Date);
+ SQL := format(
+ 'SELECT xp_f_get_mid_fio(c.chairman,0) as chairman , xp_f_get_mid_fio(c.deputy,0) as deputy, xp_f_get_mid_fio(c.deputy2,0) as deputy2, xp_f_get_mid_fio(c.secretary,0) as secretary '+
+ 'FROM enroll_comitet c WHERE c.school_year = %0:d AND coalesce(c.stream,0)=%1:d; ',
+ [idYear,cbStream]);
+ with connect.Processor.getData(SQL) do
+ try
+ if Not eof then
+ begin
+ AVariables['Председатель'] := (FieldByName('Chairman').AsString);
+ AVariables['Заместитель'] := (FieldByName('Deputy').AsString);
+ Z2 := (FieldByName('Deputy2').AsString);
+ AVariables['Секретарь'] := (FieldByName('Secretary').AsString);
+ end
+ else
+ begin
+ AVariables['Председатель'] := ('');
+ AVariables['Заместитель'] := ('');
+ AVariables['Секретарь'] := ('');
+ Z2 := '';
+ end;
+ AVariables['Заместитель2'] := (Z2);
+ if Z2<>'' then AVariables['zam2'] := 1 else AVariables['zam2'] := 0;
+
+ finally
+ Free;
+ end;
+
+end;
+Initialization
+ TCommandCollection.Register(TRepApplicantList);
+end.
+