Commit 1debb50b authored by Open Source Developer's avatar Open Source Developer

Merge branch 'develop' of https://git.minedu.gov.gr/itminedu/e-epal into pde-dde-views

parents d5e5345c ce5450a5
......@@ -172,7 +172,8 @@ class Distribution extends ControllerBase {
//print_r("<br>FETCH: " . $j);
$sCon = $this->connection->select('epal_student', 'eStudent')
->fields('eStudent', array('id', 'name', 'currentclass', 'currentepal', 'points'))
//->fields('eStudent', array('id', 'name', 'currentclass', 'currentepal', 'points'))
->fields('eStudent', array('id', 'currentclass', 'currentepal', 'second_period'))
->condition('eStudent.id', 1+ $sizeOfBlock*($j-1), '>=')
->condition('eStudent.id', $j*$sizeOfBlock, '<=');
$epalStudents = $sCon->execute()->fetchAll(\PDO::FETCH_OBJ);
......@@ -190,7 +191,8 @@ class Distribution extends ControllerBase {
if (sizeof($this->pendingStudents) != 0) {
$sCon = $this->connection->select('epal_student', 'eStudent')
->fields('eStudent', array('id', 'name', 'currentclass', 'currentepal', 'points'))
//->fields('eStudent', array('id', 'name', 'currentclass', 'currentepal', 'points'))
->fields('eStudent', array('id', 'currentclass', 'currentepal', 'second_period'))
->condition('eStudent.id', $this->pendingStudents, 'IN');
$epalStudents = $sCon->execute()->fetchAll(\PDO::FETCH_OBJ);
......@@ -361,6 +363,7 @@ class Distribution extends ControllerBase {
//'points' => $epalStudent->points,
'distribution_id' => $choice_id,
'finalized' => 1,
'second_period' => $epalStudent->second_period,
'status' => 1,
'created' => $timestamp,
'changed' => $timestamp,)
......@@ -580,25 +583,12 @@ public function checkCapacityAndArrange($epalId, $classId, $secCourId, $limitup,
}
} //endif new limit
else { //$newlimit > 0
//NEW CODE LINES
if ($this->choice_id !== 1)
$this->removeFromPendingStudents($student->student_id);
}
//END NEW CODE LINES
} //endif currentepal
} //end foreach
//NEW CODE LINES
/*
else {
foreach($students as $student)
if ($student->currentepal !== $student->epal_id)
if ($this->choice_id !== 1)
$this->removeFromPendingStudents($student->student_id);
}
*/
//END NEW CODE LINES
return SUCCESS;
......@@ -702,8 +692,6 @@ public function checkCapacityAndArrange($epalId, $classId, $secCourId, $limitup,
}
} //end if ΕΣΠΕΡΙΝΟ
} //end for each school/department
return SUCCESS;
......@@ -854,30 +842,48 @@ public function checkCapacityAndArrange($epalId, $classId, $secCourId, $limitup,
], Response::HTTP_FORBIDDEN);
}
try {
if ( $this->initializeResultsInSecondPeriod() === ERROR_DB)
return $this->respondWithStatus([
"message" => t("Unexpected Error in initializeResultsInSecondPeriod function")
], Response::HTTP_INTERNAL_SERVER_ERROR);
$sCon = $this->connection->select('epal_student', 'eStudent')
->fields('eStudent', array('id', 'currentclass', 'currentepal'))
->fields('eStudent', array('id', 'currentclass', 'currentepal', 'second_period'))
->condition('eStudent.second_period', 1 , '=');
$epalStudents = $sCon->execute()->fetchAll(\PDO::FETCH_OBJ);
//$this->globalCounterId = 10000;
//τοποθέτηση όλων των μαθητών Β' περιόδου στην πρώτη τους προτίμηση'
$this->globalCounterId = $this->retrieveLastStudentId() + 1;
if ($this->locateStudent(1, $epalStudents) === ERROR_DB)
return $this->respondWithStatus([
"message" => t("Unexpected Error in locateStudent function")
"message" => t("Unexpected Error in locateStudent function after calling locateSecondPeriodStudents method"),
"numOfDeletions" => $num
], Response::HTTP_INTERNAL_SERVER_ERROR);
if ($this->findSmallClasses() === ERROR_DB)
//επαναϋπολογισμός όλων των ολιγομελών τμημάτων (Προσοχή: αφορά ΟΛΟΥΣ τους μαθητές - κανονικής και Β΄ περιόδου)
//αρχικοποίηση flag finalize σε 1 για όλους
if ($this->setFinalize() === ERROR_DB)
return $this->respondWithStatus([
"message" => t("Unexpected Error in findSmallClasses function AFTER locateSecondPeriodStudents!")
"message" => t("Unexpected Error in setFinalize function AFTER locateSecondPeriodStudents!")
], Response::HTTP_INTERNAL_SERVER_ERROR);
//αν αποτύχει, δεν γίνεται rollback. --> Λύση: διαγρα΄φή των όποιων αποτελεσμάτων ;;
//εύρεση ολιγομελών και καταχώρηση μαθητών σε αυτά με κατάλληλη ένδειξη (finalize=0)
if ($this->findSmallClasses() === ERROR_DB) {
//αν αποτύχει, δεν γίνεται rollback. --> Λύση: διαγρα΄φή των όποιων αποτελεσμάτων
if ($this->initializeResultsInSecondPeriod() === ERROR_DB)
return $this->respondWithStatus([
"message" => t("Unexpected Error in initializeResults function AFTER findSmallClasses call Function")
], Response::HTTP_INTERNAL_SERVER_ERROR);
return $this->respondWithStatus([
"message" => t("Unexpected Error in findSmallClasses function AFTER locateSecondPeriodStudents!")
], Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
......@@ -902,10 +908,45 @@ public function checkCapacityAndArrange($epalId, $classId, $secCourId, $limitup,
}
}
private function setFinalize() {
try {
$query = $this->connection->update('epal_student_class');
$query->fields([
'finalized' => 1,
]);
$query->execute();
}
catch (\Exception $e) {
$this->logger->warning($e->getMessage());
return ERROR_DB;
}
return SUCCESS;
}
private function initializeResultsInSecondPeriod() {
//initialize/empty epal_student_class if there are already data in it!
try {
//$this->connection->delete('epal_student_class')->execute();
$con = $this->connection->prepare("delete from epal_student_class where second_period = 1 ");
$con->execute();
//$num = $con->rowCount();
}
catch (\Exception $e) {
$this->logger->warning($e->getMessage());
return ERROR_DB;
}
return SUCCESS;
}
private function retrieveLastStudentId() {
$sCon = $this->connection->select('epal_student', 'eStudent')
......
......@@ -95,19 +95,35 @@ class ReportsCreator extends ControllerBase {
], Response::HTTP_FORBIDDEN);
}
//υπολογισμός αριθμού δηλώσεων
$list = array();
//υπολογισμός αριθμού αιτήσεων
$sCon = $this->connection->select('epal_student', 'eStudent')
->fields('eStudent', array('id'));
$numApplications = $sCon->countQuery()->execute()->fetchField();
array_push($list,(object) array('name' => "Αριθμός Αιτήσεων (συνολικά)", 'numStudents' => $numApplications));
//υπολογισμός αριθμού αιτήσεων ανά τάξη
for ($i = 1; $i <= 4; $i++) {
$sCon = $this->connection->select('epal_student', 'eStudent')
->fields('eStudent', array('id'))
->condition('eStudent.currentclass', strval($i) , '=');
$numApplications = $sCon->countQuery()->execute()->fetchField();
array_push($list,(object) array('name' => "Αριθμός Αιτήσεων για " . $i . "η Τάξη", 'numStudents' => $numApplications));
}
//υπολογισμός αριθμού αιτήσεων για δεύτερη περίοδο
$sCon = $this->connection->select('epal_student', 'eStudent')
->fields('eStudent', array('id'))
->condition('eStudent.second_period', 1 , '=');
$numApplications = $sCon->countQuery()->execute()->fetchField();
array_push($list,(object) array('name' => "Αριθμός Αιτήσεων B' περιόδου", 'numStudents' => $numApplications));
//υπολογισμός αριθμού χρηστών
$sCon = $this->connection->select('epal_users', 'eUser')
->fields('eUser', array('id'));
$numUsers = $sCon->countQuery()->execute()->fetchField();
$list = array();
array_push($list,(object) array('name' => "Αριθμός Αιτήσεων", 'numStudents' => $numApplications));
array_push($list,(object) array('name' => "Αριθμός Εγγεγραμένων Χρηστών", 'numStudents' => $numUsers));
array_push($list,(object) array('name' => "Αριθμός Εγγεγραμένων Χρηστών με ρόλο Αιτούντα", 'numStudents' => $numUsers));
return $this->respondWithStatus(
......
......@@ -20,6 +20,8 @@ import { API_ENDPOINT } from '../../app.settings';
class = "loading" *ngIf="successSending == -2" >
</div>
<div style="min-height: 400px;">
<div id="emaiSentNotice" (onHidden)="onHidden()" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
......@@ -59,6 +61,8 @@ import { API_ENDPOINT } from '../../app.settings';
</button>
</div>
</div>
`
})
......
......@@ -27,7 +27,9 @@ import { API_ENDPOINT } from '../../app.settings';
//encapsulation: ViewEncapsulation.None,
template: `
<div>
<div style="min-height: 500px; ">
<h5> >Επιλογή Αναφοράς<br><br></h5>
......
......@@ -29,6 +29,7 @@ import { API_ENDPOINT } from '../../app.settings';
class = "loading" *ngIf=" distStatus === 'STARTED'" >
</div>
<div style="min-height: 400px;">
<div id="distributionNotice" (onHidden)="onHidden()" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg">
......@@ -78,7 +79,7 @@ import { API_ENDPOINT } from '../../app.settings';
<div class="col-md-6">
<button type="submit" class="btn btn-lg btn-block" *ngIf="(loginInfo$ | async).size !== 0" (click)="runDistribution()" [disabled] = "!capacityDisabled" >
<button type="submit" class="btn btn-lg btn-block" *ngIf="(loginInfo$ | async).size !== 0" (click)="runDistribution()" [disabled] = "!capacityDisabled || secondPeriodEnabled" >
Εκτέλεση Κατανομής Μαθητών<span class="glyphicon glyphicon-menu-right"></span>
</button>
</div>
......@@ -92,6 +93,8 @@ import { API_ENDPOINT } from '../../app.settings';
</div>
</div>
`
})
......
......@@ -24,12 +24,9 @@
<form novalidate [formGroup]="studentDataGroup" #form>
<p style="margin-top: 20px; line-height: 2em;"> Συμπληρώστε με κεφαλαία γράμματα τα στοιχεία του μαθητή και στη συνέχεια επιλέξτε <i>Συνέχεια</i>. <strong>Προσοχη!</strong> Συμπληρώσετε τα στοιχεία ακριβώς όπως είναι στον τελευταίο τίτλο κτήσης απολυτηρίου/ πτυχίου του μαθητή.</p>
<p style="margin-top: 20px; line-height: 2em;"> <b> Η ακρίβεια των στοιχείων που υποβάλλονται με αυτή τη δήλωση μπορεί να ελεγχθεί με βάση το αρχείο άλλων υπηρεσιών (άρθρο 8 παρ. 4 Ν. 1599/1986)</b></p>
<p style="margin-top: 20px; line-height: 2em;"> <b> Όλα τα πεδία που συνοδεύονται από (*) είναι απαραίτητο να συμπληρωθούν</b></p>
<p style="margin-top: 20px; line-height: 2em;">Συμπληρώστε με κεφαλαία γράμματα τα στοιχεία του μαθητή και στη συνέχεια επιλέξτε <i>Συνέχεια</i>. <strong>Προσοχη!</strong> Συμπληρώσετε τα στοιχεία ακριβώς όπως είναι στον τελευταίο τίτλο κτήσης απολυτηρίου/ πτυχίου του μαθητή.</p>
<p style="margin-top: 20px; line-height: 2em;"><strong>Η ακρίβεια των στοιχείων που υποβάλλονται με αυτή τη δήλωση μπορεί να ελεγχθεί με βάση το αρχείο άλλων υπηρεσιών (άρθρο 8 παρ. 4 Ν. 1599/1986).</strong></p>
<p style="margin-top: 20px; line-height: 2em;"><strong>Όλα τα πεδία που συνοδεύονται από (*) είναι απαραίτητο να συμπληρωθούν.<br/>Παρακαλούμε συμπληρώνετε τα στοιχεία με κεφαλαίους χαρακτήρες.</strong></p>
<div *ngFor="let loginInfoRow$ of loginInfo$ | async; let i=index;" style="margin-bottom: 20px;">
<div class="row evenin" style="margin: 0px 2px 0px 2px; line-height: 2em;">
......@@ -70,7 +67,7 @@
Το πεδίο δεν μπορεί να αφεθεί κενό!
</div>
<div class="alert alert-danger" *ngIf="studentDataGroup.get('regiontk').dirty && studentDataGroup.get('regiontk').hasError('pattern')">
Δεν επιτρέπονται γράμματα αλφαβήτου ή μη έγκυροι χαρακτήρες σε αυτό το πεδίο!
Ο ταχυδρομικός κώδικας αποτελείται από πέντε (5) αριθμητικά ψηφία!
</div>
</td>
<td>
......
......@@ -25,7 +25,7 @@ import { SECTOR_FIELDS_INITIAL_STATE } from '../../store/sectorfields/sectorfiel
<h4 style="margin-top: 20px; line-height: 2em; ">Οι επιλογές μου</h4>
<ul class="list-group left-side-view" style="margin-bottom: 20px;">
<li class="list-group-item active">
Τάξη εισαγωγής
Τάξη φοίτησης στο νέο σχολικό έτος
</li>
<li class="list-group-item" *ngIf="epalclass$.name === '1'">
Α’ Λυκείου
......
......@@ -19,7 +19,7 @@
</div>
</div>
<div style="min-height: 500px; margin-bottom: 30px;">
<p style="margin-top: 20px; line-height: 2em;"> <b> Στοιχεία γονέα-κηδεμόνα. Όλα τα πεδία που συνοδεύονται από (*) είναι απαραίτητο να συμπληρωθούν</b></p>
<p style="margin-top: 20px; line-height: 2em;"> <b> Στοιχεία γονέα-κηδεμόνα. Όλα τα πεδία που συνοδεύονται από (*) είναι απαραίτητο να συμπληρωθούν. Στα ονόματα επιτρέπονται μόνο κεφαλαία γράμματα.</b></p>
<form [formGroup]="formGroup">
<div class="form-group">
......@@ -38,7 +38,7 @@
Το πεδίο δεν μπορεί να αφεθεί κενό!
</div>
<div class="alert alert-danger" *ngIf="formGroup.get('userName').hasError('pattern')">
Πληκτρολογήστε το όνομά σας!
Πληκτρολογήστε το όνομά σας με κεφαλαία γράμματα!
</div>
</div>
......@@ -48,7 +48,7 @@
Το πεδίο δεν μπορεί να αφεθεί κενό!
</div>
<div class="alert alert-danger" *ngIf="formGroup.get('userSurname').hasError('pattern')">
Πληκτρολογήστε το επώνυμό σας!
Πληκτρολογήστε το επώνυμό σας με κεφαλαία γράμματα!
</div>
</div>
......@@ -58,7 +58,7 @@
Το πεδίο δεν μπορεί να αφεθεί κενό!
</div>
<div class="alert alert-danger" *ngIf="formGroup.get('userFathername').hasError('pattern')">
Πληκτρολογήστε το όνομα του πατέρα σας!
Πληκτρολογήστε το όνομα του πατέρα σας με κεφαλαία γράμματα!
</div>
</div>
......@@ -68,7 +68,7 @@
Το πεδίο δεν μπορεί να αφεθεί κενό!
</div>
<div class="alert alert-danger" *ngIf="formGroup.get('userMothername').hasError('pattern')">
Πληκτρολογήστε το όνομα της μητέρας σας!
Πληκτρολογήστε το όνομα της μητέρας σας με κεφαλαία γράμματα!
</div>
</div>
......
import { Component, OnInit, OnDestroy, Injectable, ViewChild, ElementRef, Renderer } from '@angular/core';
import { Router } from '@angular/router';
import { BehaviorSubject, Subscription, Observable } from 'rxjs/Rx';
import { VALID_EMAIL_PATTERN, VALID_NAMES_PATTERN } from '../../constants';
import { VALID_EMAIL_PATTERN, VALID_UCASE_NAMES_PATTERN } from '../../constants';
import { HelperDataService } from '../../services/helper-data-service';
import { LoginInfoActions } from '../../actions/logininfo.actions'
......@@ -37,10 +37,10 @@ import {AppSettings} from '../../app.settings';
private rd: Renderer) {
this.isModalShown = new BehaviorSubject(false);
this.formGroup = this.fb.group({
userName: ['', [Validators.pattern(VALID_NAMES_PATTERN),Validators.required]],
userSurname: ['', [Validators.pattern(VALID_NAMES_PATTERN),Validators.required]],
userFathername: ['', [Validators.pattern(VALID_NAMES_PATTERN),Validators.required]],
userMothername: ['', [Validators.pattern(VALID_NAMES_PATTERN),Validators.required]],
userName: ['', [Validators.pattern(VALID_UCASE_NAMES_PATTERN),Validators.required]],
userSurname: ['', [Validators.pattern(VALID_UCASE_NAMES_PATTERN),Validators.required]],
userFathername: ['', [Validators.pattern(VALID_UCASE_NAMES_PATTERN),Validators.required]],
userMothername: ['', [Validators.pattern(VALID_UCASE_NAMES_PATTERN),Validators.required]],
userEmail: ['', [Validators.pattern(VALID_EMAIL_PATTERN),Validators.required]],
});
this.epalUserData$ = new BehaviorSubject(<any>{userEmail: '', userName: '', userSurname: '', userFathername: '', userMothername: ''});
......
......@@ -39,10 +39,14 @@ import { BehaviorSubject, Subscription } from 'rxjs/Rx';
</div>
<div *ngIf="(SubmitedApplic$ | async).length > 0" class="row" style="margin: 10px 2px 10px 2px;">
Έχει υποβληθεί δήλωση προτίμησης ΕΠΑΛ για το νέο σχολικό έτος των παρακάτω ατόμων:
<p>Έχουν υποβληθεί οι παρακάτω δηλώσεις προτίμησης ΕΠΑΛ για το νέο σχολικό έτος.</p>
<p>Επιλέξτε το όνομα ή το επώνυμο του μαθητή για να δείτε αναλυτικά τη δήλωσή σας και να την εκτυπώσετε σε μορφή PDF.</p>
<p>Μπορείτε να διαγράψετε μία δήλωση επιλέγοντας το εικονίδιο δεξιά από το ονοματεπώνυμο.</p>
<p>Επιλέξτε "Αρχική" επάνω αριστερά αν θέλετε να ξεκινήσετε την υποβολή νέας δήλωσης προτίμησης.</p>
</div>
<div *ngIf="(SubmitedApplic$ | async).length === 0" class="row" style="margin: 10px 2px 10px 2px;">
Δεν έχετε ακόμη υποβάλλει δήλωση προτίμησης ΕΠΑΛ για το νέο σχολικό έτος
<p>Δεν έχετε ακόμη υποβάλλει δήλωση προτίμησης ΕΠΑΛ για το νέο σχολικό έτος.</p>
<p>Επιλέξτε "Αρχική" επάνω αριστερά αν θέλετε να ξεκινήσετε την υποβολή νέας δήλωσης προτίμησης.</p>
</div>
......
......@@ -39,14 +39,13 @@ export const CRITERIA_RECEIVED = 'CRITERIA_RECEIVED';
export const CRITERIA_SAVE = 'CRITERIA_SAVE';
export const CRITERIA_INIT = 'CRITERIA_INIT';
//export const VALID_NAMES_PATTERN = '[Α-ΩΆΈΉΊΎΌΏα-ωάέήίύόώ ]*$';
export const VALID_NAMES_PATTERN = '[A-Za-zΑ-ΩΆΈΉΊΙΎΌΏα-ωάέήίΐύόώ ]*$';
export const VALID_ADDRESS_PATTERN = '[0-9A-Za-zΑ-ΩΆΈΉΊΎΌΏα-ωάέήίύόώ\/. ]*$';
export const VALID_ADDRESSTK_PATTERN = '[0-9 ]*$';
// export const VALID_DIGITS_PATTERN = '69[0-9]*$';
export const VALID_DIGITS_PATTERN = '[0-9]*$';
export const VALID_TELEPHONE_PATTERN = '2[0-9]*$';
export const VALID_YEAR_PATTERN = '[0-9]*$';
export const VALID_NAMES_PATTERN = '^[A-Za-zΑ-ΩΆΈΉΊΙΎΌΏα-ωάέήίΐύόώ -]*$';
export const VALID_UCASE_NAMES_PATTERN = '^[A-ZΑ-Ω -]*$';
export const VALID_ADDRESS_PATTERN = '^[0-9A-Za-zΑ-ΩΆΈΉΊΎΌΏα-ωάέήίύόώ\/. -]*$';
export const VALID_ADDRESSTK_PATTERN = '^[0-9]{1,5}$';
export const VALID_DIGITS_PATTERN = '^[0-9]*$';
export const VALID_TELEPHONE_PATTERN = '^2[0-9]{0,10}$';
export const VALID_YEAR_PATTERN = '^(19[6789][0-9]|20[0-1][0-9])$';
export const VALID_CAPACITY_PATTERN = '[0-9]*$';
export const VALID_EMAIL_PATTERN = '[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment