various fixes, added modals, changed texts. Bundles now versioned....

various fixes, added modals, changed texts. Bundles now versioned. application_lock fully implemented
parent 3881f9c4
# Ηλεκτρονική υπηρεσία για εγγραφές και μετεγγραφές μαθητών στην Επαγγελματική Εκπαίδευση #
# Ηλεκτρονική υπηρεσία δηλώσεων προτίμησης ΕΠΑΛ για το νέο σχολικό έτος #
# Περιγραφή #
Η Ηλεκτρονική Υπηρεσία για τις εγγραφές και μετεγγραφές μαθητών στα Επαγγελματικά Λύκεια (ΕΠΑΛ) που θα αναπτυχθεί έχει ως κύριο σκοπό να παρέχει τη δυνατότητα ηλεκτρονικής δήλωσης προτίμησης των μαθητών για φοίτηση σε κάποιο από τα ΕΠΑΛ της χώρας μας, καθώς και την κατανομή τους σε αυτά με βάση συγκεκριμένα κριτήρια και λαμβάνοντας υπόψη τις προτιμήσεις τους. Η δημιουργία της υπηρεσίας θα υλοποιηθεί από την ομάδα Ανοικτού Λογισμικού του Υπουργείου Παιδείας, η οποία είναι αρμόδια για τον Σχεδιασμό, Ανάπτυξη και Συντήρηση Εφαρμογών Ανοικτού Λογισμικού του ΥΠΠΕΘ και υπάγεται στη Γενική Διεύθυνση Στρατηγικού Σχεδιασμού, Προγραμματισμού και Ηλεκτρονικής Διακυβέρνησης.
Η Ηλεκτρονική Υπηρεσία δηλώσεων προτίμησης Επαγγελματικών Λυκείων (ΕΠΑΛ) για το νέο σχολικό έτος που αναπτύσσεται έχει ως κύριο σκοπό να παρέχει τη δυνατότητα ηλεκτρονικής δήλωσης προτίμησης των μαθητών για φοίτηση σε κάποιο από τα ΕΠΑΛ της χώρας μας, καθώς και την κατανομή τους σε αυτά με βάση συγκεκριμένα κριτήρια και λαμβάνοντας υπόψη τις προτιμήσεις τους. Η δημιουργία της υπηρεσίας θα υλοποιηθεί από την ομάδα Ανοικτού Λογισμικού του Υπουργείου Παιδείας, η οποία είναι αρμόδια για τον Σχεδιασμό, Ανάπτυξη και Συντήρηση Εφαρμογών Ανοικτού Λογισμικού του ΥΠΠΕΘ και υπάγεται στη Γενική Διεύθυνση Στρατηγικού Σχεδιασμού, Προγραμματισμού και Ηλεκτρονικής Διακυβέρνησης.
Οι διαδικασίες υλοποίησης του έργου θα ακολουθήσουν τη μεθοδολογία ευέλικτης ανάπτυξης λογισμικού Agile σε πρότυπα Scrum, που υπόσχεται ανταπόκριση στις αλλαγές, παραγωγικότερες πρακτικές και λιγότερη γραφειοκρατία. Η ανταπόκριση στις αλλαγές αναφέρεται κυρίως στην συνολική ικανότητα της διαδικασίας ανάπτυξης να προσαρμόζεται ανάλογα όταν προκύπτουν αλλαγές στην πορεία του έργου, καθώς και στην ανάγκη για συνεργασία μεταξύ όλων των συμμετεχόντων. Η μέθοδος αυτή είναι μια επαναληπτική και αυξητική προσέγγιση για την ανάπτυξη έργων που επιτρέπει την προσαρμογή στις αλλαγές που προκύπτουν.
Οι διαδικασίες υλοποίησης του έργου θα ακολουθήσουν τη μεθοδολογία ευέλικτης ανάπτυξης λογισμικού Agile σε πρότυπα Scrum, που υπόσχεται ανταπόκριση στις αλλαγές, παραγωγικότερες πρακτικές και λιγότερη γραφειοκρατία. Η ανταπόκριση στις αλλαγές αναφέρεται κυρίως στην συνολική ικανότητα της διαδικασίας ανάπτυξης να προσαρμόζεται ανάλογα όταν προκύπτουν αλλαγές στην πορεία του έργου, καθώς και στην ανάγκη για συνεργασία μεταξύ όλων των συμμετεχόντων. Η μέθοδος αυτή είναι μια επαναληπτική και αυξητική προσέγγιση για την ανάπτυξη έργων που επιτρέπει την προσαρμογή στις αλλαγές που προκύπτουν.
Στην διαδικασία αυτή παρουσιάζονται οι εξής τρείς βασικοί ρόλοι: ο ιδιοκτήτης του προϊόντος (The Product Owner) είναι η Διεύθυνση Επαγγελματικής Εκπαίδευσης και υπεύθυνος ο Δ/ντης κ. Μουστάκας Γ. όπου κατέχει καθοριστικό ρόλο στην ανάπτυξη του συστήματος, εντοπίζοντας τα χαρακτηριστικά της υπηρεσίας και μεταφράζοντας τα σε μια λίστα απαιτήσεων, η ομάδα (team) που χτίζει το προιόν (μέλη της ομάδας του Ανοικτού Λογισμικού) και τέλος η ομάδα εποπτείας (Advisor Board) που αποτελείται από έμπειρα άτομα του χώρου της επαγγελματικής εκπαίδευσης με βασικό σκοπό την σύνταξη απαιτήσεων και την ιεράρχηση τους (Product Backlog).
Στην διαδικασία αυτή παρουσιάζονται οι εξής τρείς βασικοί ρόλοι: ο ιδιοκτήτης του προϊόντος (The Product Owner) είναι η Διεύθυνση Επαγγελματικής Εκπαίδευσης και υπεύθυνος ο Δ/ντης κ. Μουστάκας Γ. όπου κατέχει καθοριστικό ρόλο στην ανάπτυξη του συστήματος, εντοπίζοντας τα χαρακτηριστικά της υπηρεσίας και μεταφράζοντας τα σε μια λίστα απαιτήσεων, η ομάδα (team) που χτίζει το προιόν (μέλη της ομάδας του Ανοικτού Λογισμικού) και τέλος η ομάδα εποπτείας (Advisor Board) που αποτελείται από έμπειρα άτομα του χώρου της επαγγελματικής εκπαίδευσης με βασικό σκοπό την σύνταξη απαιτήσεων και την ιεράρχηση τους (Product Backlog).
# Περιβάλλον Ανάπτυξης#
......@@ -14,7 +14,7 @@
Μπορείτε να δείτε τις προδιαγραφές του έργου σύμφωνα με τα πρότυπα της μεθοδολογίας Agile / Scrum στο https://git.minedu.gov.gr/itminedu/e-epal/wikis/scrum
Η αναλυτική τεκμηρίωση των λειτουργικών απαιτήσεων συντηρείται στο https://git.minedu.gov.gr/itminedu/e-epal/wikis/analysis
Η αναλυτική τεκμηρίωση των λειτουργικών απαιτήσεων συντηρείται στο https://git.minedu.gov.gr/itminedu/e-epal/wikis/analysis
# Παρατηρήσεις - Σχόλια #
......@@ -22,4 +22,4 @@
# License
Code licence: [EUPL v1.1](http://ec.europa.eu/idabc/eupl.html) Content licence: [CC-BY-SA 4.0.](https://creativecommons.ellak.gr/2015/08/21/%CE%B5%CE%BD%CE%B1%CF%82-%CE%B1%CF%80%CE%BB%CF%8C%CF%82-%CE%BF%CE%B4%CE%B7%CE%B3%CF%8C%CF%82-%CE%B3%CE%B9%CE%B1-%CF%84%CE%B9%CF%82-%CE%AC%CE%B4%CE%B5%CE%B9%CE%B5%CF%82-creative-commons-4-0/)
\ No newline at end of file
Code licence: [EUPL v1.1](http://ec.europa.eu/idabc/eupl.html) Content licence: [CC-BY-SA 4.0.](https://creativecommons.ellak.gr/2015/08/21/%CE%B5%CE%BD%CE%B1%CF%82-%CE%B1%CF%80%CE%BB%CF%8C%CF%82-%CE%BF%CE%B4%CE%B7%CE%B3%CF%8C%CF%82-%CE%B3%CE%B9%CE%B1-%CF%84%CE%B9%CF%82-%CE%AC%CE%B4%CE%B5%CE%B9%CE%B5%CF%82-creative-commons-4-0/)
......@@ -43,17 +43,17 @@ function epal_mail($key, &$message, $params) {
switch ($key) {
case 'send_verification_code':
$message['from'] = \Drupal::config('system.site')->get('mail');
$message['subject'] = t('Σύστημα υποβολής αιτήσεων εγγραφής σε ΕΠΑΛ: Επιβεβαίωση e-mail', $options);
$message['subject'] = t('Σύστημα υποβολής ηλεκτρονικών δηλώσεων προτίμησης ΕΠΑΛ για το νέο σχολικό έτος: Επιβεβαίωση e-mail', $options);
$message['body'][] = $params['message'];
break;
case 'massive_mail_unallocated':
$message['from'] = \Drupal::config('system.site')->get('mail');
$message['subject'] = t('Μη ικανοποίηση ηλεκτρονικής αίτησης για εγγραφή σε ΕΠΑΛ', $options);
$message['subject'] = t('Μη ικανοποίηση ηλεκτρονικής δήλωσης προτίμησης ΕΠΑΛ', $options);
$message['body'][] = $params['message'];
break;
case 'massive_mail_located':
$message['from'] = \Drupal::config('system.site')->get('mail');
$message['subject'] = t('Ικανοποίηση ηλεκτρονικής αίτησης για εγγραφή σε ΕΠΑΛ', $options);
$message['subject'] = t('Ικανοποίηση ηλεκτρονικής δήλωσης προτίμησης ΕΠΑΛ', $options);
$message['body'][] = $params['message'];
break;
}
......
......@@ -79,6 +79,19 @@ class ApplicationSubmit extends ControllerBase
], Response::HTTP_BAD_REQUEST);
}
$epalConfigs = $this->entityTypeManager->getStorage('epal_config')->loadByProperties(array('name' => 'epal_config'));
$epalConfig = reset($epalConfigs);
if (!$epalConfig) {
return $this->respondWithStatus([
"error_code" => 3001
], Response::HTTP_FORBIDDEN);
}
if ($epalConfig->lock_application->value) {
return $this->respondWithStatus([
"error_code" => 3002
], Response::HTTP_FORBIDDEN);
}
$crypt = new Crypt();
try {
$name_encoded = $crypt->encrypt($applicationForm[0]['name']);
......
......@@ -157,7 +157,7 @@ class Distribution extends ControllerBase {
while ($this->choice_id <= $numDistributions) {
//υπολογισμός πλήθους non-finalized αιτήσεων για να καθοριστεί ο αριθμός των fetches που θα κάνουμε με συγκεκριμένο sizeOfBlock
//υπολογισμός πλήθους non-finalized δηλώσεων για να καθοριστεί ο αριθμός των fetches που θα κάνουμε με συγκεκριμένο sizeOfBlock
if ($this->choice_id === 1) {
$sCon = $this->connection->select('epal_student', 'eStudent')
->fields('eStudent', array('id'));
......
......@@ -267,31 +267,20 @@ class InformUnlocatedStudents extends ControllerBase {
. " δεν ικανοποιήθηκε. Παρακαλώ επικοινωνήστε άμεσα τηλεφωνικά με τη Διεύθυνση Δευτεροβάθμιας Εκπαίδευσης / Τμήμα Επαγγελματικής Εκπαίδευσης."
. "\r\n\r\n Ομάδα Διαχείρισης της εφαρμογής e-epal."
. "\r\n Προσοχή: το μήνυμα που διαβάζετε είναι αυτοματοποιημένο. Παρακαλώ μην απαντάτε σε αυτό το μήνυμα.." ;//e-mail body" ;//e-mail body
//add new lines with SENDER name - check it
//$params['subject'] = t('Μη ικανοποίηση ηλεκτρονικής αίτησης για εγγραφή σε ΕΠΑΛ');
//$this->logger->warning($params['message']);
//$langcode = $user->getPreferredLangcode();
$send = true;
$mail_sent = $mailManager->mail($module, $key, $to, $langcode, $params, NULL, $send);
//$mail_sent = 1;
if ($mail_sent) {
//$this->logger->info("Το mail στάλθηκε με επιτυχία");
return 1;
}
else {
//$this->logger->info("Αποτυχία αποστολής mail.");
return 0;
}
}
public function sendMailToLocatedStudents(Request $request) {
//$msg = "test";
try {
if (!$request->isMethod('GET')) {
return $this->respondWithStatus([
......
......@@ -174,9 +174,9 @@ class PDFCreator extends ControllerBase {
private function createHeader($student) {
$this->pdf->SetFont($this->fontBold, '', 16);
$this->pdf->MultiCell(0, 8, $this->prepareString('Ηλεκτρονική Αίτηση Εγγραφής Μαθητή σε ΕΠΑΛ'), 0, 'C');
$this->pdf->MultiCell(0, 8, $this->prepareString('Ηλεκτρονική Δήλωση Προτίμησης ΕΠΑΛ'), 0, 'C');
$this->pdf->SetFont($this->fontBold, '', $this->fontSizeHeader);
$this->pdf->MultiCell(0, 8, $this->prepareString('με αριθμό αίτησης: ' . $student->id->value . ' / ' . date('d-m-y (ώρα: H:i:s)', $student->created->value)), 0, 'C');
$this->pdf->MultiCell(0, 8, $this->prepareString('με αριθμό δήλωσης: ' . $student->id->value . ' / ' . date('d-m-y (ώρα: H:i:s)', $student->created->value)), 0, 'C');
$this->pdf->Ln();
}
......@@ -391,7 +391,7 @@ class PDFCreator extends ControllerBase {
$this->pdf->Ln();
$this->pdf->SetFont($this->fontLight, '', $this->fontSizeRegular);
$this->pdf->Cell($width+15, $height, $this->prepareString('Αίτηση από:'), 0, 'L');
$this->pdf->Cell($width+15, $height, $this->prepareString('Δήλωση από:'), 0, 'L');
$this->pdf->SetFont($this->fontBold, '', $this->fontSizeRegular);
//$this->pdf->Cell($width, $height, $this->prepareString($student->relationtostudent->value), 0, 'L');
$this->pdf->Cell($width, $height, $this->prepareString($relationtostudent_decoded), 0, 'L');
......
......@@ -94,12 +94,12 @@ class ReportsCreator extends ControllerBase {
], Response::HTTP_FORBIDDEN);
}
//υπολογισμός αριθμού αιτήσεων
//υπολογισμός αριθμού δηλώσεων
$sCon = $this->connection->select('epal_student', 'eStudent')
->fields('eStudent', array('id'));
$numTotal = $sCon->countQuery()->execute()->fetchField();
//υπολογισμός αριθμού αιτήσεων που ικανοποιήθηκαν στην i προτίμηση
//υπολογισμός αριθμού δηλώσεων που ικανοποιήθηκαν στην i προτίμηση
$numData = array();
for ($i=0; $i < 3; $i++) {
$sCon = $this->connection->select('epal_student_class', 'eStudent')
......@@ -109,7 +109,7 @@ class ReportsCreator extends ControllerBase {
array_push($numData, $sCon->countQuery()->execute()->fetchField());
}
// υπολογισμός αριθμού αιτήσεων που ΔΕΝ ικανοποιήθηκαν
// υπολογισμός αριθμού δηλώσεων που ΔΕΝ ικανοποιήθηκαν
//Σημείωση: υπολογισμός με queries στη βάση
$sCon = $this->connection->select('epal_student_class', 'eStudent')
->fields('eStudent', array('student_id'));
......@@ -122,7 +122,7 @@ class ReportsCreator extends ControllerBase {
->condition('eStudent.id', $studentIds, 'NOT IN');
$numNoAllocated = $sCon->countQuery()->execute()->fetchField();
//υπολογισμός αριθμού αιτήσεων που τοποθετήθηκαν προσωρινά σε ολιγομελή τμήματα
//υπολογισμός αριθμού δηλώσεων που τοποθετήθηκαν προσωρινά σε ολιγομελή τμήματα
$numInSmallClasses = 0;
$sCon = $this->connection->select('epal_student_class', 'eStudent')
->fields('eStudent', array('id'))
......@@ -132,7 +132,7 @@ class ReportsCreator extends ControllerBase {
$list = array();
array_push($list,(object) array('name' => "Αριθμός Αιτήσεων", 'numStudents' => $numTotal));
array_push($list,(object) array('name' => "Αριθμός Δηλώσεων Προτίμησης", 'numStudents' => $numTotal));
array_push($list,(object) array('name' => "Αριθμός μαθητών που τοποθετήθηκαν στην πρώτη τους προτίμηση", 'numStudents' => $numData[0]));
array_push($list,(object) array('name' => "Αριθμός μαθητών που τοποθετήθηκαν στην δεύτερή τους προτίμηση", 'numStudents' => $numData[1]));
array_push($list,(object) array('name' => "Αριθμός μαθητών που τοποθετήθηκαν στην τρίτη τους προτίμηση", 'numStudents' => $numData[2]));
......
......@@ -31,7 +31,9 @@ import {HelperDataService} from './services/helper-data-service';
import {LoaderService} from './services/Spinner.service';
import {AuthService} from './services/auth.service';
import SchoolAuthGuard from './guards/school.auth.guard';
import SchoolStudentsLockedGuard from './guards/school.students.locked.guard';
import StudentAuthGuard from './guards/student.auth.guard';
import StudentLockGuard from './guards/student.lock.guard';
import RegionEduAuthGuard from './guards/regionedu.auth.guard';
import EduAdminAuthGuard from './guards/eduadmin.auth.guard';
import MinistryAuthGuard from './guards/ministry.auth.guard';
......@@ -85,7 +87,9 @@ class MyLocalization extends NgLocalization {
LoaderService,
AuthService,
SchoolAuthGuard,
SchoolStudentsLockedGuard,
StudentAuthGuard,
StudentLockGuard,
RegionEduAuthGuard,
EduAdminAuthGuard,
MinistryAuthGuard
......
<div class="loading" *ngIf="(showLoader$ | async) === true"></div>
<div id="headerNotice" (onHidden)="onHidden()" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header {{modalHeader | async}}">
<h3 class="modal-title pull-left"><i class="fa fa-check-square-o"></i>&nbsp;&nbsp;{{ modalTitle | async }}</h3>
<button type="button" class="close pull-right" aria-label="Close" (click)="hideModal()">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header {{modalHeader | async}}">
<h3 class="modal-title pull-left"><i class="fa fa-check-square-o"></i>&nbsp;&nbsp;{{ modalTitle | async }}</h3>
<button type="button" class="close pull-right" aria-label="Close" (click)="hideModal()">
<span aria-hidden="true"><i class="fa fa-times"></i></span>
</button>
</div>
<div class="modal-body">
<p>{{ modalText | async }}</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default pull-left" data-dismiss="modal">Κλείσιμο</button>
</div>
</div>
<div class="modal-body">
<p>{{ modalText | async }}</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default pull-left" data-dismiss="modal">Κλείσιμο</button>
</div>
</div>
</div>
</div>
</div>
<div class="header-wrapper">
<header id="navbar" role="banner" class="navbar navbar-default">
<div *ngIf="(loginInfo$ | async).size > 0">
<ul class="navbar-nav">
<div *ngIf="(loginInfo$ | async).cu_name !== ''">
<div class="row">
<div class="offset-md-8 col-md-4 pull-right">
<span class="username">{{ cuName }}&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="signout isclickable" (click)="signOut()" style="color:#CC3300;">Αποσύνδεση&nbsp;&nbsp;</span>
<i class="fa fa-sign-out isclickable" (click)="signOut()"></i>
<header id="navbar" role="banner" class="navbar navbar-default">
<div class="container">
<div *ngIf="(loginInfo$ | async).size > 0">
<ul class="navbar-nav">
<div *ngIf="(loginInfo$ | async).cu_name !== ''">
<div class="row">
<div class="col-md-2">
<i class="fa fa-home isclickable" (click)="goHome()"></i>
<span class="signout isclickable" (click)="goHome()" style="color:#CC3300;">&nbsp;&nbsp;Αρχική</span>
</div>
<div class="col-md-6">&nbsp;</div>
<div class="col-md-4" style="text-align: right">
<span class="username" style="text-align: right">{{ cuName }}&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="signout isclickable" style="text-align: right" (click)="signOut()" style="color:#CC3300;">Αποσύνδεση&nbsp;&nbsp;</span>
<i class="fa fa-sign-out isclickable" style="text-align: right" (click)="signOut()"></i>
</div>
</div>
</div>
</ul>
</div>
</div>
</div>
</ul>
</div>
</header>
</div>
\ No newline at end of file
</header>
</div>
......@@ -18,8 +18,8 @@ import { CriteriaActions } from "../../actions/criteria.actions";
import { StudentDataFieldsActions } from "../../actions/studentdatafields.actions";
@Component({
selector: "reg-header",
templateUrl: "header.component.html"
selector: "reg-header",
templateUrl: "header.component.html"
})
export default class HeaderComponent implements OnInit, OnDestroy {
private authToken: string;
......@@ -32,28 +32,28 @@ export default class HeaderComponent implements OnInit, OnDestroy {
private modalText: BehaviorSubject<string>;
private modalHeader: BehaviorSubject<string>;
constructor( private _ata: LoginInfoActions,
private _hds: HelperDataService,
private _csa: SectorCoursesActions,
private _sfa: SectorFieldsActions,
private _rsa: RegionSchoolsActions,
private _eca: EpalClassesActions,
private _sdfa: StudentDataFieldsActions,
private _cria: CriteriaActions,
private _ngRedux: NgRedux<IAppState>,
private router: Router
) {
constructor(private _ata: LoginInfoActions,
private _hds: HelperDataService,
private _csa: SectorCoursesActions,
private _sfa: SectorFieldsActions,
private _rsa: RegionSchoolsActions,
private _eca: EpalClassesActions,
private _sdfa: StudentDataFieldsActions,
private _cria: CriteriaActions,
private _ngRedux: NgRedux<IAppState>,
private router: Router
) {
this.authToken = "";
this.authRole = "";
this.cuName = "";
this.loginInfo$ = new BehaviorSubject(LOGININFO_INITIAL_STATE);
this.showLoader$ = new BehaviorSubject(false);
this.modalTitle = new BehaviorSubject("");
this.modalText = new BehaviorSubject("");
this.modalHeader = new BehaviorSubject("");
this.authToken = "";
this.authRole = "";
this.cuName = "";
this.loginInfo$ = new BehaviorSubject(LOGININFO_INITIAL_STATE);
this.showLoader$ = new BehaviorSubject(false);
this.modalTitle = new BehaviorSubject("");
this.modalText = new BehaviorSubject("");
this.modalHeader = new BehaviorSubject("");
};
};
ngOnInit() {
(<any>$("#headerNotice")).appendTo("body");
......@@ -86,19 +86,19 @@ export default class HeaderComponent implements OnInit, OnDestroy {
// this.router.navigate(['/school']);
this.authToken = "";
this.authRole = "";
window.location.assign((<any> data).next);
window.location.assign((<any>data).next);
}
else if (this.authRole === PDE_ROLE) {
// this.router.navigate(["/school"]);
this.authToken = "";
this.authRole = "";
window.location.assign((<any> data).next);
window.location.assign((<any>data).next);
}
else if (this.authRole === DIDE_ROLE) {
// this.router.navigate(["/school"]);
this.authToken = "";
this.authRole = "";
window.location.assign((<any> data).next);
window.location.assign((<any>data).next);
}
else if (this.authRole === STUDENT_ROLE) {
this._eca.initEpalClasses();
......@@ -121,6 +121,24 @@ export default class HeaderComponent implements OnInit, OnDestroy {
});
}
goHome() {
if (this.authRole === SCHOOL_ROLE) {
this.router.navigate(['/school']);
}
else if (this.authRole === PDE_ROLE) {
this.router.navigate(["/school"]);
}
else if (this.authRole === DIDE_ROLE) {
this.router.navigate(["/school"]);
}
else if (this.authRole === STUDENT_ROLE) {
this.router.navigate([""]);
}
else if (this.authRole === MINISTRY_ROLE) {
this.router.navigate(["/ministry"]);
}
}
public showModal(): void {
(<any>$("#headerNotice")).modal("show");
}
......
......@@ -28,7 +28,7 @@ import { API_ENDPOINT, API_ENDPOINT_PARAMS } from '../app.settings';
<div *ngIf="!authToken" class="col-md-8 offset-md-4">
<button type="submit" class="btn-primary btn-lg" (click)="form.submit()">
Είσοδος μέσω TaxisNet<span class="glyphicon glyphicon-menu-right"></span>
Είσοδος μέσω TaxisNet
</button>
</div>
</div>
......@@ -64,23 +64,19 @@ export default class Home implements OnInit {
};
ngOnInit() {
/* this.authToken = this.getCookie('auth_token');
this.authRole = this.getCookie('auth_role');
console.log(this.authToken);
console.log(this.authRole);
if (this.authToken && this.authRole) {
this._ata.getloginInfo({ auth_token: this.authToken, auth_role: this.authRole });
this.removeCookie('auth_token');
this.removeCookie('auth_role');
} */
this.loginInfo$ = this._ngRedux.select(state => {
if (state.loginInfo.size > 0) {
state.loginInfo.reduce(({}, loginInfoToken) => {
this.authToken = loginInfoToken.auth_token;
this.authRole = loginInfoToken.auth_role;
if (this.authToken && this.authToken.length > 0 && this.authRole && this.authRole === STUDENT_ROLE)
this.router.navigate(['/parent-form']);
if (this.authToken && this.authToken.length > 0 && this.authRole && this.authRole === STUDENT_ROLE) {
if (loginInfoToken.lock_application === 1)
this.router.navigate(['/info']);
else {
this.router.navigate(['/parent-form']);
}
}
return loginInfoToken;
}, {});
}
......@@ -93,8 +89,6 @@ export default class Home implements OnInit {
if (params) {
this.authToken = params['auth_token'];
this.authRole = params['auth_role'];
// console.log(this.authToken);
// console.log(this.authRole);
}
if (this.authToken && this.authRole)
......
......@@ -7,14 +7,14 @@ import { Router } from '@angular/router';
@Component({
selector: 'breadcrumbs',
template: `
<div [hidden]="currentUrl !== '/epal-class-select'" class="col-sm-12"><p class="crumb" >Νέα Αίτηση -> Επιλογή Τάξης </p></div>
<div [hidden]="currentUrl !== '/sector-fields-select'" class="col-sm-12"><p class="crumb" >Νέα Αίτηση -> Επιλογή Τoμέα</p></div>
<div [hidden]="currentUrl !== '/region-schools-select'" class="col-sm-12"><p class="crumb" >Νέα Αίτηση -> Επιλογή Σχολείου ανα Περιφερειακή Διεύθυνση</p></div>
<div [hidden]="currentUrl !== '/sectorcourses-fields-select'" class="col-sm-12"><p class="crumb" >Νέα Αίτηση -> Επιλογή Ειδικότητας ανα τoμέα</p></div>
<div [hidden]="currentUrl !== '/schools-order-select'" class="col-sm-12"><p class="crumb" >Νέα Αίτηση -> Σειρά Προτίμησης Επιλεχθέντων Σχολείων</p></div>
<div [hidden]="currentUrl !== '/student-application-form-main'" class="col-sm-12"><p class="crumb" >Νέα Αίτηση -> Προσωπικά Στοιχεία</p></div>
<div [hidden]="currentUrl !== '/application-submit'" class="col-sm-12"><p class="crumb" >Νέα Αίτηση -> Προεπισκόπη αίτησης</p></div>
<div [hidden]="currentUrl !== '/submited-preview'" class="col-sm-12"><p class="crumb" > Υποβληθείσες αιτήσεις</p></div>
<div [hidden]="currentUrl !== '/epal-class-select'" class="col-sm-12"><p class="crumb" >Νέα Δήλωση Προτίμησης -> Επιλογή Τάξης </p></div>
<div [hidden]="currentUrl !== '/sector-fields-select'" class="col-sm-12"><p class="crumb" >Νέα Δήλωση Προτίμησης -> Επιλογή Τoμέα</p></div>
<div [hidden]="currentUrl !== '/region-schools-select'" class="col-sm-12"><p class="crumb" >Νέα Δήλωση Προτίμησης -> Επιλογή Σχολείου ανα Περιφερειακή Διεύθυνση</p></div>
<div [hidden]="currentUrl !== '/sectorcourses-fields-select'" class="col-sm-12"><p class="crumb" >Νέα Δήλωση Προτίμησης -> Επιλογή Ειδικότητας ανα τoμέα</p></div>
<div [hidden]="currentUrl !== '/schools-order-select'" class="col-sm-12"><p class="crumb" >Νέα Δήλωση Προτίμησης -> Σειρά Προτίμησης Επιλεχθέντων Σχολείων</p></div>
<div [hidden]="currentUrl !== '/student-application-form-main'" class="col-sm-12"><p class="crumb" >Νέα Δήλωση Προτίμησης -> Προσωπικά Στοιχεία</p></div>
<div [hidden]="currentUrl !== '/application-submit'" class="col-sm-12"><p class="crumb" >Νέα Δήλωση Προτίμησης -> Προεπισκόπηση Δήλωσης Προτίμησης</p></div>
<div [hidden]="currentUrl !== '/submited-preview'" class="col-sm-12"><p class="crumb" > Υποβληθείσες Δηλώσεις Προτίμησης</p></div>
<div [hidden]="currentUrl !== '/ministry'" class="col-sm-12"><p class="crumb" > Διαχειριστής Υπουργείου Παιδείας -> Σύνδεση</p></div>
......
......@@ -80,7 +80,7 @@ import {
(click)="toggleApplicantsLogin()" >
</div>
<div class="col-md-9">
<label for="applicantsLoginDisabled">Απενεργοποίηση δυνατότητας αίτησης μαθητών</label>
<label for="applicantsLoginDisabled">Απενεργοποίηση δυνατότητας υποβολής δήλωσης προτίμησης ΕΠΑΛ</label>
</div>
</div>
<br>
......
......@@ -14,12 +14,12 @@
<div class="row">
<div *ngIf="(loginInfo$ | async).size > 0" class="nav-item" [ngClass]="{active: path=='submited-preview'}">
<li *ngIf="authRole=='student'"class="nav-item" >
<a class="nav-link" [routerLink]="['/submited-preview']" [routerLinkActive]="['active']"><b>Υποβληθείσες αιτήσεις</b></a>
<a class="nav-link" [routerLink]="['/submited-preview']" [routerLinkActive]="['active']"><b>Υποβληθείσες δηλώσεις</b></a>
</li>
</div>
<div *ngIf="(loginInfo$ | async).size > 0" class="nav-item" [ngClass]="{active: path=='submited-preview'}">
<li *ngIf="authRole=='director'" class="nav-item" >
<a class="nav-link" [routerLink]="['/school/director-view']" [routerLinkActive]="['active']"><b>Επιλεχθέντες Μαθητές</b></a>
<a class="nav-link" [routerLink]="['/school/director-view']" [routerLinkActive]="['active']"><b>Δηλώσεις Μαθητών στο ΕΠΑΛ</b></a>
</li>
</div>
<div *ngIf="(loginInfo$ | async).size > 0" class="nav-item" [ngClass]="{active: path=='submited-preview'}">
......
......@@ -22,7 +22,7 @@ import { StudentDataFieldsActions } from '../../actions/studentdatafields.action
<div class="row" style="margin-top: 130px; margin-bottom: 200px;">
<div class="col-md-3 offset-md-3">
<button type="submit" class="btn-primary btn-lg btn-block isclickable" style="margin: 0px; font-size: 1em; padding: 5px; height: 6em;" (click)="submittedView()">
Εμφάνιση<br />Εκτύπωση<br />Αίτησης
Εμφάνιση<br />Εκτύπωση<br />Δήλωσης<br />Προτίμησης
</button>
</div>
<div class="col-md-6">
......
......@@ -206,7 +206,7 @@
<div class="form-group">
<label for="relationtostudent">Η αίτηση γίνεται από:(<span style="color: #ff0000;">*</span>)</label><br/>
<label for="relationtostudent">Η δήλωση προτίμησης γίνεται από:(<span style="color: #ff0000;">*</span>)</label><br/>
<select class="form-control" formControlName="relationtostudent">
<option value="">Παρακαλώ επιλέξτε...</option>
<option value="Γονέας/Κηδεμόνας">Γονέας/Κηδεμόνας</option>
......
......@@ -198,7 +198,7 @@ import {
// if (this.studentDataGroup.invalid || this.studentCriteriaGroup.invalid) {
if (this.studentDataGroup.invalid || this.invalidFormData()) {
this.modalHeader.next("modal-header-danger");
this.modalTitle.next("Η αίτηση δεν είναι πλήρης");
this.modalTitle.next("Η δήλωση προτίμησης δεν είναι πλήρης");
if (this.invalidFormData())
this.modalText.next("Πρέπει να συμπληρώσετε όλα τα πεδία που συνοδεύονται από (*). Το σχολείο τελευταίας φοίτησης πρέπει να αναζητηθεί και να επιλεχθεί από τα αποτελέσματα της αναζήτησης.");
else
......@@ -240,7 +240,7 @@ import {
return {
date: {
year: d ? parseInt(d.substr(0,4)) : 0,
month: d ? parseInt(d.substr(6,8)) : 0,
month: d ? parseInt(d.substr(5,7)) : 0,
day: d ? parseInt(d.substr(8,10)) : 0
}
};
......
......@@ -98,7 +98,7 @@ import { HelperDataService } from '../../services/helper-data-service';
<div *ngIf="studentDataField$.lastschool_class === 3"><label for="lastschool_class">Τάξη τελευταίας φοίτησης</label> <p class="form-control" style="border:1px solid #eceeef;">Γ'</p></div>
<div *ngIf="studentDataField$.lastschool_class === 4"><label for="lastschool_class">Τάξη τελευταίας φοίτησης</label> <p class="form-control" style="border:1px solid #eceeef;">Δ'</p></div>
<div><label for="relationtostudent">Η αίτηση γίνεται από</label> <p class="form-control" style="border:1px solid #eceeef;"> {{studentDataField$.relationtostudent}} </p></div>
<div><label for="relationtostudent">Η δήλωση προτίμησης γίνεται από</label> <p class="form-control" style="border:1px solid #eceeef;"> {{studentDataField$.relationtostudent}} </p></div>
<div><label for="telnum">Τηλέφωνο επικοινωνίας</label> <p class="form-control" style="border:1px solid #eceeef;"> {{studentDataField$.telnum}} </p></div>
</div>
<div class="row" style="margin-top: 20px; margin-bottom: 20px;">
......@@ -353,43 +353,48 @@ import { HelperDataService } from '../../services/helper-data-service';
this._rsa.initRegionSchools();
this._csa.initSectorCourses();
this._sdfa.initStudentDataFields();
mTitle = "Υποβολή Αίτησης Εγγραφής";
mText = "Η υποβολή της αίτησής σας πραγματοποιήθηκε. Μπορείτε να την εκτυπώσετε από την επιλογή 'Εμφάνιση - Εκτύπωση Αίτησης'. Θα ειδοποιηθείτε στο e-mail που δηλώσατε για την εξέλιξη της αίτησής σας.";
mTitle = "Υποβολή Δήλωσης Προτίμησης";
mText = "Η υποβολή της αίτησής σας πραγματοποιήθηκε. Μπορείτε να την εκτυπώσετε από την επιλογή 'Εμφάνιση - Εκτύπωση Δήλωσης Προτίμησης'. Θα ειδοποιηθείτε στο e-mail που δηλώσατε για την εξέλιξη της αίτησής σας.";
mHeader = "modal-header-success";
break;
case 1001:
mTitle = "Αποτυχία Υποβολής Αίτησης";
mTitle = "Αποτυχία Υποβολής Δήλωσης Προτίμησης";
mText = "Δεν έχετε αποδεχθεί τους όρους χρήσης";
mHeader = "modal-header-danger";
break;
case 1002:
mTitle = "Αποτυχία Υποβολής Αίτησης";
mTitle = "Αποτυχία Υποβολής Δήλωσης Προτίμησης";
mText = "Ελέξτε τη φόρμα σας. Υπάρχουν λάθη - ελλείψεις που δεν επιτρέπουν την υποβολή.";
mHeader = "modal-header-danger";
break;
case 1003:
mTitle = "Αποτυχία Υποβολής Αίτησης";
mTitle = "Αποτυχία Υποβολής Δήλωσης Προτίμησης";
mText = "Ελέξτε τη φόρμα σας. Η ημερομηνία γέννησης δεν είναι έγκυρη.";
mHeader = "modal-header-danger";
break;
case 3002:
mTitle = "Αποτυχία Υποβολής Δήλωσης Προτίμησης";
mText = "Το σύστημα δεν δέχεται υποβολή δηλώσεων αυτή την περίοδο.";
mHeader = "modal-header-danger";
break;
case 8000:
case 8001:
mTitle = "Αποτυχία Υποβολής Αίτησης";
mTitle = "Αποτυχία Υποβολής Δήλωσης Προτίμησης";
mText = "Προέκυψε σφάλμα κατά τη διάρκεια ελέγχου των στοιχείων φοίτησης σας. Παρακαλώ δοκιμάστε ξανά ή προσπαθήστε αργότερα. Εάν το πρόβλημα συνεχίσει να υφίσταται, επικοινωνήστε με την ομάδα υποστήριξης.";
mHeader = "modal-header-danger";
break;
case 8002:
mTitle = "Αποτυχία Υποβολής Αίτησης";
mTitle = "Αποτυχία Υποβολής Δήλωσης Προτίμησης";
mText = "Τα στοιχεία φοίτησης που υποβάλλατε δεν επικυρώθηκαν. Παρακαλώ ελέγξτε τη φόρμα σας και προσπαθήστε ξανά. Εάν το θέμα συνεχίσει να υφίσταται, επικοινωνήστε με την ομάδα υποστήριξης.";
mHeader = "modal-header-danger";
break;
case 8003:
mTitle = "Αποτυχία Υποβολής Αίτησης";
mTitle = "Αποτυχία Υποβολής Δήλωσης Προτίμησης";
mText = "Τα στοιχεία φοίτησης που υποβάλλατε δεν είναι έγκυρα. Παρακαλώ ελέγξτε τη φόρμα σας και προσπαθήστε ξανά. Εάν το θέμα συνεχίσει να υφίσταται, επικοινωνήστε με την ομάδα υποστήριξης.";
mHeader = "modal-header-danger";
break;
default:
mTitle = "Αποτυχία Υποβολής Αίτησης";
mTitle = "Αποτυχία Υποβολής Δήλωσης Προτίμησης";
mText = "Ελέξτε τη φόρμα σας. Υπάρχουν λάθη - ελλείψεις που δεν επιτρέπουν την υποβολή.";
mHeader = "modal-header-danger";
}
......@@ -402,8 +407,8 @@ import { HelperDataService } from '../../services/helper-data-service';
error => {
(<any>$('.loading')).remove();
this.modalHeader.next("modal-header-danger");
this.modalTitle.next("Υποβολή Αίτησης Εγγραφής");
this.modalText.next("Η υποβολή της αίτησής σας απέτυχε. Παρακαλούμε προσπαθήστε πάλι και αν το πρόβλημα συνεχίσει να υφίσταται, επικοινωνήστε με την ομάδα υποστήριξης.");
this.modalTitle.next("Υποβολή Δήλωσης Προτίμησης");
this.modalText.next("Η υποβολή της δήλωσης προτίμησης απέτυχε. Παρακαλούμε προσπαθήστε πάλι και αν το πρόβλημα συνεχίσει να υφίσταται, επικοινωνήστε με την ομάδα υποστήριξης.");
this.showModal();
this.showLoader.next(false);
console.log("Error HTTP POST Service")
......
import { Component, OnInit } from '@angular/core';
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Router } from '@angular/router';
import { Observable } from 'rxjs/Rx';
import { Observable, BehaviorSubject } from 'rxjs/Rx';
import { Injectable } from "@angular/core";
import { EpalClassesActions } from '../../actions/epalclass.actions';
import { NgRedux, select } from 'ng2-redux';
......@@ -23,23 +23,41 @@ import {AppSettings} from '../../app.settings';
<div class="row">
<breadcrumbs></breadcrumbs>
</div>
<div id="epalClassNotice" (onHidden)="onHidden()" class="modal" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header {{modalHeader | async}}">
<h3 class="modal-title pull-left"><i class="fa fa-check-square-o"></i>&nbsp;&nbsp;{{ modalTitle | async }}</h3>
<button type="button" class="close pull-right" aria-label="Close" (click)="hideModal()">
<span aria-hidden="true"><i class="fa fa-times"></i></span>
</button>
</div>
<div class="modal-body">
<p>{{ modalText | async }}</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default pull-left" data-dismiss="modal" (click)="hideModal()">Κλείσιμο</button>
</div>
</div>
</div>
</div>
<h4> Επιλογή Τάξης </h4>
<form [formGroup]="formGroup">
<p style="margin-top: 20px; line-height: 2em;"> Παρακαλώ επιλέξτε την τάξη εισαγωγής του μαθητή στην Επαγγελματική Εκπαίδευση και στη συνέχεια επιλέξτε <i>Συνέχεια</i>.</p>
<p style="margin-top: 20px; line-height: 2em;"> Παρακαλώ επιλέξτε την τάξη στην οποία θα φοιτήσει ο μαθητής στην Επαγγελματική Εκπαίδευση το νέο σχολικό έτος και έπειτα επιλέξτε <i>Συνέχεια</i>.</p>
<div *ngFor="let epalclass$ of epalclasses$ | async;"> </div>
<div class="form-group" style= "margin-top: 50px; margin-bottom: 100px;">
<label for="name"></label><br/>
<select class="form-control" formControlName="name" (change)="initializestore()">
<option value=1>Α’ Λυκείου</option>
<option value=2>Β’ Λυκείου</option>
<option value=3>Γ' Λυκείου</option>
<option value=4>Δ' Λυκείου</option>
<option value="">Επιλέξτε Τάξη</option>
<option value="1">Α’ Λυκείου</option>
<option value="2">Β’ Λυκείου</option>
<option value="3">Γ' Λυκείου</option>
<option value="4">Δ' Λυκείου</option>
</select>