-
Notifications
You must be signed in to change notification settings - Fork 1
Οδηγίες για προγραμματιστές
Οδηγίες για Developers
Για να μπορέσετε να εγκαταστήσετε την εφαρμογής DiavgeiaInsight είναι απαραίτητα τα εξής :
-
Web Server (Apache, IIS, Nginx).
-
Η γλώσσα προγραμματισμού PHP.
-
Σύστημα Διαχερίσης Βάσης Δεδομένων MySQL/MariaDB.
-
Το εργαλείο PHP Composer (https://getcomposer.org/) για την εγκατάσταση και αναβάθμιση επεκτάσεων και εργαλείων.
Εφόσον δεν υπάρχει κάποιο από τα παραπάνω, μπορείτε είτε να τα εγκαταστήσετε μεμονομένα, είτε να κατεβάσετε ένα από τα *AMP πακέτα που κυκλοφορούν, όπως το XAMPP (https://www.apachefriends.org/index.html) ή το WAMP (https://bitnami.com/).
Επειδή κάποιες από τις εργασίες που γίνονται στην εφαρμογή, όπως η ενημέρωση των αποφάσεων από τη Διαύγεια, είναι χρονοβόρες, θα χρειαστεί να τροποποιήσουμε δύο (2) παραμέτρους στο αρχείο ρυθμίσεων της PHP (php.ini).
-
max_execution_time : Προτίνεται ο ορισμός μιας αρκετά μεγάλης τιμής (>600sec).
-
memory_limit : Χρειάζεται να οριστεί σε τιμή >1024Μ.
Οι τιμές αυτές είναι μόνο για την περίπτωση της αρχικής ενημέρωσης μέσω του API της Διαύγειας, μπορείτε δηλαδή να τις επαναφέρετε στην αρχική τους κατάσταση.
ΠΡΟΣΟΧΗ : Μετά την τροποποίηση και για να περαστεί η αλλαγή στο σύστημα, θα πρέπει να επανεκκινήσετε τον Web Server.
Η εφαρμογή DiavgeiaInsights έχει κατασκευαστεί με το PHP Framework Yii2 (http://www.yiiframework.com/), ένα σύγχρονο PHP framework υψηλών επιδόσεων, κατάλληλο για διαδικτυακές εφαρμογές, που ακολουθεί το μοντέλο MVC (Model – View – Controller).
Περισσότερες πληροφορίες μπορείτε να βρείτε εδώ : http://www.yiiframework.com/doc-2.0/guide-index.html
Στον κατάλογο basic, έχουμε εκτός των άλλων τα εξής αρχεία και καταλόγους όπου συνοπτικά :
composer.json : Χρησιμοποιείται για τον ορισμό των επεκτάσεων
config : Βρίσκονται τα αρχεία ρυθμίσεων, κυρίως web.php και db.php
controllers : Οι controllers του συστήματος
messages : Οι μεταφράσεις βασικών λέξεων και φράσεων στο el/app.php
models : Τα models του συστήματος
vendor : Αποθηκεύονται τα αρχεία των βιβλιοθηκών και επεκτάσεων
views : Τα views του συστήματος
web : Τα css και μερικά πρόσθετα για την εμφάνιση
Συγκεκριμένα για τα τρία συστατικά του MVC έχουμε :
models
ContactForm.php
Cpv.php
CpvQuery.php
CpvSearch.php
Decisionsb13.php
Decisionsb13Search.php
Decisionsb21.php
Decisionsb21Search.php
Decisionsb22.php
Decisionsb22Search.php
Decisions.php
DecisionsSearch.php
LoginForm.php
Organisations.php
OrganisationsSearch.php
Preferences.php
PreferencesSearch.php
User.php
views
./cpv:
create.php
_form.php
index.php
_search.php
update.php
view.php
./decisions:
create.php
_form.php
index.php
_search.php
update.php
view.php
./decisionsb13:
create.php
_form.php
index.php
_search.php
update.php
view.php
./decisionsb21:
create.php
_form.php
index.php
_search.php
update.php
view.php
./decisionsb22:
create.php
_form.php
index.php
_search.php
update.php
view.php
./layouts:
main.php
./organisations:
create.php
_form.php
index.php
refreshdata1.php
refreshdata.php
_search.php
update1.php
view.php
./preferences:
create.php
_form.php
index.php
_search.php
update.php
view.php
./results:
index.php
resultsb21a.php
resultsb21b.php
resultsb21c.php
resultsmain.php
./site:
about.php
admin_panel.php
contact.php
error.php
index.php
login.php
refreshdata.php
searchcpv.php
search.php
searchpie.php
updatesettings11.php
controllers
CpvController.php
Decisionsb13Controller.php
Decisionsb21Controller.php
Decisionsb22Controller.php
DecisionsController.php
OrganisationsController.php
PreferencesController.php
ResultsController.php
SiteController.php
Βασικό μέρος του σχεδιασμού της εφαρμογής ήταν η δυνατότητα στους τελικούς χρήστες να μπορέσουν να δημιουργήσουν και να εμφανίσουν προσωποποιημένα ερωτήματα με βάση τα διαθέσιμα δεδομένα.
Η δυνατότητα αυτή δίνεται στην ενότητα 'Αναζήτηση' όπου θα δείξουμε τη διαδικασία που προσθέτουμε νέα ερωτήματα, αλλά και τον τρόπο που αυτά εμφανίζονται.
Υποθέτουμε ότι θέλουμε να εμφανίσουμε όλους του προμηθευτές ενός οργανισμού, μαζί με τα ποσά που έχουν πάρει και το πλήθος των εντολών πληρωμής στο όνομά τους.
Το SQL ερώτημα είναι το εξής :
SELECT awk.afm as ΑΦΜ, awk.name as ΕΠΩΝΥΜΙΑ, ROUND(SUM(awk.amount), 2) as ΠΟΣΟ, COUNT(awk.amount) as ΠΛΗΘΟΣ, ROUND(AVG(awk.amount), 2) as ΜΟ
FROM decisions as dc, decisionsb21 as db21, amountwithkae as awk
WHERE dc.ada=db21.b21_ada AND awk.awk_ada=dc.ada and dc.organizationId=99206915
GROUP BY awk.afm
ORDER BY ΠΟΣΟ DESC
Για να το μεταφέρουμε στην εφαρμογή μας θα πρέπει να τροποποιήσουμε δύο αρχεία και να προσθέσουμε ένα νέο.
Αρχικά θα πρέπει να προσθέσουμε το χώρο στο αρχείο views/results/resultsmain.php, όπου πολύ απλά δημιουργούμε ένα div με την εξής πληροφορία :
Περιγραφή
Ορισμός Φόρμας με τη σελίδα προορισμό (η οποία θα δημιουργηθεί).
[Απαραίτητα Πεδία]+ (ένα ή περισσότερα)
Το πλήκτρο 'Εμφάνιση'
Ενδεικτικά :
\<div style="text-align: justify;" class="col-lg-4"\>
**\<h4\> Αποφάσεις ανά ΑΦΜ για Οργανισμό \</h4\>**
\<?php
// Form 1 : Decisions per month pew organizations
echo Html::beginForm('index.php?r=results/resultsb21afm', 'post');
// 2. Show selected Organisations
echo '\<label class="control-label"\>Οργανισμοί\</label\>';
echo Select2::widget([
'name' =\> 'select\_orgs',
'data' =\> \$currentOrgs,
'value' =\> '',
'options' =\> [
'placeholder' =\> 'Οργανισμός...',
'multiple' =\> false
],
]);
?\>
\<br\>
\<?php
echo Html::submitButton('Εμφάνιση')
?\>
\<br\>
\<?php
echo Html::endForm();
?\>
\<p\>
\</p\>
\</div\>
Στο αρχείο controllers/ResultsController.php προσθέτουμε μια συνάρτηση (actionResultsb21afm) για τον έλεγχο της νέας σελίδας. Εδώ ελέγχουμε τι στοιχεία θα έχει η _POST μεταβλητή της φόρμας μας καθώς κάνουμε και την αποθήκευση τοπικά του ID του οργανισμού στον πίνακα preferences.
Η παράμετρος Resultsb21afmorgID αποθηκεύεται στη ΒΔ για να μπορέσει να λειτουργήσει η λειτουργία σελιδοποίησης στον πίνακα αποτελεσμάτων.
public function actionResultsb21afm()
{
if(!isset(\$\_POST['select\_orgs']) \|\| empty(\$\_POST['select\_orgs'])) {
\$orgID1 = Preferences::findOne (['pref\_name' =\> 'Resultsb21borgID']);
\$orgID = \$orgID1-\>pref\_value;
Preferences::deleteAll(['pref\_name' =\> 'Resultsb21afmorgID']);
}
else
\$orgID = \$\_POST['select\_orgs'];
Preferences::deleteAll(['pref\_name' =\> 'Resultsb21afmorgID']);
Yii::\$app-\>view-\>params['Resultsb21afmorgID'] = \$orgID;
\$pref = new Preferences();
\$pref-\>pref\_name = 'Resultsb21afmorgID';
\$pref-\>pref\_value = \$orgID;
\$pref-\>save();
return \$this-\>render('resultsb21afm');
}
Και τέλος δημιουργούμε το περιεχόμενο του αρχείου views/resultsb21afm.php
`<?php`
use yii\\helpers\\Html;
use yii\\widgets\\ActiveForm;
use yii\\widgets\\Pjax;
use app\\models\\Preferences;
use dosamigos\\chartjs\\ChartJs;
use kartik\\grid\\GridView;
use yii\\data\\SqlDataProvider;
use yii\\db\\Query;
/\* \@var \$this yii\\web\\View \*/
/\* \@var \$model app\\models\\Decisions \*/
/\* \@var \$form ActiveForm \*/
\$org = \$this-\>params['Resultsb21afmorgID'];
Yii::\$app-\>view-\>params['Resultsb21afmorgID'] = \$org;
//Yii::\$app-\>view-\>params['orgID'] = \$org;
// Ορίζουμε τον Τίτλο της σελίδας
\$this-\>title = 'Αποφάσεις ανά ΑΦΜ για Οργανισμό';
\$this-\>params['breadcrumbs'][] = \$this-\>title;
\$connection = \\Yii::\$app-\>db;
?\>
\<h1\>\<?= Html::encode(\$this-\>title) ?\>\</h1\>
\<div class="row"\>
\<div class="col-lg-9"\>
\<div style="width:100%"\>
\<?php
\$rows = 0;
**// Θέτουμε το SQL ερώτημα**
\$query = "SELECT awk.afm as ΑΦΜ, awk.name as ΕΠΩΝΥΜΙΑ, ROUND(SUM(awk.amount), 2) as ΠΟΣΟ, COUNT(awk.amount) as ΠΛΗΘΟΣ, ROUND(AVG(awk.amount), 2) as ΜΟ
FROM decisions as dc, decisionsb21 as db21, amountwithkae as awk
WHERE dc.ada=db21.b21\_ada AND awk.awk\_ada=dc.ada and dc.organizationId=".\$org."
GROUP BY awk.afm
ORDER BY ΠΟΣΟ DESC
";
**// Γίνεται το ερώτημα και διαβάζουμε τα δεδομένα. Αποθηκεύουμε το ΑΦΜ και το ΠΟΣΟ σε δύο διαφορετικούς πίνακες, για την εμφάνιση του διαγράμματος.**
\$model = \$connection-\>createCommand(\$query);
\$lines = \$model-\>queryAll();
\$label = array();
\$data = array();
foreach (\$lines as \$line) {
**\$label[] = \$line['ΑΦΜ'];**
**\$data[] = \$line['ΠΟΣΟ'];**
\$rows += 1;
}
\$label = array\_slice(\$label, 0, 20);
\$data = array\_slice(\$data, 0, 20);
**// Δημιουργούμε με το ίδιο SQL ερώτημα ένα DataProvider για την εμφάνιση των αποτελεσμάτων στον πίνακα.**
\$dataProvider = new SqlDataProvider([
'sql' =\> "SELECT awk.afm as ΑΦΜ, awk.name as ΕΠΩΝΥΜΙΑ, ROUND(SUM(awk.amount), 2) as ΠΟΣΟ, COUNT(awk.amount) as ΠΛΗΘΟΣ, ROUND(AVG(awk.amount), 2) as ΜΟ
FROM decisions as dc, decisionsb21 as db21, amountwithkae as awk
WHERE dc.ada=db21.b21\_ada AND awk.awk\_ada=dc.ada and dc.organizationId=".\$org."
GROUP BY awk.afm
",
'totalCount' =\> \$rows,
'pagination' =\> [
'pageSize' =\> 20,
],
'sort' =\> [
'attributes' =\> [
'ΠΟΣΟ',
'ΠΛΗΘΟΣ',
'ΜΟ',
'ΑΦΜ'
],
],
]);
//\$searchModel = app\\models\\OrganisationsSearch::findAll();
**// Εμφάνιση του Διαγράμματος**
?\>
\<?= ChartJs::widget([
'type' =\> 'Bar',
'options' =\> [
// 'width' =\> '600px',
//'height' =\> '600px',
],
'data' =\> [
'labels' =\> \$label,
'datasets' =\> [
[
'fillColor' =\> "rgba(220,220,220,0.5)",
'strokeColor' =\> "rgba(220,220,220,1)",
'pointColor' =\> "rgba(220,220,220,1)",
'pointStrokeColor' =\> "\#fff",
'data' =\> \$data,
],
]
]
]);
?\>
**// Εμφάνιση του πίνακα αποτελεσμάτων**
\<hr\>
\<?= GridView::widget([
'dataProvider'=\> \$dataProvider,
//'filterModel' =\> \$searchModel,
//'columns' =\> \$gridColumns,
'responsive'=\>true,
'export'=\>[
'fontAwesome'=\>true,
'showConfirmAlert'=\>false,
'target'=\>GridView::TARGET\_BLANK
],
'hover'=\>true,
'pjax'=\>true,
'showPageSummary'=\>true,
'panel'=\>[
'type'=\>'primary',
'heading'=\>'ΠΟΣΑ ΑΝΑ ΑΦΜ ΓΙΑ ΟΡΓΑΝΙΣΜΟ '.\$org
]
]); ?\>
\</div\>
\</div\>
\</div\>