Programul de licență: Informatică [616697]
Facultatea de Automatică și Calculatoare
Programul de licență: Informatică
SMART IMOB – APLICAȚIE WEB
PENTRU GESTIUNEA UNEI AGENȚII
IMOBILIARE
Lucrare de licență
Student: [anonimizat]:
Prof. univ. dr. ing. L ăcrămioara STOICU -TIVADAR
As.drd.ing. Stelian N ICOLA
Timișoara
2020
2
CUPRINS
I. INTRODUCERE ………………………….. ………………………….. ………………………….. ………….. 4
I.1 Contextul lucrării ………………………….. ………………………….. ………………………….. ………… 4
I.2 Descrierea temei pe scurt ………………………….. ………………………….. …………………………. 4
I.3 Structura lucrării ………………………….. ………………………….. ………………………….. ………… 5
II. BAZE TEORETICE ………………………….. ………………………….. ………………………….. ……….. 6
II.1. HTML, CSS și JavaScript ………………………….. ………………………….. ……………………… 7
II.2. Limbajul PHP ………………………….. ………………………….. ………………………….. …………… 8
II.3. Baze de da te ………………………….. ………………………….. ………………………….. ……………. 12
II.4 Analiza stadiului actual în domeniul problemei ………………………….. ………………….. 12
III. PROIECTAREA APLICAȚIEI WEB ………………………….. ………………………….. ………. 17
III.1. Obiectivele aplicației ………………………….. ………………………….. ………………………….. . 17
III.1.1. Obiectivul principal ………………………….. ………………………….. …………………………. 17
III.1.2. Obiectivele secundare ………………………….. ………………………….. ………………………. 17
III.2. Analiza aplicației ………………………….. ………………………….. ………………………….. ……. 18
III.2.1. Cerințele aplicației ………………………….. ………………………….. ……………………….. 18
III.2.2. Cerințe funcționale ………………………….. ………………………….. ……………………….. 18
III.2.3. Cerințe non -funcționale ………………………….. ………………………….. ………………… 19
III.3. Cazuri de utilizare ………………………….. ………………………….. ………………………….. …. 21
III.3.1. Utilizatorii aplicației ………………………….. ………………………….. …………………….. 21
III.3.2. Descrierea detaliată a cazurilor de utilizare ………………………….. ……………….. 23
III.4. Proiectarea bazei de date ………………………….. ………………………….. ……………………. 28
III.5 Arhitectura aplicației web ………………………….. ………………………….. ……………………. 29
IV. IMPLEMENTARE ………………………….. ………………………….. ………………………….. ………. 30
IV.1. Utilizare aplicație ………………………….. ………………………….. ………………………….. …… 39
IV.2. S ite de prezentare ………………………….. ………………………….. ………………………….. ….. 41
V. TESTARE ȘI VALIDARE ………………………….. ………………………….. …………………………. 43
3
VI. CONCLUZII ȘI DIRECȚII DE DEZVOLTARE ………………………….. …………………… 45
VI.1 Stadiul actual al proiectului ………………………….. ………………………….. …………………. 45
VI.2 Direcții de dezvoltare ………………………….. ………………………….. ………………………….. . 45
VII. BIBLIOGRAFIE ………………………….. ………………………….. ………………………….. ………… 46
VIII. ANEXE ………………………….. ………………………….. ………………………….. …………………….. 47
VIII. LISTA FIGURILOR SI A TABELELOR ………………………….. ………………………….. . 55
4
I. INTRODUCERE
Prin această lucrare doresc să aprofund ez limbaj ele de programare: HTML , JavaScript și
PHP, limbaje cu ajutorul cărora putem crea pagini și aplicații web dinamice fiind des utilizate
în acest scop.
I.1 Contextul lucrării
În momentul de față societatea tinde tot mai mult spre digitalizare, vedem că în
majoritatea domeniilor se dorește ca activitatea să devină mai eficientă obținând performanțe
mult mai mari , iar pentru a reuși aceste lucruri apelează la servicii automatizate , în special la
aplicații care reduc costurile și resursele umane.
Progresul tehnologic obligă antreprenorii să apeleze la aceste servicii pentru a ține pasul
cu ceea ce își doresc oamenii, și anume informație ușor accesibilă, tranzacții rapide fără pierderi
mari de resurse.
Internetul este calea pentru a accesa informații, dar și pentru a furniza informații și
totodată interacțiunea cu societatea.
Aplicațiile sunt executat e într-un browser și implementat e folosind diverse tehnologii.
Aceste aplicații se bucură de o popularitate tot mai mare, sunt pe un trend ascendent, tot mai
mulți antreprenori preferă acest tip de aplicații datorită avantajelor pe care le pun la dispoziție.
Aceste aplicații pot fi accesate de pe orice sistem de opera re, utilizatorul având nevoie doar de
un browser web.
I.2 Descrierea temei pe scurt
Proiectul propus este o aplicație web care oferă management pentru activitățile unei
agenții imobiliare , cu scopul de a ușura munca angajaților și de a îmbunătăți procesul de
dezvoltare internă. Aplicația de management este dezvoltată astfel încât să ofere o interfață
simplă și să fie cât mai ușor de utilizat.
5
I.3 Structura lucrării
În continuare se va prezenta structura lucrării pe capitole și o descriere pentru fiecare din
ele.
Capitolul 1 – Introducere – Acest capitol conține descrie rea contextului lucrării și a temei
care au contribuit la dezvoltarea proiectului.
Capitolul 2 – Fundamentarea teoretică – Acest capitol prezintă tehnologiile utilizate
pentru realizarea aplicației web.
Capitolul 3 – Aplicația web – În acest capitol sunt prezentate obiectivele proiectului,
principiile de funcționare și câteva cazuri de utilizare.
Capitolul 4 – Prezintă util izarea aplicației
Capitolul 5– Concluzii – Acest capitol descrie concluziile care au fost deduse în urma
realizării acestei aplicații. De asemenea, vor fi descrise și dezvoltările ulterioare care pot fi
aduse proiectului.
6
II. BAZE TEORETICE
Pentru a putea dezvolta o aplicație web trebuie să se țină cont de câteva criterii , astfel
încât să existe o scalabilitate și mentenanță cât mai facilă . Un criteriu la fel de important al
aplicațiilor web, este acela de a permite accesul la informații de pe mai multe terminale (mobile,
desktop, alte aplicații web etc.), acest lucru se poate realiza prin intermediul serviciilor și
separarea definitivă a conceptelor de client și server, în acest mod se poate realiza un produs,
serviciile căruia vor putea fi utilizate la maxim. În fond, o aplicație web oferă acces rapid la
informații de prezentare și acces la anumite resurse. Aceste resurse sunt servite de către un
server în urma unei cereri de pe orice tip de client, comunicarea se realizează prin i ntermediul
protocolului HTTP (Hypertext Transfer Protocol), iar interogarea resurselor se face prin
accesarea unui URI (Uniform Resource Identifier) în browser. [5]
În trecut aplicațiile ofereau doar conținut static , care era scris în HTML/CSS, cu pu țin
Javascript pentru comunicarea aplicației cu utilizatorul final. Lucrurile au evoluat foarte mult,
limbajele de dezvoltare pentru server s -au dezvoltat continu, dar și interpretoarele de
JavaScript, nucleul V8 din browser s -au dezvoltat deopotrivă, astfel înc ât, în prezent,
majoritatea aplicațiilor web au conținut dinamic. Conținutul dinamic reprezintă răspunsul
serverului la acțiunile clientului, fiecare eveniment pe partea de client este prins de către
JavaScript și în urma unei comunicări cu serverul, schim bă starea paginii curente.
Arhitectura de comunicare este Client -Server, în care Clientul reprezintă browser -ul, cel
ce procesează toate interacțiunile cu utilizatorul, prinde evenimentele, validează pe partea de
interfață anumite stări, iar serverul este cel care răspunde cererilor (pe baza adresei URI)
clientului, în linii generale serverul poate fi privit ca o unitate fizică, pe care rulează un serviciu
capabil să proceseze interceptări de tip HTTP (de ex. Apache sau Tomcat) . Atunci când
browser -ul deschide o conexiune (pe baza adresei) cu serverul, se face o cerere către anumite
resurse, dar odată cu această ce rere se mai trimit date suplimentare către server, cum ar fi un
token de autentificare, serverul analizează datele de intrare, și dacă utilizatorul care a cerut
resursa respectivă are acces la ea, i se va trimite înapoi un cod de răspuns (status) și conțin utul
propriu -zis. [5]
Prin utilizarea arhitecturii Client -Server prin protocolul HTTP se permite accesul la 8
tipuri de interogări: get, post, put, delete, options, head, trace și connect. De obicei introducerea
datelor se realizează prin interogarea POST, în acest caz este necesară o validare suplimentară
pe partea de server, evitându -se astfel injectările nevalide la nivelul bazei de date.[2]
7
La implementarea codului pentru această aplicație web s -au folosit mai multe IDE -uri în
funcție de limbajul de pr ogramare folosit și anume: pentru HTML, CSS, JAVASCRIPT, PHP
s-a folosit Sublime Text 3, iar pentru baza de date M YSQL s -a folosit Navicat.
II.1. HTML, CSS și JavaScript
Pentru partea de frontend s -a folosit „pachetul” html, css, javascript, jquery, bootstrap .
În principal comenzile pe care utilizatorul le poate executa sunt comune pentru ambele
platforme, având interfața asemănătoare, dar cu ajutorul CSS le -am adaptat pentru fiecare
dispozitiv în parte.
Toate elementele de HTML sunt construite în mod dinamic utilizând JavaScript, pentru
a nu fi nevoie s ă se repete același cod de mai multe ori. JavaScript permite integrarea de
scripturi în codul HTML al unei pagini web, iar atunci când sunt executate, aces te scripturi ne
dau un control mai mare asupra a ceea ce apare în fereastra browser -ului în comparație cu o
pagina simplă scrisă în HTML. Limbajele de tip client sunt citite și executate de browser după
descărcarea paginii web de pe server. PHP fiind un li mbaj folosit adesea pentru backend, codul
este rulat pe server înainte de a trimite pagina web către browser. [6]
JavaScript este un limbaj de programare folosit mai ales pentru introducerea unor
funcționalită ți în paginile web. Codul Javascript din aceste pagini este rulat de către browser.
Limbajul este bine cunoscut pentru folosirea sa în construirea site -urilor web, dar este folosit
și pentru a ccesul la obiecte încastrate (embedded objects) în alte aplica ții. În ciuda numelui și
a unor asemănări în sintaxă, între JavaScript și limbajul Java nu există nicio legătură. Cea mai
întâlnită utilizare a JavaScript este în crearea de scripturi pentru pagini web. Programatorii web
pot îngloba în paginile HTML script -uri pentru diverse activită ți cum ar fi verificarea datelor
introduse de utilizatori sau crearea de meniuri și alte efecte animate. O tehnică de construire a
paginilor web tot mai întâlnită în ultimul timp este AJAX, abreviere de la „Asynchronous
JavaScript and XML”. Această tehnică constă în executarea de cereri HTTP în fundal, fără a
reîncărca toată pagina web și actualizarea numai anumitor po rțiuni ale paginii prin manipularea
DOM -ului paginii. Tehnica AJAX permite construirea unor interfe țe web cu timp de răspuns
mic, întruc ât opera ția (costisitoare ca timp) de încărcare a unei pagini HTML completă este în
mare parte eliminată. Scripturile JavaScript pot fi incluse în pagina Web în două moduri:
– prin intermediul etichetei;
8
– prin intermediul unei proced uri eveniment ;
Scripturile integrate în cadrul paginilor sunt evaluate după ce încărcarea paginii s -a
încheiat dar înainte ca aceasta să fie afi șată. Pe de altă parte, scripturile stocate ca fi șiere
separate sunt evaluate înaintea tuturor scripturilor in -line (adică a celor incluse în pagină).
Func țiile definite în cadrul scripturilor nu sunt executate automat la încărcarea paginilor ci abia
atunci când acestea sunt apelate, fie prin eticheta . [1]
II.2. Limbajul PHP
PHP este un limbaj de programare. Numele PHP provine din limba engleză și este un
acronim recursiv Hypertext Preprocessor. Folosit ini țial pentru a produce pagini web dinamice,
este folosit pe scară largă în dezvoltarea paginilor și aplica țiilor web. Se fo losește în principal
înglobat în codul HTML, dar începând de la versiunea 4.3.0 se poate folosi și în mod „linie de
comandă”, permi țând crearea de aplica ții independente. Este unul din cele mai importante
limbaje de programare web open -source și server -side, existând versiuni disponibile pentru
majoritatea web serverelor și pentru toate sistemele de operare.
Inițial, limbajul a fost dezvoltat de inventatorul său, Rasmus Lerdorf. Odată cu cre șterea
numărului de utilizatori, dezvoltarea a fost preluată de o nouă entitate, numită The PHP Group
(Grupul PHP).
Popularitatea de care se bucură acest limbaj de programare se datorează următoarelor
caracteristici :
– Familiaritatea : sintaxa limbajului este foarte u șoară combinând sintaxele unora din
cele mai popul are limbaje Perl sau C;
– Simplitatea : sintaxa limbajului este destul de liberă. Nu este nevoie de includere de
biblioteci sau de directive de compilare, codul PHP inclus într -un document executându -se
între marcajele speciale;
– Eficien ța : PHP -ul se f olose ște de mecanisme de alocare a resurselor, foarte necesare
unui mediu multiutilizator, a șa cum este web -ul;
– Securitate : PHP -ul pune la dispozi ția programatorului un set flexibil și eficient de
măsuri de siguran ță;
9
– Flexibilitate : fiind apărut di n necesitatea dezvoltării web -ului, PHP a fost modularizat
pentru a ține pasul cu dezvoltarea diferitelor tehnologii. Nefiind legat de un anumit server web,
PHP-ul a fost integrat pentru numeroasele servere web existente;
– Gratuitate : este probabil cea mai importantă caracteristică a PHP -ului. Dezvoltarea
PHP-ului sub licen ță open -source a determinat adaptarea rapidă a PHP -ului la nevoile web –
ului, eficientizarea și securizarea codului .
PHP este un limbaj de programare destinat în primul rând internet ului, aducând dinamică
unei pagini web. Este unul dintre cele mai importante limbaje de programare web open -source
(este gratuit și, în plus, utilizatorii pot ac ționa liber asupra procesului de dezvoltare) și server –
side (codul sursă nu se rulează pe calcu latorul celui care vizualizează pagina, ci pe serverul
web).
Prin CGI (Common Gateway Interface) se în țelege o interfa ță a unui server de web, care
extinde func ționalită țile acestuia. CGI nu se referă la un anumit limbaj de programare, ci
define ște un mod ul standardizat, prezent în cadrul unui server HTTP. Prin intermediul acestui
modul se stabilesc regulile prin care server -ul va pasa datele primite de la un utilizator către o
aplica ție scrisă într -un anumit limbaj de programare, pentru ca apoi să întoarcă rezultatele
acestei aplica ții înapoi la utilizator.
Limbajul PHP, în marea majoritate a cazurilor, se folose ște sub formă de secven țe de
cod inserate în cadrul unui document HTML. Din acest motiv, vom prefera termenul de „script
PHP” celui de pro gram PHP. Structura unui script PHP este foarte asemănătoare cu cea a unui
cod scris în limbajul C, mai ales în sensul în care structurile de programare au aceea și sintaxă
și aceea și func ționalitate. Rolurile de bază ale unui script PHP constau în aceea că script-ul
poate prelua date trimise de către o pagină web de la un client (în general, datele pot fi trimise
de către o pagină web prin intermediul formularelor) și de a executa o secven ță de program în
urma căreia va rezulta un cod HTML, cod pe care clie ntul îl va primi sub forma unei pagini
web. Clientul nu va avea acces la codul efectiv al script -ului, ci, prin faptul că acesta se află pe
server și se rulează tot pe acesta, va primi direct HTML -ul generat de script.
PHP nu este un limbaj de programare d e sine -stătător (cum ar fi C++, spre exemplu) ci
se folose ște în simbioză în primul rând cu HTML, și deci pentru a rula, are nevoie neapărată
de un server de web (http server). Practic, pentru a face ca pe calculatorul nostru să poată rula
10
fișiere php, ave m nevoie să instalăm, pe lângă limbajul PHP, și un server de web, și de a face
legătura dintre cele două.
Practic limbajul PHP face legătura între baza de date si utilizator.
Pentru conexiunea cu baza de date cât și interogările asupra acesteia am ales să folosesc
PHP PDO.
Mai jos vă prezint câteva porțiuni de cod reprezentative:
a) Conexiunea la baza de date
<?php
session_start();
$servername = "localhost";
$username = 'root';
$password = '';
$db_name = 'smart_imob';
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES
latin1',);
$conn = new PDO("mysql:host=$servername; dbname=".$db_name, $username,
$password, $options);
$conn ->setAttribute(PDO::ATTR_E RRMODE, PDO::ERRMODE_EXCEPTION);
?>
b) Funcție care facilitează operațiile în baza de date, evitând SqlInjection
public function sql_exec($sql_cmd,$export = "") {
global $conn;
$sql_cmd = str_replace(PHP_EOL, '', $sql_cmd);
try {
$sql_con = $conn ->prepare($sql_cmd);
$pos_end = 0;
$pos_arr = array();
while (is_int($pos_start = strpos($sql_cmd, ':', $pos_end))) {
if (!is_int($pos_end = strpos($sql_cmd,' ',$pos_start))) {
$pos_end = strlen($sql_cmd);
}
$pos_cm d = trim(substr($sql_cmd, $pos_start+1, $pos_end –
$pos_start));
if (!in_array($pos_cmd, $pos_arr)) {
array_push($pos_arr,$pos_cmd);
}
11
}
foreach ($pos_arr as $value) {
if (stripos($value, "=") === false){
if (!isset($_POST[$pos_cm d])) {
die('EROARE ! Variabila necunoscuta :
'.$value.' ! ('.$sql_cmd.')');
}
$sql_con ->bindParam(':'.$value, $_POST[$value]);
}
}
// if (in_array(strtoupper(substr($sql_cmd, 0,6)),
["INSERT","UPDATE","DELETE"])){
if ((strtoupper(substr($sql_cmd, 0,6)) !== "SELECT") &&
(strtoupper(substr($sql_cmd, 0,4) !== "SHOW"))){
$sql_data = $sql_con ->execute();
if ($sql_data == true) {
return "OK";
}
}
else {
if ($s ql_con ->execute()) {
if ($sql_con ->rowCount() > 0){
$sql_data = array();
while ($row = $sql_con –
>fetch(PDO::FETCH_ASSOC)) {
$sql_data[] = $row;
}
switch ($export) {
case 'return': return $sql_data; break;
case '0': echo
json_encode($sql_data[0]); break;
case '1': return
implode('',array_values($sql_data[0])); break;
default: return "OK"; break;
}
}
else {return '';}
}
else {echo "EROARE SQL_EXEC !";}
}
}
catch ( PDOException $e) {
echo json_encode($e ->getMessage()."@@".$sql_cmd."@@");
}
$sql_con = null;
}
12
Această func ție primește ca parametrii un string, care reprezintă comanda MySql
($sql_cmd) și un mod de răspuns ($export). Verifică fiecare parametru de forma
’:<parametru>’ și face bind, adică o evaluează și exclude comenzile de SQL Injection. Dacă
comanda mysql este ex ecutată cu succes returnează diferite valori sau date in funcție de
parametrul $export.
Această funcție se apelează prin:
• Crearea unui obiect:
$act = new PHP_functions();
$act->sql_exec($sql_cmd, ‚<tip_export>’);
• Apelare funcție prin extinderea clasei:
class <nume_clasa> extends PHP_functions{
self::sql_exec($sql_cmd, ‚<tip_export>’);
}
II.3. Baz e de date
Baza de date reprezintă o modalitate de stocare a unor informații și date pe un suport
extern cu posibilitatea extinderii ușoare și rapide a acestora. În general, baza de date este
memorată într -unul sau mai multe fișiere. Bazele de date sunt manipulate d e către sistemele de
gestiune a bazelor de date.
Datele sunt organizate în rânduri, coloane, tabele și sunt indexate pentru a facilita g ăsirea
informațiilor relevante. O bază de date relațională este o bază de date care are o colecție de
tabele, toate fiind descrise și organizate formal conform modelului rela țional. Datele pot fi
accesate sau reasamblate în numeroase moduri, fără a fi necesar să se reorganizeze tabelele
bazei de date. Bazele de date relaționale permit utilizatorilor să clasifice și să s tocheze cu
ușurință date care mai t ârziu pot fi interogate și filtrate pentru a extrage informa ții specifice.
Bazele de date relaționale sunt ușor de extins și nu se bazează pe organizarea fizică. Datele
sunt stocate o singura dată, cea ce elimină duplicar ea datelor. Inte rogările complexe sunt ușor
de realizat de c ătre utilizatori, mai mulți utilizatori pot accesa ace eași bază de date, iar sistemele
de gestiune a bazelor de date pot limita a ccesul doar pentru anumiți utilizatori.
II.4 Analiza stadiului actu al în domeniul problemei
În cadrul agențiilor imobiliare organizarea reprezintă unul dintre cele mai importante
aspecte asupra dezvoltării unui proiect. Există diverse aplicații care îndeplinesc cerințele
necesare pentru a ușura munca agențiilor. Aplicații le existente oferă o parte din funcționalitățile
13
care vor fi introduse și în cadrul acestui proiect. Analizând unele din aceste aplicații, se va
putea observa setul de funcționalități pe care le oferă fiecare în parte.
1. NIBO1
Nibo Imobiliare este o soluție software pentru gestionarea online a unei agenții
imobiliare. Aplicația poate fi folosită din orice locație utilizându -se telefonul mobil sau tableta.
• CRM Imobiliar
• Gestionează Cererile Și Ofertele Imobiliare
• Email/SMS Marketing
• Optimizat SEO
Agenția https://www.global -imobiliare -iasi.ro a implementat Nibo Imobiliare.
Figura 1 – Interfață web site Global Imobiliare
1 http://www.nibo.ro/soft -imobiliar
14
2. IMOBMANAGER2
Creat pentru a sprijini activitatea agenților imobiliari, dezvoltatorilor și băncilor. CRM –
ul Imobmanager are o interfa ță prietenoas ă și ușor de utilizat, se pot gestiona propriet ățile cat
și cererile clien ților, dar și publicarea automata pe site-urile de specialitate cu un singur click.
• Managementul propriet ăților, istoric pre ț
• Managementul contactelor (Proprietari, Clien ți, Colaboratori, Companii)
• Managementul cererilor
• Matching automat cerere -oferta, istoric oferte propuse.
• Trimitere mail c ătre client printr -un simplu click cu ofertele potrivite.
• Rapoarte de performan ță care permit gestionarea activit ății și optimizarea
costurilor
Agenția https://www.conceptimobiliare.ro a implementat Imobman ager.
Figura 2 – Interfață web site Concept Imobiliare
3. CRM REBS3
Creat cu pasiune și entuziasm din dorința de a dezvolta o unealtă utilă pentru agenții
imobiliari, CRM REBS a crescut frumos și s -a perfecționat într -un program imobiliar de
2 https://www.imobmanager.ro/#crmImobiliar
3 https://www.crmrebs.ro
15
succes, o soluție excelentă pentru creșterea productivității și a eficienței manag erilor din
domeniul imobiliar, a agenților și personalului administrativ.
Bazele acestui software imobiliar au fost puse de către Dumitru Sîrbu, fost agent
imobiliar, care a cunoscut și s -a confruntat cu toate provocările de zi cu zi din domeniu, ajutat
de partenerii Felix Kerekes și Cătălin Pintea, pasionați de tehnologie.
Figura 3 – Interfață CRM REBS
În tabelul de mai jos este prezentată o comparație a sistemului propriu cu sistemele
similare care se ocupă de managementul unei agenții imobiliare. An aliza a fost realizată pe
baza unui set de criterii ce au fost identificate ca fiind relativ comune
Funcționalitate/sistem NIBO IMOBMANAGER CRMREBS SMART
IMOB
Aplicație web ✓ ✓ ✓ ✓
Aplicații mobile ✓ ✓ ✓ Nu are
Multi utilizator ✓ ✓ ✓ ✓
Notificări ✓ ✓ ✓ ✓
Listă imobile ✓ ✓ ✓ ✓
Generare Rapoarte ✓ ✓ ✓ ✓
16
Căutare(utilizatori,
imobile etc.) ✓ ✓ ✓ ✓
Generare contract
automat Nu are Nu are Nu are ✓
Calendar proiecte ✓ ✓ ✓ Nu are
Tabel 1 – Analiză comparativă
17
III. PROIECTAREA APLICAȚIEI WEB
III.1. Obiectivele aplicației
În cadrul acestui capitol sunt prezentate obiectivele propuse pentru aplicația realiz ată.
Scopul aplicației este de a ușura munca angajaților din tr-o agenție imobiliară cât și de a
îmbunătății performanțele acestora. Astfel, aplicați a servește la îmbunătățirea procesului de
dezvoltare internă.
III.1.1. Obiectivul principal
Obiectivul principal al aplicației se focusează pe oferirea unui soluții software pentru o
agenției imobiliară . Această soluție are rolul de a facilita munca angajaților prin
funcționalitățile care le pune la dispoziție. Sistemul permite managementul proprietăților ,
managementul organizatoric, managementul contractelor . În cadrul sistemului realizat
managementul proprietăților face referire la op erațiile efectuate pe proprietăți , sarcini și
rapoarte .
III.1.2. Obiectivele secundare
Un obiectiv important propus este reprezentat de eficiența utilizării aplicației , respectiv
interfața aplicației trebuie să fie simplă, ușor de navigat, cât mai prietenoasă, curată și
organizată, astfel obiectivul este atins rapid. Interfa ța av ând un rol decisiv în aprobarea
succesului aplicației.
Al doilea obi ectiv general care se dorește să fie realizat este reprezentat de securitate. Se
dorește evitarea accesului utilizatorilor neautorizați la resursele aplicației. În funcție de rolul
utilizatorului se restric ționează a ccesul la re sursele aplicației, fiecare utilizator având acces la
pagina proprie , iar în funcție de rolul care benefi ciază pot accesa pagini care le pun la dispozi ție
funcționalități separate. Acest obiectiv o sa fie realizat prin autentificare și autorizare.
Sistemul propus trebuie să poată fi utilizat de mai multe tipuri de utilizatori, re spectiv :
administratorul și agenții imobiliari.
18
Admin istrator – este acel tip de utilizator care gestionează conturile utilizatorilor care
pot accesa aplicația, gestionează contracte , vizualize ază rapoa rte.
Agentul imobiliar – este acel tip de utilizator care adaugă imobile și se ocupă de
încheierea contractelor.
Sistemul trebuie să fie capabil să ofere posibilitatea admin istratorului să efectueze
operații de creare, vizualizare, modificare și ștergere a supra angajaților. Administratorul este
cel care cre ează conturi angajaților, iar aceștia primesc datele de autenti ficare .
Sistemul trebuie să permită gestionarea imobilelor . Utilizatorul cu rolul de agent
imobiliar, are permisiunea de a adăuga, vizualiza, modifica, șterge imobile cât și încheiere
contracte . Gestionarea imobilelor constă în operațiile de creare, vizual izare, modificare,
ștergere și încheiere contracte .
III.2. Analiza aplicației
Acest capitol prezintă cerințele și principiile de funcționare utilizate pentru realizarea
aplica ției web. Sistemul este analizat din mai multe perspective, respectiv s -a realiza t o analiză
generală, de unde reies cerin țele non -funcționale, o analiză care urmărește funcționalitatea
fiecărei componente în parte, de unde rezultă cerințele funcționale și s-a efectuat o cercetare
asupra tehnologiilor utilizate pentru dezvoltarea a plicației web.
III.2.1. Cerințele aplicației
Cerințele unui si stem pot fi clasificate în cerințe funcționale și cerințe non -funcționale.
Cerințele funcționale prezintă acele funcționalități concrete pe care sistemul trebuie sa le ofere
astfel încât să r ăspundă cerințelor. Cerințele non -funcționale sunt acele cerințe care nu implică
realizarea unei func ționalități, dar care sunt necesare ca func ționalitățile să poată fi utilizate.
III.2.2. Cerințe funcționale
Cerințele funcționale descriu funcțiile pe care trebuie să le realizeze sistemul și modul
în care un utilizat or poate interac ționa cu aplicația. Ele pot fi calcule, procesări de date sau alte
funcționalită ți specifice care definesc ce ar trebui să facă un sistem. Cerințele funcționale ale
sistemului au fost stabilite în urma analizei efectuate asupra sistem elor similare.
19
În tabelul de mai jos sunt specificate principalele cerințe funcționale ale sistemului
dezvoltat.
Identificator Descrierea cerinței funcționale Utilizator
CF 1 Autentificare Toți utilizatorii
CF 2 Administrare conturi utilizatori Admin istrator
CF 3 Administrare proprietăți Toți utilizatorii
CF 4 Adăugare proprietăți Toți utilizatorii
CF 5 Modificare proprietăți Toți utilizatorii
CF 6 Vizualizare proprietăți Toți utilizatorii
Tabel 2 – principalele cerințe funcționale
III.2.3. Cerințe non -funcționale
În ingineria sistemelor, o cerin ță non-funcțională este o cerință care specifică criteriile
care pot fi utilizate pentru a descrie modul în care func ționează sistemul, în timp ce cerințele
funcționale descriu ce ar trebui să facă sistemul. Cerințele non -funcționale sunt vitale pentru
succesul sistemelor software. În cazul în care acestea nu sunt abordate în mod corespunzător.
Cerințele non -funcționale pentru sistemul realizat sunt urm ătoarele:
• Utilizabilitatea
Interfa ța aplicației trebuie să fie cât mai simplă, astfel înc ât un utilizator nou să poată
folosi aplicația fără sa consulte un manual de utilizare. Designul interfeței grafice, dar și
plasarea elementelor în locații specifice, familiar utilizatorului, reprezintă elemente esențiale
pentru o utilizare preferată de utilizator. O aplicație cu o interfață prietenoasă, ușor de învățat,
de navigat și care face ca obiectivul să fie atins rapid, este dorită de utilizator în defavoarea
20
unei aplicații cu multe func ționalităț i, dar care nu beneficiază de o interfață corespunz ătoare.
Interfa ța are un rol decisive în aprobarea succesului aplica ției.
• Extensibilitatea
Această proprietate non -funcțională a sistemului m ăsoară cât de ușor se pot adăuga noi
funcționalități aplica ției. Implementarea sistemului a fost realizată astfel înc ât dezvoltările
viitoare sa poate fi f ăcute cu ușurință și să nu degradeze modul de funcționare existent.
Adăugarea de noi func ționalități se realizează ușor în cadrul proiectelor bine structurate
. • Performanța
Perfo rmanța ca și indicator de calitate reprezintă o măsură care definește volumul de
procesări pe care o aplicație trebuie să le poată realiza pe o unitate de timp sau termenul care
trebuie respectat pentru finalizarea corectă a unei aplica ții. Sistemul realizat prezintă un timp
de răspuns scurt pentru procesarea datelor, o rată de utilizare ridicată și o utilizare scăzută a
resurselor sistemului. Performanța este necesară pentru a putea asigura utilizarea și
funcționarea în condiții optime a sistemului. S -a pus a ccent pe implementarea unui sistem care
comunică în timp real cu clientul.
• Scalabilitate
Această proprietate arată capacitatea unui sistem de a suporta corect un volum mai mare
de date sau de a permite mărirea sau extinderea sa. Un sistem de p relucrare a datelor este
scalabil dacă atunci c ând volumul de date pe care le p relucrează devine mai mare, iar sistemul
se comportă similar, f ără defecțiuni. De asemenea, un sistem este scalabil și dacă acesta oferă
rezultate îmbunătățite în condițiile în care sunt adăugate resurse suplimentare (hardware).
• Securitate
Cea mai importantă cerință non -funcțională este securitatea, presupune protecția
împotriva atacurilor. Utilizatorii înregistra ți vor avea parole criptate în baza de date, fiecare
utilizator se autentifică pentru a avea acces la sistem, în cazul în care un utilizator nu este
înregistrat, aces ta nu poate accesa sistemul. În funcție de rolul utilizatorului se restricționează
accesul acestuia. Utilizatorii au acces la pagina proprie, iar în funcție de rolul de care
beneficiază pot accesa pagini care pun la dispoziție func ționalită ți diferite.
21
• Accesibilitatea
Accesibilitatea este reprezentată de modul simplu în care se poate accesa aplicația.
Datorită faptului ca sistemul realizat este o aplica ție web, se poate accesa foarte ușor prin
intermediul unui browser web, as tfel utilizatorului îi este necesară o conexiune la internet si un
browser web pentru a putea utiliza aplicația.
• Disponibilitatea
Această cerin ță non -funcțional ă este reprezentată de momentele în care sistemul poate fi
utilizat. Aplicația poate fi disponibilă permanent, astfel înc ât utilizatorii să poată folosi aplicația
în orice moment doresc. Pentru a putea accesa aplicația este necesar să existe conexiune la
internet.
III.3. Cazuri de utilizare
Modelul cazurilor de utilizare cuprinde: actorii, scenarii, cazurile de utilizare și
diagramele cazurilor de utilizare. Cazurile de utilizare sunt folosite în analiza sistemelor pentru
a clarifica și organiza ceri nțele sistemelor. Un caz de utilizare poate fi considerat ca un set de
scenarii posibile care au leg ătura cu un anumit scop. Cazurile de utilizare ar trebui s ă conțin ă
toate activitățile sistemului care au o anumita valoare pentru utilizator. Un caz de utilizare sau
un set de cazuri, au urm ătoarele particularități: organizează cerințele funcționale ale sistemului,
conturează interac țiunea dintre obiectivele sistemului și actorii acestuia, înregistrează căile de
la declanșarea evenimentelor până la obiective, descr ie un flux principal de evenimente și
permite mai multe nivele, astfel înc ât un caz de utilizare să poată folosi funcționalitatea altuia.
III.3.1. Utilizatorii aplicației
Sistemul realizat suportă două tipuri de utilizatori:
• Admin istrator – este utiliz atorul care gestionează utilizatorii care pot accesa aplicația,
efectuează rapoarte periodice și deține controlul .
• Agentul imobiliar – este utilizatorul care adaugă imobile și se ocupa de încheierea
contractelor .
22
În figura urm ătoare sunt prezentate toate cazurile de utilizare, în care actorul principal
este Admin istratorul -ul aplicației.
Figura 4 – Cazuri utilizare administrator
În figura urm ătoare sunt prezentate toate cazurile de utilizare, în care actorul este agentul
imobiliar.
Figur a 5 – Cazuri utilizare agent imobiliar
agentlogin
logout
vizualizare
parteneri
vizualizare
clienti
vizualizare
imobilefinalizare
tranzactiivizualizare
contracteadaugare
parteneriadaugare
clientiadminlogin
logout
adaugare
date firma
vizualizare
parteneri
vizualizare
clienti
vizualizare
imobilevizualizare
rapoarteștergere
utiliatorimodificare
utilizatoriînregistrare
utilizatori
23
III.3.2. Descrierea detaliată a cazurilor de utilizare
În cadrul acestui subcapitol, se va realiza o descriere detaliata a cazurilor de utilizare.
Caz de utilizare 1: Autentificarea utilizatorului
Actor: Admin istrator , Agent imobiliar
Pentru a avea acces la funcționalitățile puse la dispozi ție de sistem es te necesar ca
utilizatorul să se autentifice.
Precondiții: – Utilizatorul trebuie să acceseze pagina de autentificare
Postcondiții: – Autentificarea utilizatorului în sistem
Scenariu favorabil:
– Accesarea paginii de autentificare
– Introducerea datelor de autentificare
– Trimiterea datelor în urma ap ăsării butonului de „ Autentificare ”
– Verificarea corectitudini datelor
– Autentificarea utilizatorului în sistem
Scenariu nefavorabil:
În cazul în care utilizatorul int roduce date nevalide, sistemul afi șează un mesaj
corespunz ător pentru a specifica că datele introduse nu sunt valide.
Diagrama urm ătoare oferă o reprezentare vizuală a evenimentelor declanșate de cazul
de utilizare în care oricare dintre actori se autentifică în sis tem.
24
Figura 6 – Autentificare sistem
Caz de utilizare 2: Înregistrare utilizator
Actor: Admi nistrator
Scop: Pentru a avea și alți utilizatori acces la sistem.
Precondiții:
– Autentificarea utilizatorului în sistem
– Utilizatorul trebuie să dețină rolul de Admin inistrator
– Accesarea paginii pentru înregistrare utilizatori
Postcondiții:
– Înregistrare utilizator
– Utilizatorul nou înregistrat prime ște un e -mail cu noul lui cont
25
Scenariu favorabil:
1. Admin istrator-ul se autentifică
2. Adăugare date valide pentru contul de utilizator
3. Trimiterea datelor pentru procesare
4. Înregistrare utilizator cu succes
Scenariu nefavorabil: Dacă administratorul nu completează toate c âmpurile atunci
înregistrarea nu poat e fi realizată.
Diagrama urm ătoare oferă o reprezentare vizuală a evenimentelor declanșate de cazul de
utilizare în care acto rul “Admin istrator ” înregistr ează un nou utilizator în sistem.
Figura 7 – Inregistrare utilizator nou
Caz de utilizare 3: Adău gare imobile
Actor: Agent imobiliar
26
Scop: Înregistrarea proiectelor în sistem.
Precondiții:
– Autentificare utilizator
– Utilizatorul trebuie să dețină rolul de Agent imobiliar
– Accesarea paginii pentru adăugare imobile
Postcondiții : Adăugare imobil în sistem
Scenariu favorabil:
1. Autentificare utilizator
2. Adăugare date valide pentru imobil
3. Trimiterea datelor pentru procesare
4. Adăugare imobil nou
Scenariu nefavorabil: Nu va putea salva imobilul pentru c ă datele introdus e nu au fost
completate corect.
Diagrama urm ătoare oferă o reprezentare vizuală a evenimentelor declanșate de cazul de
utilizare în care acto rul “agent imobilar ” adaugă un nou imobil .
27
Figura 8 – Adăugare imobil
Caz de utilizare 4: Vizualizare rapoa rte
Actor: Admin istrator
Scop: Identificarea relațiilor dintre angajați si a performanțelor
Precondiții:
– Autentificare în sistem
– Accesarea paginii pentru vizualizare rapoa rte
Scenariu favorabil:
1. Autentificare utilizator
2. Accesarea paginii pentru vizualizare rapoarte
3. Afișare raport
28
III.4. Proiectarea bazei de date
Baza de date conține o colecție de date necesare pentru funcționarea și utilizarea
aplicației web. În baza de date sunt stocate informații care sunt necesare aplicației pentru a -și
îndeplini obiectivul. Aplica ția utilizează o baz ă de date care conține zece tabele: clienți, mesaje,
general, contracte, imobile, date_firma, users, parteneri, consultanti, smart_imob.
La proiect area bazei de date s -a dorit reprezentarea cât mai corectă a informațiilor, astfel
încât să se reducă posibilitatea de a se ajunge la informații eronate sau la pierderea datelor.
Pentru realizarea acestor aspecte s -a utilizat tehnica de normalizare a bazei de date.
Tabela clienți – aici se rețin informații despre clienții agenției
Tabela mesaje – această tabelă înregistrează notificările venite de pe site
Tabela general – aici sunt câteva date predefinite
Tabela contracte – se rețin date despre contractele încheiate
Tabela imobile – acesta tabelă reține informații despre imobile și conține câmpuri
necesare pentru descrierea acestora
Tabela date_firma – această tabelă reține informații cu privire la firma imobiliară
Tabela users – în această tabelă sunt înreg istrați utilizatorii aplicației și reține informații
utile despre aceștia.
Tabela parteneri – în această tabela sunt înregistrați cei care doresc să vândă
Tabela consultanți – În momentul în care administratorul creează un nou cont, datele
introduse vor f i salvate în baza de date
Tabela smart_imob – aici sunt câteva date predefinite
29
Figura 9 – Tabelele bazei de date
III.5 Arhitectura aplicației web
SERVER SITE WEB PAGINA ADMIN
Php, mysql Html, javascript, css client agent
30
IV. IMPLEMENTARE
După autentificare meniul principal al aplicației va fi afișat. În fereastra principală, în
funcție de meniul selectat , se va afișa conținutul principal al paginii specifice acestuia.
Meniul oferă acces la funcționalitățile pe care le oferă aplicația iar în submeniuri sunt
puse la dispoziție instrumente cu cele mai importante funcții pentru fiecare. Unele dintre
submeniuri au o opțiune drop -down, care permite acces rapid elemente suplim entare. Opțiunile
care sunt disponibile în fiecare submodul sunt descrise în secțiunile specifice. Aplicația va
actualiza în mod automat modificările efectuate pentru toți utilizatorii logați, atunci când
interacționează cu acesta (de exemplu, de fiecare d ată când utilizatorul salvează niște date în
baza de date ).
Codul prezentat mai jos generează meniul:
<body>
<div class="page -wrapper chiller -theme toggled">
<a id="show -sidebar" class="btn btn -sm btn -dark" href="#">
<i class="fas fa -bars"></i>
</a>
<nav id="sidebar" class="sidebar -wrapper">
<div class="sidebar -content">
<div class="sidebar -brand">
<a href="#">SMART -IMOB</a>
<div id="close -sidebar">
<i class="fas fa -times"></i>
</div>
</div>
<div class="sidebar -menu">
<ul>
<li class="sidebar -dropdown">
<a href="#">
<i class="fa fa -user"></i>
<span>Clienti</span>
</a>
<div class=" sidebar -submenu">
<ul>
<li>
<a href="#" id="lista_clienti">Lista</a>
</li>
<?php
if($chk == "U"){
?>
<li>
<a href="#" id="add_clienti">Adauga</a>
</li>
<?php } ?>
</ul>
</div>
</li>
<li class="sidebar -dropdown">
<a href="#">
<i class="far fa-file"></i>
<span>Contracte</span>
31
</a>
<div class="sidebar -submenu">
<ul>
<li>
<a href="#" id="lista_con">Lista</a>
</li>
<?php
if($chk == "U"){
?>
<li>
<a href="#" id="add_con">Adauga</a>
</li>
<?php } ?>
</ul>
</div>
</li>
<li class=" sidebar -dropdown">
<a href="#">
<i class="fa fa -home"></i>
<span>Proprietati</span>
</a>
<div class="sidebar -submenu">
<ul>
<li>
<a href="#" id="lista_prop">Lista</a>
</li>
<li>
<a href="#" id="add_prop">Adauga</a>
</li>
</ul>
</div>
</li>
<?php
if($chk == "A"){
?>
<li class="sidebar -dropdown">
<a href="#">
<i class="fa fa -globe"></i>
<span>Rapoarte</span>
</a>
<div class=" sidebar -submenu">
<ul>
<li>
<a href="#" id="statistica">Statistica</a>
</li>
<!– <li>
<a href="#" id="liste">Liste</a>
</li> –>
</ul>
</div>
</li>
<?php } ?>
<li class="sidebar -dropdown">
<a href="#">
<i class="fa fa -globe"></i>
<span>Administrare</span>
</a>
32
<div class="si debar -submenu">
<ul>
<?php
if($chk == "A"){
?>
<li>
<a href="#" id="admin_agenti">Consultanti</a>
</li>
<?php } ?>
<li>
<a href="#" id="admin_parteneri">Parteneri</a>
</li>
<?php
if($chk == "A"){
?>
<!– <li>
<a href="#" id="admin_conta" >Contabilitate</a>
</li> –>
<?php } ?>
<!– <li>
<a href="#" id="smart_imob">SMART IMOB</a>
</li> –>
</ul>
</div>
</li>
<li class="header -menu">
<span>Extra</span>
</li>
<?php
if($chk == "A"){
?>
<li>
<a href="#" id="setari">
<i class="fa fa -calendar"></i>
<span>Setari</span>
</a>
</li>
<?php } ?>
<li>
<a href="#" id="site_prezentare">
<i class="fa fa -calendar"></i>
<span>SITE PREZENTARE</span>
</a>
</li>
<li class="header -menu">
<span>Utilizator</span>
</li>
<li>
<a href="javascript:;">
<span><?php echo $email; ?></span>
</a>
</li>
</ul>
</div>
</div>
<div class="sidebar -footer">
33
<a href="#">
<i class="fa fa -envelope"></i>
<span class="badge badge -pill badge -success notification" id="notify_mesaje_nr"></span>
</a>
<a href ="#">
<i class="fa fa -power -off" id="log_out"></i>
</a>
</div>
</nav>
Tabel 3 : Bucată cod generare meniu
Figură 10 – Meniul aplicației
MENIU SETARI:
Se introduc datele firmei
MENIU ADMINISTRARE:
1. PARTENERI:
34
a. Aici se introduc firmele sau persoanele fizice pentru care se faciliteaz ă
vânzarea.
b. Deamenea se pot edita datele introduse
2. CONSULTANTI:
a. Se introduc angaja ții firmei de imobiliare. Disponibil doar
administratorului.
MENIU CLIENTI:
1. ADAUGA:
a. Se introduc datele cumparatorului, duăa care se afi șează propriet ățiile
disponibile pentru cump ărare
2. LISTE:
a. Sunt afi șați toți clien ții cu toate propr ietățile pe care le -au cump ărat
MENIU CONTRACTE:
Se pot ad ăuga contracte. U n contract înseamn ă o vânzare sau o închiriere.
Se pot vi zualiza contractele în func ție de diferite filtre si deasemnea daca se dore ște desc ărcarea
din nou a unui contract.
Cum se genereaz ă contractul ? Pentru generarea autom ată a contractelor se folose ște libraria
PHPOFFICE împreun ă cu două template -uri de contracte (v ânzare/ închirie re). Se aduc din
baza de date datele corespunzatoare imobilului , iar apoi se completeaz ă tag-urile din templete –
ul corespunzator.
<?php
use PhpOffice \PhpWord \Style \Font;
use PhpOffice \PhpWord \Style \Paragraph;
require_once '../vendor/phpoffice/phpword/bootstrap.php';
require ("../core/connectDB.php");
require ("PHP_functions.php");
if (!file_exists('doc/contract_vanzare -cumparare.docx')) {die();}
class Create_Word extends PHP_functions{
public $ templateProcessor;
35
private $final_arr = array();
private $n_file = "contract_vanzare -cumparare";
private $f_name = "CONTRACT VANZARE – ";
public function __construct(){
if ($_GET['tip'] == "CHIRIE"){
$this ->n_file = "contract_inchiriere";
$this->f_name = "CONTRACT CHIRIE – ";
}
$this ->filename_template = 'doc/'.$this ->n_file.'.docx';
$this ->templateProcessor = new
\PhpOffice \PhpWord \TemplateProcessor($this ->filename_template);
$_POST['idd'] = $_REQUEST['id'];
$sql_cmd = "SELECT ser ie, c.numar, DATE_FORMAT(c.datain, '%d.%m.%Y')
AS data_in,
CONCAT(cl.nume,' ',
cl.prenume) AS nume_prenume_cump,
CONCAT(cl.localitate,',
str. ', cl.strada, ', nr. ', cl.numar, ', judet ', g.value1) AS adr_cump,
cl.codpers AS
codper s_cump, p.denumire AS denumire_vanzator, p.cif AS cif_vanzator,
CONCAT(p.localitate, ',
str. ', p.strada, ', nr. ', p.numar, ', judet ', g1.value1) AS adr_vanzator,
CONCAT(cc.nume, ' ',
cc.prenume) AS nume_prenume_consult, cc.bi_serie, cc. bi_numar,
CONCAT(i.localitate, ', str.
', i.strada, ', nr. ', i.numar, ', judet ', g2.value1) AS adr_imobil,
g3.value1 AS tip_imobil,
IF(i.tip_imobil <> 'T',
CONCAT('compus din ', i.nr_cam,' camere, ', i.nr_bai, ' bai, ', i.nr_balcoane, ' balcoane, ',
i.nr_buc, ' bucatarii, ', i.nr_parc, ' parcari, avand suprafata construita de ', i.s_construita, '
mp si utila de ', i.s_utila, ' mp.'), ' cu suprafata totala de ') AS descriere_imobil,
i.id AS id_imobil, pret,";
if ($_GET['tip'] ==
"CHIRIE"){
$sql_cmd .=
"CONCAT(pret,' EUR, reprezentand chiria pe o luna') AS comision,";
}
else{
$sql_cmd .=
"CONCAT(val_comision,' EUR, reprezentand ', comision, '% din valoarea tranzactiei') AS
comision,";
36
}
$sql_cmd .=
"DATE_FORMAT(i.de_la, '%d.%m.%Y') AS de_la, DATE_FORMAT(i.pana_la, '%d.%m.%Y')
AS pana_la,
ROUND(DA TEDIFF(STR_TO_DATE(pana_la,'%Y%m%d'),
STR_TO_DATE(de_la,'%Y%m%d'))/30) AS total_luni,
(ROUND(DATEDIFF(STR_TO_DATE(pana_la,'%Y%m%d'),
STR_TO_DATE(de_la,'%Y%m%d'))/30)*pret) AS total_de_plata
FROM contracte c
LEFT JOIN clienti cl ON
(c.cumparator=cl.id)
LEFT JOIN general g ON (g.tip='JUDET'
AND g.value=cl.judet)
LEFT JOIN parteneri p ON
(c.vanzator=p.id)
LEFT JOIN general g1 ON (g1.tip='JUDET'
AND g1.value=p.judet)
LEFT JOIN consultanti cc ON
(c.consultant=cc.id)
LEFT JOIN imobile i ON (c.imobil=i.id)
LEFT JOIN general g2 ON (g2.tip='JUDET'
AND g2.value=i.judet)
LEFT JOIN general g3 ON
(g3.tip='TIP_IMOBIL' AND g3.value=i.tip_imobil)
WHERE c.id= :idd ";
$this ->final_arr = self::sql_exec($s ql_cmd, "return")[0];
$data_firma = self::sql_exec("SELECT denumire AS denumire_firma, cif AS
cif_firma,
CONCAT(localitate, ', str. ', strada, ', nr. ', numar, ', jud. ', value1) AS adr_firma
FROM date_firma d
LEFT JOIN gene ral g ON
(g.tip='JUDET' AND g.value=d.judet)", "return")[0];
$_POST['idd'] = $this ->final_arr['id_imobil'];
$str_utilitati = self::get_specificatii("UTILITATI");
$str_finisaje = self::get_specificatii("FINISAJE");
$str_dotari = self:: get_specificatii("DOTARI");
$this ->final_arr['denumire_firma'] = $data_firma['denumire_firma'];
$this ->final_arr['cif_firma'] = $data_firma['cif_firma'];
37
$this ->final_arr['adr_firma'] = $data_firma['adr_firma'];
$this ->final_arr['utilitati'] = $st r_utilitati;
$this ->final_arr['finisaje'] = $str_finisaje;
$this ->final_arr['dotari'] = $str_dotari;
}
private function create_word_file(){
$this ->templateProcessor = new
\PhpOffice \PhpWord \TemplateProcessor($this ->filename_template);
self::set _value_tags($this ->final_arr);
$this ->templateProcessor ->saveAs('doc/'.$this ->f_name.$this –
>final_arr['nume_prenume_cump'].'.docx');
}
public function set_value_tags($arr){
foreach ($arr AS $k => $v){
if (is_array($v)){
$this ->templateProcess or->cloneRow($k, sizeof($v));
for ($j = 0; $j < sizeof($v); $j++){
$this ->templateProcessor ->setValue($k.'#'.($j+1),
$v[$j]);
}
}
else {
$this ->templateProcessor ->setValue($k, $v);
}
}
}
public function download_header(){
ob_clean();
$filer = 'doc/'.$this ->f_name.$this –
>final_arr['nume_prenume_cump'].'.docx';
$len = filesize($filer);
$filename = basename($filer);
header("Pragma: public");
header("Expires: 0");
header("Cache -Control : must -revalidate, post -check=0, pre -check=0");
header("Cache -Control: public");
header("Content -Description: File Transfer");
header('Content -Type: application/vnd.openxmlformats –
officedocument.wordprocessingml.document');
38
$header='C ontent -Disposition: attachment; filename="'.$filename.'";';
header($header );
header("Content -Transfer -Encoding: binary");
header("Content -Length: ".$len);
@readfile($filer);
unlink($filer);
flush();
}
public function export_word(){
self::create_word_file();
self::download_header();
}
}
$word = new Create_Word();
$word ->export_word();
?>
MENIU PROPRIETATI:
Se adaug ă imobile. Se pot vi zualiza imobilele ad ăugate sa u vândute și deasemnea tot de aici se
poate face cump ărarea sa u închirierea imobilului dorit.
MENIU RAPOARTE:
Accesibil doar administratorului. Se pot vedea statitici de v ânzari, închirieri, imobile spre
vânzare/ închiriere, etc.
Cum se generează rapoartele ? Se selecteaz ă datele dorite din baza de date în func ție de diferite
filtrări și se trimit c ătre javascript. Cu ajutorul librariei ApexCharts din javascript și cu datele
primite de pe server se generaz ă diferite grafice. ( https://ape xcharts.com/ )
39
IV.1. Utilizare aplicație
Înregistrarea utilizatorilor în sistem este realiză de către administrator. Utilizatorii
înregistrați cu emailul și parola se vor putea conecta la sistem.
În figura urm ătoare este prezentată pagina de înregistrare, unde administratorul introduce
datele personale ale utilizatorului, iar dacă acestea sunt valide, utilizatorul este înregistrat în
cadrul sistemului.
Figura 11. Înregistrare utilizator în sistem
În figura următoare este prezentată pagina de autentificare , unde utilizatorul își introduce
email -ul și parola în câmpurile specifice, iar dacă acestea sunt valide utilizatorul are acces la
sistem.
40
Figura 12. Pagina de autentificare
În continuare sunt detaliate câteva dintre principalele funcționalități puse la dispoziție de
aplicația realizată. Adăugare proprietate – această operație este efectuată de c ătre utilizatorul
cu rolul de agent . Pentru adăugarea unei noi proprietăți utilizatorul completează câmpurile
necesar e..
Figura 13. Adăugare proiect
Rapoarte privind proprietățile înregistrate, vânzările realizate, închirieri, dar și rapoarte
privind agenții imobiliari.
41
Figura 14. Rapoarte
IV.2. Site de prezentare
Figura 1 5. Pagina principală a site -ului de prezentare
42
Figura 1 6. Pagina pentru vânzări
Figura 1 7. Detalii proprietate și posibilitate contact agent
43
V. TESTARE ȘI VALIDARE
În acest capitol sunt prezentate câteva cazuri de testare pentru sistemul realizat. Pentru
testare am ales câteva scenarii ale sistemului, iar pentru fiecare dintre acestea se va realiza câte
un caz de test corespunzător, în urma căruia se va determina dacă rezultatele obținute corespund
cu rezultatel e așteptate. Testarea sistemului se va realiza manual, prin testarea func ționalității
acestuia.
În tabelul următor este prezentat cazul de test pentru logarea unui utilizator în sistem:
Caz de testare: Logarea utilizatorului în sistem
Preconditii: Utiliz atorul trebuie să dețină un cont
Acțiune Rezultat așteptat
1. Utilizatorul accesează pagina principală a
aplicației, respecitiv pagina de login Deschiderea paginii de login
2. Utilizatorul introduce credențialele în
câmpurile afișate și apasă butonul de login Așteptarea răspunsului de la server
3. Primirea rezultatului de la server Dacă au fost introduse datele existente
utilizatorul este redirecționat spre pagina
principală a rolului pe care îl deține, altfel se
afișează un mesaj în care se specifică fa ptul
că datele introduse nu sunt valide
Tabel 4 – Cazul de test pentru logarea unui utilizator în sistem
În tabelul următor este prezentat cazul de test pentru adăugarea unui nou proiect, această
acțiune fiind realizată de către utilizatorii care dețin rolul de agent imobiliar
Caz de testare: Adăugarea unui nou imobil
Preconditii: Utilizatorul trebuie să dețină un cont
44
Acțiune Rezultat așteptat
1. Utilizatorul se loghează în aplicație
conform etapelor descrise în tabelul 6.1 Afișarea paginii prin cipale corespunzatoare
utilizatorului cu rolul de agent imobiliar
2. Din meniul afișat, utilizatorul selectează
proprietăți, apoi adauga Deschiderea unei ferestre care deține
câmpurile care trebuie completate pentru
crearea unui nou proiect
3. Completarea câmpurilor afișate pentru
crearea unui nou proiect și apăsarea
butonului pentru salvare Afișarea unui mesaj care specifică faptul ca
operația a fost efectuată cu succes
Tabel 5 – Cazul de test pentru adăugarea unui imobil
45
VI. CONCLUZII ȘI DIRECȚII DE DEZVOLTARE
În cadrul acestui capitol se vor prezenta realizările și obiectivele care au fost atinse prin
acest proiect, precum și o descriere a eventualelor dezvoltări ulterioare.
VI.1 Stadiul actual al proiectului
Proiectul reușește să își atingă obiectivul propus, realizând cu succes managementul
activităților din cadrul unei agenții imobiliare . Obiectivele propuse pentru acest proiect au fost
îndeplinite, astfel aplicația oferă posibilit atea de management a contur ilor utilizatorilor, a
proprietăților , a contractelor , a clienților , a partenerilor, precum și transmiterea de notificări
din partea clienților , iar pentru analize asupra activității din cadrul agenției pot fi vizualizate
rapoarte care ajută la stabilirea unor concluzii și luarea unor decizii corespunzătoare. Scopul
rapoartelor este de a îmbunătății performanța a genților și a relațiilor dintre aceștia.
După cum s -a propus, în cadrul sistemului există două tipuri de utilizatori, pentru fiecare
tip existând cate un meniu cu resursele disponibile rolului deținut de utilizator. Securitatea
aplicației a fost asigurată prin folosirea autentificării și reținerea parolelor criptate în baza de
date. Sistemul reu șește să pună la dispoziția utilizato rilor o interfață grafică intuitivă,
prietenoasă și ușor de învățat.
În concluzie, se poate spune ca sistemul realizat conferă utilizatorilor posibilitatea de a –
și desfășura mai ușor munca și de a obține performanțe mai bune în urma desfășurării lucrului
online .
VI.2 Direc ții de dezvoltare
• Mai multe filtre si rapoarte (export date in format xlsx si csv)
• Optimizare site de prezentare .
• Dezvoltare securitate la introducerea datelor c ât și la autentificare. Ținând cont c ă acest
soft se va reg ăsi în cloud, pent ru o securitate mai buna se recom anda achizi ționarea
unui certificat SSL
• Dezvoltare aplica ție nativ ă android/ ios
• Integrare parte de contabilitate primar ă (emitere fluturasi , salariu fix+ bonusuri din
vanzari, etc)
46
VII. BIBLIOGRAFIE
[1] Richard Wagner, R. Allen Wyke, JavaScript, traducere de Cora Radulian și Dan Pavelescu,
Editura Teora, 2001, Bucure ști
[2] Data Validation, Data Integrity, Designing Distributed Applications with Visual Studio
.NET
[3] Jean-Paul Mesters, Aide -mémoire JavaScript, OEM -Eyrolles, Paris, 2003
[4] Mike Robertshaw, Web Site Design (U234), The Open University of Hong Kong, 2002
[5] Floarea Năstase, Pavel Năstase, Tehnologia aplica țiilor Web (XML -DOM -ASP), Editura
Economică, 2002
[6] Liviu Dumitrașcu, (X)HTML, Editura Universită ții din Ploie ști, 2003
SURSE:
Pentru tabele: https://datatables.net/
Pentru grafice: https://apexcharts.com/
Pentru contracte: https://github.com/PHPOffice
HTML: www.w3schools.com
PHP: https://www.php.net/
PDO: https://www.php.net/manual/en/book.pdo.php
JQUERY: https://jquery.com/
JAVASCRIPT: https://www.javascript.com/
BOOTSTRA P: https://getbootstrap.com/docs/4.0/getting -started/introduction/
MYSQL: https://www.mysql.com/
CERTIFICATE SSL: https://www.globalsign.com/en/ssl -information -center/what -is-an-ssl-
certificate
47
VIII. ANEXE
Anexa 1 – Adăugare agenți imobiliari
<style type="text/css">
.borduri {
border: #cdcdcd medium solid;
border -radius: 5px;
-moz-border -radius: 5px;
-webkit -border -radius: 5px;
}
.inputModal{
width:100%;
height:1.6vw;
font-size: 15px;
}
</style>
<div class="row" id="content_add_consultanti">
<div class="col -lg-12 col -md-12" >
<div class="col -lg-12 borduri ">
<div class="row" >
<div class="col -lg-12" style="text -align: center;">
<label style="font -size:1vw !important; color:
darkcyan;"><strong>Adauga Consultant</strong></label>
</div>
</div>
<div class="row " style="margin:5px; ">
<div class="col -lg-2" style="padding:0.1em 0.3em 0.1em 0.3em">
<div class="form -group" style="margin:0; width:100%;
">
<label style="font -size:0.9vw !important; margin:
0; " for="email">E -mail</label>
<input type="text" id="email" name="email"
class="form -control inputModal" scope="ser" >
</div>
</div>
<div class="col -lg-2" style="padding:0.1em 0.3em 0.1em 0.3em">
<div class="form -group" style="margin:0; width:100%;
">
<labe l style="font -size:0.9vw !important; margin:
0; " for="pass">Parola</label>
<input type="password" id="pass" name="pass"
class="form -control inputModal" >
</div>
</div>
<div class="col -lg-3" style="padding:0.1em 0.3em 0.1em 0.3em">
<div class="form -group" style="margin:0; width:100%;
">
<label style="font -size:0.9vw !important; margin:
0; " for="nume">Nume</label>
<input type="text" id="nume" name="nume"
class="form -control inputModal" scope="ser" >
</div>
48
</div>
<div class="col -lg-3" style="padding:0.1em 0.3em 0.1em 0.3em">
<div class="form -group" style="margin:0; width:100%;
">
<label style="font -size:0.9vw !important; margin:
0; " for="prenume">Prenume</label>
<input type="text" id="prenume "
name="prenume" class="form -control inputModal" scope="ser" >
</div>
</div>
<div class="col -lg-1" style="padding:0.1em 0.3em 0.1em 0.3em">
<div class="form -group" style="margin:0; width:100%;
">
<label style="font -size:0.9vw !impor tant; margin:
0; " for="bi_serie">Serie CI</label>
<input type="text" id="bi_serie" name="bi_serie"
class="form -control inputModal" scope="ser" >
</div>
</div>
<div class="col -lg-1" style="padding:0.1em 0.3em 0.1em 0.3em">
<div class="form -group" style="margin:0; width:100%;
">
<label style="font -size:0.9vw !important; margin:
0; " for="bi_numar">Numar CI</label>
<input type="text" id="bi_numar"
name="bi_numar" class="form -control inputModal" scope="ser" >
</div>
</div>
</div>
<div class="row" id="" style="margin -top: 0.5em; margin -bottom:
0.5em">
<input type="button" class="btn btn -success" style="font -size:
18px; width: 100%" id="add_consultant" value='Salveaza'>
</div>
</div>
</div>
</div>
<div class="row" id="content_tbl_consultanti" style="margin -top: 1em">
</div>
<script type="text/javascript">
$('#content_tbl_proprietati').ready(function(){
load_consultanti();
$('#add_consultant').on('click', function(){
var data = get_fields_data("content_add_consultanti");
var pass = $('#pass').val();
var email = $('#email').val();
var url = "php/control.php";
var request = "insert_consultant";
var arr = {request, data, email, pass};
Ajax_Method(url, arr, onSuccess);
function onSuccess(res){
if (res == "OK"){
alerte_("Consultant inregistrat cu succes!", "success");
49
$('#content_tbl_consultanti').html("");
load_consultanti();
}
else if (res == "EXISTA"){
alerte_("Consultantul este inregistrat!", "danger");
}
}
});
});
</script>
Anexa 2 – Liste proprietăți
<div class="row" id="filtru_tbl_proprietati" style="margin -top: 1em">
<div class="col -lg-4">
<label style="font -size:0.9vw !important; margin: 0; " for="filtru">Filtru</label>
<select class="form -control inputModal" style="font -size: 12px" id="filtru">
<option value="D">DISPONIBILE</option>
<option value ="V">VANDUTE</option>
<option value="I">INCHIRIATE</option>
</select>
</div>
<div class="col -lg-4" id="filtru_tranz">
<label style="font -size:0.9vw !important; margin: 0; "
for="filtru_tip_tranzactie">Filtru</label>
<select class="form -control inputModal" style="font -size: 12px"
id="filtru_tip_tranzactie">
<option value="">TOATE</option>
<option value="V">VANZARE</option>
<option value="I">INCHIRIERE</option>
</select>
</div>
</div>
<div class="row" id="content_tbl_proprietati" styl e="margin -top: 1em">
</div>
<script type="text/javascript">
$(document).ready(function(){
load_proprietati("content_tbl_proprietati", "D", "");
var opt = $('#filtru').val();
var opt_tranz = $('#filtru_tip_tranzactie').val();
$('#filtru').on('ch ange', function(){
opt = $(this).val();
load_proprietati("content_tbl_proprietati", opt, opt_tranz);
if(opt == "D"){
$('#filtru_tranz').show();
}
else{
$('#filtru_tranz').hide();
}
});
50
$('#filtru_tip_tranzactie').on('change', function(){
opt_tranz = $(this).val();
load_proprietati("content_tbl_proprietati", opt, opt_tranz);
});
});
</script>
Anexa 3 – Autentificare
<?php
require("../../core/connectDB.php");
require("../../php/PHP _functions.php");
class Functions extends PHP_functions{
public static function inregistrare(){
if ($_POST['pass'] != $_POST['pass_rep']){
echo json_encode("ERR_PASS");
}
else{
$_POST['pass'] = password_hash($_POST['pass'],
PASSWORD_BCRYPT);
$c = self::sql_exec("SELECT COUNT(*) FROM users WHERE email=
:email ", "1");
if($c > 0){
echo json_encode("EXISTA");
}
else{
}
echo json_encode(self::sql_exec("INSERT INTO users SET email= :email
, pass= :pass , priv='A'", "return"));
}
}
public static function autentificare(){
$hash = self::sql_exec("SELECT pass FROM users WHERE email= :email ", "1");
if (password_verify($_POST['pass'], $hash)) {
$_SESSION['user_smart'] = $_POST['email'];
session_ write_close();
echo json_encode("OK");
}
else{
echo json_encode("NU");
}
}
}
$act = new Functions();
switch($_REQUEST['request']){
case "inregistrare": $act ->inregistrare(); break;
case "autentificare": $act->autentificare(); break;
}
51
?>
Anexa 4 – Generare contract
<?php
require ("../core/connectDB.php");
require ("../php/PHP_functions.php");
$idd = "";
$act = new PHP_functions();
if (isset($_GET['id'])){$idd = $_GET['id'];}
else{$idd = $_GET['idd'];}
$id_user = "";
if($_SESSION['priv'] == "U"){
$id_user = $act ->sql_exec("SELECT id FROM consultanti WHERE
email='".$_SESSION['user_smart']."'", "1");
}
$sql_cmd = "SELECT serie, c.numar, DATE_FORMAT(c.datain, '%d.%m.%Y') AS data_in,
CONCAT(cl.nume,' ', cl.prenume)
AS nume_prenume_cump,
CONCAT(cl.localitate,', str. ',
cl.strada, ', nr. ', cl.numar, ', judet ', g.value1) AS adr_cump,
cl.codpers AS codpers_cump,
p.denumire AS denumire_vanzator, p.cif AS cif_vanzato r,
CONCAT(p.localitate, ', str. ',
p.strada, ', nr. ', p.numar, ', judet ', g1.value1) AS adr_vanzator,
CONCAT(cc.nume, ' ',
cc.prenume) AS nume_prenume_consult, cc.bi_serie, cc.bi_numar,
CONCAT(i.localitate, ', str. ',
i.strada, ', nr. ', i.numar, ', judet ', g2.value1) AS adr_imobil,
g3.value1 AS tip_imobil,
IF(i.tip_imobil <> 'T',
CONCAT('compus din ', i.nr_cam,' camere, ', i.nr_bai, ' bai, ', i.nr_balcoane, ' balcoane, ', i.nr_buc, '
bucatarii, ', i.nr_parc, ' parcari, avand suprafata construita de ', i.s_construita, ' mp si utila de ',
i.s_utila, ' mp.'), ' cu suprafata totala de ') AS descriere_imobil,
i.id AS id_imobil, pret,";
if ($_GET['tip'] == "CHIRIE"){
$sql_cmd .=
"CONCAT (pret,' EUR, reprezentand chiria pe o luna') AS comision,";
}
else{
$sql_cmd .=
"CONCAT(val_comision,' EUR, reprezentand ', comision, '% din valoarea tranzactiei') AS
comision,";
}
52
$sql_cmd .=
"DATE_FORMAT(i.de_la, '%d.%m.%Y') AS de_la, DATE_FORMAT(i.pana_la, '%d.%m.%Y')
AS pana_la,
ROUND(DATEDIFF(STR_TO_DATE(pana_la,'%Y%m%d'),
STR_TO_DATE(de_la,'%Y%m%d'))/30) AS total_luni,
(ROUND(DATEDIFF(STR_TO_DATE(pana_la,'%Y%m%d'),
STR_TO_DATE(de_la,'%Y%m%d'))/30)*pret) AS total_de_plata
FROM contracte c
LEFT JOIN clienti cl ON (c.cumparator=cl.id)
LEFT JOIN general g ON (g.tip='JUDET' AND
g.value=cl.judet)
LEFT JOIN parteneri p ON (c.vanzator=p.id)
LEFT JOIN general g1 ON (g1.tip='JUDET' AND
g1.value=p.judet)
LEFT JOIN consultanti cc ON
(c.consultant=cc.id)
LEFT JOIN imobile i ON (c.imobil=i.id)
LEFT JOIN general g2 ON (g2.tip='JUDET' AND
g2.value=i.judet)
LEFT JOIN general g3 ON (g3.tip='TIP_IMOBIL'
AND g3.value=i.tip_imobil)
WHERE c.id='".$idd."'";
$data = $act ->sql_exec($sql_cmd, "return")[0];
$data_firma = $act ->sql_exec("SELECT denumire, cif, CONCAT(localitate, ', str. ', strada, ', nr. ',
numar, ', jud. ', value1) AS adr_firma
FROM date_firma d
LEFT JOIN general g ON
(g.tip='JUDET' AND g.value=d.judet)", "return")[0];
$_POST['idd'] = $data['id_imobil'];
$str_utilitati = $act ->get_specificatii("UTILITATI");
$str_finisaje = $act ->get_specificatii("FINI SAJE");
$str_dotari = $act ->get_specificatii("DOTARI");
?>
<div class="row">
<div class="col -lg-12">
<label>SERIE: <b><?php echo $data['serie'];?></b></label><br>
<label>NUMAR: <b><?php echo $data['numar'];?></b></label><br>
</div>
</div>
<div class="row">
<div class="col -lg-12">
<label>Incheiat astazi <b><?php echo $data['data_in'];?></b></label><br>
</div>
</div>
<div class="row">
<div class="col -lg-12">
<label>I. PARTILE CONTRACTANTE</label><br>
</div>
</div>
53
<div class="row">
<div class="col -lg-12">
<section>
1.1 <b><?php echo $data['denumire_vanzator'];?></b> cu domiciliul in
localitatea <b><?php echo $data['adr_vanzator'];?></b>, identificat prin CIF <b><?php echo
$data['cif_vanzator'];?></b>, in calitate de VANZATOR si
</section>
<br>
<section>
1.2 <b><span id="nume_prenume_cump"><?php echo
$data['nume_prenume_cump'];?></span></b> cu domiciliul in localitatea <b><?php echo
$data['adr_cump'];?></b>, identificat prin CIF <b><?php echo $data['codpers_cump'];?></b >, in
calitate de CUMPARATOR
</section>
<br>
<section>
1.3 <b><?php echo $data_firma['denumire'];?></b> avand CIF <b><?php
echo $data_firma['cif'];?></b> cu sediul in localitate<b><?php echo
$data_firma['adr_firma'];?></b>, reprezentata de consultantul <b><?php echo
$data['nume_prenume_consult'];?></b>, identificat prin CI <b>seria <b><?php echo
$data['bi_serie'];?></b> si numarul <b><?php echo $data['bi_numar'];?></b>, in calitate de
INTERMEDIAR au convenit să încheie prezen tul contract de vânzare -cumpărare, cu respectarea
următoarelor clauze:
</section>
<br>
</div>
</div>
<div class="row">
<div class="col -lg-12">
<label>II. OBIECTUL CONTRACTULUI</label><br>
</div>
</div>
<div class="row">
<div class="col -lg-12">
<section>
<?php if($_GET['tip'] == "CUMPARARE"){ ?>
2.1. Transmiterea dreptului de proprietate de către vânzător cumpărătorului
asupra imobilului <b><?php echo $data['tip_imobil'];?></b> situat în <b><?php echo
$data['adr_imobil'];?></b>, <b><?php ec ho $data['descriere_imobil'];?></b>.
<?php }else { ?>
2.1. Inchirierea imobilului de către LOCATOR LOCATARULUI a
imobilului <b><?php echo $data['tip_imobil'];?></b> situat în <b><?php echo
$data['adr_imobil'];?></b>, <b><?php echo $data['descriere_imo bil'];?></b>.
<?php } ?>
</section><br>
<section>
2.3. Utilitati: <b><?php echo $str_utilitati;?></b>
</section><br>
<section>
2.4. Finisage: <b><?php echo $str_finisaje;?></b>
</section><br>
<section>
2.5. Dotari: <b><?php echo $ str_dotari;?></b>
</section><br>
</div>
54
</div>
<div class="row">
<div class="col -lg-12">
<label>III. PRETUL CONTRACTULUI</label><br>
</div>
</div>
<div class="row">
<div class="col -lg-12">
<section>
<?php if($_GET['tip'] == "CUMPARARE"){ ?>
3.1. Prețul irevocabil al vânzării, stabilit de comun acord între
VÂNZĂTOR și CUMPĂRĂTOR este de <b><?php echo $data['pret'];?></b> EUR, din care
INTERMEDIARUL a primit azi, data semnării și autentificării suma de <b><?php echo
$data['comision'];?></b>.
<?php }else { ?>
3.1. Prețul irevocabil al chiriei, stabilit de comun acord între LOCATOR și
LOCATAR este de <b><?php echo $data['pret'];?></b> EUR/ luna, adica pretul platit pentru
perioada <b><?php echo $data['de_la'];?></b> – <b><?php echo $data['p ana_la'];?></b>(
<b><?php echo $data['total_luni'];?></b> luni) este de <b><?php echo
$data['total_de_plata'];?></b> EUR, din care INTERMEDIARUL a primit azi, data semnării și
autentificării suma de <b><?php echo $data['comision'];?></b>.
<?php } ?>
Prezentul CONTRACT ține loc și de chitanță.
</section><br>
</div>
</div>
55
VIII. LISTA FIGURILOR SI A TABELELOR
Figura 1 – Interfață web site Global Imobiliare
Figura 2 – Interfață web site Concept Imobiliare
Figura 3 – Interfață CRM REBS
Figura 4 – Cazuri utilizare administrator
Figura 5 – Cazuri utilizare agent imobiliar
Figura 6 – Autentificare sistem
Figura 7 – Inregistrare utilizator nou
Figura 8 – Adăugare imobil
Figura 9 – Tabelele bazei de date
Figură 10 – Meniul aplicației
Figura 11. Înregistrare utilizator în sistem
Figura 12. Pagina de autentificare
Figura 13. Adăugare proiect
Figura 14. Rapoarte
Figura 15. Pagina principală a site -ului de prezentare
Figura 16. Pagina pentru vânzări
Figura 17. Detalii proprietate și posibilitate contact agent
Tabel 1 – Analiză comparativă
Tabel 2 – principalele cerințe funcționale
Tabel 3 : Bucată cod generare meniu
Tabel 4 – Cazul de test pentru logarea unui utilizator în sistem
Tabel 5 – Cazul de test pentru adăugare a unui imobil
56
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Programul de licență: Informatică [616697] (ID: 616697)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
