Alpha version for service consumption

parent 73aa06e4
......@@ -30,23 +30,11 @@ class Client
$this->_settings = array_merge($this->_settings, $settings);
$this->_settings['ws_endpoint_token'] = "{$this->_settings['ws_endpoint']}/oauth2/token";
$this->_settings['ws_endpoint_token_granttype'] = 'password';
$this->_settings['ws_endpoint_studentepalinfo'] = "{$this->_settings['ws_endpoint']}/api/epal/GetStudentEpalInfo";
$this->_settings['ws_endpoint_studentepalcertification'] = "{$this->_settings['ws_endpoint']}/api/epal/GetStudentEpalCertification";
$this->_settings['ws_endpoint_studentepalpromotion'] = "{$this->_settings['ws_endpoint']}/api/epal/GetStudentEpalPromotion";
$this->_settings['ws_endpoint_alldidactiyear'] = "{$this->_settings['ws_endpoint']}/api/general/GetAllDidactiYear";
}
/**
* Επιστρέφει πίνακα με κλειδιά τα property names των πεδίων που επιστρέφει η GetStudentEpalInfo
* και τιμές λεκτικά - ετικέτες τους.
*
* @return array
*/
public function getStudentInfoFields()
{
return $this->studentInfoFields;
}
/**
* Λαμβάνει το authentication token
*
......
<?php
namespace Drupal\epal;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\epal\Client;
class ClientConsumer
{
protected $entityTypeManager;
protected $logger;
protected $client;
protected $settings;
protected $cached_didactic_years = [
"1" => "2008 - 2009",
"2" => "2011 - 2012",
"3" => "1999 - 2000",
"4" => "2000 - 2001",
"5" => "2009 - 2010",
"6" => "2010 - 2011",
"7" => "2001 - 2002",
"8" => "2002 - 2003",
"9" => "2003 - 2004",
"10" => "2004 - 2005",
"11" => "2005 - 2006",
"12" => "2006 - 2007",
"13" => "2007 - 2008",
"17" => "2012 - 2013",
"18" => "2013 - 2014",
"22" => "2014 - 2015",
"23" => "2015 - 2016",
"24" => "2016 - 2017"
];
protected $cached_level_names = [
"1" => "Α",
"2" => "Β",
"3" => "Γ",
"4" => "Δ"
];
public function __construct($settings, EntityTypeManagerInterface $entityTypeManager, LoggerChannelFactoryInterface $loggerChannel)
{
$this->settings = $settings;
$this->entityTypeManager = $entityTypeManager;
$this->logger = $loggerChannel->get('epal-school');
$this->client = new Client($this->settings, $this->logger);
}
public function getAllDidactiYear()
{
$ts_start = microtime(true);
// try {
// $catalog = $this->client->getAllDidactiYear();
// } catch (\Exception $e) {
// $catalog = [];
// }
$catalog = $this->cached_didactic_years;
$duration = microtime(true) - $ts_start;
$this->logger->info(__METHOD__ . " :: timed [{$duration}]");
return $catalog;
}
public function getStudentEpalPromotion($didactic_year_id, $lastname, $firstname, $father_firstname, $mother_firstname, $birthdate, $registry_no, $level_name)
{
$ts_start = microtime(true);
try {
$result = $this->client->getStudentEpalPromotion($didactic_year_id, $lastname, $firstname, $father_firstname, $mother_firstname, $birthdate, $registry_no, $level_name);
} catch (\Exception $e) {
$result = -1;
}
$duration = microtime(true) - $ts_start;
$this->logger->info(__METHOD__ . " :: timed [{$duration}]");
return $result;
}
public function getStudentEpalCertification($didactic_year_id, $lastname, $firstname, $father_firstname, $mother_firstname, $birthdate, $registry_no, $level_name)
{
$ts_start = microtime(true);
try {
$result = $this->client->getStudentEpalCertification($didactic_year_id, $lastname, $firstname, $father_firstname, $mother_firstname, $birthdate, $registry_no, $level_name);
} catch (\Exception $e) {
$result = -1;
}
$duration = microtime(true) - $ts_start;
$this->logger->info(__METHOD__ . " :: timed [{$duration}]");
return $result;
}
/**
* If $ending is provided
* it is assumed as the second part of the academic-year (i.e. 2017 for 2016-2017),
* the function returns the corresponding id to match first;
* If $id is provided, return the corresponding label.
* $id has priority over $ending, if both are supplied.
*
* @return null|string null if no input or no info located
*/
public function getDidacticYear($ending = null, $id = null)
{
$value = null;
if ($id !== null) {
if (array_key_exists($id, $this->cached_didactic_years)) {
$value = $this->cached_didactic_years[$id];
}
} elseif ($ending !== null) {
$remain = array_filter($this->cached_didactic_years, function ($v) use ($ending) {
$pos = strpos($v, "$ending");
return ($pos !== false && $pos > 4);
});
if (count($remain) > 0) {
$values = array_keys($remain);
$value = $values[0];
}
}
return $value;
}
/**
* Get the level name of the denoted class level
*
* @return string|mixed The level name of the provided failsafe value if not found
*/
public function getLevelName($id, $failsafe_value = 'X')
{
$value = $failsafe_value;
if (array_key_exists($id, $this->cached_level_names)) {
$value = $this->cached_level_names["$id"];
}
return $value;
}
private function generateRandomString($length)
{
$characters = ['Α','Β','Γ','Δ','Ε','Ζ','Η','Θ','Ι','Κ','Λ','Μ','Ν','Ξ','Ο','Π','Ρ','Σ','Τ','Υ','Φ','Χ','Ψ','Ω'];
$charactersLength = count($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
}
......@@ -13,20 +13,40 @@ use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
class ApplicationSubmit extends ControllerBase {
use Drupal\epal\ClientConsumer;
class ApplicationSubmit extends ControllerBase
{
const UNIT_TYPE_NIP = 1;
const UNIT_TYPE_DIM = 2;
const UNIT_TYPE_GYM = 3;
const UNIT_TYPE_LYK = 4;
const UNIT_TYPE_EPAL = 5;
const CERT_GYM = 'Απολυτήριο Γυμνασίου';
const CERT_LYK = 'Απολυτήριο Λυκείου';
protected $entityTypeManager;
protected $logger;
protected $connection;
protected $client; // client consumer
public function __construct(
EntityTypeManagerInterface $entityTypeManager,
Connection $connection,
LoggerChannelFactoryInterface $loggerChannel)
{
LoggerChannelFactoryInterface $loggerChannel
) {
$this->entityTypeManager = $entityTypeManager;
$this->connection = $connection;
$this->logger = $loggerChannel->get('epal');
$config = $this->config('epal.settings');
$settings = [];
foreach (['ws_endpoint', 'ws_username', 'ws_password', 'verbose', 'NO_SAFE_CURL'] as $setting) {
$settings[$setting] = $config->get($setting);
}
$this->client = new ClientConsumer($settings, $entityTypeManager, $loggerChannel);
}
public static function create(ContainerInterface $container)
......@@ -38,7 +58,8 @@ class ApplicationSubmit extends ControllerBase {
);
}
public function appSubmit(Request $request) {
public function appSubmit(Request $request)
{
if (!$request->isMethod('POST')) {
return $this->respondWithStatus([
"error_code" => 2001
......@@ -49,26 +70,25 @@ class ApplicationSubmit extends ControllerBase {
$content = $request->getContent();
if (!empty($content)) {
$applicationForm = json_decode($content, TRUE);
}
else {
$applicationForm = json_decode($content, true);
} else {
return $this->respondWithStatus([
"error_code" => 5002
], Response::HTTP_BAD_REQUEST);
}
$transaction = $this->connection->startTransaction();
try {
//insert records in entity: epal_student
$authToken = $request->headers->get('PHP_AUTH_USER');
$epalUsers = $this->entityTypeManager->getStorage('epal_users')->loadByProperties(array('authtoken' => $authToken));
$epalUser = reset($epalUsers);
if (!$epalUser){
if (!$epalUser) {
return $this->respondWithStatus([
"error_code" => 4003
], Response::HTTP_FORBIDDEN);
}
$student = array(
'langcode' => 'el',
'student_record_id' => 0,
......@@ -111,8 +131,10 @@ class ApplicationSubmit extends ControllerBase {
if (($errorCode = $this->validateStudent($student)) > 0) {
return $this->respondWithStatus([
"error_code" => $errorCode ], Response::HTTP_OK);
"error_code" => $errorCode
], Response::HTTP_OK);
}
$lastSchoolRegistryNumber = $student['lastschool_registrynumber'];
$lastSchoolYear = (int)(substr($student['lastschool_schoolyear'], -4));
if ((int)date("Y") === $lastSchoolYear && (int)$student['lastschool_unittypeid'] === 5) {
......@@ -128,7 +150,6 @@ class ApplicationSubmit extends ControllerBase {
} else {
$student['currentepal'] = 0;
}
} else {
$student['currentepal'] = 0;
}
......@@ -151,23 +172,19 @@ class ApplicationSubmit extends ControllerBase {
}
if ($applicationForm[0]['currentclass'] === "3" || $applicationForm[0]['currentclass'] === "4" ) {
if ($applicationForm[0]['currentclass'] === "3" || $applicationForm[0]['currentclass'] === "4") {
$course = array(
'student_id' => $created_student_id,
'coursefield_id' => $applicationForm[3]['coursefield_id']
);
$entity_storage_course = $this->entityTypeManager->getStorage('epal_student_course_field');
$entity_object = $entity_storage_course->create($course);
$entity_storage_course->save($entity_object);
}
else if ($applicationForm[0]['currentclass'] === "2") {
} elseif ($applicationForm[0]['currentclass'] === "2") {
$sector = array(
'student_id' => $created_student_id,
'sectorfield_id' => $applicationForm[3]['sectorfield_id']
);
$entity_storage_sector = $this->entityTypeManager->getStorage('epal_student_sector_field');
$entity_object = $entity_storage_sector->create($sector);
$entity_storage_sector->save($entity_object);
......@@ -175,32 +192,124 @@ class ApplicationSubmit extends ControllerBase {
return $this->respondWithStatus([
"error_code" => 0
], Response::HTTP_OK);
}
catch (\Exception $e) {
print_r($e->getMessage());
} catch (\Exception $e) {
$this->logger->warning($e->getMessage());
$transaction->rollback();
return $this->respondWithStatus([
"error_code" => 5001
], Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
private function respondWithStatus($arr, $s) {
private function respondWithStatus($arr, $s)
{
$res = new JsonResponse($arr);
$res->setStatusCode($s);
return $res;
}
private function validateStudent($student) {
if(!$student["agreement"]) {
/**
*
* @return int error code ελέγχου; 0 εάν ο έλεγχος επιτύχει, μη μηδενικό εάν αποτύχει:
* 1001 δεν επιλέχθηκε το πλαίσιο συμφωνης γνώμης
* 1002 λανθασμένο τελευταίο έτος φοίτησης
* 1003 λανθασμένη ημερομηνία
* 8000 μη αναμενόμενο λάθος
* 8001 δικτυακό λάθος κλήσης υπηρεσίας επιβεβαίωσης στοιχείων
* 8002 τα στοιχεία φοίτησης δεν επικυρώθηκαν
* 8003 τα στοιχεία φοίτησης δεν είναι έγκυρα
*/
private function validateStudent($student)
{
if (!$student["agreement"]) {
return 1001;
}
if(!$student["lastschool_schoolyear"] || strlen($student["lastschool_schoolyear"]) !== 9) {
if (!$student["lastschool_schoolyear"] || strlen($student["lastschool_schoolyear"]) !== 9) {
return 1002;
}
return 0;
// date in YYY-MM-DD, out d-m-Y
$date_parts = explode('-', $student['birthdate'], 3);
if ((count($date_parts) !== 3) ||
(checkdate($date_parts[1], $date_parts[2], $date_parts[0]) !== true)) {
return 1003;
}
$birthdate = "{$date_parts[2]}-{$date_parts[1]}-{$date_parts[0]}";
// check as per specs:
// - can't check certification prior to 2014, pass through
// - check certification if last passed class is gym
// - check promotion if last passed class is not gym
$check_certification = true;
$check_promotion = true;
if (intval($student['lastschool_unittypeid']) == self::UNIT_TYPE_GYM) {
$check_promotion = false;
$check_certification = true;
}
if (intval($student['graduation_year']) < 2014 &&
intval($student['certificatetype']) == self::CERT_GYM) {
$check_certification = false;
}
// now check service
$pass = true;
$error_code = 0;
if (($check_certification === true) ||
($check_promotion === true)) {
if ($check_promotion === true) {
$service = 'getStudentEpalPromotion';
} else {
$service = 'getStudentEpalCertification';
}
try {
$didactic_year_id = $this->client->getDidacticYear(substr($student["lastschool_schoolyear"], -4, 4));
$level_name = $this->client->getLevelName($student['lastschool_class']);
$service_rv = $this->client->$service(
$didactic_year_id,
$student['studentsurname'],
$student['name'],
$student['fatherfirstname'],
$student['motherfirstname'],
$birthdate,
$student['lastschool_registrynumber'],
$level_name
);
$pass = ($service_rv === true);
if ($service_rv === true) {
$error_code = 0;
} elseif ($service_rv === false) {
$error_code = 8002;
} elseif ($service_rv === null) {
$error_code = 8003;
} else {
// -1 is an exception and data is already validated
$error_code = 8001;
}
} catch (\Exception $e) {
$pass = false;
$error_code = 8000;
}
}
// TODO REMOVE
$this->logger->info(
'check certification: [' . var_export($check_certification, true) . '] ' .
'check promotion: [' . var_export($check_promotion, true) . '] ' .
'pass: [' . var_export($pass, true) . '] ' .
'check: ' . print_r([
$didactic_year_id,
$student['studentsurname'],
$student['name'],
$student['fatherfirstname'],
$student['motherfirstname'],
$birthdate,
$student['lastschool_registrynumber'],
$level_name
], true));
// return 1000; // TODO stop here until all checks are finished
return $error_code;
}
}
......@@ -16,7 +16,7 @@ import { EPALCLASSES_INITIAL_STATE } from '../../store/epalclasses/epalclasses.i
import { SECTOR_COURSES_INITIAL_STATE } from '../../store/sectorcourses/sectorcourses.initial-state';
import { SECTOR_FIELDS_INITIAL_STATE } from '../../store/sectorfields/sectorfields.initial-state';
import { StudentEpalChosen, StudentCourseChosen, StudentSectorChosen } from '../students/student';
import {AppSettings} from '../../app.settings';
import { AppSettings } from '../../app.settings';
import { ILoginInfo, ILoginInfoToken } from '../../store/logininfo/logininfo.types';
import { LOGININFO_INITIAL_STATE } from '../../store/logininfo/logininfo.initial-state';
import { EpalClassesActions } from '../../actions/epalclass.actions';
......@@ -100,8 +100,6 @@ import { HelperDataService } from '../../services/helper-data-service';
<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;">
<div class="col-md-6">
......@@ -114,9 +112,7 @@ import { HelperDataService } from '../../services/helper-data-service';
<span style="font-size: 0.9em; font-weight: bold;">Υποβολή&nbsp;&nbsp;&nbsp;</span><i class="fa fa-forward"></i>
</button>
</div>
</div>
`
})
......@@ -128,7 +124,7 @@ import { HelperDataService } from '../../services/helper-data-service';
private courseSelected;
private sectorSelected;
private classSelected;
private totalPoints= <number>0;
private totalPoints = <number>0;
private studentDataFields$: BehaviorSubject<IStudentDataFields>;
private regions$: BehaviorSubject<IRegions>;
private sectors$: BehaviorSubject<ISectors>;
......@@ -187,7 +183,7 @@ import { HelperDataService } from '../../services/helper-data-service';
(<any>$('#studentFormSentNotice')).appendTo("body");
this.loginInfoSub = this._ngRedux.select(state => {
if (state.loginInfo.size > 0) {
state.loginInfo.reduce(({}, loginInfoToken) => {
state.loginInfo.reduce(({ }, loginInfoToken) => {
this.authToken = loginInfoToken.auth_token;
this.cu_name = loginInfoToken.cu_name;
......@@ -204,7 +200,7 @@ import { HelperDataService } from '../../services/helper-data-service';
this.epalclassesSub = this._ngRedux.select(state => {
if (state.epalclasses.size > 0) {
state.epalclasses.reduce(({}, epalclass) => {
state.epalclasses.reduce(({ }, epalclass) => {
this.classSelected = epalclass.name;
return epalclass;
}, {});
......@@ -217,8 +213,8 @@ import { HelperDataService } from '../../services/helper-data-service';
}).subscribe(this.studentDataFields$);
this.regionsSub = this._ngRedux.select(state => {
state.regions.reduce((prevRegion, region) =>{
region.epals.reduce((prevEpal, epal) =>{
state.regions.reduce((prevRegion, region) => {
region.epals.reduce((prevEpal, epal) => {
if (epal.selected === true) {
this.epalSelected.push(Number(epal.epal_id));
this.epalSelectedOrder.push(epal.order_id);
......@@ -231,8 +227,8 @@ import { HelperDataService } from '../../services/helper-data-service';
}).subscribe(this.regions$);
this.sectorsSub = this._ngRedux.select(state => {
state.sectors.reduce((prevSector, sector) =>{
sector.courses.reduce((prevCourse, course) =>{
state.sectors.reduce((prevSector, sector) => {
sector.courses.reduce((prevCourse, course) => {
if (course.selected === true) {
this.courseSelected = course.course_id
}
......@@ -244,7 +240,7 @@ import { HelperDataService } from '../../services/helper-data-service';
}).subscribe(this.sectors$);
this.sectorFieldsSub = this._ngRedux.select(state => {
state.sectorFields.reduce(({}, sectorField) =>{
state.sectorFields.reduce(({ }, sectorField) => {
if (sectorField.selected === true) {
this.sectorSelected = sectorField.id
}
......@@ -289,11 +285,11 @@ import { HelperDataService } from '../../services/helper-data-service';
aitisiObj[0].regionarea = std.regionarea;
aitisiObj[0].regiontk = std.regiontk;
aitisiObj[0].certificatetype = std.certificatetype;
// aitisiObj[0].graduation_year = std.graduation_year;
// aitisiObj[0].lastschool_registrynumber = std.lastschool_registrynumber;
// aitisiObj[0].lastschool_schoolyear = std.lastschool_schoolyear;
// aitisiObj[0].lastschool_class = std.lastschool_class;
// aitisiObj[0].currentepal = std.currentepal;
// aitisiObj[0].graduation_year = std.graduation_year;
// aitisiObj[0].lastschool_registrynumber = std.lastschool_registrynumber;
// aitisiObj[0].lastschool_schoolyear = std.lastschool_schoolyear;
// aitisiObj[0].lastschool_class = std.lastschool_class;
// aitisiObj[0].currentepal = std.currentepal;
aitisiObj[0].graduation_year = std.graduation_year;
aitisiObj[0].lastschool_registrynumber = std.lastschool_schoolname.registry_no;
......@@ -301,7 +297,7 @@ import { HelperDataService } from '../../services/helper-data-service';
aitisiObj[0].lastschool_schoolyear = std.lastschool_schoolyear;
aitisiObj[0].lastschool_unittypeid = std.lastschool_schoolname.unit_type_id;
aitisiObj[0].lastschool_class = std.lastschool_class;
// aitisiObj[0].currentepal = 154;
// aitisiObj[0].currentepal = 154;
aitisiObj[0].relationtostudent = std.relationtostudent;
aitisiObj[0].telnum = std.telnum;
......@@ -313,13 +309,13 @@ import { HelperDataService } from '../../services/helper-data-service';
aitisiObj[0].disclaimer_checked = this.disclaimer_checked;
aitisiObj[0].currentclass = this.classSelected;
for (let i=0; i < this.epalSelected.length; i++)
epalObj[i] =new StudentEpalChosen(null, this.epalSelected[i] , this.epalSelectedOrder[i]);
for (let i = 0; i < this.epalSelected.length; i++)
epalObj[i] = new StudentEpalChosen(null, this.epalSelected[i], this.epalSelectedOrder[i]);
aitisiObj['1'] = epalObj;
if (aitisiObj[0]['currentclass'] === "2" )
if (aitisiObj[0]['currentclass'] === "2")
aitisiObj['3'] = new StudentSectorChosen(null, this.sectorSelected);
else if (aitisiObj[0]['currentclass'] === "3" || aitisiObj[0]['currentclass'] === "4" ) {
else if (aitisiObj[0]['currentclass'] === "3" || aitisiObj[0]['currentclass'] === "4") {
aitisiObj['3'] = new StudentCourseChosen(null, this.courseSelected);
}
......@@ -342,46 +338,76 @@ import { HelperDataService } from '../../services/helper-data-service';
this.showLoader.next(true);
this.http.post(connectionString, record, options)
.map((res: Response) => res.json())
.subscribe(
success => {
.subscribe(success => {
(<any>$('.loading')).remove();
this.showLoader.next(false);
let errorCode = parseInt(success.error_code);
if (errorCode === 0) {
this.modalTitle.next("Υποβολή Αίτησης Εγγραφής");
this.modalText.next("Η υποβολή της αίτησής σας πραγματοποιήθηκε. Μπορείτε να την εκτυπώσετε από την επιλογή 'Εμφάνιση - Εκτύπωση Αίτησης'. Θα ειδοποιηθείτε στο e-mail που δηλώσατε για την εξέλιξη της αίτησής σας");
this.modalHeader.next("modal-header-success");
let mTitle = "";
let mText = "";
let mHeader = "";
switch (errorCode) {
case 0:
this._eca.initEpalClasses();
this._sfa.initSectorFields();
this._rsa.initRegionSchools();
this._csa.initSectorCourses();
this._sdfa.initStudentDataFields();
console.log("success post");
this.showModal();
mTitle = "Υποβολή Αίτησης Εγγραφής";
mText = "Η υποβολή της αίτησής σας πραγματοποιήθηκε. Μπορείτε να την εκτυπώσετε από την επιλογή 'Εμφάνιση - Εκτύπωση Αίτησης'. Θα ειδοποιηθείτε στο e-mail που δηλώσατε για την εξέλιξη της αίτησής σας.";
mHeader = "modal-header-success";
break;
case 1001:
mTitle = "Αποτυχία Υποβολής Αίτησης";
mText = "Δεν έχετε αποδεχθεί τους όρους χρήσης";
mHeader = "modal-header-danger";
break;
case 1002:
mTitle = "Αποτυχία Υποβολής Αίτησης";
mText = "Ελέξτε τη φόρμα σας. Υπάρχουν λάθη - ελλείψεις που δεν επιτρέπουν την υποβολή.";
mHeader = "modal-header-danger";