Piata de Automobile
CUPRINS
Introducere
Capitolul 1 – Fundamente teoretice privind tema studiată
1.1 Vânzarea de mașini în România
1.2 Noțiuni teoretice despre leasing
1.3 Închirierea de mașini (Rent a car)
Capitolul 2 – Noțiuni teoretice despre uneltele folosite în realizarea aplicației
2.1 Limbajul Java. Generalități.
2.2 Elemente pentru realizarea interfețelor grafice în Java
2.3 Lucrul cu baze de date în Java
Capitolul 3 – Modul de realizare a aplicației
3.1 Baza de date
3.2 Ferestrele aplicației
Capitolul 4 – Modul de utilizare a aplicației
4.1 Secțiunea Vânzări mașini
4.2 Secțiunea Leasing
4.3 Secțiunea Rent a car
Concluzii
Bibliografie
Anexe
Anexa 1 – Model de contract Vânzare-Cumpărare pentru un vehicul folosit
Anexa 2 – Model contract închiriere auto
Anexa 3 – Model contract de leasing
Anexa 4 – Documente necesare prentru întocmirea unui contract de leasing
Introducere
Piața de automobile cunoaște în prezent o dezvoltare și răspândire foarte vaste. Există în Romania la ora actuală o mulțime de site-uri și de firme care se ocupă cu vânzarea de mașini sau cu alte servicii conexe cum ar fi: leasing, închirieri auto, montare de instalații GPL, service auto, etc.
Având în vedere aceste motive, a reprezentat pentru mine o provocare studierea acestui domeniu, documentarea și sistematizarea volumului mare de informații disponibil. În urma studiului a rezultat o aplicației practică realizată în limbajul Java care are în spate o bază de date MySQL care conține modulele de vânzare de mașini, leasing de mașini și închirieri auto.
În primul capitol al lucrării am sistematizat câteva dintre cele mai importante elemente teoretice despre modulele implementate în aplicație, în capitulul 2 am prezentat câteva noțiuni teoretice pe care le-am utilizat în aplicație, în capitolul 3 am explicat modul în care am realizat aplicația, iar în cel de-al patrulea capitol am prezentat modul de utilizare a aplicației.
Capitolul 1 – Fundamente teoretice privind tema studiată
1.1 Vânzarea de mașini în România
Piața de vânzări auto în România este în prezent bine dezvoltată și reprezentată pe întreg teritoriul țării. Există o multitudine de firme care se ocupă de vânzările auto, care cel mai adesea sunt prezente și online prin site-uri de prezentare. Mașinile vândute provin atât din Romania cât și din străinătate (unele dintre mașini nici nu sunt încă în țară, însă sunt prezentate potențialilor clienți).
În forma online a pieței lucrurile sunt destul de variate și totuși au multe în comun. Majoritatea site-uri pornesc de la căutarea mașinii dorite după diverse criterii de interes după care pot fi vizualizate rezultatele căutărilor.
Această formă de prezentare online crește gradul de accesibilitate a potențialilor clienți, fiind anulate barierele geografice, deși trebuie luat în considerare și faptul că, în ciuda dezvoltării Internetului, sunt încă multe persoane care nu au acces la Internet sau nu știu să folosescă intrumentele puse la dispoziție online. În acest sens vânzările de mașini mai sunt popularizate și prin intermediul anunțurilor din ziare, care sporec gradul de accesibilitate la persoanele care nu folosesc mediul online.
Deasemenea, cel mai direct mod de prezentare este cel din piețele auto existente în toată țara.
Din punct de vedere al preferințelor clienților între a achiziționa o mașină nouă sau o mașină second hand lucrurile sunt relativ în echilibru. Unele persoane preferă siguranța și beneficiile unei mașini noi (de menționat aici și programele de stimulare a parcului auto). Alte persoane, de multe ori din cauza posibilităților financiare mai reduse, preferă mașini second hand.
1.2 Noțiuni teoretice despre leasing
„Leasing-ul a apărut pentru prima dată în Statele Unite ale Americii, ca mai apoi, treptat, să pătrundă și în alte țări, îndeosebi în Europa.
Apariția operațiunilor de leasing este de dată relativ recentă, ele fiind introduse abia în 1952 în SUA și extinse din 1962 și în principalele țări dezvoltate ale lumii, ocupând acum o poziție principală între formele de finanțare și creditare a investițiilor.
În România, prima mențiune a leasing-ului într-un act normativ datează din anul 1995, și este utilizat în cuprinsul unei ordonanțe referitoare la echipamentele importate în cadrul unor astfel de tranzacții; astăzi, domeniul este reglementat prin Ordonanța nr. 51/1997 republicată, privind operațiunile de leasing și societățile de leasing și, din punct de vedere contabil, prin Hotărârea de Guvern nr. 22/2003 privind unele modificări și completări ale metodologiilor contabile și fiscale.
Definiția leasingului poate fi dată atât din punct de vedere economic, cât și juridic.
Din punct de vedere economic, leasingul reprezintă o operațiune de finanțare în care finanțatorul asigură fondurile necesare pentru întreaga investiție.
Din punct de vedere juridic, leasingul reprezintă un contract complex care permite unei persoane să obțină și să utilizeze un lucru fără a plati imediat prețul cu posibilitatea de a-l cumpăra la un preț rezidual.
În legislatia romana operațiunile de leasing sunt definite ca fiind acele operațiuni prin care “o parte, denumită locator/finanțator, transmite pentru o perioadă determinată dreptul de folosință asupra unui bun al cărui proprietar este cealaltă parte, denumită utilizator, la solicitarea acesteia, contra unei plăți periodice, denumită rată de leasing, iar la sfârșitul perioadei de leasing locatorul/finanțatorul se obligă să respecte dreptul de opțiune al utilizatorului de a cumpăra bunul, de a prelungi contractul de leasing ori de a înceta raporturile contractuale”. (Ordonanta nr. 51/1997- forma actuala)
Leasing-ul este o operațiune care cuprinde:
· un contract de vânzare-cumpărare;
· un contract de locațiune;
· un contract de mandat;
· un contract prealabil privind promisiunea de vânzare pe care o face cumpărătorul, care valorează drept vânzare din momentul în care sunt concretizate toate elementele esențiale ale vânzării.
Leasing-ul mai cuprinde, de asemenea, promisiunea bilaterală de locație din partea finanțatorului și a utilizatorului, preexistența contractului de locațiune, care va avea valoare de contract numai atunci când se vor concretiza toate elementele contractului de locație. În același timp, este inclusă o stipulație pentru altul, în baza căreia utilizatorul poate acționa în garanție pe vânzătorul bunului.
În același timp, leasing-ul are trăsăturile caracteristice ale unui contract de adeziune, deoarece la încheierea sa utilizatorul nu are posibilitatea să aducă modificări clauzelor stipulate.
1.2.1 Principalele forme ale leasing-ului
Formele leasing-ului sunt diferite, fiind determinate și folosite în funcție de posibilitățile de finanțare ale furnizorului, de limitele pieței, gradul de organizare și desfacere a produselor la export.
· după obiectul său, leasing-ul poate fi mobiliar sau imobiliar. În relațiile comerciale internaționale, un loc important revine leasing-ului mobiliar, pentru că se referă la echipamente industriale, oferind garanția folosirii lor pe o perioada mai mare de un an, dând posibilitatea utilizatorului să achiziționeze echipamentul la expirarea termenului de locație.
Leasing-ul mobiliar reprezintă opțiunea cea mai frecventă în relațiile comerciale internaționale și din motive financiare.
· în raport de implicarea părților, leasing-ul este direct sau indirect. Leasing-ul este definit ca fiind direct când perfectarea contractului are loc între furnizor și client, iar indirect este atunci când este realizat prin intermediul unei societăți specializate.
· după conținutul ratelor leasing-ul este financiar sau operațional. Leasing-ul financiar se caracterizează prin aceea că în perioada de bază a închirierii este recuperat prețul de export, costurile auxiliare și se obține un anumit beneficiu. Leasing-ul operațional este caracterizat prin aceia că în perioada de bază se obține numai o parte din prețul de export.
· după procedurile de calcul al ratelor, leasing-ul este net sau brut. Leasing-ul net este acela în care ratele cuprind prețul net de vânzare al echipamentului și beneficiul realizat din utilizarea bunului respectiv. Leasing-ul brut, care mai este cunoscut și sub denumirea de full-service leasing, este acela în care ratele includ: prețul net de vânzare al bunurilor închiriate; cheltuielile efectuate pentru întreținerea și reparațiile echipamentelor, mașinilor sau utilajelor închiriate; beneficiile realizate pe parcursul utilizării lor.
· după durata închirierii, leasing-ul poate fi pe termen scurt sau pe termen lung. Leasing-ul pe termen scurt implică închirierea echipamentelor pe baza mai multor contracte de o durată mai redusă. Leasing-ul pe termen lung este acela în care se încheie un singur contract pentru întreaga perioadă.
Mai sunt întâlnite: leasing-ul experimental, leasing-ul ordinatoarelor, renting-ul și lease-back-ul. Leasing-ul experimental se caracterizează prin închirierea bunurilor pe o perioadă scurtă de două sau de trei luni, în mod experimental. Leasing-ul ordinatoarelor se caracterizează prin finanțarea și comercializarea calculatoarelor și a altor echipamente. Această formă de leasing mai este cunoscută și sub denumirea de time sharing. Renting-ul sau hire își dovedesc utilitatea, mai ales, în cazul mijloacelor de transport. Fiind un mijloc de finanțare deosebit de ingenios, lease-back-ul este utilizat într-o măsură tot mai mare. Prin lease-back, proprietarul, fără să piardă echipamentul care îi servește onorarii comenzilor, obține capital în scopul dezvoltării activităților sale economice.
1.2.2 Creditul bancar și leasingul; diferențe
Acordarea creditului pentru achiziționarea unui echipament presupune, de regula, achitarea unui anumit procent la livrarea acestuia, creditul reprezentând valoarea rămasă neachitată.
Leasing-ul echipamentului nu necesită efectuarea unei plăți parțiale în momentul preluării bunului și presupune numai finanțare pentru partea din valoarea bunului, care se așteaptă să fie utilizată în perioada de leasing. Utilizatorul are posibilitatea achiziționării bunului la valoarea reziduală, la sfârșitul perioadei de leasing.
Obținerea unui credit implică pentru împrumutat oferirea drept garanție a altor active.
Echipamentul luat în leasing se constituie el însuși într-o garanție.
Proprietarul echipamentului suportă riscul privind uzura morală a acestuia. Firma de leasing suportă riscul uzurii morale, deoarece ea este proprietara echipamentului.
Împrumutatul poate solicita deducerea din taxele datorate a părții din credit reprezentând dobânda și deprecierea valutară.
Standardele Internaționale de Contabilitate solicită înregistrarea echipamentului în bilanțul firmei ca activ, în contrapartidă cu un cont de obligații.
În cazul leasing-ului operațional, echipamentul nu apare în bilanț, ceea ce îmbunătățește indicatorii financiari ai utilizatorului.
1.2.3 Participanții, obiectul și mecanismul de derulare al leasing-ului
Leasing-ul pune în legătură trei persoane: utilizatorul, societatea de leasing și producătorul (uneori doar vânzătorul) care poate fi chiar societatea de leasing; acestea au interese complementare în derularea operațiunii:
Finanțatorul (locator) este, de regulă, o societate financiară sau o bancă specializată în plasarea capitalului în investiții pe durată medie sau lungă, în condiții de rentabilitate, prin cumpărarea bunului oferit de furnizor.
Utilizatorul (locatar, beneficiar) este interesat să utilizeze un bun fără a investi în achiziționarea lui. Aceasta îi permite fie să-și dirijeze fondurile proprii în alte direcții.
Operațiunea în sine constituie o activitate complexă care presupune existența unui mecanism, procedee și documente cu rolul de a reglementa condițiile economico-juridice în care se desfășoară și parcurgerea unor etape succesive:
a) premergătoare încheier în legătură trei persoane: utilizatorul, societatea de leasing și producătorul (uneori doar vânzătorul) care poate fi chiar societatea de leasing; acestea au interese complementare în derularea operațiunii:
Finanțatorul (locator) este, de regulă, o societate financiară sau o bancă specializată în plasarea capitalului în investiții pe durată medie sau lungă, în condiții de rentabilitate, prin cumpărarea bunului oferit de furnizor.
Utilizatorul (locatar, beneficiar) este interesat să utilizeze un bun fără a investi în achiziționarea lui. Aceasta îi permite fie să-și dirijeze fondurile proprii în alte direcții.
Operațiunea în sine constituie o activitate complexă care presupune existența unui mecanism, procedee și documente cu rolul de a reglementa condițiile economico-juridice în care se desfășoară și parcurgerea unor etape succesive:
a) premergătoare încheierii contractului de leasing: cercetarea piețelor externe și desfășurarea unei activități promoționale prin forme adecvate; negocierea și contactarea partenerilor; analiza eficienței operațiunii de leasing;
b) contractare: se încheie o convenție între furnizor și beneficiar, prin care se stabilește că societatea de leasing preia finanțarea operațiunii; încheierea contractului de leasing între beneficiar și societatea de leasing, în calitate de finanțator; societatea de leasing dă comanda la furnizor pentru executarea echipamentului; se livrează bunul ce constituie obiectul contractului de leasing; se întocmește protocolul de predare-recepție în care se consemnează că bunul este pregătit pentru punerea în funcțiune; data semnării protocolului de recepție se consideră data începerii derulării contractului; pentru efectuarea plăților de către societatea de leasing către furnizor se va avea în vedere aceeași dată a semnării protocolului; plata ratelor de leasing de către beneficiar (rate anuale, semestriale, trimestriale), așa cum s-a convenit; utilizatorul, la sfârșitul contractului, are trei opțiuni: de a prelungi contractul de leasing, cumpărarea echipamentului sau înapoierea acestuia; de exemplu, în țara noastră conform legislației în vigoare, rezilierea anticipată a contractului, poate fi solicitată de societatea de leasing în următoarele situații: utilizatorul refuză să primească bunul la termenul stipulat în contractul de leasing, utilizatorul nu își execută obligația de plată a redevențelor, utilizatorul se află în stare de reorganizare judiciară sau faliment.
În continuare, se prezintă schematic mecanismul și etapele tranzacției de leasing cu 3 participanti:
1. Beneficiarul inițiază operațiunea și se adresează societății de leasing cu o cerere de ofertă;
2. Societatea de leasing acceptă cererea de ofertă, care devine comandă;
3. Stabilirea contractului dintre producător și beneficiar;
4. Încheierea contractului de leasing dintre finanțator și beneficiar;
5. Cumpărarea bunului de către societatea de leasing;
6. Punerea bunului la dispoziția beneficiarului;
7. Beneficiarul plătește societății de leasing costul sub formă de rate eșalonate pe perioada de valabilitate a contractului.
În contractele de leasing apar termeni specifici ce caracterizează această operațiune:
– perioada de leasing – identifică perioada în care contractul de leasing va fi în vigoare. Se poate include în contract o opțiune de reînnoire pentru una sau mai multe perioade specificate, ce împuternicește chiriașul să își poată reînnoi contractul;
– scadențarul ratelor – precizează valoarea ratelor și data la care acestea trebuie plătite. Multe contracte includ provizioane pentru plăți întârziate, care presupun plăți suplimentare dacă plata ratelor nu se face la timp sau într-o perioadă de grație specificată. Deși nu este explicitat întotdeauna, ratele conțin adesea și dobânda aferentă finanțării operațiunii;
– perioada de bază sau primară este prima perioadă de închiriere, în care se recuperează de către societatea de leasing cheltuielile făcute cu bunul închiriat, perioadă care este mai scurtă decât durata de folosință a obiectului închiriat. Mărimea perioadei primare se stabilește prin contract și va fi funcție de durata de viață economică a bunului; perioada secundară a bunului este considerată diferența dintre durata sa de folosință și perioada primară;
– valoarea reziduală este valoarea bunului la sfârșitul perioadei de închiriere;
– întreținerea – stipulează cine este responsabil cu întreținerea echipamentului;
– îmbunătățiri și modificări – dacă chiriașul are dreptul de a face îmbunătățiri sau modificări în funcție de necesități;
– asigurare – specifică partea care are obligația de a asigura bunul, cine beneficiază și în ce măsură de orice despăgubire în cazul în care bunul este pierdut, furat sau avariat;
– pierderi stipulate – sumele pe care le va suporta chiriașul dacă bunul este pierdut, furat sau distrus. Asemenea sume pot fi adiționale sau incluse în valoarea bunului;
– opțiunea de cumpărare – precizează dacă chiriașul are dreptul sau obligația de a cumpăra echipamentul. Se poate specifica un preț opțional sau un interval de prețuri precum și cum și când poate fi exercitată opțiunea;
– transferuri – precizează dacă chiriașul sau proprietarul are dreptul de a-și transfera drepturile în leasing;
– revendicări – stabilește dacă chiriașul poate da în judecată sau întreprinde alte acțiuni în numele proprietarului pentru a-și apăra drepturile față de furnizori și alți terți privind utilizarea bunului și dacă chiriașul este îndreptățit să intre în posesia unor despăgubiri din asemenea acțiuni;
– rezilierea înainte de termen și anularea – stipulează în ce condiții contractul de leasing poate fi anulat. Aceste prevederi sunt cu atât mai importante cu cât crește perioada de leasing, deoarece, în timp bunul își pierde valoarea economică;
– înlocuirea cu echipament modern – prevede modificarea/înnoirea unui echipament sau înlocuirea acestuia cu un model mai nou pe perioada de leasing. Clauza este utilizată în special pentru leasingul de calculatoare, echipamente de comunicații și alte bunuri care sunt supuse unor schimbări tehnologice rapide;
– costurile de terminare – stipulează cine este responsabil pentru costurile (dezasamblare, ambalare, încărcare, asigurare) legate de revenirea bunului la proprietar la sfârșitul perioadei de leasing.
Rata de leasing – denumită în mod obișnuit “chirie” – se stabilește în funcție de condițiile existente pe piață, de durata de utilizare și de valoarea de achiziție a obiectului, de riscurile ce intervin pe perioada închirierii de bază și de posibilitatea de a reînchiria ulterior bunul unui alt client. Mărimea ratei de leasing se determină ca sumă fixă ce trebuie plătită lunar, semestrial sau anual, în mod anticipat (la începutul perioadei) sau la sfârșitul perioadei de leasing. Dacă societatea de leasing este de acord ca locatarul să plătească în avans un anumit număr de rate, atunci vărsămintele efectuate de locatar vor înceta cu intervalul aferent, înainte de încheierea contractului de leasing.
Elementele în funcție de care se calculează rata de leasing/chiria, diferă de la o formă de leasing la alta, de la o societate de leasing la alta și conțin, de regulă:
· prețul real la care se achiziționează bunul (cuprinde taxele vamale și TVA-ul dacă bunul este importat de o firmă românească), la care se adaugă cheltuielile de transport și alte cheltuieli aferente;
· valoarea reziduală a bunului (dacă nu este reglementată legal, ea va fi negociată de finanțator și beneficiar);
· comisionul societății de leasing ce depinde de prețul echipamentului, dar și de cheltuielile generale ale societății;
· durata locației (influențează cuantumul și numărul ratelor de leasing);
· cuantumul amortizării echipamentului (pentru leasing-ul financiar va fi egal cu prețul de achiziție al bunului), care prin aplicarea la cheltuielile de capital și însumate,
asigură recuperarea uzurii fizice a echipamentului;
· asigurarea pentru garanție, furt, foc, pierdere, etc;
· cheltuieli pentru achiziționarea bunului, cheltuieli cu întreținerea și reparațiile și alte cheltuieli neprevăzute;
· dobânda, TVA-ul, profitul, comisionul de gestiune, rata de devalorizare a monedei.
Modul în care se calculează chiria diferă de la o societate de leasing la alta, iar în cadrul aceleiași societăți se poate diferenția pe clase de bunuri.
Formula de calcul a ratei de leasing, care a fost folosită și în cadrul aplicației este:
unde:
I – valoarea împrumutului
r – rata anuală/1200
N – perioada în luni a împrumutului
V – valoarea reziduală”
1.3 Închirierea de mașini (Rent a car)
Serviciul de închirieri auto – preluat ca terminologie din limbajul anglo-saxon și în România, ca serviciu de rent a car – se impune tot mai mult la nivel mondial ca o alternativă la transportul cu autovehicule proprii.
Piața de închirieri auto este constituită în esență, din două categorii de companii:
a) Companii internaționale de rent a car, care fac parte din sistemul mondial de închirieri auto (Avis, Hertz, Europcar, etc.). Acestea sunt organizații cu tradiție în domeniu, care operează în majoritatea statelor lumii, fie direct, fie prin intermediul agențiilor care aparțin brand-ului respectiv. Clienții cărora li se adresează sunt de regulă, persoane fizice sau companii multinaționale.
b) Companii naționale de rent a car de dimensiuni mici și mijlocii, care deservesc piața locală și care au identificat anumite nișe în cadrul acesteia, motiv pentru care nu concurează și nu sunt concurate puternic de către companiile internaționale.
Se impune precizarea că, o companie de rent a car poate oferi pe lângă serviciul de închirire de scurtă durată (“short term rental”) și pe cel pentru perioade mari de timp (“long term rental”). Cea de-a doua variantă de închiriere este preferată de către companii. De exemplu pentru unele companii internationale care isi desfasoara activitatea în Romania pentru o anumita perioada de timp, soluția cea mai eficientă alternativa la utilizarea autoturismelor proprii constă în externalizarea cheltuielilor de transport, prin închirierea de mașini de la companiile de rent a car (long term rental). Rata de închiriere include în acest caz toate costurile aferente (taxe de drum, taxele pentru asigurări, mentenanță etc), toate acestea constituind pentru beneficiarul serviciului, cheltuieli deductibile fiscal. De remarcat faptul că, pentru această categorie de clienți, companiile de rent a car au început să ofere și servicii asociate celui principal, în speță, închirierea logisticii de birou (videoproiector, laptop, camere video etc), precum și a logisticii de călătorie (aparat antiradar, aparat GPS, hărți rutiere etc), necesare unui om de afaceri pasager în oraș.
O analiză succintă a pieței de închirieri auto a evidențiat următoarele aspecte semnificative:
• Clienții, piața țintă, segmentarea pieței.
În cadrul pieței pot fi identificate următoarele segmente principale, cărora li se adresează o companie de închirieri auto :
– Turiști și clienți ocazionali – este vorba de persoane fizice care apelează la serviciul de rent a car pentru câteva zile, în funcție de necesități. O creștere semnificativă a volumului vânzărilor se înregistrează așadar, în perioadele de vacanță.
– Companiile de asigurări – acestea pun la dispoziție un vehicul, în condițiile în care persoanei asigurate i-a fost furată sau accidentată grav mașina.
– Companiile comerciale – acestea închiriază pe termen scurt unul sau mai multe vehicule pentru angajații lor, care se deplasează în scop profesional în țară sau în afără ei. În situațiile în care deplasarea are loc pentru perioade mai mari de timp, compania preferă formula serviciului de tip long term rental, care este mai eficientă sub aspectul cheltuielilor.
– Companii comerciale care solicită ocazional închirierea de vehicule mari pentru desfășurarea activității lor.
• Furnizarea de vehicule pentru companiile de închirieri auto.
Pentru a-și constitui parcul auto, compania de închirieri poate opta, în principal, pentru următoarele variante:
a) Achiziționare de la distribuitorii (interni sau externi) de mașini, prin intermediul contractului de vânzare – cumpărare. Având în vedere că efortul financiar este considerabil, în special în momentul inițial al demarării afacerii, puține companii apelează la această soluție.
b) Achiziționare în sistem de leasing de la firmele specializate. Este soluția cel mai des folosită, atât în rândul companiilor naționale de dimensiune mică și mijlocie, dar și la nivelul marilor companii, datorită posibilității eșalonării cheltuielilor de capital în decursul perioadei de leasing.
c) Efectuarea unui credit bancar, care va fi folosit pentru achiziționarea parcului auto. Este o opțiune rar folosită de către companiile de rent a car, datorită dificultăților ridicate de normele bancare, dar ea poate fi folosită în situația achiziționării unui număr foarte mic de vehicule.
Capitolul 2 – Noțiuni teoretice despre uneltele folosite în realizarea aplicației
Aplicația a fost realizată cu ajutorul limbajului de programare Java, iar baza de date este de tip MySQL (gestionată cu ajutorul WAMP).
Alegerea limbajului Java pentru realizarea aplicației a ținut cont de faptul că acest limbaj nu necesită licență și este independent de platforma pe care rulează. În egală măsură, nici baza de date MySQL sau softul WAMP nu au necesitat licență.
2.1 Limbajul Java. Generalități.
Java este o tehnologie inovatoare lansată de compania Sun Microsystems în 1995, care a avut un impact remarcabil asupra întregii comunități a dezvoltatorilor de software, impunându-se prin calități deosebite cum ar fi simplitate, robustețe și nu în ultimul rând portabilitate. Denumită inițial OAK, tehnologia Java este formată dintr-un limbaj de programare de nivel înalt pe baza căruia sunt construite o serie de platforme destinate implementarii de aplicații pentru toate segmentele industriei software.
Limbajul de programare Java a fost folosit la dezvoltarea unor tehnologii dedicate rezolvarii unor probleme din cele mai diverse domenii. Aceste tehnologii au fost grupate în așa numitele platforme de lucru, ce reprezinta seturi de librarii scrise în limbajul Java, precum și diverse programe utilitare, folosite pentru dezvoltarea de aplicații sau componente destinate unei anume categorii de utilizatori.
• J2SE (Standard Edition): Este platforma standard de lucru ce ofera suport pentru crearea de aplicații independente și appleturi. De asemenea, aici este inclusa și tehnologia JavaWeb Start ce furnizeaza o modalitate extrem de facila pentru lansarea și instalarea locala a programelor scrise în Java direct de peWeb, oferind cea mai comoda soluție pentru distribuția și actualizarea aplicațiilor Java.
• J2ME (Micro Edition): Folosind Java, programarea dispozitivelor mobile este extrem de simpla, platforma de lucru J2ME oferind suportul necesar scrierii de programe dedicate acestui scop.
• J2EE (Enterprise Edition): Aceasta platforma ofera API-ul necesar dezvoltarii de aplicații complexe, formate din componente ce trebuie sa ruleze în sisteme eterogene, cu informațiile memorate în baze de date distribuite, etc. Tot aici gasim și suportul necesar pentru crearea de aplicații și servicii Web, bazate pe componente cum ar fi servleturi, pagini JSP, etc.
În ceea ce privește Java SE, este în lucru varianta Java JDK 7. Ca și medii de dezvoltare a programelor Java există o mulțime în prezent, cum ar fi: JDeveloper, NetBeans, Eclpise, etc. Aplicația prezentată în acestă lucrare a fost realizată în NetBeans.
Pe data de 27 ianuarie 2010, Oracle anunța că a finalizat preluarea firmei Sun Microsystems. Oracle anunța că va asigura în continuare dezvoltarea produselor Sun cum ar fi SPARC, Solaris, Java și MySQL.
Crearea oricarei aplicații Java presupune efectuarea urmatorilor pași:
1. Scriererea codului sursă
Toate aplicațiile Java conțin o clasa principala(primara) în care trebuie sa se găsească metoda main. Clasele aplicației se pot găsi fie într-un singur fișier, fie în mai multe.
2. Salvarea fișierelor sursă
Se va face în fișiere care au obligatoriu extensia .java, nici o alta extensie fiind acceptata. Este recomandat ca fișierul care conține codul sursa al clasei primare sa aiba același nume cu cel al clasei, deși acest lucru nu este obligatoriu.
Sa presupunem ca am salvat fișierul C:\intro\FirstApp.java.
3. Compilarea aplicației
Pentru compilare vom folosi compilatorul javac din distribuția J2SDK. Apelul compilatorului se face pentru fișierul ce conține clasa principala a aplicației sau pentru orice fișier/fișiere cu extensia java. Compilatorul creează câte un fișier separat pentru fiecare clasa a programului. Acestea au extensia .class și implicit sunt plasate în același director cu fișierele sursa. javac FirstApp.java
În cazul în care compilarea a reușit va fi generat fișierul FirstApp.class.
4. Rularea aplicației
Se face cu interpretorul java, apelat pentru unitatea de compilare corespunzatoare clasei principale. Deoarece interpretorul are ca argument de intrare numele clasei principale și nu numele unui fișier, ne vom poziționa în directorul ce conține fișierul FirstApp.class și vom apela interpretorul astfel: java FirstApp
Clasa este un concept de bază al programării orientate obiect, domeniu în care reprezintă structura care definește caracteristicile abstracte ale unui lucru (obiect), printre care caracteristicile acestuia (atributele sale, câmpuri sau proprietăți), precum și comportamentele acestui lucru (lucrurile pe care le poate face, sau metode, operații sau proprietăți). Pentru a da consistență atributelor este nevoie de cearea unui obiect într-o clasă. Astfel, un obiect se mai numește și instanță a unei clase.
Declararea unei clase respectă următorul format general:
[modificatori clasa] class NumeClasa
[extends NumeSuperclasa]
[implements Interfata1 [, Interfata2 … ]]
{
// Corpul clasei
}
Corpul unei clase urmează imediat după declararea clasei și este cuprins între acolade. Conținutul acestuia este format din:
• Declararea și, eventual, inițializarea variabilelor de instanță și de clasă (cunoscute împreună ca variabile membre).
• Declararea și implementarea constructorilor.
• Declararea și implementarea metodelor de instanța și de clasă (cunoscute împreună ca metode membre).
• Declararea unor clase imbricate (interne).
Crearea obiectelor se realizează prin instanțierea unei clase și implică următoarele lucruri:
• Declararea: Presupune specificarea tipului acelui obiect, cu alte cuvinte specificarea clasei acestuia (vom vedea că tipul unui obiect poate fi și o interfață).
NumeClasa numeObiect;
• Instanțierea: Se realizează prin intermediul operatorului new și are ca efect crearea efectivă a obiectului cu alocarea spațiului de memorie corespunzător.
numeObiect = new NumeClasa();
• Inițializarea: Se realizează prin intermediul constructorilor clasei respective. Inițializarea este de fapt parte integrantă a procesului de instanțiere, în sensul că imediat după alocarea memoriei ca efect al operatorului new este apelat constructorul specificat.
Mai general, instanțierea și inițializarea apar sub forma:
numeObiect = new NumeClasa([argumente constructor]);
Un concept de bază în ceea ce privește POO este moștenirea, în Java existând doar varianta de moștenire simplă, ceea ce înseamnă că o clasă poate avea un singur părinte. O clasă va moșteni o altă clasă prin menționarea cuvântului cheie extends în declararea clasei:
class B extends A {…}
Cea mai generală clasă Java, care nu are părinte, este clasa Object. În rest, orice clasă Java are (implicit sau explicit) un părinte.
Prin mostenire o clasa poate fi reutilizată pentru a modela o alta clasă, care este o specializare a celei dintâi. Prima clasa se numeste clasa de baza sau (sau superclasa sau clasa parinte), iar cea de-a doua, clasa derivata (sau subclasa).
2.2 Elemente pentru realizarea interfețelor grafice în Java
Interfața grafică cu utilizatorul (GUI) se referă la toate tipurile de comunicare vizuală între un program și utilizatorii săi. Aceasta este o particularizare a interfeței cu utilizatorul (UI) prin care se întelege conceptul generic de interacțiune dintre program și utilizatori.
Limbajul Java pune la dispoziție numeroase clase pentru implementarea diverselor funcționalitati GUI.
De la apariția limbajului Java, bibliotecile de clase care oferă servicii grafice au suferit o multitudine de schimbări în trecerea de la o versiune la alta a Java. Acest lucru se datorează, pe de o parte dificultății legate de implementarea noțiunii de portabilitate, pe de altă parte nevoii de a integra mecanismele GUI cu tehnologii apărute și dezvoltate ulterior.
În momentul actual, există două modalități de a crea o aplicație cu interfață grafică și anume:
• AWT (Abstract Windowing Toolkit) – este API-ul inițial pus la dispoziție începând cu primele versiuni de Java;
• Swing – parte dintr-un proiect mai amplu numit JFC (Java Foundation Classes) creat în urma colaborării dintre Sun, Netscape și IBM, Swing se bazează pe modelul AWT, extinzând funcționalitatea lui și adăugând sau înlocuind componente pentru dezvoltarea aplicațiilor GUI.
În principiu, crearea unei aplicații grafice presupune următoarele lucruri:
• Design:
– Crearea unei suprafețe de afișare (cum ar fi o fereastră) pe care vor fi așezate obiectele grafice (componente) care servesc la comunicarea cu utilizatorul (butoane, controale pentru editarea textelor, liste, etc);
– Crearea și așezarea componentelor pe suprafața de afișare la pozițiile corespunzătoare;
• Funcționalitate:
– Definirea unor acțiuni care trebuie să se execute în momentul când utilizatorul interacționează cu obiectele grafice ale aplicației;
– ”Ascultarea” evenimentelor generate de obiecte în momentul interacțiunii cu utilizatorul și executarea acțiunilor corespunzătoare, așa cum au fost ele definite.
Aplicația prezentată în această lucrare folosește tehnologia Swing.
Din familia Swing fac parte pachetele javax.swing, javax.swing.event și altele. De remarcat că Swing nu înlocuiește, ci completează AWT cu noi pachete de clase. Multe din clasele AWT sunt necesare și atunci când se lucrează în Swing. Obiectele grafice din Swing au nu numai aceeași funcționalitate, ci și același aspect pe orice platforma. Mai mult, acest aspect poate fi ales de programator dintre mai multe variante posibile.
Librăria Swing este parte a JFC care oferă componentele necesare programatorilor pentru crearea de interfețe grafice moderne și “prietenoase” aplicațiilor Java. Swing aduce îmbunătățiri calitative față de pachetul AWT. Printre îmbunătățirile aduse de Swing, înafară de noile componente adăugate, putem enumera: mod de prezentare și comportare pentru interfață independentă de platformă, posibilitate de a avea componente cu forme nerectangulare, accesibilitate sporită, etc.
2.2.1 Suprafețe de afișare
Crearea obiectelor grafice nu realizează automat și afișarea lor pe ecran. Mai întâi ele trebuie așezate pe o suprafață de afișare și vor deveni vizibile în momentul în care suprafața respectivă va fi vizibilă. O astfel de suprafață pe care sunt plasate componentele reprezintă o instanța a unei clase derivată din clasa Container.
O parte din clasele a căror părinte este Container este prezentată mai jos:
• Window – este superclasa tututor ferestrelor. Din această clasă sunt derivate:
– Frame – ferestre standard;
– Dialog – ferestre de dialog modale sau nemodale;
• Panel – o suprafață fără reprezentare grafică folosită pentru gruparea altor componente. Din această clasă derivă Applet, folosită pentru crearea appleturilor.
• ScrollPane – container folosit pentru implementarea automată a derulării pe orizontală sau verticală a unei componente.
2.2.2 Gestionarea poziționării
Un gestionar de poziționare (layout manager) este un obiect care controlează dimensiunea și aranjarea (poziția) componentelor unui container.
Așadar, modul de aranjare a componentelor pe o suprafața de afișare nu este o caracteristică a containerului. Fiecare obiect de tip Container (Applet, Frame, Panel, etc.) are asociat un obiect care se ocupă cu dispunerea componentelor pe suprafața sa și anume gestionarul său de poziționare.
Sunt însă situații când dorim să plasăm componentele la anumite poziții fixe iar acestea să ramâna acolo chiar dacă redimensionăm containerul. Folosind un gestionar această poziționare absolută a componentelor nu este posibilă și deci trebuie cumva să renunțăm la gestionarea automată a containerul. Acest lucru se realizează prin trimitera argumentului null metodei setLayout().
La instanțierea unui container se creează implicit un gestionar de poziționare asociat acestuia. De exemplu, pentru o fereastră gestionarul implict este de tip BorderLayout, în timp ce pentru un panel este de tip FlowLayout.
• FlowLayout: așează componentele pe suprafața de afișare în flux liniar, mai precis, componentele sunt adăugate una după alta pe linii, în limita spațiului disponibil. În momentul când o componentă nu mai încape pe linia curentă se trece la următoarea linie, de sus în jos.
• BorderLayout: împarte suprafața de afișare în cinci regiuni, corespunzătoare celor patru puncte cardinale și centrului. O componentă poate fi plasată în oricare din aceste regiuni, dimeniunea componentei fiind calculata astfel încât să ocupe întreg spațiul de afișare oferit de regiunea respectivă. La adăugarea unei componente pe o suprafață gestionată de BorderLayout, metoda add va mai primi pe lânga referința componentei și zona în care aceasta va fi amplasată, care va fi specificată prin una din constantele clasei: NORTH, SOUTH, EAST, WEST, CENTER. BorderLayout este gestionarul implicit pentru toate containerele care descind din clasa Window, deci al tuturor tipurilor de ferestre.
• GridLayout: organizează containerul ca un tabel cu rânduri și coloane, componentele fiind plasate în celulele tabelului de la stânga la dreapta, începând cu primul rând. Celulele tabelului au dimensiuni egale iar o componentă poate ocupa doar o singură celulă.
• CardLayout: tratează componentele adăugate pe suprafața sa într-o manieră similară cu cea a dispunerii cărților de joc într-un pachet. Suprafața de afișare poate fi asemănată cu pachetul de cărți iar fiecare component ă este o carte din pachet. La un moment dat, numai o singură componentă este vizibilă (”cea de deasupra”).
• GridBagLayout: Este cel mai complex și flexibil gestionar de poziționare din Java. La fel ca în cazul gestionarului GridLayout, suprafața de afișare este considerată ca fiind un tabel însă numărul de linii și de coloane sunt determinate automat, în funcție de componentele amplasate pe suprafața de afișare. De asemenea, în funcție de componentele gestionate, dimensiunile celulelor pot fi diferite cu singurele restricții ca pe aceeași linie să aibă aceeași înălțime, iar pe coloană aibă aceeași lățime. O componentă poate ocupa mai multe celule adiacente, chiar de dimensiuni diferite, zona ocupată fiind referită prin ”regiunea de afișare” a componentei respective.
2.2.3 Componente Swing
Toate componentele Swing sunt definte de clase proprii ce se găsesc în pachetul javax.swing, clasa JComponent fiind superclasa abstractă a tuturor acestor clase.
• JButton – butoane cu eticheta formată dintr-un text pe o singură linie;
• JCheckBox – componentă ce poate avea două stări; mai multe obiecte de acest tip pot fi grupate folosind clasa JCheckBoxGroup;
• JComboBox – liste în care doar elementul selectat este vizibil și care se deschid la apăsarea lor;
• JLabel – etichete simple ce pot conține o singură linie de text needitabil;
• JList – liste în care toate elementele sunt vizibile, cu selecție simplă sau multiplă;
• JTextField – casete de text (pe o singură linie) și JTextArea (pe mai multe linii).
• JTable – tabel. Aceasta este o clasă mai complexă decât cele enumerate mai sus și în continuare vom prezenta puțin mai pe larg câteva aspecte legate de utilizarea tabelelor în Java.
JTable este o clasă care folosește la afișarea datelor sub formă tabelară, opțional permițând și modificarea datelor.
Frecvent, pentru a crea un tabel este nevoie de datele pe care le va conține (reprezentate într-o matrice) și de un vector de tip String care va conține numele coloanelor tabelului.
Exemplu:
Object data[][] = … ;
String antet[] = …
JTable tabel = new JTable(data, antet);
Mai există și alte variante de contructori pentru JTable, însă cea de mai sus este mai des întâlnită.
Modul în care sunt reprezentate datele în tabel este dat de modelul tabelului. Implicit un JTable folosește clasa DefaultTableModel, însă este posibil să se creeeze și clase personalizate, prin implementarea interfeței TableModel. Deobicei, o clasă creată de utilizator în aceste sens va fi o subclasă a clasei AbstractTableModel.
Lățimea coloanelor: Implicit, toate coloanele tabelului au aceeași lățime. În momentul în care utilizatorul modifică manual lățimea unei coloane, toate coloanele din dreapta acesteia se modifică.
Pentru a seta manual lățimea inițială a coloanelor, trebuie apelată metoda setPreferredWidth() pentru fiecare coloană. În acest caz, fiecare coloană va fi reprezentată de un obiect de tip TableColumn.
Exemplu:
TableColumn column = null;
for (int i = 0; i < 5; i++) {
column = table.getColumnModel().getColumn(i);
if (i == 2) {
column.setPreferredWidth(100); //a treia coloană
} else {
column.setPreferredWidth(50);
}
}
Selectarea elementelor din tabel: Implicit, utilizatorul poate selecta una sau mai multe rânduri din tabel. În cazul selecției multiple, rândurile pot și continue sau nu.
Pentru a selecta un singur rând se poate face click cu mouse-ul undeva în cadrul acestuia sau se poate deplasa cu săgețile sus/jos de pe tastatură.
Pentru a selecta o zonă continuă sau arbitrară de mai multe rânduri se procedează în stilul clasic, folosind tasta Shift pentru o zonă continuă de rânduri sau tasta Ctrl pentru o zonă arbitrară de rânduri.
Pentru a seta unul din modul de selecție a rândurilor se va apela metoda setSelectionMode() cu unul din parametrii: MULTIPLE_INTERVAL_SELECTION, SINGLE_INTERVAL_SELECTION sau SINGLE_SELECTION.
Lucrurile sunt similare și pentru cazul selecției coloanelor.
Rendere:
Un tabel folosește un renderer pentru toate celulele care conțin același tip de date. Astfel, toate acele celule vor fi afișate unitar.
Sunt câteva moduri predefinite de afișare a datelor în celule după cum urmează:
tipul Boolean este afișat ca și Checkbox
tipurile numerice sunt afișate aliniat la dreapta
tipul Date este afișat folosind o instanță a clasei DateFormat pentru formatarea datei
tipurile ImageIcon, Icon sunt afișate aliniat centrat
tipul Object este afișat aliniat la stânga sub formă de String
În mod implicit, toate coloanele tabelului sunt considerate a fi de tip Object.
Modul de afișare a datelor în celule poate fi personalizat prin crearea de noi rendere. Acest lucru se realizează prin extinderea clasei DefaultTableCellRenderer sau implementarea interfeței TableCellRenderer.
Sortarea datelor dintr-un tabel: Pentru a permite sortarea datelor dintr-un tabel este nevoie de un obiect sorter care este o instanță a clasei TableRowSorter. Acest lucru se poate realiza apelând pentru un tabel metoda autoCreateRowSorter(true). Prin aceasta se obține faptul că atunci când utilizatorul va face click pe o coloană din antetul tabelului, acesta va fi sortat crescător sau descrescător după elementele din acea coloană.
Există și modalități mai sofisticate de sortare a datelor, însă nu le vom detalia în această lucrare.
Listarea la imprimantă a tabelelor: JTable pune la dispoziție un API simplu pentru listarea tabelelor. Practic pentru un anumit tabela se va apela metoda print().
Exemplu:
try {
if (!table.print()) {
System.err.println("Utilizator a anulat listarea");
}
} catch (java.awt.print.PrinterException e) {
System.err.format("Nu se poate lista %s%n", e.getMessage());
}
La rularea unui astfel de cod se va deschide o fereastră standard de listare la imprimantă.
Pe lângă această variantă simplă de listare mai există și altele, cum ar fi setarea unui antet pentru pagină.
Exemplu:
MessageFormat header = new MessageFormat("Page {0,number,integer}");
try {
table.print(JTable.PrintMode.FIT_WIDTH, header, null);
} catch (java.awt.print.PrinterException e) {
System.err.format("Cannot print %s%n", e.getMessage());
}
Pentru setări mai complexe ale listării se va personaliza un obiect de tip Printable obținut prin apelarea metodei JTable.getPrintable().
• JTabbedPane – această clasă reprezintă un tip special de container Swing care permite existența simultană a mai multe file, iar la un momentdat doar una din acestea să fie vizibilă. Acest container poate fi considerat ca și o alternativă la gestionarul de poziționare CardLayout.
Pentru a crea un JTabbedPane există mai mulți contructori cum ar fi:
JTabbedPane()
JTabbedPane(int) – parametrul de tip int va preciza unde vor fi poziționate tab-urile. Valorile posibile sunt: TOP, BOTTOM, LEFT, RIGHT (implicit este TOP).
JTabbedPane(int, int) – primul parametru de tip int are aceeași semnificație ca și mai sus, iar cel de-al doilea parametru specifică politica de layout. Aceasta poate fi WRAP_TAB_LAYOUT sau SCROLL_TAB_LAYOUT.
Pentru a adăuga un nou tab se poate folosi una din formele metodei addTab():
addTab(String, Icon, Component, String)
addTab(String, Icon, Component)
addTab(String, Component)
Primul parametru de tip String reprezintă textul care va apărea pe tab, parametru de tip Icon reprezintă imaginea opțională care poate apărea pe un tab alături de text, parametru de tip Component reprezintă obiectul care va fi afișat la acționarea tab-ului, iar ultimul parametru de tip String reprezintă tool tip-ul care poate apărea când mouse-ul este deasupra tab-ului.
Alte metode din cadrul clasei JtabbedPane sunt:
insertTab(String, Icon, Component, String, int): insereză un tab nou la un index specificat
removeTabAt(int): șterge tab-ul cu indexul specificat ca și parametru
removeAll(): șterge toate tab-urile
int indexOfTab(String): returnează indexul tab-ului care conține textul trimis ca și parametru de tip String
void setSelectedIndex(int): selectează tab-ul cu indexul trimis ca și parametru
int getSelectedIndex(): returnează indexul tab-ului curent selectat
void setMnemonicAt(int, int): setează tasta fierbinte a unui anumit tab
2.3 Lucrul cu baze de date în Java
În Java există JDBC (Java Database Connectivity) care este o interfață standard SQL de acces la baze de date. JDBC este constituită dintr-un set de clase și interfețe scrise în Java, furnizând mecanisme standard pentru proiectanții aplicațiilor ce folosesc de baze de date.
Folosind JDBC este ușor să transmitem secvențe SQL către baze de date relaționale. Cu alte cuvinte, nu este necesar să scriem un program pentru a accesa o bază de date Oracle, alt program pentru a accesa o bază de date Sybase și asa mai departe. Este de ajuns să scriem un singur program folosind API-ul JDBC și acesta va fi capabil să comunice cu drivere diferite, trimițând secvențe SQL către baza de date dorită. Bineînțeles, scriind codul sursă în Java, ne este asigurată portabilitatea programului.
Pachetele care oferă suport pentru lucrul cu baze de date sunt java.sql ce reprezintă nucleul tehnologiei JDBC.
În linii mari, API-ul JDBC oferă următoarele facilități:
1. Stabilirea unei conexiuni cu o bază de date.
2. Efectuarea de secvențe SQL.
3. Prelucrarea rezultatelor obținute.
2.3.1 Conectarea la o bază de date
Procesul de conectare la o baza de date implică efectuarea a două operații:
1. Inregistrarea unui driver corespunzator.
2. Realizarea unei conexiuni propriu-zise.
Clasele și interfețele responsabile cu realizarea unei conexiuni sunt:
• DriverManager – este clasa ce se ocupă cu înregistrarea driverelor ce vor fi folosite în aplicație;
• Driver – interfața pe care trebuie să o implementeze orice clasă ce descrie un driver;
• DriverPropertyInfo – prin intermediul acestei clase pot fi specificate diverse proprietăți ce vor fi folosite la realizarea conexiunilor;
• Connection – descrie obiectele ce modeleaza o conexiune propriu-zisa cu baza de date.
Înregistrarea unui driver
Primul lucru pe care trebuie sa îl facă o aplicație în procesul de conectare la o bază de date este să înregistreze la mașina virtuală ce rulează aplicația, driverul JDBC responsabil cu comunicarea cu respectiva bază de date. Acest lucru presupune încărcarea în memorie a clasei ce implementează driver-ul și poate fi realizată în mai multe modalități.
a. Folosirea clasei DriverManager:
DriverManager.registerDriver(new TipDriver());
b. Folosirea metodei Class.forName ce apeleaza ClassLoader-ul mașinii virtuale:
Class.forName("TipDriver");
Class.forName("TipDriver").newInstance();
c. Setarea proprietatii sistem jdbc.drivers, care poate fi realizata în două feluri:
– De la linia de comandă:
java -Djdbc.drivers=TipDriver Aplicatie
– Din program:
System.setProperty("jdbc.drivers", "TipDriver");
Folosind această metodă, specificarea mai multor drivere se face separând numele claselor cu punct și virgulă.
Specificarea unei baze de date
O dată ce un driver JDBC a fost înregistrat, acesta poate fi folosit la stabilirea unei conexiuni cu o bază de date. Având în vedere faptul că pot exista mai multe drivere încărcate în memorie, trebuie să avem posibilitea de a specifica pe lângă un identificator al bazei de date și driverul ce trebuie folosit. Aceasta se realizează prin intermediul uni adrese specifice, numită JDBC URL ce are următorul format:
jdbc:sub-protocol:identificator
Câmpul sub-protocol denumește tipul de driver ce trebuie folosit pentru realizarea conexiunii și poate fi odbc, oracle, sybase, db2 și așa mai departe.
Identificatorul bazei de date este un indicator specific fiecărui driver corespunzător bazei de date cu care aplicația dorește să interacționeze. În funcție de tipul driver-ului, acest identificator poate include numele unei mașini gazdă, un număr de port, numele unui fișier sau al unui director, etc.
Subprotocolul odbc este un caz special, în sensul că permite specificarea în cadrul URL-ului a unor atribute ce vor fi folosite la crearea unei conexiuni.
La primirea unui JDBC URL, DriverManager-ul va parcurge lista driverelor inregistrate în memorie, până când unul dintre ele va recunoaște URL-ul respectiv. Dacă nu există nici unul potrivit, atunci va fi lansată o excepție de tipul SQLException, cu mesajul "No suitable driver".
Tipuri de drivere
Tipurile de drivere existente ce pot fi folosite pentru realizarea unei conexiuni prin intermediul JDBC se impart în urmatoarele categorii:
Tip 1.
Fig. 2.1
Acest tip de driver permite conectarea la o bază de date care a fost înregistrată în prealabil în ODBC. ODBC (Open Database Conectivity) reprezintă o modalitate de a uniformiza accesul la baze de date, asociind acestora un identificator DSN (Data Source Name) și driver și parametrii necesari conectării. Conectarea efectivă la baza de date se va face prin intermediul acestui identificator, driver-ul ODBC efectuând comunicarea cu driverul nativ al bazei de date.
Driverul va converti apelurile de metode JDBC în apeluri de funcții ODBC.
Deși simplu de utilizat, soluția JDBC-ODBC nu este portabilă și comunicarea cu baza de date suferă la nivelul vitezei de execuție datorită multiplelor redirectări între drivere. De asemenea, atât ODBC-ul cât și driver-ul nativ sunt dependente de mașina pe care rulează aplicația. Astfel, această variantă ar trebui evitată dacă există la dispoziție un driver pur Java.
Clasa Java care descrie acest tip de driver JDBC este sun.jdbc.odbc.JdbcOdbcDriver și este inclusa în distribuția standard J2SDK.
Specificarea bazei de date se face printr-un URL de forma:
jdbc:odbc:identificator
unde identificator este profilul (DSN) creat bazei de date în ODBC.
Tip 2. Driver JDBC – Driver nativ
Fig. 2.2
Acest tip de driver transformă cererile JDBC direct în apeluri către driverul nativ al bazei de date, care trebuie instalat în prealabil. Driverul va converti apelurile de metode JDBC în apeluri native ale API-ului bazei de date. Aceasta este o variantă mai bună decât prima, nemaiavând de-a face și cu ODBC-ul, însă nu este scris în întregime în Java, deci nici acesta nu oferă independența de platformă și nu este foarte potrivit pentru appleturi. În schimb, faptul că folosește API-uri native îl face foarte rapid.
Clase Java care implementează astfel de drivere pot fi procurate de la producătorii de SGBD-uri, distribuția standard J2SDK neincluzând niciunul.
Tip 3. Driver JDBC – Server
Fig. 2.3
Acest tip de driver este cunoscut și sub denumirea de driver pur Java, folosindu-se de middleware-ul specific unui tip de baze de date și transformă cererile JDBC folosind un protocol de rețea independent, acestea fiind apoi transformate folosind o aplicație server într-un protocol specific bazei de date. Introducerea serverului ca nivel intermediar aduce flexibilitate maximă în sensul că vor putea fi realizate conexiuni cu diferite tipuri de baze, fără nici o modificare la nivelul clientului și al independenței de platformă. Folosindu-se de un middleware, oferă avantaje suplimentare de securitate.
Librăriile specifice nu mai trebuie să existe pe mașina client, ceea ce face acest protocol potrivit și pentru appleturi.
Tip 4. Driver JDBC nativ
Fig. 2.4
Acest tip de driver este cunoscut ca fiind un driver pur Java de acces direct la o bază de date. El transformă cererile JDBC direct în cereri către baza de date folosind protocolul de rețea al acesteia, comunicarea făcându-se deobicei prin socket-uri.
Această soluție este cea mai rapidă, fiind preferată la dezvoltarea aplicațiilor care manevrează volume mari de date și viteza de execuție este critică.
Driverul este independent de platformă și trebuie să fie instalat în JMV a mașinii client. Drivere de acest tip pot fi procurate de la diverși producători de SGBD-uri.
Exemplu de driver: oracle.jdbc.driver.OracleDriver
Realizarea unei conexiuni la o bază de date
Metoda folosită pentru realizarea unei conexiuni este getConnection() din clasa DriverManager și poate avea mai multe forme:
Connection c = DriverManager.getConnection(url);
Connection c = DriverManager.getConnection(url, username, password);
Connection c = DriverManager.getConnection(url, dbproperties);
Folosirea diferitelor tipuri de drivere implică doar schimbarea numelui clasei ce reprezinta driverul și a modalitatii de specificare a bazei de date.
O conexiune va fi folosită pentru:
• Crearea de secvențe SQL utilizate pentru interogarea sau actualizarea bazei.
• Aflarea unor informatii legate de baza de date (meta-date).
De asemenea, clasa Connection asigură facilități pentru controlul tranzacțiilor din memorie către baza de date prin metodele commit, rollback, setAutoCommit.
Închiderea unei conexiuni se realizează prin metoda close().
2.3.2 Efectuarea de secvențe SQL
Odată făcută conectarea la baza de date cu metoda DriverManager.getConection(), se poate folosi obiectul Connection rezultat pentru a se crea obiecte de tip Statement, PreparedStatement sau CallableStatement cu ajutorul cărora putem trimite secvențe SQL către baza de date. Cele mai uzuale comenzi SQL sunt cele folosite pentru:
• Interogarea bazei de date: SELECT
• Actualizarea datelor: INSERT, UPDATE, DELETE
• Actualizarea structurii: CREATE, ALTER, DROP – acestea mai sunt numite instrucțiuni DDL (Data Definition Language)
• Apelarea unei proceduri stocate: CALL
După cum vom vedea, obținerea și prelucrarea rezultatelor unei interogări este realizată prin intermediul obiectelor de tip ResultSet.
Interfața Statement
Interfața Statement oferă metodele de bază pentru trimiterea de secvențe SQL către baza de date și obtinerea rezultatelor, celelalte doua interfete: PreparedStatement și CallableStatement fiind derivate din aceasta. Crearea unui obiect Statement se realizează prin intermediul metodei createStatement() a clasei Connection, fără nici un argument:
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
Executia unei secvențe SQL poate fi realizată prin intermediul a trei metode:
1. executeQuery
Este folosită pentru realizarea de interogari de tip SELECT.Metoda returneaza un obiect de tip ResultSet ce va conține sub o formă tabelară rezultatul interogării.
String sql = "SELECT * FROM persoane";
ResultSet rs = stmt.executeQuery(sql);
2. executeUpdate
Este folosită pentru actualizarea datelor (INSERT, UPDATE, DELETE) sau a structurii bazei de date (CREATE, ALTER, DROP). Metoda va returna un întreg ce semnifică numărul de linii afectate de operațiunea de actualizare a datelor, sau 0 în cazul unei instrucțiuni DDL.
3. execute
Această metodă va fi folosită doar dacă este posibil ca rezultatul unei interogări să fie format din doua sau mai multe obiecte de tip ResultSet sau rezultatul unei actualizari să fie format din mai mule valori, sau o combinatie intre aceste cazuri.
Folosind clasa Statement, în cazul în care dorim să introducem valorile unor variabile într-o secvență SQL, nu avem altă soluție decât să creăm un șir de caractere compus din instructiuni SQL și valorile variabilelor:
int cod = 100;
String nume = "Popescu";
String sql = "SELECT * FROM persoane WHERE cod=" + cod +" OR nume=’" + nume + "’";
ResultSet rs = stmt.executeQuery(sql);
Interfața PreparedStatement
Interfața PreparedStatement este derivată din Statement, fiind diferită de aceasta în următoarele privințe:
• Instanțele de tip PreparedStatement conțin secvențe SQL care au fost deja compilate (sunt ”pregătite”).
• O secvență SQL specificată unui obiect PreparedStatement poate să aiba unul sau mai mulți parametri de intrare, care vor fi specificați prin intermediul unui semn de întrebare (”?”) în locul fiecăruia dintre ei. Înainte ca secvența SQL să poată fi executată, fiecarui parametru de intrare trebuie să i se atribuie o valoare, folosind metode specifice acestei clase.
Execuția repetată a aceleiați secvențe SQL, dar cu parametri diferiți, va fi în general mai rapidă dacă folosim PreparedStatement, deoarece nu mai trebuie sa creăm câte un obiect de tip Statement pentru fiecare apel SQL, ci refolosim o singură instanță precompilată, furnizându-i doar alte argumente.
Crearea unui obiect de tip PreparedStatement se realizează prin intermediul metodei prepareStatement() a clasei Connection, specificând ca argument o secvență SQL ce conține câte un semn de întrebare pentru fiecare parametru de intrare:
Connection con = DriverManager.getConnection(url);
String sql = "UPDATE persoane SET nume=? WHERE cod=?";
Statement pstmt = con.prepareStatement(sql);
Obiectul va pstmt conține o comandă SQL precompilată care este trimisă imediat către baza de date, unde va aștepta parametri de intrare pentru a putea fi executată.
Trimiterea parametrilor se realizează prin metode de tip setXXX, unde XXX este tipul corespunzător parametrului, iar argumentele metodei sunt numărul de ordine al parametrului de intrare (al semnului de intrebare) și valoarea pe care dorim să o atribuim.
pstmt.setString(1, "Ionescu");
pstmt.setInt(2, 100);
După stabilirea parametrilor de intrare, secvența SQL poate fi executata. Putem apoi stabili alte valori de intrare și refolosi obiectul PreparedStatement pentru execuții repetate ale comenzii SQL. Este însă posibil ca SGBD-ul folosit să nu suporte acest tip de operatiune și să nu rețină obiectul precompilat pentru execuții ulterioare. În această situație, folosirea interfeței PreparedStatement în loc de Statement nu va îmbunătăți în nici un fel performanța codului, din punctul de vedere al vitezei de execuție a acestuia.
Execuția unei secvențe SQL folosind un obiect PreparedStatement se realizează printr-una din metodele executeQuery, executeUpdate sau execute, semnificațiile lor fiind aceleași ca și în cazul obiectelor de tip Statement, cu singura deosebire că în cazul de față, ele nu au nici un argument.
String sql = "UPDATE persoane SET nume=? WHERE cod=?";
Statement pstmt = con.prepareStatement(sql);
pstmt.setString(1, "Ionescu");
pstmt.setInt(2, 100);
pstmt.executeUpdate();
Fiecărui tip Java îi corespunde un tip generic SQL. Este responsabilitatea programatorului să se asigure că foloseste metoda adecvată de tip setXXX la stabilirea valorii unui parametru de intrare. Lista tuturor tipurilor generice disponibile, numite și tipuri JDBC, este definită de clasa java.sql.Types, prin constantelor declarate de aceasta. Metoda setObject() permite specificarea unor valori pentru parametrii de intrare, atunci când dorim să folosim maparea implicită între tipurile Java și cele JDBC sau atunci când dorim să precizăm explicit un tip JDBC.
pstmt.setObject(1, "Ionescu", Types.CHAR);
Folosind metoda setNull() putem să atribuim unui parametru de intrare valoare SQL NULL, trebuind însă să specificăm și tipul de date al coloanei în care vom scrie această valoare. Același lucru poate fi realizat cu metode de tipul setXXX dacă argumentul folosit are valoarea null.
pstmt.setNull(1, Types.CHAR);
pstmt.setInt(2, null);
Interfața CallableStatement
Interfața CallableStatement este derivată din PreparedStatement, instanțele de acest tip oferind o modalitate de a apela o procedura stocata intr-o baza de date, intr-o maniera standar pentru toate SGBD-urile.
Crearea unui obiect CallableStatement se realizeaza prin metoda prepareCall() a clasei Connection:
Connection con = DriverManager.getConnection(url);
CallableStatement cstmt = con.prepareCall("{call proceduraStocata(?, ?)}");
Trimiterea parametrilor de intrare se realizeaza ca și la PreparedStatement, cu metode de tip setXXX. Dacă procedura are și parametri de iesire (valori returnate), acestia vor trebui inregistrati cu metoda registerOutParameter() inainte de executia procedurii. Obținerea valorilor rezultate în parametrii de iesie se va face cu metode de tip getXXX.
2.3.3 Obținerea și prelucrarea rezultatelor
Interfața ResultSet
În urma executiei unei interogari SQL, rezultatul va fi reprezentat printr-un obiect de tip ResultSet, ce va conține toate liniile ce satisfac conditiile impuse de comanda SQL. Forma generală a unui ResultSet este tabelară, având un număr de coloane și de linii, în funcție de secvența executată. De asemenea, obiectul va conține și meta-datele interogării cum ar fi denumirele coloanelor selectate, numărul lor, etc.
Pentru a extrage informațiile din această structură va trebui să parcurgem tabelul linie cu linie și din fiecare să extragem valorile de pe coloane. Pentru acest lucru vom folosi metode de tip getXXX, unde XXX este tipul de data al unei coloane iar argumentul primit indică fie numărul de ordine din cadrul tabelului, fie numele acestuia. Coloanele sunt numerotate de la stânga la dreapta, începând cu 1. În general, folosirea indexului coloanei în loc de numele său va fi mai eficientă. De asemenea, pentru maxima portabilitate se recomandă citirea coloanelor în ordine de la stânga la dreapta și fiecare citire să se facă o singură dată.
Un obiect ResultSet folosește un cursor pentru a parcurge articolele rezultate în urma unei interogări. Inițial acest cursor este poziționat înaintea primei linii, fiecare apel al metodei next() determinând trecerea la următoarea linie. Deoarece next() returnează false când nu mai sunt linii de adus, uzual va fi folosită o buclă while petru a itera prin articolele tabelului:
String sql = "SELECT cod, nume FROM persoane";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
int cod = r.getInt("cod");
String nume = r.getString("nume");
/* echivalent cu:
int cod = r.getInt(1);
String nume = r.getString(2);
*/
System.out.println(cod + ", " + nume);
}
Implicit, un tabel de tip ResultSet nu poate fi modificat, iar cursorul asociat nu se deplaseaza decât înainte, linie cu linie. Așadar, putem itera prin rezultatul unei interogări o singură dată și numai de la prima la ultima linie. Este însă posibil să creăm ResultSet-uri care să permită modificarea sau deplasarea în ambele sensuri. Exemplul următor va folosi un cursor care este modificabil și nu va reflecta schimbarile produse de alți utilizatori după crearea sa:
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
String sql = "SELECT cod, nume FROM persoane";
ResultSet rs = stmt.executeQuery(sql);
Dacă un ResultSet foloseste un cursor modificabil și care poate naviga în ambele sensuri, atunci are la dispoziție o serie de metode ce se bazeaza pe acest suport:
• absolute() – deplasează cursorul la o anumită linie specificată absolut;
• updateXXX() – actualizeaza valoarea unei coloane din linia curenta,unde XXX este un tip de date.
• updateRow() – transferă actualizările făcute liniei în baza de date.
• moveToInsertRow() – deplasează cursorul la o linie specială, numită linie nouă, utilizată pentru a introduce noi articole în baza de date. Linia curentă anterioară a cursorului va fi memorată pentru a se putea reveni la ea.
• insertRow() – inserează articolul din zona linie noua în baza de date; cursorul trebuie să fie poziționat la linia nouă la execuția acestei operatiuni.
• moveToCurrentRow() – revine la linia curentă din tabel.
• deleteRow() – sterge linia curenta din tabel și din baza de date; nu poate fi apelată când cursorul este în modul linie nouă.
Nu toate sistemele de gestiune a bazelor de date oferă suport pentru folosirea cursoarelor care pot fi modificate. În cazul în care acest lucru este permis, este responsabilitatea driver-ului bazei de date sa asigure rezolvarea problemelor legate de actualizarea concurenta a unui cursor, astfel incat sa nu apara anomalii.
2.3.4 Lucrul cu meta-date
Interfața DatabaseMetaData
După realizarea unui conexiuni la o bază de date, putem apela metoda getMetaData() pentru a afla diverse informatii legate de baza respectiva, asa numitele meta-date (”date despre date”); Ca rezultat al apelului metodei, vom obtine un obiect de tip DatabaseMetaData ce oferă un număr mare de metode pentru determinarea tabelelor, procedurilor stocate, capabilitatilor conexiunii, gramaticii SQL suportate, etc. ale bazei de date.
În aplicația prezentată în această lucrare am folosit metodele getColumns() și getTables().
Metoda getColumns() permite obținerea de informații despre coloanele unui tabel dintr-o bază de date. Informațiile returnate despre coloane sunt destul de variate, fiind 22 la număr. Dintre cele mai de interes sunt: COLUMN_NAME – numele coloanei, DATA_TYPE – tipul de date SQL așa cum este definit în java.sql.Types, TYPE_NAME – denumirea tipului de date care este dependent de tipul sursei de date, COLUMN_SIZE – dacă coloana este de tip caracter returnează dimensiunea maximă, dacă este de tip numeric returnează precizia, NULLABLE și IS_NULLABLE – precizează dacă coloana permite NULL sau nu, COLUMN_DEF – valoarea implicită, ORDINAL_POSITION – numărul de ordine al coloanei în tabel.
Metoda getTables() permite obținerea de informații despre tabelele din baza de date precum ar fi: TABLE_NAME – numele tabelului, TABLE_TYPE – tipul tabelului (poate fi "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM").
Interfața ResultSetMetaData
Meta-datele unui ResultSet reprezintă informațiile despre rezultatul conținut în acel obiect cum ar fi numărul coloanelor, tipul și denumirile lor, etc. Acestea sunt obținute apelând metoda getMetaData() pentru ResultSet-ul respectiv, care va returna un obiect de tip ResultSetMetaData ce poate fi apoi folosit pentru extragerea informațiilor dorite cum ar fi: getColumnCount() pentru a afla câte coloane sunt în ResultSet, getColumnName(int n) pentru a afla numele celei de-a n coloană, getColumnType(int n) pentru a afla tipul de date al celei de-a n coloane (așa cum este definit în java.sql.Types), getColumnTypeName(int n) pentru a afla tipul de date al celei de-a n coloane (cu denumirea dependentă de tipul sursei de date).Capitolul 3 – Modul de realizare a aplicației
3.1 Baza de date
Baza de date folosită pentru aplicație este de tip MySQL, creată cu ajutorul programului WAMP.
Baza de date conține 6 tabele după cum urmează:
Tabelul istoric_inchirieri
Acest tabel conține istoricul închirerilor de mașini, conținând numărul de înmatriculare care identifică în mod unic o mașină, câteva date despre închiriere cât și despre persoana care a închiriat mașina.
Fig. 3.1 Istoric închirieri
Tabelul leasing
Acest tabel conține date despre mașinile vândute în leasing și anume informațiile principale legate de operațiunea de leasing (avansul, valoarea împrumutului, valoarea reziduală, dobânda, perioada împrumutului), codul mașinii vândute (care se va regăsi în tabelul masinileasing care va conține informații detaliate despre mașina dată în leasing), data încheierii contractului și tipul contractantului.
Fig. 3.2 Leasing
Fig. 3.3 Masini
Tabelul mașini
În acest tabel sunt conținute informații detaliate despre mașinile care pot fi vândute (cu cash sau prin leasing). Fiecare mașina are un cod numeric unic de identificare plus alte 15 informații relevante despre aceasta. Desigur acestea nu acoperă toate detaliile posibile ale unei mașini însă s-a conderat că sunt suficiente și relevante. De menționat faptul că pe baza codului unic de identificare a unei mașini există și imagini aferente fiecăreia, care, pentru o mai ușoară regăsire, au fost denumite conform cu codul unic de identificare al mașinii (exemplu: 1001.jpg).
Tabelul mașini_închiriate
În acest tabel se regăsesc toate mașinile închiriate la un momentdat. Sunt reținute date specifice închirerii cât și câteva date despre beneficiar. În momentul în care o mașină va fi returnată, se va șterge linia corespunzătoare ei din acest tabel și se va adăuga o nouă linie în tabelul istoric_inchirieri.
Fig. 3.4Masini inchiriate
Tabelul mașinileasing
Similar tabelului mașini, acest tabel conține informații detaliate despre mașinile date în leasing. În cazul în care o mașină va fi returnată, linia corespunzătoare ei din acest tabel va fi transferată în tabelul mașini.
Fig. 3.5Masini leasing Fig. 3.6 Rent a car
Tabelul rentacar
Acest tabel este similar cu tabelul mașini, conținănd informații detaliate despre mașinile care pot fi închirate. Informațiile suplimentare sunt prețul pentru o zi de închiriere a mașinii și câmpul disponibilă care poate avea valoarea 1 dacă mașina este disponibilă spre a fi închiriată sau 0 dacă mașina este deja închiriată.
3.2 Ferestrele aplicației
Ferereastra principală a aplicației este un container de tip JTabbedPane cu 4 tab-uri: Vânzări auto, Leasing și Rent-a-car. Fiecare dintre tab-uri este accesibil din tastatură prin intermediul tastelor fierbinți.
Ferestrele corespunzatoare fiecărei opțiuni sunt obiecte de tip JPanel incluse în JTabbedPane. Ferestrele secundare care se deschid în cazul opțiunii Leasing și Rent-a-car sunt obiecte de tip JFrame.
În designul interfeței s-a optat pentru o variantă colorată și nemonotonă. Din acest motiv fiecare fereastră este colorată în alt mod, în culori în degradeu sau bicolor. JFrame-urile au doar culoare simplă de fundal.
Imaginile de fundal au fost setate la JPanel-uri prin suprascrierea metodei paintComponent(Graphics g), în cadrul căreia s-a apelat metoda g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this).
Obiectele de tip imagine au fost obținute astfel:
image = javax.imageio.ImageIO.read(new java.net.URL(getClass(). getResource("poza.gif"), "poza.gif"));
În cazul ferestrelor care au doar culoare de fundal s-a apelat metoda setBackground(new java.awt.Color(red, green, blue)).
Tot ca și un element mai deosebit de design am optat pentru butoane care pe lângă text conțin și o imagine sugestivă, sau chiar butoane care nu au deloc text ci doar o imagine sugestivă. Printre butoanele de acest tip se numără: , , , .
Pentru a seta o imagine la un buton am apelat metoda:
setIcon(new javax.swing.ImageIcon(getClass().getResource("poza.jpg")))
Un alt element mai deosebit al aplicației a fost oferirea flexibilitații în căutarea unei anumite mașini. În acest sens au fost oferite șase criterii de rafinare a căutărilor, fiecare dintre acestea având o valoare implicită de tipul “Oricare” sau “Oricât” pentru situațiile în care nu se dorește utilizarea vreunui filtru la un momendat.
Toate căutările se materializează în secvențe SQL care vor fi rulate în unul din tabele bazei de date.
Să luăm exemplu căutării unei mașini în vederea achiziționării. Secvența SELECT se contruiește dinamic în funcție de filtrele setate, astfel:
String sql = "SELECT * FROM masini";
if (!jComboMarca.getSelectedItem().toString().equals("Oricare"))
sql = sql + " WHERE marca='" + jComboMarca.getSelectedItem().toString() + "'";
if (!jComboModel.getSelectedItem().toString().equals("Oricare"))
if (!sql.contains("WHERE"))
sql = sql + " WHERE model='" + jComboModel.getSelectedItem(). toString() + "'";
else
sql = sql + " AND model='" + jComboModel.getSelectedItem(). toString() + "'";
if (!jComboKm.getSelectedItem().toString().equals("Oricat"))
if (!sql.contains("WHERE"))
sql = sql + " WHERE kmRulati<=" + Integer.parseInt(jComboKm. getSelectedItem(). toString());
else
sql = sql + " AND kmRulati<=" + Integer.parseInt(jComboKm. getSelectedItem().toString());
if (!jComboAnDeLa.getSelectedItem().toString().equals("Oricare"))
if (!sql.contains("WHERE"))
sql = sql + " WHERE anFabric>=" + Integer.parseInt(jComboAnDeLa. getSelectedItem().toString());
else
sql = sql + " AND anFabric>=" + Integer.parseInt(jComboAnDeLa. getSelectedItem().toString());
if (!jComboAnPanaLa.getSelectedItem().toString().equals("Oricare"))
if (!sql.contains("WHERE")) {
sql = sql + " WHERE anFabric<=" + Integer.parseInt( jComboAnPanaLa.getSelectedItem().toString());
else
sql = sql + " AND anFabric<=" + Integer.parseInt(jComboAnPanaLa. getSelectedItem().toString());
if (jTextFieldPret.getText().length() > 0)
if (!sql.contains("WHERE"))
sql = sql + " WHERE pretEuro<=" + Integer.parseInt(jTextFieldPret. getText());
else
sql = sql + " AND pretEuro<=" + Integer.parseInt(jTextFieldPret. getText());
if (!jComboCarburant.getSelectedItem().toString().equals("Oricare"))
if (!sql.contains("WHERE"))
sql = sql + " WHERE tipCombustibil='" + jComboCarburant. getSelectedItem().toString() + "'";
else
sql = sql + " AND tipCombustibil='" + jComboCarburant. getSelectedItem().toString() + "'";
ResultSet rs = stmt.executeQuery(sql);
Capitolul 4 – Modul de utilizare a aplicației
Aplicația are patru secțiuni distincte compuse din: Vânzări mașini, Leasing de mașini, Închiriere mașini (și returnare).
Primele trei secțiuni au unele părți comune și anume cele care țin de selectarea mașinilor, după care fiecare se individualizează.
4.1 Secțiunea Vânzări mașini
În prima parte a acestei ferestre se poate rafina căutarea mașinilor după șase criterii: marca, model, km rulați, anul fabricației, preț și tip carburant.
Oricare din aceste criterii poate fi omis sau pot fi selectate toate. După aceasta se apasă butonul Căutare, iar în tabel se vor afișa toate mașinile care corespund criteriilor selectate. Se va observa că pe prima coloană din tabel se află codul unic de identificare al fiecărei mașini. Cu ajutorul acestui cod se vor putea vizualiza detalii mai complete despre o anumită mașină sau se poate întocmi factura de vânzare a acesteia.
Fig. 4.1
Dacă se dorește afișarea mai multor detalii despre o mașină anume, se va introduce codul acesteia în caseta de text din dreptul butonului Afișare, după care se va acționa butonul Afișare. Aceasta va avea ca și efect deschiderea unei noi ferestre care conține 15 informații diverse despre mașină, cât și o imagine a acesteia.
Fig. 4.2
Fig. 4.3
După selectarea codului mașinii care se va vinde, se apasă butonul , deschizându-se o nouă fereastră în care se introduc câteva dintre detaliile contractului de vânzare a mașinii. Detaliile complete se vor afla în contractul scris.
4.2 Secțiunea Leasing
Prima parte a acestei ferestre este similară cu cea de Vânzări. După selectarea mașinii dorite și eventual vizualizarea detaliilor suplimentare despre aceasta, se poate trece la introducerea datelor de bază în ceea ce privește contractul de leasing. Aceasta se va face acționând butonul .
Fig. 4.4
După aceasta va apărea o nouă fereastră denumită Detalii leasing în care trebuiesc completate mai multe câmpuri. Acestea sunt: valoarea avansului, valoarea împrumutului, valoarea reziduală, dobânda anuală și perioada de leasing exprimată în luni. După introducerea acestor informații se va apăsa butonul Calcul rate pentru a se calcula valoarea ratei lunare și suma totală de plată.
Dacă se dorește se poate genera și graficul lunar de plată al ratelor, apăsând butonul Detaliere rate.
După aceasta se va selecta tipul contractantului (Societate comercială, Asociație sau Persoană fizică) și se va completa numărul contractului de leasing încheiat fizic. Restul informațiilor contractului de leasing vor rămâne doar pe suportul de hârtie.
Fig. 4.5
4.3 Secțiunea Rent a car
În cadrul acestei secțiuni pot fi închiriate mașini sau returnate.
Închirierea unei mașini se face acționând butonul Închiriere.
Similar ferestrelor anterioare, în prima parte a acestei ferestre se pot rafina criteriile de selectare a unei mașini. Diferența constă aici în faptul că mașinile sunt identificate în mod unic după numărul de înmatriculare, care în acest caz este un detaliu mai important decât la secțiunile de vânzare. Dacă este găsită mașina potrivită, se va completa numărul de înmatriculare al acesteia în caseta de text din dreptul butonului . Există și varianta mai simplă de a selecta numărul de înmatriculare al mașinii cu mouse-ul, direct din tabel, ceea ce va avea ca și rezultat autocompletarea numărului de înmatriculare în caseta de text. Este chiar recomandată acestă variantă, deoarece dacă nu este introdus corect din tastatură, numărul de înmatriculare nu va fi recunoscut.
Fig. 4.6
După acționarea butonului se va deschide o nouă fereastră în care se vor seta detaliile necesare pentru închirierea mașinii.
La deschiderea acestei ferestre vor fi deja autocompletate și vor fi editabile casetele de text care conțin marca, modelul, numărul de înmatriculare și prețul prentru o zi de închiriere al mașinii selectate anterior.
Vor trebui apoi completate casetele de text Număr zile de inchiriere și Garanție.
Desemenea mai există o listă de extraopțiuni din care se poate selecta. Prețul acestora este afișat per zi, astfel că în cazul închirierii pe mai multe zile, aceste prețuri vor fi multiplicate corespunzător.
După aceasta trebuie apăsat butonul Calcul total de plată pentru a afla suma totală de plată pe baza datelor introduse mai sus.
La final se introduc datele de identificare ale beneficiarului și se apasă butonul Listare factură.
Fig. 4.7
Returnarea unei mașini se face acționând butonul Returnare.
În fereastra care apare alegând această opțiune se găsesc toate mașinile închiriate în acel moment. Mașina care se returnează este identificată după numărul de înmatriculare care poate fi introdus de mână sau se va autocompleta dacă se face click pe acesta în tabel.
În cazul în care se va întârzia returnarea unei mașini, în câmpul Valoare penalizări se va autocompleta valoarea penalizărilor, proporțională cu numărul de zile de întârziere. Operatorul programului poate adăuga eventuale alte sume de penalizări la aceasta și să menționeze în caseta de text de dedesubt motivul penalizărilor, după care se apasă butonul Încasare. După achitarea eventualelor penalizări, mașina poate fi returnată, apăsând butonul .
Fig. 4.8
Concluzii
Această lucrare prezintă o parte din ceea ce înseamnă piața auto și componentele conexe acesteia. Aplicația practică a surprins cele mai importante elemente ce țin de: vânzări, leasing și închirieri.
Lucrarea a fost precedată de o perioadă de documentare pentru a putea cuprinde cele mai importante elemente legate de tema studiată și implementată.
Aplicația a fost creată cu ajutorulul limbajului Java, are o interfață grafică intuitivă și ușor de utilizat. Pentru gestionarea datelor am ales utilizarea unei baze de date de tip MySQL.
Gradul de dificultate al aplicației nu este foarte ridicat și ușor de folosit chiar și fără multe cunoștințe anterioare în utilizarea unor astfel de aplicații.
Pe viitor această aplicație poate fi dezvoltată pentru a i se adăuga noi funcționalități sau pentru a i se diversifica sau îmbunătăți cele deja implementate.
Bibliografie
[1] Eckel B., Thinking in Java, Third Edition, Ed. Prentice Hall, 2002
[2] Tanasă S., Olaru C., Andrei Ș., Java de la 0 la expert, Ed.Polirom, 2007
[3] http://thor.info.uaic.ro/~acf/java/Cristian_Frasinaru-Curs_practic_de_Java.pdf
[4] http://facultate.regielive.ro/cursuri/drept_banci_drept_comercial_finante/ contractul_de_leasing-107.html
[6] http://www.model-contracte.com/contract-de-leasing-2.html
[7] http://www.rent-a-car.com.ro/2011/04/06/consideratii-generale-despre-serviciul-rent-a-car/
Anexe
Anexa 1 – Model de contract Vânzare-Cumpărare pentru un vehicul folosit
Anexa 2 – Model contract închiriere auto
CONDITII CONTRACTUALE PENTRU INCHIRIERE AUTO
1. Livrarea și returnarea mașinii:
Autoturismul va fi inchiriat în bune conditii, fără defecte, iar orice plângere referitoare la starea sa va fi adusă la cunoștința firmei de închirieri în momentul închirierii.
Locatarul va returna autoturismul în starea tehnică în care l-a preluat, împreună cu documentele și toate echipamentele acestuia, la data și în locul stabilite în prezentul contract.
În cazul în care locatarul nu returnează autoturismul la cel mult trei ore după data și ora stabilite și nu anunță telefonic această întârziere, firma de închirieri are dreptul să anunțe furtul autoturismului la Poliție.
2. Condiții de utilizare a mașinii:
Locatarul se obligă să nu folosească autoturismul:
-fără a detine permis de conducere;
-în contradicție cu legile Romaniei și regulile de conducere;
-pentru a transporta pasageri sau bunuri contra-cost;
-pentru a tracta un alt autoturism sau orice altceva;
-dacă el sau orice alt pasager este sub influenta băuturilor alcoolice, a drogurilor sau a unui medicament care i-ar putea afecta viteza de reacție sau starea de constiență;
-în scopuri ilicite(ilegale) cum ar fi: contrabanda, hoție, tâlhării, transport ilegal de bunuri, pentru curse sau orice alt gen de concursuri;
-decât în concordanță cu instrucțiunile de folosire ale producătorului.
3. Plăți:
Locatarul va achita:
-contravaloarea inchirierii autoturismului se stabileste în functie de numarul de zile dorit și în functie de autoturismul ales;
-contravaloarea unei garantii în valoare de 100-500 euro în functie de autoturism;
-perioada minima de inchiriere este de 24 ore, prima ora dupa cele 24 este netaxabila, iar urmatoarele 3 se vor tarifa cu 5 euro pe ora. Dupa a patra ora se tarifeaza o zi;
-toate costurile legate de participarea la trafic(taxa parking, autostrada, amenzi, etc.);
-100 euro în cazul deteriorarii sau pierderii actelor mașinii;
-100 euro în cazul deteriorarii sau pierderii cheilor autoturismului;
-300 euro în cazul unui accident care survine din vina clientului, care să acopere o parte din pierderea firmei de inchirieri pe perioada cat automobilul este imobilizat în service;
-30 euro pentru fiecare capac de roata lipsa la predarea mașinii.
4. Asigurarea:
-Autoturismul este asigurat full CASCO;
-locatarul și insotitorii sai nu sunt asigurati;
-în cazul în care locatarul conduce autoturismul în una din conditiile stipulate la pct.2 al. 1,2,5,6,7 și aceasta duce la deteriorarea autoturismului, va fi obligat la plata tuturor reparatiilor;
-în cazul în care autoturismul nu este deteriorat la data returnarii, aflandu-se în aceeasi stare ca la predare, conform procesului verbal de predare-primire incheiat la data preluarii autoturismului, firma de închirieri va returna integral garantia depusa de locatar. În cazul în care autoturismul nu este returnat în starea în care a fost primit locatarul are urmatoarele obligatii: în caz de accident din cauza locatarului, se obligă să plăteasca 100 euro franciza impusă de asigurator în caz de orice daună inclusiv zgârieturi, furturi de oglinzi, antene, etc. și 15% din valoarea daunei care se constată la un service autorizat pentru a acoperi reîntregirea poliței CASCO după accident; în caz de daună totală locatarul se obligă să plătească diferența dintre suma platită de asigurator și valoarea integrală a autoturismului calculată de proprietar; în cazul în care locatarul nu este precaut și nu urmărește sistemele de avertizare ale autoturismului în cazul unor defecțiuni și se constată într-un service autorizat că se puteau evita prin oprirea autoturismului și anunțarea proprietarului, locatarul se obligă să efectueze toate reparațiile pe cheltuiala sa;
– firma de închirieri nu răspunde pentru distrugerea sau furtul bunurilor locatarului sau însoțitorilor acestuia aflate în autoturism.
5. Accident, avarii sau furt:
În cazul unui accident, avarii sau furt locatarul are urmatoarele obligații:
-să obțină numele și adresa celeilalte părți implicate;
-să nu abandoneze autoturismul fără a-l asigura împotriva furtului sau altor avarii;
-să aducă la cunoștinta firmei de închirieri orice avarie sau defecțiune oricât de mică ar fi;
-să obțină documentele constatatoare ale avariei, accidentului, etc. de la Politie impreună cu rezultatul alcoolemiei;
-anexa 2 de la Poliție pentru societatea de asigurări;
-autorizația de reparație emisă de Poliție;
-copie dupa actul de identitate și permisul de conducere al celeilalte parti implicate în accident;
-asigurarea RCA și copie dupa certificatul de inmatriculare al celuilalt autovehicul implicat în accident;
-în caz de furt, neprezentarea certificatului de inmatriculare și a cheii autoturismului este considerata complicitate la furt;
-în cazul furtului din partea clientului, proprietarul are dreptul să se foloseasca de orice mijloace legale pentru a-și recupera autoturismul sau contravaloarea acestuia și clientul, prin semnarea acestui contract, declara ca se afla în deplinatatea capacitatilor mentale și se obliga să raspunda în fata legii pentru aceasta.
6. Nulitatea:
Locatarul este de acord ca orice adnotare ori alterare a prezentelor conditii sunt nule pana nu vor fi recunoscute în scris de catre firma de închirieri.
7. Litigii:
Orice litigiu care reiese din prezentul contract și nu va putea fi soluționat pe cale amiabilă va fi solutionat de catre Judecatoria Arad.
Prezentul contract are titlu executoriu.
8. Persoana contractanta și valabilitatea contractului:
Nume……………………………..Adresa……………………..C.I……………………….
CNP………………………………Permis………………………Tel………………………
Numar zile……………din data de………………pana în……………………Arad………
Ora……………………Nr.Auto…………………..Nr.Kilometri………………………….
Avans plata………………….Garantie………………….Plata/zi………………………….
Reprezentant al SC………………………….. Reg.com…………………………………..
Cod fiscal………………………….Adresa……………………….Semnatura……………..
Anexa 3 – Model contract de leasing
”CONTRACT DE LEASING
Incheiat astazi ………………
la ………………………………..
I. PARTILE CONTRACTANTE
1.1. S.C. ……………………………………………………………………………….. S.N.C./S.C.S./S.A./S.R.L., cu sediul social in (localitatea) ……………………., str. ………………………………. nr. ……………………., bloc …………., scara ……….., etaj …….., apartament ……., judet/sector ……………………………, inregistrata la Oficiul Registrului Comertului ……………………………., sub nr. ………………….. din ……………………………, cod fiscal nr. ……………………………… din ………………….., avand contul nr. …………………………….., deschis la ………………………………., existand si functionand potrivit legislatiei statului …………………………., reprezentata de …………………………., cu functia de …………………………, cetatean …………………………….., posesor act de identitate/pasaport ………………, in calitate de locator/finantator, pe de o parte, si
1.2. S.C. ……………………………………………………………………………….. S.N.C./S.C.S./S.A./S.R.L., cu sediul social in (localitatea) ……………………., str. ……………………………………… nr. …………….., bloc …………., scara ……….., etaj …….., apartament ……., judet/sector …………………………………, inregistrata la Oficiul Registrului Comertului …………………………., sub nr. ……………….. din ………………….., cod fiscal nr. ……………………. din ………………., avand contul nr. …………………., deschis la …………………………………………, existand si functionand potrivit legislatiei statului ………………………, reprezentata de ……………………………., cu functia de ………………………………………….., cetatean ………………………………., posesor act de identitate/pasaport ………………, in calitate de utilizator, pe de alta parte,
sau
1.2. Asociatia/Fundatia ……………………………………………………………………………………………….., cu sediul in (localitatea) ……………………………………………., str. ………………………… nr. ………….., bloc ………, scara …….., etaj …….., apartament …….., sector/judet ………………………………………., inregistrata in registrul persoanelor juridice prin Sentinta civila nr. ……………………………………….. din ………………………………….., a Tribunalului …………………., codul fiscal nr. ………………………….. din …………………………, avand contul nr. ……………………… deschis la ………………………………….., reprezentata de ………………………………………, cu functia de ……………………………………………….., in calitate de utilizator, pe de alta parte,
sau
1.2. Intreprinderea/Asociatia …………………………………………………………………………………….., cu sediul in (localitatea) ……………………………………, str. …………………………………….. nr. ……….., bloc ……, scara ….., etaj ……, apartament ……….., sector/judet …………………………, posesoarea autorizatiei nr. ………….. din ………………, eliberata de Primaria …………………………., codul fiscal nr. …………………………. din ……………………….., avand contul nr. …………………………. deschis la …………………………………………., reprezentata de ……………………………………………….., cu functia de …………………………………, in calitate de utilizator, pe de alta parte,
sau
1.2. D ……………………………………………………, domiciliat in …………………………………………….., str. ……………………………, nr. ………….., bloc ………., scara ………., etaj ………., apartament …….., sector/judet …………………, nascut la data de (ziua, luna, anul) …………………………………………….. in (localitatea) ……………………………………. sector/judet ……………………….., fiul lui …………………… si al ………………………, posesorul buletinului (cartii) de identitate seria ………. nr. ………………….., liberat de …………………….., cod numeric personal ………………………….., in calitate de utilizator, pe de alta parte, au convenit sa incheie prezentul contract de leasing, cu respectarea urmatoarelor clauze:
II. OBIECTUL CONTRACTULUI
2.1. Locatorul/finantatorul, la solicitarea utilizatorului, se obliga sa predea bunurile mobile/imobile prevazute in anexa, care face parte integranta din prezentul contract si sa transmita utilizatorului folosinta lor. 1)
2.2. Predarea-primirea bunurilor se va face pe baza de proces-verbal, pana la data de …………………., in caz contrar locatorul fiind obligat la plata unei penalizari de …..% pe zi de intarziere din valoarea redeventei.
2.3. Cheltuielile legate de predarea-primirea bunurilor care fac obiectul prezentului contract vor fi suportate de ………………………. .
2.4. Locatorul are dreptul sa verifice, la intervale de ………, starea bunurilor si modul de exploatare a lor, iar daca utilizatorul nu si-a indeplinit obligatiile contractuale, poate sa rezilieze, inainte de termen, contractul.
III. DURATA CONTRACTULUI2)
3.1. Contractul se incheie pe o durata de ……………………., incepand de la data de ……………… si pana la data de ……………………….. .
IV. PRETUL CONTRACTULUI
4.1. Utilizatorul va plati locatorului, incepand cu data transmiterii folosintei bunurilor care fac obiectul prezentului contract, o redeventa in valoare de ………………. lei in rate lunare astfel: …………………………………………………………………………………………………………………………….. ……………………………………………………………………………………………………………………………. .
4.2. Evolutia ratei inflatiei care se inregistreaza ulterior incheierii prezentului contract, determina indexarea redeventei.
4.3. Neplata redeventei la termenele si in conditiile prevazute la pct. 4.1 si 4.2 atrage penalizari de …………… % pe zi de intarziere, calculate la valoarea redeventei restante.
4.4. In cazul in care, la expirarea prezentului contract, utilizatorul isi exprima intentia de a cumpara bunul, locatorul trebuie sa ia in calcul varsamintele efectuate anterior cu titlu de redeventa, precum si valoarea reziduala a bunului.
4.5. Dreptul de optiune constand din cumpararea bunului se poate exercita pana la expirarea prezentului contract, cu acceptul locatorului, numai daca utilizatorul va formula o oferta de cumparare ferma si irevocabila.
V. GARANTII
5.1. Locatorul garantează pe utilizator pentru evictiune din partea oricarei persoane fizice sau juridice care ar pretinde un drept de proprietate sau un alt drept real asupra bunurilor care fac obiectul prezentului contract.
5.2. Locatorul va acorda asistenta tehnica utilizatorului pe toata durata pentru care s-a incheiat prezentul contract.
VI. OBLIGATIILE PARTILOR
6.1. Locatorul/finantatorul se obliga:
sa respecte dreptul utilizatorului de a alege furnizorul, potrivit necesitatilor;
sa incheie contract de vanzare-cumparare cu furnizorul desemnat de utilizator, in conditiile expres formulate de catre acesta;
sa transmita utilizatorului, in temeiul prezentului contract, toate drepturile care deriva din contractul de vanzare-cumparare, cu exceptia dreptului de dispozitie;
sa respecte dreptul de optiune al utilizatorului, care consta in posibilitatea de a opta pentru prelungirea contractului sau pentru achizitionarea sau restituirea bunului;
sa-i garanteze utilizatorului folosinta linistita a bunului, in conditiile in care acesta a respectat toate clauzele contractuale;
sa asigure, printr-o societate de asigurare, bunurile oferite in leasing.
6.2. Utilizatorul se obliga:
sa efectueze receptia si sa primeasca bunul la termenul prevazut in prezentul contract;
sa exploateze bunul conform instructiunilor elaborate de furnizor si sa asigure instruirea personalului desemnat sa-l exploateze;
sa nu greveze de sarcini bunul care face obiectul prezentului contract fara acordul locatorului;
sa efectueze platile cu titlu de rata de leasing, in cuantumul valoric stabilit si la termenele prevazute in prezentul contract;
sa suporte cheltuielile de intretinere si alte cheltuieli care decurg din contractul de leasing;
sa-si asume, pentru intreaga perioada a contractului3), totalitatea obligatiilor care decurg din folosirea bunului direct sau prin prepusii sai, inclusiv riscul pierderii, distrugerii sau avarierii bunului utilizat, din cauze fortuite, si continuitatea platilor cu titlu de rata de leasing, pana la achitarea integrala a pretului prezentului contract;
sa permita locatorului verificarea periodica a starii si a modului de exploatare a bunului care face obiectul contractului de leasing;
sa il informeze pe locator, in timp util, despre orice tulburare a dreptului de proprietate, venita din partea unui tert;
sa nu aduca modificari bunurilor fara acordul locatorului;
sa restituie bunul in conformitate cu prevederile prezentului contract.
VII. RASPUNDERI
7.1. In cazul in care utilizatorul refuza sa primeasca bunul la termenul stipulat in prezentul contract sau daca se afla in stare de reorganizare judiciara si/sau faliment, locatorul are dreptul de a-l rezilia, unilateral, cu daune-interese.
7.2. Daca utilizatorul nu-si exercita obligatia de plata a ratei de leasing timp de doua luni consecutive, locatorul are dreptul de a rezilia prezentul contract, iar utilizatorul este obligat sa restituie bunul, sa plateasca ratele scadente, cu daune-interese. 4)
7.3. In situatia in care locatorul nu respecta dreptul de optiune al utilizatorului, el datoreaza daune-interese, in cuantum egal cu valoarea reziduala a bunului sau cu valoarea sa de circulatie calculata la data expirarii contractului.
7.4. In cazul in care, in timpul executarii prezentului contract, locatorul vinde bunul care face obiectul contractului unui alt locator/finantator, noul finantator este legat de aceleasi obligatii contractuale ca si vanzatorul, care ramane garant al indeplinirii obligatiilor fata de utilizator.
7.5. Din momentul incheierii prezentului contract si pana la incetarea lui si reintrarea in posesia bunului, locatorul/finantatorul este exonerat de orice raspundere fata de terti pentru prejudiciile provocate prin folosinta bunului de catre utilizator.
VIII. FORTA MAJORA
8.1. Nici una dintre partile contractante nu raspunde de neexecutarea la termen sau/si de executarea in mod necorespunzator – total sau partial – a oricarei obligatii care ii revine in baza prezentului contract, daca neexecutarea sau executarea necorespunzatoare a obligatiei respective a fost cauzata de forta majora, asa cum este definita de lege.
8.2. Partea care invoca forta majora este obligata sa notifice celeilalte parti, in termen de ……………. (zile, ore), producerea evenimentului si sa ia toate masurile posibile in vederea limitarii consecintelor lui.
8.3. Daca in termen de ……………… (zile, ore) de la producere, evenimentul respectiv nu inceteaza, partile au dreptul sa-si notifice incetarea de plin drept a prezentului contract fara ca vreuna dintre ele sa pretinda daune-interese.
IX. NOTIFICARI
9.1. In acceptiunea partilor contractante, orice notificare adresata de una dintre acestea celeilalte este valabil indeplinita daca va fi transmisa la adresa/sediul prevazut in partea introductiva a prezentului contract.
9.2. In cazul in care notificarea se face pe cale postala, ea va fi transmisa, prin scrisoare recomandata, cu confirmare de primire (A.R.) si se considera primita de destinatar la data mentionata de oficiul postal primitor pe aceasta confirmare.
9.3. Daca notificarea se trimite prin telex sau telefax, ea se considera primita in prima zi lucratoare dupa cea in care a fost expediata.
9.4. Notificarile verbale nu se iau in considerare de nici una dintre parti, daca nu sunt confirmate, prin intermediul uneia dintre modalitatile prevazute la alineatele precedente.
X. LITIGII
10.1. Partile au convenit ca toate neintelegerile privind validitatea prezentului contract sau rezultate din interpretarea, executarea ori incetarea acestuia sa fie rezolvate pe cale amiabila de reprezentantii lor.
10.2. In cazul in care rezolvarea neintelegerilor nu este posibila pe cale amiabila, ele vor fi supuse spre solutionare tribunalului arbitral, conform regulilor de procedura aplicabile arbitrajului comercial ad-hoc, organizat de Camera de Comert si Industrie a Romaniei.
XI. CLAUZE FINALE
11.1. Modificarea prezentului contract se face numai prin act aditional incheiat intre partile contractante.
11.2. Prezentul contract, impreuna cu anexele sale care fac parte integranta din cuprinsul sau, reprezinta vointa partilor si inlatura orice alta intelegere verbala dintre acestea, anterioara sau ulterioara incheierii lui.
11.3. In cazul in care partile isi incalca obligatiile lor, neexercitarea de partea care sufera vreun prejudiciu a dreptului de a cere executarea intocmai sau prin echivalent banesc a obligatiei respective nu inseamna ca ea a renuntat la acest drept al sau.
11.4. Prezentul contract a fost incheiat intr-un numar de …………… exemplare din care …………………… astazi ……………………., data semnarii lui.
LOCATOR/FINANTATOR
UTILIZATOR
NOTE:
In cuprinsul contractului sau in anexa, dupa caz, se vor inscrie date privind: denumirea, descrierea tehnica si calitatile bunurilor; scopul si destinatia lor; valoarea bunurilor.
Contractul de leasing nu se poate incheia pe un termen mai mic de un an.
In lipsa unei stipulatii contrare.
Daca partile nu convin altfel.
Anexa 4 – Documente necesare prentru întocmirea unui contract de leasing
PERSOANE JURIDICE:
formular de leasing completat (cererea de finanțare);
acord CRB (3 exemplare);
acord de eliberare secret bancar;
factură proforma de la furnizor sau specificație tehnică a autovehiculului;
act de identitate (copie) cu specimen de semnătură;
cod unic de înregistrare (copie);
ultimele 3 bilanțuri (raportul semestrial pe anul în curs) inclusiv Anexele și balanțele aferente + ultima balanță pe anul în curs;
act constitutiv companie (statutul firmei);
specimen de semnatura de la banca pentru persoanele imputernicite sa opereze pe conturile firmei.
PERSOANE FIZICE:
formular de leasing completat (cererea de finanțare);
acord CRB (3 exemplare);
acord de eliberare secret bancar;
factură proforma de la furnizor sau specificație tehnică a autovehiculului;
act de identitate soț/soție (copie) cu specimen de semnătură;
adeverință în original de la angajator soț/soție (cu specificarea funcției, vechimii și a venitului lunar net);
carte de muncă soț/soție (copie);
certificat de căsătorie (copie);
actul de proprietate al locuinței sau contract de închiriere (copie).
PERSOANE FIZICE AUTORIZATE:
formular de leasing completat (cererea de finanțare);
acord CRB (3 exemplare);
acord de eliberare secret bancar;
factură proforma de la furnizor sau specificație tehnică a autovehiculului;
declarația de venit definitivă pe ultimii doi ani și declarația de venit estimativă pe anul în curs;
acte juridice de constituire și autorizare a profesiei (copie);
cod fiscal sau certificate de înregistrare fiscală, dacă există (copie);
actul de identitate (copie) cu specimen de semnătură;
act de proprietate sau închiriere spațiu (copie). ”
Bibliografie
[1] Eckel B., Thinking in Java, Third Edition, Ed. Prentice Hall, 2002
[2] Tanasă S., Olaru C., Andrei Ș., Java de la 0 la expert, Ed.Polirom, 2007
[3] http://thor.info.uaic.ro/~acf/java/Cristian_Frasinaru-Curs_practic_de_Java.pdf
[4] http://facultate.regielive.ro/cursuri/drept_banci_drept_comercial_finante/ contractul_de_leasing-107.html
[6] http://www.model-contracte.com/contract-de-leasing-2.html
[7] http://www.rent-a-car.com.ro/2011/04/06/consideratii-generale-despre-serviciul-rent-a-car/
Anexe
Anexa 1 – Model de contract Vânzare-Cumpărare pentru un vehicul folosit
Anexa 2 – Model contract închiriere auto
CONDITII CONTRACTUALE PENTRU INCHIRIERE AUTO
1. Livrarea și returnarea mașinii:
Autoturismul va fi inchiriat în bune conditii, fără defecte, iar orice plângere referitoare la starea sa va fi adusă la cunoștința firmei de închirieri în momentul închirierii.
Locatarul va returna autoturismul în starea tehnică în care l-a preluat, împreună cu documentele și toate echipamentele acestuia, la data și în locul stabilite în prezentul contract.
În cazul în care locatarul nu returnează autoturismul la cel mult trei ore după data și ora stabilite și nu anunță telefonic această întârziere, firma de închirieri are dreptul să anunțe furtul autoturismului la Poliție.
2. Condiții de utilizare a mașinii:
Locatarul se obligă să nu folosească autoturismul:
-fără a detine permis de conducere;
-în contradicție cu legile Romaniei și regulile de conducere;
-pentru a transporta pasageri sau bunuri contra-cost;
-pentru a tracta un alt autoturism sau orice altceva;
-dacă el sau orice alt pasager este sub influenta băuturilor alcoolice, a drogurilor sau a unui medicament care i-ar putea afecta viteza de reacție sau starea de constiență;
-în scopuri ilicite(ilegale) cum ar fi: contrabanda, hoție, tâlhării, transport ilegal de bunuri, pentru curse sau orice alt gen de concursuri;
-decât în concordanță cu instrucțiunile de folosire ale producătorului.
3. Plăți:
Locatarul va achita:
-contravaloarea inchirierii autoturismului se stabileste în functie de numarul de zile dorit și în functie de autoturismul ales;
-contravaloarea unei garantii în valoare de 100-500 euro în functie de autoturism;
-perioada minima de inchiriere este de 24 ore, prima ora dupa cele 24 este netaxabila, iar urmatoarele 3 se vor tarifa cu 5 euro pe ora. Dupa a patra ora se tarifeaza o zi;
-toate costurile legate de participarea la trafic(taxa parking, autostrada, amenzi, etc.);
-100 euro în cazul deteriorarii sau pierderii actelor mașinii;
-100 euro în cazul deteriorarii sau pierderii cheilor autoturismului;
-300 euro în cazul unui accident care survine din vina clientului, care să acopere o parte din pierderea firmei de inchirieri pe perioada cat automobilul este imobilizat în service;
-30 euro pentru fiecare capac de roata lipsa la predarea mașinii.
4. Asigurarea:
-Autoturismul este asigurat full CASCO;
-locatarul și insotitorii sai nu sunt asigurati;
-în cazul în care locatarul conduce autoturismul în una din conditiile stipulate la pct.2 al. 1,2,5,6,7 și aceasta duce la deteriorarea autoturismului, va fi obligat la plata tuturor reparatiilor;
-în cazul în care autoturismul nu este deteriorat la data returnarii, aflandu-se în aceeasi stare ca la predare, conform procesului verbal de predare-primire incheiat la data preluarii autoturismului, firma de închirieri va returna integral garantia depusa de locatar. În cazul în care autoturismul nu este returnat în starea în care a fost primit locatarul are urmatoarele obligatii: în caz de accident din cauza locatarului, se obligă să plăteasca 100 euro franciza impusă de asigurator în caz de orice daună inclusiv zgârieturi, furturi de oglinzi, antene, etc. și 15% din valoarea daunei care se constată la un service autorizat pentru a acoperi reîntregirea poliței CASCO după accident; în caz de daună totală locatarul se obligă să plătească diferența dintre suma platită de asigurator și valoarea integrală a autoturismului calculată de proprietar; în cazul în care locatarul nu este precaut și nu urmărește sistemele de avertizare ale autoturismului în cazul unor defecțiuni și se constată într-un service autorizat că se puteau evita prin oprirea autoturismului și anunțarea proprietarului, locatarul se obligă să efectueze toate reparațiile pe cheltuiala sa;
– firma de închirieri nu răspunde pentru distrugerea sau furtul bunurilor locatarului sau însoțitorilor acestuia aflate în autoturism.
5. Accident, avarii sau furt:
În cazul unui accident, avarii sau furt locatarul are urmatoarele obligații:
-să obțină numele și adresa celeilalte părți implicate;
-să nu abandoneze autoturismul fără a-l asigura împotriva furtului sau altor avarii;
-să aducă la cunoștinta firmei de închirieri orice avarie sau defecțiune oricât de mică ar fi;
-să obțină documentele constatatoare ale avariei, accidentului, etc. de la Politie impreună cu rezultatul alcoolemiei;
-anexa 2 de la Poliție pentru societatea de asigurări;
-autorizația de reparație emisă de Poliție;
-copie dupa actul de identitate și permisul de conducere al celeilalte parti implicate în accident;
-asigurarea RCA și copie dupa certificatul de inmatriculare al celuilalt autovehicul implicat în accident;
-în caz de furt, neprezentarea certificatului de inmatriculare și a cheii autoturismului este considerata complicitate la furt;
-în cazul furtului din partea clientului, proprietarul are dreptul să se foloseasca de orice mijloace legale pentru a-și recupera autoturismul sau contravaloarea acestuia și clientul, prin semnarea acestui contract, declara ca se afla în deplinatatea capacitatilor mentale și se obliga să raspunda în fata legii pentru aceasta.
6. Nulitatea:
Locatarul este de acord ca orice adnotare ori alterare a prezentelor conditii sunt nule pana nu vor fi recunoscute în scris de catre firma de închirieri.
7. Litigii:
Orice litigiu care reiese din prezentul contract și nu va putea fi soluționat pe cale amiabilă va fi solutionat de catre Judecatoria Arad.
Prezentul contract are titlu executoriu.
8. Persoana contractanta și valabilitatea contractului:
Nume……………………………..Adresa……………………..C.I……………………….
CNP………………………………Permis………………………Tel………………………
Numar zile……………din data de………………pana în……………………Arad………
Ora……………………Nr.Auto…………………..Nr.Kilometri………………………….
Avans plata………………….Garantie………………….Plata/zi………………………….
Reprezentant al SC………………………….. Reg.com…………………………………..
Cod fiscal………………………….Adresa……………………….Semnatura……………..
Anexa 3 – Model contract de leasing
”CONTRACT DE LEASING
Incheiat astazi ………………
la ………………………………..
I. PARTILE CONTRACTANTE
1.1. S.C. ……………………………………………………………………………….. S.N.C./S.C.S./S.A./S.R.L., cu sediul social in (localitatea) ……………………., str. ………………………………. nr. ……………………., bloc …………., scara ……….., etaj …….., apartament ……., judet/sector ……………………………, inregistrata la Oficiul Registrului Comertului ……………………………., sub nr. ………………….. din ……………………………, cod fiscal nr. ……………………………… din ………………….., avand contul nr. …………………………….., deschis la ………………………………., existand si functionand potrivit legislatiei statului …………………………., reprezentata de …………………………., cu functia de …………………………, cetatean …………………………….., posesor act de identitate/pasaport ………………, in calitate de locator/finantator, pe de o parte, si
1.2. S.C. ……………………………………………………………………………….. S.N.C./S.C.S./S.A./S.R.L., cu sediul social in (localitatea) ……………………., str. ……………………………………… nr. …………….., bloc …………., scara ……….., etaj …….., apartament ……., judet/sector …………………………………, inregistrata la Oficiul Registrului Comertului …………………………., sub nr. ……………….. din ………………….., cod fiscal nr. ……………………. din ………………., avand contul nr. …………………., deschis la …………………………………………, existand si functionand potrivit legislatiei statului ………………………, reprezentata de ……………………………., cu functia de ………………………………………….., cetatean ………………………………., posesor act de identitate/pasaport ………………, in calitate de utilizator, pe de alta parte,
sau
1.2. Asociatia/Fundatia ……………………………………………………………………………………………….., cu sediul in (localitatea) ……………………………………………., str. ………………………… nr. ………….., bloc ………, scara …….., etaj …….., apartament …….., sector/judet ………………………………………., inregistrata in registrul persoanelor juridice prin Sentinta civila nr. ……………………………………….. din ………………………………….., a Tribunalului …………………., codul fiscal nr. ………………………….. din …………………………, avand contul nr. ……………………… deschis la ………………………………….., reprezentata de ………………………………………, cu functia de ……………………………………………….., in calitate de utilizator, pe de alta parte,
sau
1.2. Intreprinderea/Asociatia …………………………………………………………………………………….., cu sediul in (localitatea) ……………………………………, str. …………………………………….. nr. ……….., bloc ……, scara ….., etaj ……, apartament ……….., sector/judet …………………………, posesoarea autorizatiei nr. ………….. din ………………, eliberata de Primaria …………………………., codul fiscal nr. …………………………. din ……………………….., avand contul nr. …………………………. deschis la …………………………………………., reprezentata de ……………………………………………….., cu functia de …………………………………, in calitate de utilizator, pe de alta parte,
sau
1.2. D ……………………………………………………, domiciliat in …………………………………………….., str. ……………………………, nr. ………….., bloc ………., scara ………., etaj ………., apartament …….., sector/judet …………………, nascut la data de (ziua, luna, anul) …………………………………………….. in (localitatea) ……………………………………. sector/judet ……………………….., fiul lui …………………… si al ………………………, posesorul buletinului (cartii) de identitate seria ………. nr. ………………….., liberat de …………………….., cod numeric personal ………………………….., in calitate de utilizator, pe de alta parte, au convenit sa incheie prezentul contract de leasing, cu respectarea urmatoarelor clauze:
II. OBIECTUL CONTRACTULUI
2.1. Locatorul/finantatorul, la solicitarea utilizatorului, se obliga sa predea bunurile mobile/imobile prevazute in anexa, care face parte integranta din prezentul contract si sa transmita utilizatorului folosinta lor. 1)
2.2. Predarea-primirea bunurilor se va face pe baza de proces-verbal, pana la data de …………………., in caz contrar locatorul fiind obligat la plata unei penalizari de …..% pe zi de intarziere din valoarea redeventei.
2.3. Cheltuielile legate de predarea-primirea bunurilor care fac obiectul prezentului contract vor fi suportate de ………………………. .
2.4. Locatorul are dreptul sa verifice, la intervale de ………, starea bunurilor si modul de exploatare a lor, iar daca utilizatorul nu si-a indeplinit obligatiile contractuale, poate sa rezilieze, inainte de termen, contractul.
III. DURATA CONTRACTULUI2)
3.1. Contractul se incheie pe o durata de ……………………., incepand de la data de ……………… si pana la data de ……………………….. .
IV. PRETUL CONTRACTULUI
4.1. Utilizatorul va plati locatorului, incepand cu data transmiterii folosintei bunurilor care fac obiectul prezentului contract, o redeventa in valoare de ………………. lei in rate lunare astfel: …………………………………………………………………………………………………………………………….. ……………………………………………………………………………………………………………………………. .
4.2. Evolutia ratei inflatiei care se inregistreaza ulterior incheierii prezentului contract, determina indexarea redeventei.
4.3. Neplata redeventei la termenele si in conditiile prevazute la pct. 4.1 si 4.2 atrage penalizari de …………… % pe zi de intarziere, calculate la valoarea redeventei restante.
4.4. In cazul in care, la expirarea prezentului contract, utilizatorul isi exprima intentia de a cumpara bunul, locatorul trebuie sa ia in calcul varsamintele efectuate anterior cu titlu de redeventa, precum si valoarea reziduala a bunului.
4.5. Dreptul de optiune constand din cumpararea bunului se poate exercita pana la expirarea prezentului contract, cu acceptul locatorului, numai daca utilizatorul va formula o oferta de cumparare ferma si irevocabila.
V. GARANTII
5.1. Locatorul garantează pe utilizator pentru evictiune din partea oricarei persoane fizice sau juridice care ar pretinde un drept de proprietate sau un alt drept real asupra bunurilor care fac obiectul prezentului contract.
5.2. Locatorul va acorda asistenta tehnica utilizatorului pe toata durata pentru care s-a incheiat prezentul contract.
VI. OBLIGATIILE PARTILOR
6.1. Locatorul/finantatorul se obliga:
sa respecte dreptul utilizatorului de a alege furnizorul, potrivit necesitatilor;
sa incheie contract de vanzare-cumparare cu furnizorul desemnat de utilizator, in conditiile expres formulate de catre acesta;
sa transmita utilizatorului, in temeiul prezentului contract, toate drepturile care deriva din contractul de vanzare-cumparare, cu exceptia dreptului de dispozitie;
sa respecte dreptul de optiune al utilizatorului, care consta in posibilitatea de a opta pentru prelungirea contractului sau pentru achizitionarea sau restituirea bunului;
sa-i garanteze utilizatorului folosinta linistita a bunului, in conditiile in care acesta a respectat toate clauzele contractuale;
sa asigure, printr-o societate de asigurare, bunurile oferite in leasing.
6.2. Utilizatorul se obliga:
sa efectueze receptia si sa primeasca bunul la termenul prevazut in prezentul contract;
sa exploateze bunul conform instructiunilor elaborate de furnizor si sa asigure instruirea personalului desemnat sa-l exploateze;
sa nu greveze de sarcini bunul care face obiectul prezentului contract fara acordul locatorului;
sa efectueze platile cu titlu de rata de leasing, in cuantumul valoric stabilit si la termenele prevazute in prezentul contract;
sa suporte cheltuielile de intretinere si alte cheltuieli care decurg din contractul de leasing;
sa-si asume, pentru intreaga perioada a contractului3), totalitatea obligatiilor care decurg din folosirea bunului direct sau prin prepusii sai, inclusiv riscul pierderii, distrugerii sau avarierii bunului utilizat, din cauze fortuite, si continuitatea platilor cu titlu de rata de leasing, pana la achitarea integrala a pretului prezentului contract;
sa permita locatorului verificarea periodica a starii si a modului de exploatare a bunului care face obiectul contractului de leasing;
sa il informeze pe locator, in timp util, despre orice tulburare a dreptului de proprietate, venita din partea unui tert;
sa nu aduca modificari bunurilor fara acordul locatorului;
sa restituie bunul in conformitate cu prevederile prezentului contract.
VII. RASPUNDERI
7.1. In cazul in care utilizatorul refuza sa primeasca bunul la termenul stipulat in prezentul contract sau daca se afla in stare de reorganizare judiciara si/sau faliment, locatorul are dreptul de a-l rezilia, unilateral, cu daune-interese.
7.2. Daca utilizatorul nu-si exercita obligatia de plata a ratei de leasing timp de doua luni consecutive, locatorul are dreptul de a rezilia prezentul contract, iar utilizatorul este obligat sa restituie bunul, sa plateasca ratele scadente, cu daune-interese. 4)
7.3. In situatia in care locatorul nu respecta dreptul de optiune al utilizatorului, el datoreaza daune-interese, in cuantum egal cu valoarea reziduala a bunului sau cu valoarea sa de circulatie calculata la data expirarii contractului.
7.4. In cazul in care, in timpul executarii prezentului contract, locatorul vinde bunul care face obiectul contractului unui alt locator/finantator, noul finantator este legat de aceleasi obligatii contractuale ca si vanzatorul, care ramane garant al indeplinirii obligatiilor fata de utilizator.
7.5. Din momentul incheierii prezentului contract si pana la incetarea lui si reintrarea in posesia bunului, locatorul/finantatorul este exonerat de orice raspundere fata de terti pentru prejudiciile provocate prin folosinta bunului de catre utilizator.
VIII. FORTA MAJORA
8.1. Nici una dintre partile contractante nu raspunde de neexecutarea la termen sau/si de executarea in mod necorespunzator – total sau partial – a oricarei obligatii care ii revine in baza prezentului contract, daca neexecutarea sau executarea necorespunzatoare a obligatiei respective a fost cauzata de forta majora, asa cum este definita de lege.
8.2. Partea care invoca forta majora este obligata sa notifice celeilalte parti, in termen de ……………. (zile, ore), producerea evenimentului si sa ia toate masurile posibile in vederea limitarii consecintelor lui.
8.3. Daca in termen de ……………… (zile, ore) de la producere, evenimentul respectiv nu inceteaza, partile au dreptul sa-si notifice incetarea de plin drept a prezentului contract fara ca vreuna dintre ele sa pretinda daune-interese.
IX. NOTIFICARI
9.1. In acceptiunea partilor contractante, orice notificare adresata de una dintre acestea celeilalte este valabil indeplinita daca va fi transmisa la adresa/sediul prevazut in partea introductiva a prezentului contract.
9.2. In cazul in care notificarea se face pe cale postala, ea va fi transmisa, prin scrisoare recomandata, cu confirmare de primire (A.R.) si se considera primita de destinatar la data mentionata de oficiul postal primitor pe aceasta confirmare.
9.3. Daca notificarea se trimite prin telex sau telefax, ea se considera primita in prima zi lucratoare dupa cea in care a fost expediata.
9.4. Notificarile verbale nu se iau in considerare de nici una dintre parti, daca nu sunt confirmate, prin intermediul uneia dintre modalitatile prevazute la alineatele precedente.
X. LITIGII
10.1. Partile au convenit ca toate neintelegerile privind validitatea prezentului contract sau rezultate din interpretarea, executarea ori incetarea acestuia sa fie rezolvate pe cale amiabila de reprezentantii lor.
10.2. In cazul in care rezolvarea neintelegerilor nu este posibila pe cale amiabila, ele vor fi supuse spre solutionare tribunalului arbitral, conform regulilor de procedura aplicabile arbitrajului comercial ad-hoc, organizat de Camera de Comert si Industrie a Romaniei.
XI. CLAUZE FINALE
11.1. Modificarea prezentului contract se face numai prin act aditional incheiat intre partile contractante.
11.2. Prezentul contract, impreuna cu anexele sale care fac parte integranta din cuprinsul sau, reprezinta vointa partilor si inlatura orice alta intelegere verbala dintre acestea, anterioara sau ulterioara incheierii lui.
11.3. In cazul in care partile isi incalca obligatiile lor, neexercitarea de partea care sufera vreun prejudiciu a dreptului de a cere executarea intocmai sau prin echivalent banesc a obligatiei respective nu inseamna ca ea a renuntat la acest drept al sau.
11.4. Prezentul contract a fost incheiat intr-un numar de …………… exemplare din care …………………… astazi ……………………., data semnarii lui.
LOCATOR/FINANTATOR
UTILIZATOR
NOTE:
In cuprinsul contractului sau in anexa, dupa caz, se vor inscrie date privind: denumirea, descrierea tehnica si calitatile bunurilor; scopul si destinatia lor; valoarea bunurilor.
Contractul de leasing nu se poate incheia pe un termen mai mic de un an.
In lipsa unei stipulatii contrare.
Daca partile nu convin altfel.
Anexa 4 – Documente necesare prentru întocmirea unui contract de leasing
PERSOANE JURIDICE:
formular de leasing completat (cererea de finanțare);
acord CRB (3 exemplare);
acord de eliberare secret bancar;
factură proforma de la furnizor sau specificație tehnică a autovehiculului;
act de identitate (copie) cu specimen de semnătură;
cod unic de înregistrare (copie);
ultimele 3 bilanțuri (raportul semestrial pe anul în curs) inclusiv Anexele și balanțele aferente + ultima balanță pe anul în curs;
act constitutiv companie (statutul firmei);
specimen de semnatura de la banca pentru persoanele imputernicite sa opereze pe conturile firmei.
PERSOANE FIZICE:
formular de leasing completat (cererea de finanțare);
acord CRB (3 exemplare);
acord de eliberare secret bancar;
factură proforma de la furnizor sau specificație tehnică a autovehiculului;
act de identitate soț/soție (copie) cu specimen de semnătură;
adeverință în original de la angajator soț/soție (cu specificarea funcției, vechimii și a venitului lunar net);
carte de muncă soț/soție (copie);
certificat de căsătorie (copie);
actul de proprietate al locuinței sau contract de închiriere (copie).
PERSOANE FIZICE AUTORIZATE:
formular de leasing completat (cererea de finanțare);
acord CRB (3 exemplare);
acord de eliberare secret bancar;
factură proforma de la furnizor sau specificație tehnică a autovehiculului;
declarația de venit definitivă pe ultimii doi ani și declarația de venit estimativă pe anul în curs;
acte juridice de constituire și autorizare a profesiei (copie);
cod fiscal sau certificate de înregistrare fiscală, dacă există (copie);
actul de identitate (copie) cu specimen de semnătură;
act de proprietate sau închiriere spațiu (copie). ”
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: Piata de Automobile (ID: 144176)
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.
