FACULTAD DE CIENCIAS MATEMÁTICAS Y FÍSICAS CARRERA DE...

Post on 22-Jun-2018

218 views 0 download

Transcript of FACULTAD DE CIENCIAS MATEMÁTICAS Y FÍSICAS CARRERA DE...

UNIVERSIDAD DE GUAYAQUIL

FACULTAD DE CIENCIAS MATEMÁTICAS Y FÍSICAS

CARRERA DE INGENIERÍA EN SISTEMAS

COMPUTACIONALES

DELITOS RELATIVOS A LAS TARJETAS DE CRÉDITO,

ALTERNATIVA TECNOLÓGICA DE PAGO.

PROPUESTA LA COMUNICACIÓN NFC

MANUAL TÉCNICO

AUTOR: ROBERTO DAVID RAMIREZ VELIZ

TUTOR: ING. JUAN SANCHEZ

GUAYAQUIL – ECUADOR

2013

2

ÍNDICE GENERAL

DIAGRAMA DE PROCESOS DE PAGO NFC........................................................ 4

DETALLE DE LOS PROCESO NFC ....................................................................... 6

DIAGRAMA DE CASO DE USO ............................................................................ 7

CÓDIGO FUENTE DE LA APLICACIÓN DE LA TARJETA DE CRÉDITO ......... 8

NOMBRE DEL PROYECTO : TESIS ...................................................................... 8

PAQUETE ANDROID.COM.LIBRARY .............................................................. 8

CLASE DATABASE.JAVA ............................................................................. 8

CLASE FUNCIONES.JAVA .......................................................................... 10

CLASE HTTP.JAVA ...................................................................................... 11

CLASE HTTPPOSTAUX.JAVA .................................................................... 12

CLASE PARAMETROS.JAVA ...................................................................... 14

PAQUETE ANDROID.COM.TESIS .................................................................. 16

CLASE ACTIVIDAD_ACERCA.JAVA ......................................................... 16

CLASE CONTRASENIA.JAVA .................................................................... 16

CLASE DATABASE_HELPER.JAVA ........................................................... 19

CLASE EDITAR_TARJETA.JAVA ............................................................... 19

CLASE GALERIA_TARJETA.JAVA ............................................................ 24

CLASE INGRESAR.JAVA ............................................................................ 28

CLASE LECTURA.JAVA .............................................................................. 32

CLASE LOGIN.JAVA .................................................................................... 33

CLASE MAIN.JAVA .................................................................................... 36

CLASE REGISTRO.JAVA ............................................................................ 37

CLASE TARJETA.JAVA .............................................................................. 40

ARCHIVOS XML .............................................................................................. 42

ANDROID MANIFEST.XML ........................................................................ 42

ACERCA.XML .............................................................................................. 43

CONTRASENIA.XML ................................................................................... 44

3

EDITAR.XML ................................................................................................ 44

GALERIA.XML ............................................................................................. 46

INGRESAR.XML ........................................................................................... 47

LOGIN.XML .................................................................................................. 48

REGISTER.XML ............................................................................................ 49

TARJETA.XML ............................................................................................. 51

CÓDIGO PHP .................................................................................................... 53

CONFIGURACIONE.PHP ............................................................................. 53

LISTADO_TARJETA.PHP ............................................................................ 54

PETICIONES.PHP.......................................................................................... 55

INDEX.PHP.................................................................................................... 60

LISTADOTARJETAENTIDADES.PHP ......................................................... 60

LISTADOUSUARIO.PHP .............................................................................. 62

USUARIOSISTEMA.PHP .............................................................................. 63

USUARIO.PHP .............................................................................................. 66

FUNCIONES.PHP .......................................................................................... 72

CONTROL.PHP ............................................................................................. 73

PERMISO.PHP ............................................................................................... 74

PETICIONES.PHP.......................................................................................... 74

PETICIONES ENTIDADES ........................................................................... 78

PETICIONES TARJETAS.PHP ...................................................................... 80

PETICIONES USUARIOS.PHP ..................................................................... 82

RECUPERAR CONTRASENIA.PHP ............................................................. 84

RECUPERAR CONTRASENIA EXITO.PHP ................................................ 85

JQUERY.JTABLE .............................................................................................. 86

DICCIONARIO DE DATOS .............................................................................. 96

LIBRERÍAS ADICIONALES ............................................................................. 98

4

DIAGRAMA DE PROCESOS DE PAGO NFC

Inicio de la actividad del pago NFC

El cliente tiene la necesidad de adquirir un bien.

El cliente selecciona los productos a comprar

Se debe activar la comunicación NFC

no

El Sistema le validará si tiene activo el NFC

si

El Vendedor, le indicará el total a cancelar

no

El Sistema le calculará el total a cancelar

si

El Vendedor Indica el total a Pagar

Inicio/Cliente

Selección productos a comprar

¿Tiene Activo NFC?

Activar NFC

Verifica valor de totales

x

5

El usuario deberá acerca su dispositivo Smartphone Para poder realizar la comunicación NFC

El usuario acepta la cancelación de la compra Se realiza la confirmación del Pago.

Se ejecuta el pago de la tarjeta de crédito del NFC

Se recibirá un correo de confirmación del pago

Finaliza la actividad del pago NFC

Efectuar el Pago NFC

Confirmar de Pago NFC

Fin/Proceso

Interacción de los dispositivos móviles

x

Confirmación del Proceso(email)

6

DETALLE DE LOS PROCESO NFC

Inicio/Cliente El cliente inicia el proceso de pago de tarjeta de crédito mediante el NFC. Cliente necesita adquirir un producto El cliente tiene la necesidad de adquirir un bien, por este motivo se dirige a la tienda, a realizar la respectiva compra. Activación de la comunicación NFC del smartphone El cliente deberá crear la tarjeta de crédito en el dispositivo Smartphone, para establecer el mecanismo de comunicación y poder efectuar el pago NFC debe activar la configuración Android Beam en el dispositivo. Verificación de la comunicación NFC El sistema verificará que la comunicación de NFC e internet este activa, mediante validación del servicio en el teléfono. Cálculo de totales El cliente seleccionara los productos a comprar, y se le presentara mediante un cálculo el total a pagar del cliente. Verificación del total a cancelar El cliente verificará la compra de los productos, se le detallara todos los artículos seleccionados con su respectivo precio de venta. Interacción del dispositivo móvil con el lector NFC El cliente deberá acercar su dispositivo Smartphone con el lector de NFC, para poder realizar la comunicación NFC. Aceptación de efectuarse la transacción El cliente debe aceptar la transacción, se enviará un correo automático al cliente. Ejecución del pago NFC Proceso de efectuarse el pago, se debita el saldo de la tarjeta de crédito, y podrá ser consultado su detalle del estado de cuenta mediante la vía web.

7

DIAGRAMA DE CASO DE USO

DETALLE DE CASO DE USO

El usuario crea la tarjeta de crédito en el dispositivo móvil, que puede ser Dinners, Visa o Mastercard.

Deberá ingresar datos personales, y un correo electrónico donde se le enviará al cliente la verificación de la transacción.

El dispositivo móvil, efectuará el proceso de transmisión de datos al lector NFC, este recibirá la información, procesará el pago y se enviará mediante un email, la confirmación de transacción.

REGISTRAR USUARIO Y

TARJETA CRÉDITO

COMUNICACIÓN NFC

REALIZACIÓN DEL PAGO

Users

8

CÓDIGO FUENTE DE LA APLICACIÓN DE LA TARJETA DE CRÉDITO

NOMBRE DEL PROYECTO : TESIS

PAQUETE ANDROID.COM.LIBRARY

CLASE DATABASE.JAVA Permite la interacción de la base de dato que se crea en el teléfono smartphone que

contendrá la información de las tarjetas de crédito, contiene las sentencias de SQL,

como: delete, update, insert. package com.android.library; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import com.android.tesis.R; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.provider.BaseColumns; import android.util.Log; import android.widget.Toast; public class DataBase { private static final String DATABASE_NAME = "Tesis"; private static final int DATABASE_VERSION = 1; private static final String TABLE_NAME = "tarjetas"; private static final String TAG = "Tesis"; private Context context; private SQLiteDatabase db; public DataBase(Context context) { this.context = context; OpenHelper openHelper = new OpenHelper(this.context); this.db = openHelper.getWritableDatabase(); }

9

public void open() { if (!db.isOpen()) { OpenHelper openHelper = new OpenHelper(this.context); this.db = openHelper.getWritableDatabase(); } } public long insert(String tableName, ContentValues pairValues) { long rowId = db.insertOrThrow(tableName, null, pairValues); Log.i(TAG, "Insertando registro en la tabla " + tableName + ", id = " + rowId); return rowId; } public void insertString(String tableName, String query) { Log.i(TAG, "Insertando registro en la tabla " + tableName); db.execSQL(query); } public void close() { db.close(); } public String update(String tableName, ContentValues pairValues, String rowId) { db.update(tableName, pairValues, " tarjeta = " + rowId, null); Log.i(TAG, "Actualizando registro en la tabla " + tableName + ", tarjeta = " + rowId); return rowId; } public long updateAll(String tableName, ContentValues pairValues) { Log.i(TAG, "Actualizando registro en la tabla " + tableName ); return db.update(tableName, pairValues, null , null); } public void delete(String tableName, String whereClause, String[] whereArgs) { db.delete(tableName, whereClause, whereArgs); Log.i(TAG, "Eliminando registros en la tabla " + tableName); } public Cursor rawQuery(String query, String[] selectionArgs) { Cursor test = db.rawQuery(query, selectionArgs); return test; } public Cursor query(String tableName, String[] columnsName, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) { return db.query(tableName, columnsName, selection, selectionArgs, groupBy, having, orderBy); } private static class OpenHelper extends SQLiteOpenHelper {

10

private Context context; OpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); this.context = context; } @Override public void onCreate(SQLiteDatabase db) { String s; try { InputStream in = context.getResources().openRawResource( R.raw.sql); DocumentBuilder builder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document doc = builder.parse(in, null); NodeList statements = doc.getElementsByTagName("statement"); for (int i = 0; i < statements.getLength(); i++) { s = statements.item(i).getChildNodes().item(0) .getNodeValue(); db.execSQL(s); } } catch (Throwable t) { System.out.println("Error hp: " + t.toString()); Toast.makeText(context, t.toString(), 50000).show(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME); onCreate(db); } } }

CLASE FUNCIONES.JAVA

Esta clase maneja la encriptación de la información con el estándar MD5 que se le

envía por parámetro.

package com.android.library; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Funciones {

11

public static String md5(String s) { MessageDigest digest; try { digest = MessageDigest.getInstance("MD5"); digest.update(s.getBytes(),0,s.length()); String hash = new BigInteger(1, digest.digest()).toString(16); return hash; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } } CLASE HTTP.JAVA

Permite la interacción con el ambiente web, maneja las conexiones del cliente y se

realiza una validación para verificar que el dispositivo tiene la conexión de internet. package com.android.library; import java.net.URLEncoder; import java.util.List; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.DefaultHttpClient; import android.content.Context; import android.net.ConnectivityManager; public class Http { /* * Funcion para acceder al Web Service */ public String accederWebService(String page, List<NameValuePair> nameValuePairs, int method) { String responseBody = null; HttpClient httpclient = new DefaultHttpClient(); ResponseHandler<String> responseHandler = new BasicResponseHandler(); try { switch (method) {

12

case 1: { String combinedParams = ""; if (!nameValuePairs.isEmpty()) { combinedParams += "?"; for (NameValuePair p : nameValuePairs) { String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(), "UTF-8"); if (combinedParams.length() > 1) { combinedParams += "&" + paramString; } else { combinedParams += paramString; } } } HttpGet request = new HttpGet( page + combinedParams); responseBody = httpclient.execute(request, responseHandler); break; } case 2: { HttpPost httpPost = new HttpPost(page); httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); responseBody = httpclient.execute(httpPost, responseHandler); break; } } } catch (Exception e) { e.printStackTrace(); } return responseBody; } /* * Funcion para validar si se esta conectado al internet */ public boolean validarConexion(Context context) { String service = Context.CONNECTIVITY_SERVICE; ConnectivityManager connectivity = (ConnectivityManager) context .getSystemService(service); return connectivity.getActiveNetworkInfo() != null && connectivity.getActiveNetworkInfo().isAvailable() && connectivity.getActiveNetworkInfo().isConnected(); } } CLASE HTTPPOSTAUX.JAVA

Permite manejar la interacción con el método JSON, que encripta los objetos que son

utilizados en el ambiente, se manejo la información en el tipo de dato String.

13

package com.android.library; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import android.util.Log; /*CLASE AUXILIAR PARA EL ENVIO DE PETICIONES A NUESTRO SISTEMA * Y MANEJO DE RESPUESTA.*/ public class Httppostaux{ InputStream is = null; String result = ""; public JSONArray getserverdata(ArrayList<NameValuePair> parameters, String urlwebserver ){ //conecta via http y envia un post. httppostconnect(parameters,urlwebserver); if (is!=null){//si obtuvo una respuesta getpostresponse(); return getjsonarray(); }else{ return null; } } //peticion HTTP private void httppostconnect(ArrayList<NameValuePair> parametros, String urlwebserver){ // try{ HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(urlwebserver); httppost.setEntity(new UrlEncodedFormEntity(parametros)); //ejecuto peticion enviando datos por POST HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); }catch(Exception e){ Log.e("log_tag", "Error in http connection "+e.toString()); } } public void getpostresponse(){ //Convierte respuesta a String try{ BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);

14

StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result=sb.toString(); Log.e("getpostresponse"," result= "+sb.toString()); }catch(Exception e){ Log.e("log_tag", "Error converting result "+e.toString()); } } public JSONArray getjsonarray(){ //parse json data try{ JSONArray jArray = new JSONArray(result); return jArray; } catch(JSONException e){ Log.e("log_tag", "Error parsing data "+e.toString()); return null; } } } CLASE PARAMETROS.JAVA

Maneja la dirección URL, donde se encuentra el Web Services, puede ser este local o

publicado en algún dominio que maneja el estándar Mail, XAMPP.

package com.android.library; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.preference.PreferenceManager; public class Parametros { private SharedPreferences parametros; private String urlServidor = "http://www.ideasinteligentes.com.ec/PagosNFC/"; private String urlServidor = "http://10.0.2.2/PagosNFC/"; private Editor editor; private String PREF_NOMBRE = "PREF_NOMBRE"; private String PREF_CEDULA = "PREF_CEDULA"; private String PREF_USUARIO = "PREF_USUARIO"; private String PREF_CONTRASENIA = "PREF_USUARIO";

15

public Parametros(Context context) { parametros = PreferenceManager.getDefaultSharedPreferences(context); } public String getNombre() { return parametros.getString(PREF_NOMBRE, ""); } public void setNombre(String nombre) { editor = parametros.edit(); editor.putString(PREF_NOMBRE, nombre); editor.commit(); } public String getUsuario() { return parametros.getString(PREF_USUARIO, ""); } public void setCedula(String cedula) { editor = parametros.edit(); editor.putString(PREF_CEDULA, cedula); editor.commit(); } public String getCedula() { return parametros.getString(PREF_CEDULA, ""); } public void setUsuario(String usuario) { editor = parametros.edit(); editor.putString(PREF_USUARIO, usuario); editor.commit(); } public String getContrasenia() { return parametros.getString(PREF_CONTRASENIA, ""); } public void setContrasenia(String contrasenia) { editor = parametros.edit(); editor.putString(PREF_CONTRASENIA, contrasenia); editor.commit(); } public String getUrlServidor() { return urlServidor; } }

16

PAQUETE ANDROID.COM.TESIS

CLASE ACTIVIDAD_ACERCA.JAVA

package com.android.tesis; import android.app.Activity; import android.os.Bundle; public class Actividad_acerca extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acerca); } } CLASE CONTRASENIA.JAVA

Maneja el proceso del usuario que pueda recuperar la contraseña, que se envía por

Email, maneja métodos de conexión de internet y envio de correos. package com.android.tesis; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.TableLayout; import com.android.library.Funciones; import com.android.library.Http; import com.android.library.Parametros; public class Contrasenia extends Activity { private ProgressDialog progressDialog; private Parametros parametros; private Http http; private int error = 0; private static final int alertExito = 1, alertProgress = 2, alertError = 3, alertInternet = 4; private TableLayout tlyLogin;

17

private EditText txtUsuario; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); parametros = new Parametros(getApplicationContext()); http = new Http(); setContentView(R.layout.contrasenia); tlyLogin = (TableLayout) findViewById(R.id.tlyLogin); txtUsuario = (EditText) findViewById(R.id.txtUsuario); } public void enviar(View v) { validarInputs(tlyLogin); if (error == 0) { showDialog(alertProgress); new RecordarContrasenia().execute( txtUsuario.getText().toString()); } error = 0; } @Override protected Dialog onCreateDialog(int id) { String title = "", msg = ""; switch (id) { case alertExito: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_exito).toString(); break; case alertError: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_error).toString(); break; case alertInternet: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_internet).toString(); break; case alertProgress: progressDialog = new ProgressDialog(Contrasenia.this); progressDialog.setTitle(getText(R.string.app_name).toString()); progressDialog .setMessage(getText(R.string.lbl_cargando).toString()); return progressDialog; } return new AlertDialog.Builder(Contrasenia.this) .setTitle(title) .setMessage(msg) .setPositiveButton( getText(R.string.lbl_aceptar).toString(), new DialogInterface.OnClickListener() { @Override

18

public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).create(); } private void validarInputs(ViewGroup group) { for (int i = 0, count = group.getChildCount(); i < count; ++i) { View view = group.getChildAt(i); if (view instanceof EditText) { EditText e = ((EditText) view); if (e.getText().toString().length() == 0) { error++; e.setError(getText(R.string.input_error)); } } if (view instanceof ViewGroup && (((ViewGroup) view).getChildCount() > 0)) validarInputs((ViewGroup) view); } } class RecordarContrasenia extends AsyncTask<String, String, String> { protected String doInBackground(String... params) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("accion", "RC") nameValuePairs.add(new BasicNameValuePair("usuario", params[0])); if(http.validarConexion(getApplicationContext())){ return http.accederWebService(parametros.getUrlServidor() + "/modulos/peticiones.php", nameValuePairs, 2); }else{ return "NOINTERNET"; } } protected void onPostExecute(String result) { System.out.println("Devuelve el correo: " + result); progressDialog.dismiss();// ocultamos progess dialog. if(result.equals("NOINTERNET")){ showDialog(alertInternet); }else if (result.equals("ok")) { parametros.setUsuario(txtUsuario.getText().toString()); showDialog(alertExito); } else { showDialog(alertError); }

19

} } } CLASE DATABASE_HELPER.JAVA

Crea la tabla en la base de dato del teléfono que contendrá la información de la tarjeta

de crédito. package com.android.tesis; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME="tarjetas.db"; public DatabaseHelper(Context context, String nombre, CursorFactory factory, int version) { super(context, DATABASE_NAME, factory, 1); } @Override public void onCreate(SQLiteDatabase arg0) { // TODO Auto-generated method stub arg0.execSQL("CREATE TABLE tarjetas(idtarjeta TEXT PRIMARY KEY, cliente TEXT);"); } @Override public void onUpgrade(SQLiteDatabase arg0, int oldVersion, int newVersion) { // TODO Auto-generated method stub android.util.Log.v("tarjetas","Upgrading database, which will destroy all old data"); arg0.execSQL("DROP TABLE IF EXISTS tarjetas"); onCreate(arg0); } } CLASE EDITAR_TARJETA.JAVA

Permite modificar la información de la tarjeta de crédito, disponible, ejemplo, la

fecha de caducidad, el tipo de tarjeta. package com.android.tesis; import java.util.ArrayList; import java.util.Calendar;

20

import java.util.GregorianCalendar; import java.util.List; import java.util.StringTokenizer; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.ContentValues; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.DatePicker; import android.widget.EditText; import android.widget.Spinner; import android.widget.TableLayout; import com.android.library.DataBase; import com.android.library.Http; import com.android.library.Parametros; public class Editar extends Activity { private DataBase db; private Cursor cursor; private static final String TABLE_NAME = "tarjetas"; private ProgressDialog progressDialog; private Parametros parametros; private Http http; private int error = 0; private static final int alertExito = 1, alertProgress = 2, alertError = 3, alertInternet = 4; private TableLayout tlyIngresar; private EditText txtTarjeta, txtCodigo; private Spinner spnTarjetas; private String[] tarjetas = { "America", "Visa", "Dinners" }; private int[] images = { R.drawable.american, R.drawable.visa, R.drawable.discovery }; private DatePicker dpFecha; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); db = new DataBase(getApplicationContext()); parametros = new Parametros(getApplicationContext()); http = new Http(); setContentView(R.layout.ingresar);

21

tlyIngresar = (TableLayout) findViewById(R.id.tlyIngresar); txtTarjeta = (EditText) findViewById(R.id.txtTarjeta); txtTarjeta.setEnabled(false); txtCodigo = (EditText) findViewById(R.id.txtCodigo); spnTarjetas = (Spinner) findViewById(R.id.spnTarjetas); ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, tarjetas); dataAdapter .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spnTarjetas.setAdapter(dataAdapter); dpFecha = (DatePicker) findViewById(R.id.dpFecha); Calendar cal = Calendar.getInstance(); Intent i = getIntent(); if (i.hasExtra("id")) { cursor = db .rawQuery("SELECT tarjeta, tipo, codigo, strftime('%m-%d-%Y', FECHA, 'unixepoch') AS fecha FROM " + TABLE_NAME + " WHERE _id = ?", new String[] { i.getStringExtra("id") }); cursor.moveToPosition(0); Log.e("aqui ", cursor.getString(cursor .getColumnIndexOrThrow("fecha"))); StringTokenizer st = new StringTokenizer(cursor.getString(cursor .getColumnIndexOrThrow("fecha")),"-"); txtTarjeta.setText(cursor.getString(cursor .getColumnIndexOrThrow("tarjeta"))); txtCodigo.setText(cursor.getString(cursor .getColumnIndexOrThrow("codigo"))); String tipo = cursor.getString(cursor .getColumnIndexOrThrow("tipo")); for(int x=0; x<tarjetas.length; x++ ){ if(tipo.equals(tarjetas[x])){ spnTarjetas.setSelection(x,true); } } int month = Integer.valueOf(st.nextToken()); int day = Integer.valueOf(st.nextToken()); int year = Integer.valueOf(st.nextToken()); Log.e("Entra", Integer.valueOf(day).toString() + " - " + Integer.valueOf(month).toString() + " - " + Integer.valueOf(year).toString()); dpFecha.updateDate(year, month, day); } } public void guardar(View v) { validarInputs(tlyIngresar); if (error == 0) { showDialog(alertProgress); new ActualizarTarjeta().execute( txtTarjeta.getText().toString(), txtCodigo.getText().toString(), tarjetas[spnTarjetas.getSelectedItemPosition()],

22

Integer.valueOf( images[spnTarjetas.getSelectedItemPosition()]) .toString()); } error = 0; } public void guardarTarjeta() { ContentValues vals = new ContentValues(); vals.put("tarjeta", txtTarjeta.getText().toString()); vals.put("tipo", tarjetas[spnTarjetas.getSelectedItemPosition()]); vals.put("codigo", txtCodigo.getText().toString()); vals.put("imagen", images[spnTarjetas.getSelectedItemPosition()]); GregorianCalendar d = new GregorianCalendar(dpFecha.getYear(), dpFecha.getMonth() - 1, dpFecha.getDayOfMonth()); System.out.println("Fecha: " + d.toString()); vals.put("FECHA", d.getTimeInMillis()/1000); db.update(TABLE_NAME, vals, txtTarjeta.getText().toString()); } @Override protected Dialog onCreateDialog(int id) { String title = "", msg = ""; switch (id) { case alertExito: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_exito).toString(); break; case alertError: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_error).toString(); break; case alertInternet: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_internet).toString(); break; case alertProgress: progressDialog = new ProgressDialog(Editar.this); progressDialog.setTitle(getText(R.string.app_name).toString()); progressDialog .setMessage(getText(R.string.lbl_cargando).toString()); return progressDialog; } return new AlertDialog.Builder(Editar.this) .setTitle(title) .setMessage(msg) .setPositiveButton(getText(R.string.lbl_aceptar).toString(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) {

23

// TODO Auto-generated method stub } }).create(); } private void validarInputs(ViewGroup group) { for (int i = 0, count = group.getChildCount(); i < count; ++i) { View view = group.getChildAt(i); if (view instanceof EditText) { EditText e = ((EditText) view); if (e.getText().toString().length() == 0) { error++; e.setError(getText(R.string.input_error)); } } if (view instanceof ViewGroup && (((ViewGroup) view).getChildCount() > 0)) validarInputs((ViewGroup) view); } } class ActualizarTarjeta extends AsyncTask<String, String, String> { protected String doInBackground(String... params) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("accion", "AT")); nameValuePairs.add(new BasicNameValuePair("tarjeta", params[0])); nameValuePairs.add(new BasicNameValuePair("codigo", params[1])); nameValuePairs.add(new BasicNameValuePair("tipo", params[2])); nameValuePairs.add(new BasicNameValuePair("imagen", params[3])); nameValuePairs.add(new BasicNameValuePair("fecha_creacion", Integer.valueOf(dpFecha.getYear()).toString() + "-" + Integer.valueOf(dpFecha.getMonth()).toString() + "-" + Integer.valueOf(dpFecha.getDayOfMonth()).toString())); if (http.validarConexion(getApplicationContext())) { return http.accederWebService(parametros.getUrlServidor() + "/modulos/peticiones.php", nameValuePairs, 2); } else { return "NOINTERNET"; } } protected void onPostExecute(String result) { System.out.println("Rpta: " + result); progressDialog.dismiss();// ocultamos progess dialog. if (result.equals("NOINTERNET")) { showDialog(alertInternet); } else if (result.equals("ok")) { guardarTarjeta(); showDialog(alertExito);

24

} else { showDialog(alertError); } } } public void onDestroy() { super.onDestroy(); db.close(); } } CLASE GALERIA_TARJETA.JAVA

Maneja la creación de la imagen de la tarjeta de crédito, esta información se la

almacena en la base de dato del teléfono. package com.android.tesis; package com.android.tesis; import java.nio.charset.Charset; import android.app.Activity; import android.content.Intent; import android.content.res.TypedArray; import android.database.Cursor; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.NfcAdapter.CreateNdefMessageCallback; import android.nfc.NfcAdapter.OnNdefPushCompleteCallback; import android.nfc.NfcEvent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.text.format.Time; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.Toast; import com.android.library.DataBase; public class GaleriaTarjeta extends Activity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback { NfcAdapter mNfcAdapter; private static final int MESSAGE_SENT = 1; private Gallery galeria1; private ImageView imagen;

25

private static final String TABLE_NAME = "tarjetas"; private DataBase db; private Cursor cursor; GalleryAdapter adapterG; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.galeria); mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if (mNfcAdapter == null) { Toast.makeText(getApplicationContext(), "NFC is not available on this device.", Toast.LENGTH_LONG) .show(); } // Register callback to set NDEF message mNfcAdapter.setNdefPushMessageCallback(this, this); // Register callback to listen for message-sent success mNfcAdapter.setOnNdefPushCompleteCallback(this, this); db = new DataBase(getApplicationContext()); cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, new String[] {}); Log.e("tesis", "Registros " + cursor.getCount()); galeria1 = (Gallery) findViewById(R.id.galeria); imagen = (ImageView) findViewById(R.id.imagen); adapterG = new GalleryAdapter(); galeria1.setAdapter(adapterG); galeria1.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { if (position == 0) { Intent i = new Intent(); i.setClass(getApplicationContext(), Ingresar.class); startActivity(i); } else { cursor.moveToPosition(position); Intent i = new Intent(); i.putExtra("id", cursor.getString(cursor .getColumnIndexOrThrow("_id"))); i.setClass(getApplicationContext(), Editar.class); startActivity(i); } } }); galeria1.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub cursor.moveToPosition(position);

26

Intent i = new Intent(); i.putExtra("numero_tarjeta", cursor.getString(cursor .getColumnIndexOrThrow("tarjeta"))); i.setClass(getApplicationContext(), Tarjeta.class); startActivity(i); return true; } }); } @Override public void onResume() { super.onResume(); cursor.requery(); adapterG.notifyDataSetChanged(); // Check to see that the Activity started due to an Android Beam if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { processIntent(getIntent()); } } @Override public void onDestroy() { super.onDestroy(); db.close(); } class GalleryAdapter extends BaseAdapter { private int mGalleryItemBackcground; public GalleryAdapter() { TypedArray a = getApplicationContext().obtainStyledAttributes( R.styleable.Gallery1); mGalleryItemBackcground = a.getResourceId( R.styleable.Gallery1_android_galleryItemBackground, 0); a.recycle(); } public int getCount() { // TODO Auto-generated method stub return cursor.getCount(); } public Object getItem(int arg0) { // TODO Auto-generated method stub return arg0; } public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } public View getView(int arg0, View arg1, ViewGroup arg2) {

27

// TODO Auto-generated method stub cursor.moveToPosition(arg0); ImageView i = new ImageView(getApplicationContext()); i.setImageResource(cursor.getInt(cursor .getColumnIndexOrThrow("imagen"))); i.setLayoutParams(new Gallery.LayoutParams(180, 180)); i.setScaleType(ScaleType.FIT_XY); i.setBackgroundResource(mGalleryItemBackcground); return i; } } /* * Para la interacion con NFC */ /** * Implementation for the CreateNdefMessageCallback interface */ @Override public NdefMessage createNdefMessage(NfcEvent event) { Time time = new Time(); time.setToNow(); String text = ("Beam me up!\n\n" + "Beam Time: " + time .format("%H:%M:%S")); NdefMessage msg = new NdefMessage(new NdefRecord[] { createMimeRecord( "application/com.example.android.beam", text.getBytes()) /** * The Android Application Record (AAR) is commented out. When a device * receives a push with an AAR in it, the application specified in the * AAR is guaranteed to run. The AAR overrides the tag dispatch system. * You can add it back in to guarantee that this activity starts when * receiving a beamed message. For now, this code uses the tag dispatch * system. */ // ,NdefRecord.createApplicationRecord("com.example.android.beam") }); return msg; } @Override public void onNewIntent(Intent intent) { // onResume gets called after this to handle the intent setIntent(intent); } /** * Parses the NDEF Message from the intent and prints to the TextView */ void processIntent(Intent intent) { Parcelable[] rawMsgs = intent .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); // only one message sent during the beam NdefMessage msg = (NdefMessage) rawMsgs[0]; // record 0 contains the MIME type, record 1 is the AAR, if present

28

Toast.makeText(getApplicationContext(), new String(msg.getRecords()[0].getPayload()), Toast.LENGTH_LONG) .show(); Intent i = new Intent(); i.setClass(getApplicationContext(), Lectura.class); i.putExtra("mensaje", new String(msg.getRecords()[0].getPayload())); startActivity(i); } /** * Creates a custom MIME type encapsulated in an NDEF record * * @param mimeType */ public NdefRecord createMimeRecord(String mimeType, byte[] payload) { byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII")); NdefRecord mimeRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload); return mimeRecord; } @Override public void onNdefPushComplete(NfcEvent event) { // TODO Auto-generated method stub // A handler is needed to send messages to the activity when this // callback occurs, because it happens from a binder thread mHandler.obtainMessage(MESSAGE_SENT).sendToTarget(); } /** This handler receives a message from onNdefPushComplete */ private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_SENT: Toast.makeText(getApplicationContext(), "Mensaje enviado!", Toast.LENGTH_LONG).show(); break; } } }; } CLASE INGRESAR.JAVA

package com.android.tesis; import java.util.ArrayList; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import org.apache.http.NameValuePair;

29

import org.apache.http.message.BasicNameValuePair; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.ContentValues; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.DatePicker; import android.widget.EditText; import android.widget.Spinner; import android.widget.TableLayout; import com.android.library.DataBase; import com.android.library.Http; import com.android.library.Parametros; public class Ingresar extends Activity { private DataBase db; private static final String TABLE_NAME = "tarjetas"; private ProgressDialog progressDialog; private Parametros parametros; private Http http; private int error = 0; private static final int alertExito = 1, alertProgress = 2, alertError = 3, alertInternet = 4; private TableLayout tlyIngresar; private EditText txtTarjeta, txtCodigo; private Spinner spnTarjetas; private String[] tarjetas = { "America", "Visa", "Dinners" }; private int[] images = { R.drawable.american, R.drawable.visa, R.drawable.discovery }; private DatePicker dpFecha; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); db = new DataBase(getApplicationContext()); parametros = new Parametros(getApplicationContext()); http = new Http(); setContentView(R.layout.ingresar); tlyIngresar = (TableLayout) findViewById(R.id.tlyIngresar); txtTarjeta = (EditText) findViewById(R.id.txtTarjeta); txtCodigo = (EditText) findViewById(R.id.txtCodigo); spnTarjetas = (Spinner) findViewById(R.id.spnTarjetas); ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, tarjetas); dataAdapter .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spnTarjetas.setAdapter(dataAdapter);

30

dpFecha = (DatePicker) findViewById(R.id.dpFecha); } public void guardar(View v) { validarInputs(tlyIngresar); if (error == 0) { showDialog(alertProgress); new IngresarTarjeta().execute(txtTarjeta.getText().toString(), txtCodigo.getText().toString(), tarjetas[spnTarjetas.getSelectedItemPosition()], Integer.valueOf(images[spnTarjetas.getSelectedItemPosition()]).toString()); } error = 0; } public void guardarTarjeta() { ContentValues vals = new ContentValues(); vals.put("tarjeta", txtTarjeta.getText().toString()); vals.put("tipo", tarjetas[spnTarjetas.getSelectedItemPosition()]); vals.put("codigo", txtCodigo.getText().toString()); vals.put("imagen", images[spnTarjetas.getSelectedItemPosition()]); GregorianCalendar d = new GregorianCalendar(dpFecha.getYear(), dpFecha.getMonth() - 1, dpFecha.getDayOfMonth()); System.out.println("Fecha: " + d.toString()); vals.put("FECHA", d.getTimeInMillis()/1000); //System.out.println("Entra: " + d.getTime()); db.insert(TABLE_NAME, vals); } @Override protected Dialog onCreateDialog(int id) { String title = "", msg = ""; switch (id) { case alertExito: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_exito).toString(); return new AlertDialog.Builder(Ingresar.this) .setTitle(title) .setMessage(msg) .setPositiveButton(getText(R.string.lbl_aceptar).toString(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub finish(); } }).create(); case alertError: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_error).toString(); break;

31

case alertInternet: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_internet).toString(); break; case alertProgress: progressDialog = new ProgressDialog(Ingresar.this); progressDialog.setTitle(getText(R.string.app_name).toString()); progressDialog .setMessage(getText(R.string.lbl_cargando).toString()); return progressDialog; } return new AlertDialog.Builder(Ingresar.this) .setTitle(title) .setMessage(msg) .setPositiveButton(getText(R.string.lbl_aceptar).toString(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).create(); } private void validarInputs(ViewGroup group) { for (int i = 0, count = group.getChildCount(); i < count; ++i) { View view = group.getChildAt(i); if (view instanceof EditText) { EditText e = ((EditText) view); if (e.getText().toString().length() == 0) { error++; e.setError(getText(R.string.input_error)); } } if (view instanceof ViewGroup && (((ViewGroup) view).getChildCount() > 0)) validarInputs((ViewGroup) view); } } class IngresarTarjeta extends AsyncTask<String, String, String> { protected String doInBackground(String... params) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("accion", "IT")); nameValuePairs.add(new BasicNameValuePair("tarjeta", params[0])); nameValuePairs.add(new BasicNameValuePair("codigo", params[1])); nameValuePairs.add(new BasicNameValuePair("tipo", params[2])); nameValuePairs.add(new BasicNameValuePair("imagen", params[3])); nameValuePairs.add(new BasicNameValuePair("fecha_creacion",

32

Integer.valueOf(dpFecha.getYear()).toString() + "-" + Integer.valueOf(dpFecha.getMonth()).toString() + "-" + Integer.valueOf(dpFecha.getDayOfMonth()).toString())); if (http.validarConexion(getApplicationContext())) { return http.accederWebService(parametros.getUrlServidor() + "/modulos/peticiones.php" , nameValuePairs, 2); } else { return "NOINTERNET"; } } protected void onPostExecute(String result) { System.out.println("Rpta: " + result); progressDialog.dismiss();// ocultamos progess dialog. if (result.equals("NOINTERNET")) { showDialog(alertInternet); } else if (result.equals("ok")) { guardarTarjeta(); showDialog(alertExito); } else { showDialog(alertError); } } } public void onDestroy(){ super.onDestroy(); db.close(); } } CLASE LECTURA.JAVA

package com.android.tesis; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; import com.android.tesis.R; public class Lectura extends Activity { TextView txtMensaje; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.lectura); txtMensaje = (TextView)findViewById(R.id.txtMensaje);

33

Intent i = getIntent(); if(i.hasExtra("mensaje")){ txtMensaje.setText("Se recibe: " + i.getStringExtra("mensaje")); } } } CLASE LOGIN.JAVA

Maneja la pantalla principal de la aplicación, que registra el usuario y contraseña que

contendrá la información de la tarjeta de crédito. package com.android.tesis; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.TableLayout; import android.widget.Toast; import com.android.library.Funciones; import com.android.library.Http; import com.android.library.Parametros; public class Login extends Activity { private ProgressDialog progressDialog; private Parametros parametros; private Http http; private int error = 0; private static final int alertExito = 1, alertProgress = 2, alertError = 3, alertInternet = 4; private TableLayout tlyLogin; private EditText txtUsuario, txtContrasenia; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); parametros = new Parametros(getApplicationContext()); http = new Http();

34

setContentView(R.layout.login); tlyLogin = (TableLayout) findViewById(R.id.tlyLogin); txtUsuario = (EditText) findViewById(R.id.txtUsuario); txtContrasenia = (EditText) findViewById(R.id.txtContrasenia); } public void guardar(View v) { validarInputs(tlyLogin); if (error == 0) { showDialog(alertProgress); new LoguearSistema().execute( txtUsuario.getText().toString(), txtContrasenia.getText() .toString()); } error = 0; } public void registrar(View v){ Intent iRegistrar = new Intent(); iRegistrar.setClass(getApplicationContext(), Registro.class); startActivity(iRegistrar); } public void recordarContrasenia(View v){ Intent iRegistrar = new Intent(); iRegistrar.setClass(getApplicationContext(), Contrasenia.class); startActivity(iRegistrar); } @Override protected Dialog onCreateDialog(int id) { String title = "", msg = ""; switch (id) { case alertExito: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_exito).toString(); break; case alertError: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_error).toString(); break; case alertInternet: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_internet).toString(); break; case alertProgress: progressDialog = new ProgressDialog(Login.this); progressDialog.setTitle(getText(R.string.app_name).toString()); progressDialog .setMessage(getText(R.string.lbl_cargando).toString()); return progressDialog; } return new AlertDialog.Builder(Login.this)

35

.setTitle(title) .setMessage(msg) .setPositiveButton( getText(R.string.lbl_aceptar).toString(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).create(); } private void validarInputs(ViewGroup group) { for (int i = 0, count = group.getChildCount(); i < count; ++i) { View view = group.getChildAt(i); if (view instanceof EditText) { EditText e = ((EditText) view); if (e.getText().toString().length() == 0) { error++; e.setError(getText(R.string.input_error)); } } if (view instanceof ViewGroup && (((ViewGroup) view).getChildCount() > 0)) validarInputs((ViewGroup) view); } } class LoguearSistema extends AsyncTask<String, String, String> { protected String doInBackground(String... params) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("accion", "LU")); nameValuePairs.add(new BasicNameValuePair("usuario", params[0])); nameValuePairs .add(new BasicNameValuePair("contrasenia", Funciones.md5(params[1]))); Log.e("Respuesta: " , Funciones.md5(params[1]) + " - " + params[1]); if(http.validarConexion(getApplicationContext())){ return http.accederWebService(parametros.getUrlServidor() + "/modulos/peticiones.php", nameValuePairs, 2); }else{ return "NOINTERNET"; } } protected void onPostExecute(String result) { Log.e("Respuesta: " , result);

36

progressDialog.dismiss();// ocultamos progess dialog. if(result.equals("NOINTERNET")){ showDialog(alertInternet); }else if (result.equals("ok")) { parametros.setUsuario(txtUsuario.getText().toString()); parametros.setContrasenia(txtContrasenia.getText().toString()); //showDialog(alertExito); Intent i = new Intent(getApplicationContext(),GaleriaTarjeta.class); startActivity(i); } else { showDialog(alertError); } } } } CLASE MAIN.JAVA

Maneja la actividad principal que se ejecuta en el proyecto. package com.android.tesis; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import com.android.library.Parametros; public class Main extends Activity { private Parametros parametros; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); parametros = new Parametros(getApplicationContext()); if(parametros.getUsuario().equals("")) { Intent i = new Intent(); i.setClass(this, Login.class); startActivity(i); }else{ Intent i = new Intent(); i.setClass(this, GaleriaTarjeta.class); startActivity(i); } finish(); } }

37

CLASE REGISTRO.JAVA

Permite registrar la informacion del usuario, que manejará el teléfono, los datos que

contendrá son: nombre de usuario, contraseña, cédula, fecha de creación. package com.android.tesis; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.TableLayout; import com.android.library.Funciones; import com.android.library.Http; import com.android.library.Parametros; public class Registro extends Activity { private ProgressDialog progressDialog; private Parametros parametros; private Http http; private int error = 0; private static final int alertExito = 1, alertProgress = 2, alertError = 3, alertInternet = 4; private TableLayout tlyLogin; private EditText txtNombre, txtCedula, txtUsuario, txtContrasenia, txtEmail; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); parametros = new Parametros(getApplicationContext()); http = new Http(); setContentView(R.layout.register); tlyLogin = (TableLayout) findViewById(R.id.tlyLogin); txtNombre = (EditText) findViewById(R.id.txtNombre); txtCedula = (EditText) findViewById(R.id.txtCedula); txtEmail = (EditText) findViewById(R.id.txtEmail); txtUsuario = (EditText) findViewById(R.id.txtUsuario); txtContrasenia = (EditText) findViewById(R.id.txtContrasenia); }

38

public void guardar(View v) { validarInputs(tlyLogin); if (error == 0) { showDialog(alertProgress); new RegistrarUsuario().execute(txtNombre.getText().toString(),txtCedula.getText().toString(),txtEmail.getText().toString(), txtUsuario.getText().toString(), txtContrasenia.getText() .toString()); } error = 0; } @Override protected Dialog onCreateDialog(int id) { String title = "", msg = ""; switch (id) { case alertExito: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_exito).toString(); break; case alertError: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_error).toString(); break; case alertInternet: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_internet).toString(); break; case alertProgress: progressDialog = new ProgressDialog(Registro.this); progressDialog.setTitle(getText(R.string.app_name).toString()); progressDialog .setMessage(getText(R.string.lbl_cargando).toString()); return progressDialog; } return new AlertDialog.Builder(Registro.this) .setTitle(title) .setMessage(msg) .setPositiveButton( getText(R.string.lbl_aceptar).toString(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).create(); } private void validarInputs(ViewGroup group) { for (int i = 0, count = group.getChildCount(); i < count; ++i) {

39

View view = group.getChildAt(i); if (view instanceof EditText) { EditText e = ((EditText) view); if (e.getText().toString().length() == 0) { error++; e.setError(getText(R.string.input_error)); } } if (view instanceof ViewGroup && (((ViewGroup) view).getChildCount() > 0)) validarInputs((ViewGroup) view); } } class RegistrarUsuario extends AsyncTask<String, String, String> { protected String doInBackground(String... params) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("accion", "RU")); nameValuePairs.add(new BasicNameValuePair("nombre", params[0])); nameValuePairs.add(new BasicNameValuePair("cedula", params[1])); nameValuePairs.add(new BasicNameValuePair("email", params[2])); nameValuePairs.add(new BasicNameValuePair("usuario", params[3])); nameValuePairs .add(new BasicNameValuePair("contrasenia", Funciones.md5(params[4]))); if(http.validarConexion(getApplicationContext())){ return http.accederWebService(parametros.getUrlServidor() + "/modulos/peticiones.php", nameValuePairs, 2); }else{ return "NOINTERNET"; } } protected void onPostExecute(String result) { progressDialog.dismiss();// ocultamos progess dialog. if(result.equals("NOINTERNET")){ showDialog(alertInternet); }else if (result.equals("ok")) { parametros.setNombre(txtNombre.getText().toString()); parametros.setUsuario(txtUsuario.getText().toString()); parametros.setContrasenia(txtContrasenia.getText().toString()); //showDialog(alertExito); Intent i = new Intent(getApplicationContext(),GaleriaTarjeta.class); startActivity(i); } else { showDialog(alertError); } } } }

40

CLASE TARJETA.JAVA

package com.android.tesis; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.widget.EditText; import com.android.library.Http; import com.android.library.Parametros; public class Tarjeta extends Activity { private String numTarjeta=""; private ProgressDialog progressDialog; private Parametros parametros; private Http http; private EditText txtTarjeta, txtNombre, txtFechaTope, txtSaldoInicial, txtMinimoPagar, txtCupoAsignado, txtCupoUtilizado, txtCupoDisponible; private static final int alertExito = 1, alertProgress = 2, alertError = 3, alertInternet = 4; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); parametros = new Parametros(getApplicationContext()); http = new Http(); setContentView(R.layout.tarjeta); txtTarjeta = (EditText)findViewById(R.id.txtTarjeta); txtNombre = (EditText)findViewById(R.id.txtNombre); txtFechaTope = (EditText)findViewById(R.id.txtFechaTope); txtSaldoInicial = (EditText)findViewById(R.id.txtSaldoInicial); txtMinimoPagar = (EditText)findViewById(R.id.txtMinimoPagar); txtCupoAsignado = (EditText)findViewById(R.id.txtCupoAsignado); txtCupoUtilizado = (EditText)findViewById(R.id.txtCupoUtilizado); txtCupoDisponible = (EditText)findViewById(R.id.txtCupoDisponible); Intent i = getIntent(); if(i.hasExtra("numero_tarjeta")){

41

numTarjeta = i.getStringExtra("numero_tarjeta"); new ConsultarTarjeta().execute(); } } class ConsultarTarjeta extends AsyncTask<Void, String, String> { protected String doInBackground(Void... params) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("accion", "CT")); nameValuePairs.add(new BasicNameValuePair("numero_tarjeta", numTarjeta)); if (http.validarConexion(getApplicationContext())) { return http.accederWebService(parametros.getUrlServidor() + "/modulos/peticiones.php" , nameValuePairs, 2); } else { return "NOINTERNET"; } } protected void onPostExecute(String result) { System.out.println("Rpta: " + result); //progressDialog.dismiss();// ocultamos progess dialog. if (result.equals("NOINTERNET")) { showDialog(alertInternet); } else if (!result.equals("[]")) { try { JSONObject jsonRoot = new JSONObject(result); JSONArray jsonArray = jsonRoot.getJSONArray("data"); if (jsonArray.length() > 0) { JSONObject jsonObj = jsonArray .getJSONObject(0); txtTarjeta.setText(jsonObj.getString("numero_tarjeta")); txtNombre.setText(jsonObj.getString("nombre")); txtFechaTope.setText(jsonObj.getString("fecha_tope_pago")); //txtSaldoInicial.setText(jsonObj.getString("")) txtMinimoPagar.setText(jsonObj.getString("minimo_pagar")); txtCupoAsignado.setText(jsonObj.getString("cupo_asignado")); //txtCupoUtilizado.setText(jsonObj.getString("cupo_utilizado")); txtCupoDisponible.setText(jsonObj.getString("cupo_disponible")); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } @Override protected Dialog onCreateDialog(int id) { String title = "", msg = ""; switch (id) {

42

case alertExito: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_exito).toString(); break; case alertError: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_error).toString(); break; case alertInternet: title = getText(R.string.lbl_informacion).toString(); msg = getText(R.string.lbl_internet).toString(); break; case alertProgress: progressDialog = new ProgressDialog(Tarjeta.this); progressDialog.setTitle(getText(R.string.app_name).toString()); progressDialog .setMessage(getText(R.string.lbl_cargando).toString()); return progressDialog; } return new AlertDialog.Builder(Tarjeta.this) .setTitle(title) .setMessage(msg) .setPositiveButton(getText(R.string.lbl_aceptar).toString(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).create(); } }

ARCHIVOS XML

ANDROID MANIFEST.XML

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.tesis" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

43

<uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".Main" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Login"></activity> <activity android:name=".Contrasenia"></activity> <activity android:name=".Registro"></activity> <activity android:name=".GaleriaTarjeta"> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="application/com.android.tesis" /> </intent-filter> </activity> <activity android:name=".Actividad_acerca"></activity> <activity android:name="Ingresar"></activity> <activity android:name="Editar"></activity> <activity android:name="Tarjeta"></activity> <activity android:name=".Lectura"></activity> <activity android:name=".HiScreen"> </activity> </application> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.VIBRATE"/> </manifest>

ACERCA.XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/fondo2" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginTop="153dp" android:text="Sistema de creacion de Tarjeta de Credito" android:textAppearance="?android:attr/textAppearanceLarge" /> </RelativeLayout>

44

CONTRASENIA.XML

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" style="@style/scrolls" > <TableLayout android:id="@+id/tlyLogin" style="@style/tables" > <TableRow> <TextView style="@style/texts" android:layout_span="2" android:text="@string/lbl_mensaje_contrasenia" /> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_usuario" /> <EditText android:id="@+id/txtUsuario" style="@style/edits" android:inputType="text" /> </TableRow> <TableRow> <LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center" > <Button style="@style/buttons" android:onClick="enviar" android:text="@string/lbl_enviar_email" > </Button> </LinearLayout> </TableRow> </TableLayout> </ScrollView>

EDITAR.XML

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" style="@style/scrolls" > <TableLayout android:id="@+id/tlyIngresar" style="@style/tables" >

45

<TableRow> <TextView style="@style/texts" android:text="@string/lbl_tarjeta" /> <EditText android:id="@+id/txtTarjeta" style="@style/edits" android:inputType="text" /> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_tipo" /> <Spinner android:id="@+id/spnTarjetas" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:entries="@array/spn_tarjeta"/> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_codigo" /> <EditText android:id="@+id/txtCodigo" style="@style/edits" android:inputType="text" /> </TableRow> <TableRow> <LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center_vertical" > <TextView style="@style/texts" android:text="@string/lbl_fecha" /> <DatePicker android:id="@+id/dpFecha" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </TableRow> <TableRow> <LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center" > <Button style="@style/buttons"

46

android:onClick="Buscar" android:text="@string/lbl_buscar" > </Button> <Button style="@style/buttons" android:onClick="guardar" android:text="@string/lbl_editar" > </Button> </LinearLayout> </TableRow> </TableLayout> </ScrollView>

GALERIA.XML

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" style="@style/scrolls" > <TableLayout android:id="@+id/tlyLogin" style="@style/tables" > <TableRow> <TextView style="@style/texts" android:layout_span="2" android:text="@string/lbl_mensaje_contrasenia" /> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_usuario" /> <EditText android:id="@+id/txtUsuario" style="@style/edits" android:inputType="text" /> </TableRow> <TableRow> <LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center" > <Button style="@style/buttons" android:onClick="enviar" android:text="@string/lbl_enviar_email" > </Button> </LinearLayout> </TableRow> </TableLayout> </ScrollView>

47

INGRESAR.XML

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" style="@style/scrolls" > <TableLayout android:id="@+id/tlyIngresar" style="@style/tables" > <TableRow> <TextView style="@style/texts" android:text="@string/lbl_tarjeta" /> <EditText android:id="@+id/txtTarjeta" style="@style/edits" android:inputType="text" /> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_tipo" /> <Spinner android:id="@+id/spnTarjetas" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:entries="@array/spn_tarjeta"/> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_codigo" /> <EditText android:id="@+id/txtCodigo" style="@style/edits" android:inputType="text" /> </TableRow> <TableRow> <LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center_vertical" > <TextView style="@style/texts" android:text="@string/lbl_fecha" />

48

<DatePicker android:id="@+id/dpFecha" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </TableRow> <TableRow> <LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center" > <Button style="@style/buttons" android:onClick="guardar" android:text="@string/lbl_ingresar" > </Button> </LinearLayout> </TableRow> </TableLayout> </ScrollView>

LOGIN.XML

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" style="@style/scrolls" > <TableLayout android:id="@+id/tlyLogin" style="@style/tables" > <TableRow> <TextView style="@style/texts" android:text="@string/lbl_usuario" /> <EditText android:id="@+id/txtUsuario" style="@style/edits" android:inputType="text" /> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_password" /> <EditText android:id="@+id/txtContrasenia" style="@style/edits" android:inputType="text" android:password="true" /> </TableRow> <TableRow>

49

<LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center" > <Button style="@style/buttons" android:onClick="guardar" android:text="@string/lbl_login" > </Button> </LinearLayout> </TableRow> <TableRow> <LinearLayout android:layout_width="fill_parent" style="@style/llayout"> <Button style="@style/buttons" android:background="@null" android:layout_weight="1" android:onClick="registrar" android:text="@string/lbl_registrar" > </Button> <Button style="@style/buttons" android:background="@null" android:layout_weight="1" android:onClick="recordarContrasenia" android:text="@string/lbl_recordar_contrasenia" > </Button> </LinearLayout> </TableRow> </TableLayout> </ScrollView>

REGISTER.XML

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" style="@style/scrolls" > <TableLayout android:id="@+id/tlyLogin" style="@style/tables" > <TableRow> <TextView style="@style/texts" android:text="@string/lbl_nombre" />

50

<EditText android:id="@+id/txtNombre" style="@style/edits" android:inputType="text" /> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_cedula" /> <EditText android:id="@+id/txtCedula" style="@style/edits" android:inputType="number" /> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_email" /> <EditText android:id="@+id/txtEmail" style="@style/edits" android:inputType="textEmailAddress" /> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_usuario" /> <EditText android:id="@+id/txtUsuario" style="@style/edits" android:inputType="text" /> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_password" /> <EditText android:id="@+id/txtContrasenia" style="@style/edits" android:inputType="text" android:password="true" /> </TableRow> <TableRow> <LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center" > <Button style="@style/buttons" android:onClick="guardar" android:text="@string/lbl_login" > </Button> </LinearLayout>

51

</TableRow> </TableLayout> </ScrollView>

TARJETA.XML

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" style="@style/scrolls" > <TableLayout android:id="@+id/tlyIngresar" style="@style/tables" > <TableRow> <TextView style="@style/texts" android:text="@string/lbl_tarjeta" /> <EditText android:id="@+id/txtTarjeta" style="@style/edits" android:enabled="false" android:inputType="text" /> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_nombre" /> <EditText android:id="@+id/txtNombre" style="@style/edits" android:enabled="false" android:inputType="text" /> </TableRow> <TableRow> <LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center_vertical" > </LinearLayout> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_fecha_tope" /> <EditText android:id="@+id/txtFechaTope" style="@style/edits" android:enabled="false" android:inputType="text" /> </TableRow> <TableRow>

52

<LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center_vertical" > </LinearLayout> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_saldo_inicial" /> <EditText android:id="@+id/txtSaldoInicial" style="@style/edits" android:enabled="false" android:inputType="text" /> </TableRow> <TableRow> <LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center_vertical" > </LinearLayout> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_minimo_pagar" /> <EditText android:id="@+id/txtMinimoPagar" style="@style/edits" android:enabled="false" android:inputType="text" /> </TableRow> <TableRow> <LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center_vertical" > </LinearLayout> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_cupo_asignado" /> <EditText android:id="@+id/txtCupoAsignado" style="@style/edits" android:enabled="false" android:inputType="text" /> </TableRow> <TableRow> <LinearLayout style="@style/llayout"

53

android:layout_span="2" android:gravity="center_vertical" > </LinearLayout> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_cupo_utilizado" /> <EditText android:id="@+id/txtCupoUtilizado" style="@style/edits" android:enabled="false" android:inputType="text" /> </TableRow> <TableRow> <LinearLayout style="@style/llayout" android:layout_span="2" android:gravity="center_vertical" > </LinearLayout> </TableRow> <TableRow> <TextView style="@style/texts" android:text="@string/lbl_cupo_disponible" /> <EditText android:id="@+id/txtCupoDisponible" style="@style/edits" android:enabled="false" android:inputType="text" /> </TableRow> </TableLayout> </ScrollView>

CODIGO PHP

CONFIGURACIONE.PHP

<?php

extract($_REQUEST);

$hostname = "localhost";

$databasename = "pagosnfc";

$username = "root";

$password = "";

?>

54

LISTADO_TARJETA.PHP

<?php

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

require_once('configuraciones.php');

require_once('../clases/conexion.class.php');

require_once('../clases/tarjeta.class.php');

$json_tarjetas = tarjeta::obtener_listado_json();

//echo $json_entidades;

?>

<link href="../css/estilos.css" rel="stylesheet" type="text/css" />

<link href="../css/tableorderer_1.css" rel="stylesheet" type="text/css">

<link href="../css/menu.css" rel="stylesheet" type="text/css">

<script type="text/javascript" src="../lib/prototype.js"></script>

<script type="text/javascript" src="../lib/tableorderer/js/table_orderer.js"></script>

<!--<script type="text/javascript" src="../lib/tableorderer/js/table_orderer-min.js"></script> -->

<body>

<center>

<ul class="pureCssMenu pureCssMenum">

<li class="pureCssMenui"><a class="pureCssMenui"

href="listadoUsuarios.php">Usuarios</a></li>

<li class="pureCssMenui"><a class="pureCssMenui"

href="listadoTarjetas.php">Tarjetas</a></li>

<li class="pureCssMenui"><a class="pureCssMenui"

href="listadoTarjetasEntidades.php">Entidades</a></li>

</ul>

</center>

<br /><br /><br /><br />

<table width="550" border="0" align="center" cellpadding="0" cellspacing="0">

<tr>

<td>

<table width="100%" border="0" cellpadding="0" cellspacing="0">

<tr>

55

<th><img src="../images_tm/header_left.jpg" alt="" /></th>

<td class="header"><strong><center>Listado de Tarjetas</center></strong></td>

<th class="header">&nbsp;</th>

<th><img src="../images_tm/header_right.jpg" alt="" /></th>

</tr>

</table>

</td>

</tr>

<tr>

<td><div id="container"></div></td>

</tr>

</table>

<script type="text/javascript" language="JavaScript">

new TableOrderer('container',{data : eval(<?php echo $json_tarjetas ?>),search : 'top',paginate :

'bottom', pageCount:20,unsortedColumn : ['OPC']});

</script>

</body>

</html>

PETICIONES.PHP

<?php

require_once('configuraciones.php');

require_once('../clases/conexion.class.php');

extract($_REQUEST);

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

/**

* LU -> Loguear Usuario

*/

if ($accion == "LU") {

require_once('../clases/usuario.class.php');

56

$objUsuario = new Usuario($id, $nombre, $cedula, trim($usuario), $contrasenia, $estado,

$fecha_creacion, $email);

if ($objUsuario->consultarUsuario() == "1") {

echo "ok";

} else {

echo "Error - Usuario/Contraseña invalidos";

}

}

/**

* LU -> Registrar Usuario

*/

if ($accion == "RU") {

require_once('../clases/usuario.class.php');

$objUsuario = new Usuario($id, $nombre, $cedula, trim($usuario), $contrasenia, $estado,

$fecha_creacion, $email);

if ($objUsuario->ingresarUsuario() == "1") {

echo "ok";

} else {

echo "error";

}

}

/**

* LU -> Recordar Contraseña

*/

if ($accion == "RC") {

require_once('../clases/usuario.class.php');

require_once('../libs/funciones.php');

require_once('../libs/PHPMailer/class.phpmailer.php');

define('GUSER', 'roberto.ramirez@ideasinteligentes.com.ec'); // Gmail username

define('GPWD', 'rr4mirez123'); // Gmail password

$objUsuario = new Usuario($id, $nombre, $cedula, trim($usuario), $contrasenia, $estado,

$fecha_creacion, $email);

$objUsuario->obtenerUsuario();

if ($objUsuario->get_email() != "" && $objUsuario->get_estado() == "1") {

57

//$msg = 'Para recuperar de clic <a

href="http://www.ideasinteligentes.com.ec/PagosNFC/modulos/recuperarContrasenia.php?usuario=' .

$usuario . '">Aqui</a>';

$msg = 'Para recuperar su contraseña visiste la siguiente dirección:

http://ideasinteligentes.com.ec/PagosNFC/modulos/recuperarContrasenia.php?usuario=' . $usuario;

smtpmailer($objUsuario->get_email(), 'roberto.david.ramirez.veliz@gmail.com',

'Administracion', 'Recuperar contraseña ', $msg);

echo "ok";

} else {

echo "error";

}

}

/**

* IT -> Ingresar Tarjeta

*/

if ($accion == "IT") {

require_once('../clases/usuario.class.php');

require_once('../clases/tarjeta.class.php');

$objUsuario = new Usuario("", "", "", $usuario, "", "", "", "");

if ($objUsuario->consultarPorUsuario()) {

$objTarjeta = new Tarjeta($id, $tarjeta, $codigo, $tipo, $imagen, date("Y-m-d h:i:s"),

$objUsuario->get_id());

if ($objTarjeta->ingresarTarjeta() == "1") {

echo "ok";

} else {

echo "error";

}

} else {

echo "error: usuario no registrado en el sistema";

}

}

/*

* Consultar Tarjeta

*/

if ($accion == "CT") {

58

require_once('../clases/entidad.class.php');

$objEntidad = new Entidad();

$objEntidad->set_numero_tarjeta($numero_tarjeta);

$data['data'] = $objEntidad->obtener_entidad();

echo json_encode($data);

}

/*

* Actualizar Tarjeta

*/

if ($accion == "AT") {

require_once('../clases/tarjeta.class.php');

$objTarjeta = new Tarjeta($id, $tarjeta, $codigo, $tipo, $imagen, $fecha_creacion, "");

if ($objTarjeta->actualizarTarjeta() == "1") {

echo "ok";

} else {

echo "No se realizó ningún cambio.";

}

}

if ($accion == "MC") {

require_once('../clases/usuario.class.php');

$objUsuario = new Usuario("", "", "", trim($usuario), $contrasenia, "", "", "");

if ($objUsuario->modificarContrasenia() == "1") {

header("Location:recuperarContraseniaExito.php");

} else {

echo "error";

}

};

if ($accion == "RT") {

require_once('../clases/entidad.class.php');

$objEntidad = new Entidad();

$objEntidad->set_numero_tarjeta($numero_tarjeta);

$data = $objEntidad->obtener_entidad2();

$arrFecha = explode("-", $data[fecha_vencimiento]);

if ($data != "") {

59

if (date("Y-m-d", strtotime($data[fecha_vencimiento])) < date('Y-m-d')) {

echo "Su tarjeta esta vencida.";

} else {

if ($data['cupo_disponible'] < $monto) {

echo utf8_encode("No tiene cupo para realizar el proceso.");

} else {

try {

$cupo_disponible = $data['cupo_disponible'] - $monto;

$objEntidad->set_cupo_disponible($cupo_disponible);

$resp = $objEntidad->actualizar_cupo();

if ($resp == 1) {

require_once('../clases/usuario.class.php');

require_once('../libs/funciones.php');

require_once('../libs/PHPMailer/class.phpmailer.php');

define('GUSER', 'roberto.ramirez@ideasinteligentes.com.ec'); // Gmail username

define('GPWD', 'rr4mirez123'); // Gmail password

$objUsuario = new Usuario($id, $nombre, $cedula, trim($usuario), $contrasenia,

$estado, $fecha_creacion, $email);

$objUsuario->obtenerUsuario();

if ($objUsuario->get_email() != "" && $objUsuario->get_estado() == "1") {

//$msg = 'Para recuperar de clic <a

href="http://www.ideasinteligentes.com.ec/PagosNFC/modulos/recuperarContrasenia.php?usuario=' .

$usuario . '">Aqui</a>';

$msg = "Le indicamos que acaba de realizar una transaccion por $ $monto , revisar

su estado de cuenta \n\nHora de Transaccion: ".date("Y-m-d h:i:s");

smtpmailer($objUsuario->get_email(), 'roberto.david.ramirez.veliz@gmail.com',

'Administracion', 'Transaccion PagosNFC', $msg);

//echo "ok";

} else {

//echo "error";

}

echo "Ok";

} else {

echo "Error en la operación";

}

60

} catch (Exception $e) {

echo "Error en la operación";

}

}

}

}

}

?>

INDEX.PHP

<?php

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

header("Location: modulos/listadoTarjetas.php");

?>

LISTADOTARJETAENTIDADES.PHP

<?php

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

require_once('configuraciones.php');

require_once('../clases/conexion.class.php');

require_once('../clases/entidad.class.php');

$json_entidades = entidad::obtener_listado_json();

//echo $json_entidades;

?>

<link href="../css/estilos.css" rel="stylesheet" type="text/css" />

<link href="../css/tableorderer_1.css" rel="stylesheet" type="text/css">

61

<link href="../css/menu.css" rel="stylesheet" type="text/css">

<script type="text/javascript" src="../lib/prototype.js"></script>

<script type="text/javascript" src="../lib/tableorderer/js/table_orderer.js"></script>

<!--<script type="text/javascript" src="../lib/tableorderer/js/table_orderer-min.js"></script> -->

<body>

<center>

<ul class="pureCssMenu pureCssMenum">

<li class="pureCssMenui"><a class="pureCssMenui"

href="listadoUsuarios.php">Usuarios</a></li>

<li class="pureCssMenui"><a class="pureCssMenui"

href="listadoTarjetas.php">Tarjetas</a></li>

<li class="pureCssMenui"><a class="pureCssMenui"

href="listadoTarjetasEntidades.php">Entidades</a></li>

</ul>

</center>

<br /><br /><br /><br />

<table width="550" border="0" align="center" cellpadding="0" cellspacing="0">

<tr>

<td>

<table width="100%" border="0" cellpadding="0" cellspacing="0">

<tr>

<th><img src="../images_tm/header_left.jpg" alt="" /></th>

<td class="header"><strong><center>Listado de Tarjetas Entidad</center></strong></td>

<th class="header">&nbsp;</th>

<th><img src="../images_tm/header_right.jpg" alt="" /></th>

</tr>

</table>

</td>

</tr>

<tr>

<td><div id="container"></div></td>

</tr>

</table>

<script type="text/javascript" language="JavaScript">

62

new TableOrderer('container',{data : eval(<?php echo $json_entidades ?>),search : 'top',paginate :

'bottom', pageCount:20,unsortedColumn : ['OPC']});

</script>

</body>

</html>

LISTADOUSUARIO.PHP

<?php

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

require_once('configuraciones.php');

require_once('../clases/conexion.class.php');

require_once('../clases/usuario.class.php');

$json_usuarios = usuario::obtener_listado_json();

//echo $json_entidades;

?>

<link href="../css/estilos.css" rel="stylesheet" type="text/css" />

<link href="../css/tableorderer_1.css" rel="stylesheet" type="text/css">

<link href="../css/menu.css" rel="stylesheet" type="text/css">

<script type="text/javascript" src="../lib/prototype.js"></script>

<script type="text/javascript" src="../lib/tableorderer/js/table_orderer.js"></script>

<!--<script type="text/javascript" src="../lib/tableorderer/js/table_orderer-min.js"></script> -->

<body>

<center>

<ul class="pureCssMenu pureCssMenum">

<li class="pureCssMenui"><a class="pureCssMenui"

href="listadoUsuarios.php">Usuarios</a></li>

<li class="pureCssMenui"><a class="pureCssMenui"

href="listadoTarjetas.php">Tarjetas</a></li>

<li class="pureCssMenui"><a class="pureCssMenui"

href="listadoTarjetasEntidades.php">Entidades</a></li>

</ul>

63

</center>

<br /><br /><br /><br />

<table width="550" border="0" align="center" cellpadding="0" cellspacing="0">

<tr>

<td>

<table width="100%" border="0" cellpadding="0" cellspacing="0">

<tr>

<th><img src="../images_tm/header_left.jpg" alt="" /></th>

<td class="header"><strong><center>Listado de Usuarios</center></strong></td>

<th class="header">&nbsp;</th>

<th><img src="../images_tm/header_right.jpg" alt="" /></th>

</tr>

</table>

</td>

</tr>

<tr>

<td><div id="container"></div></td>

</tr>

</table>

<script type="text/javascript" language="JavaScript">

new TableOrderer('container',{data : eval(<?php echo $json_usuarios ?>),search : 'top',paginate :

'bottom', pageCount:20,unsortedColumn : ['OPC']});

</script>

</body>

</html>

USUARIOSISTEMA.PHP

<?php

require_once('permisos.php');

?>

<html>

<link href="../css/estilos.css" rel="stylesheet" type="text/css" />

<link href="../css/menu.css" rel="stylesheet" type="text/css">

64

<link href="../css/validationEngine.jquery.css" rel="stylesheet" type="text/css">

<link href="../css/redmond/jquery-ui-1.8.16.custom.css" rel="stylesheet" type="text/css" />

<link href="../js/jtable/themes/lightcolor/blue/jtable.css" rel="stylesheet" type="text/css" />

<script src="../js/jquery-1.6.4.min.js" type="text/javascript"></script>

<script src="../js/jquery-ui-1.8.16.custom.min.js" type="text/javascript"></script>

<script src="../js/jtable/jquery.jtable.js" type="text/javascript"></script>

<script type="text/javascript" src="../js/jquery.validationEngine.js"></script>

<script type="text/javascript" src="../js/jquery.validationEngine-es.js"></script>

</head>

<body>

<center>

<ul class="pureCssMenu pureCssMenum">

<li class="pureCssMenui"><a class="pureCssMenui" href="usuarios_sistema.php">Usuarios

Sistema</a></li>

<li class="pureCssMenui"><a class="pureCssMenui" href="usuarios.php">Usuarios</a></li>

<li class="pureCssMenui"><a class="pureCssMenui" href="tarjetas.php">Tarjetas</a></li>

<li class="pureCssMenui"><a class="pureCssMenui" href="entidades.php"

align="center">Entidades</a></li>

<li class="pureCssMenui"><a class="pureCssMenui"

href="recuperarContrasenia.php?usuario=<?php echo $_SESSION['usuarioLogin']; ?>&sistema=s"

align="center">Cambiar contrase&ntilde;a</a></li>

<li class="pureCssMenui"><a class="pureCssMenui" href="../control.php?accion=2"

align="center">Salir</a></li>

</ul>

</center>

<br /><br /><br /><br />

<div id="ContenedorUsuarios" style="width: 1000px;"></div>

<script type="text/javascript">

$(document).ready(function () {

//Prepare jTable

$('#ContenedorUsuarios').jtable({

title: 'Listado de Usuarios del Sistema',

paging: true,

pageSize: 20,

sorting: true,

65

defaultSorting: 'nombre ASC',

actions: {

listAction: 'peticionesUsuariosSistema.php?action=list',

createAction: 'peticionesUsuariosSistema.php?action=create'

// updateAction: 'peticionesUsuariosSistema.php?action=update'

},

fields: {

id: {

key: true,

create: false,

edit: false,

list: false

},

nombre: {

title: 'Nombre',

width: '25%'

},

usuario: {

title: 'usuario',

width: '20%'

},

contrasenia: {

title: 'Contrase\xf1a',

visibility: 'hidden' ,

edit: false

},

fecha_creacion: {

title: 'Fecha de Creaci\xf3n',

width: '20%',

type: 'date',

create: false,

edit: false

}

}

});

66

//Load person list from server

$('#ContenedorUsuarios').jtable('load');

});

</script>

</body>

</html>

USUARIO.PHP

<?php

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

class usuario {

private $_id = "";

private $_nombre = '';

private $_cedula = '';

private $_usuario = '';

private $_contrasenia = '';

private $_estado = '';

private $_fecha_creacion = '';

private $_email = '';

public function __construct($id, $nombre, $cedula, $usuario, $contrasenia, $estado,

$fecha_creacion, $email) {

global $hostname, $databasename, $username, $password;

$this->_id = $id;

$this->_nombre = $nombre;

$this->_cedula = $cedula;

$this->_usuario = $usuario;

$this->_contrasenia = $contrasenia;

$this->_estado = $estado;

$this->_fecha_creacion = $fecha_creacion;

$this->_email = $email;

67

$this->conexion = new Conexion($hostname, $databasename, $username, $password);

}

public function obtener_listado_json() {

global $hostname, $databasename, $username, $password, $lblDescripcion;

$conexion = new Conexion($hostname, $databasename, $username, $password);

$conexion->conectar();

$sql = "SELECT *

FROM $databasename.usuarios";

$res = $conexion->ejecutarSQL($sql, __CLASS__, __METHOD__, __LINE__);

$array_proc = array();

$idx = 0;

while ($data = mysql_fetch_array($res)) {

$array_proc[$idx]['Codigo'] = $data['id'];

$array_proc[$idx]['Nombre'] = $data['nombre'];

$array_proc[$idx]['Cedula'] = $data['cedula'];

$array_proc[$idx]['Email'] = $data['email'];

$array_proc[$idx]['Usuario'] = $data['usuario'];

$array_proc[$idx]['Fecha Creaci&oacute;n'] = $data['fecha_creacion'];

$idx++;

}

return json_encode($conexion->retornaUtf8($array_proc));

}

public function obtener_listado($jtSorting,$jtStartIndex,$jtPageSize) {

global $hostname, $databasename, $username, $password, $lblDescripcion;

$conexion = new Conexion($hostname, $databasename, $username, $password);

$conexion->conectar();

$sql = "SELECT *

FROM $databasename.usuarios ORDER BY ". $jtSorting . " LIMIT " . $jtStartIndex.

"," . $jtPageSize;

//echo $sql;

$result = $conexion->ejecutarSQL($sql, __CLASS__, __METHOD__, __LINE__);

$rows = array();

while ($row = mysql_fetch_array($result)) {

68

$rows[] = $row;

}

return $rows;

}

public function ingresarUsuario() {

global $databasename;

$this->conexion->conectar();

$sql = "INSERT INTO $databasename.usuarios

(nombre,cedula,usuario,contrasenia,estado,fecha_creacion,email)

VALUES ('$this->_nombre','$this->_cedula', '$this->_usuario','$this-

>_contrasenia','1',date(now()),'$this->_email')";

$this->conexion->ejecutarSQL($sql, __CLASS__, __METHOD__, __LINE__);

if ($this->conexion->registrosAfectados() > 0) {

return "1";

} else {

return "0";

}

}

public function consultarUsuario() {

global $databasename;

$this->conexion->conectar();

$sql = "SELECT * FROM $databasename.usuarios WHERE usuario='$this->_usuario'

AND contrasenia = MD5('$this->_contrasenia') AND estado = '1'";

//echo $sql; EXIT;

$this->conexion->ejecutarSQL($sql, __CLASS__, __METHOD__, __LINE__);

if ($this->conexion->registrosAfectados() > 0) {

$data = $this->conexion->extraerDatos();

$this->_id = $data['id'];

$this->_nombre = $data['nombre'];

$this->_cedula = $data['cedula'];

$this->_email = $data['email'];

$this->_usuario = $data['usuario'];

$this->_contrasenia = $data['contrasenia'];

69

$this->_fecha_creacion = $data['fecha_creacion'];

$this->_estado = $data['estado'];

return "1";

} else {

return "0";

}

}

public function modificarContrasenia(){

global $databasename;

$this->conexion->conectar();

$sql = "UPDATE $databasename.usuarios

SET contrasenia = md5('$this->_contrasenia')

WHERE usuario = '$this->_usuario'";

//echo $sql;

$this->conexion->ejecutarSQL($sql, __CLASS__, __METHOD__, __LINE__);

if ($this->conexion->registrosAfectados() > 0) {

return "1";

} else {

return "0";

}

}

public function consultarPorUsuario() {

global $databasename;

$this->conexion->conectar();

$sql = "SELECT * FROM $databasename.usuarios WHERE usuario='$this->_usuario'

AND estado = '1'";

//echo $sql;

$this->conexion->ejecutarSQL($sql, __CLASS__, __METHOD__, __LINE__);

if ($this->conexion->registrosAfectados() > 0) {

$data = $this->conexion->extraerDatos();

$this->_id = $data['id'];

$this->_nombre = $data['nombre'];

$this->_cedula = $data['cedula'];

70

$this->_email = $data['email'];

$this->_usuario = $data['usuario'];

$this->_contrasenia = $data['contrasenia'];

$this->_fecha_creacion = $data['fecha_creacion'];

$this->_estado = $data['estado'];

return "1";

} else {

return "0";

}

}

public function obtenerUsuario() {

global $databasename;

$this->conexion->conectar();

$sql = "SELECT * FROM $databasename.usuarios WHERE usuario='$this->_usuario'";

$this->conexion->ejecutarSQL($sql, __CLASS__, __METHOD__, __LINE__);

if ($this->conexion->registrosObtenidos() > 0) {

$data = $this->conexion->extraerDatos();

$this->_id = $data['id'];

$this->_nombre = $data['nombre'];

$this->_cedula = $data['cedula'];

$this->_email = $data['email'];

$this->_usuario = $data['usuario'];

$this->_contrasenia = $data['contrasenia'];

$this->_fecha_creacion = $data['fecha_creacion'];

$this->_estado = $data['estado'];

return true;

} else {

return false;

}

}

public function get_id() {

return $this->_id;

}

71

public function set_id($_id) {

$this->_id = $_id;

}

public function get_nombre() {

return $this->_nombre;

}

public function set_nombre($_nombre) {

$this->_nombre = $_nombre;

}

public function get_cedula() {

return $this->_cedula;

}

public function set_cedula($_cedula) {

$this->_cedula = $_cedula;

}

public function get_usuario() {

return $this->_usuario;

}

public function set_usuario($_usuario) {

$this->_usuario = $_usuario;

}

public function get_contrasenia() {

return $this->_contrasenia;

}

public function set_contrasenia($_contrasenia) {

$this->_contrasenia = $_contrasenia;

72

}

public function get_estado() {

return $this->_estado;

}

public function set_estado($_estado) {

$this->_estado = $_estado;

}

public function get_fecha_creacion() {

return $this->_fecha_creacion;

}

public function set_fecha_creacion($_fecha_creacion) {

$this->_fecha_creacion = $_fecha_creacion;

}

public function get_email() {

return $this->_email;

}

public function set_email($_email) {

$this->_email = $_email;

}

}

?>

FUNCIONES.PHP

<?php

function smtpmailer($to, $from, $from_name, $subject, $body) {

global $error;

$mail = new PHPMailer(); // create a new object

$mail->IsSMTP(); // enable SMTP

73

$mail->SMTPDebug = 0; // debugging: 1 = errors and messages, 2 = messages only

$mail->SMTPAuth = true; // authentication enabled

$mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for Gmail

$mail->Host = 'mail.ideasinteligentes.com.ec';

$mail->Port = 465;

$mail->Username = GUSER;

$mail->Password = GPWD;

$mail->SetFrom($from, $from_name);

$mail->Subject = $subject;

$mail->Body = $body;

$mail->AddAddress($to);

if(!$mail->Send()) {

$error = 'Mail error: '.$mail->ErrorInfo;

return false;

} else {

$error = 'Message sent!';

return true;

}

}

?>

CONTROL.PHP

<?php

require_once('modulos/configuraciones.php');

require_once('clases/conexion.class.php');

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

session_start();

if ($accion == "1") {

require_once('clases/usuario_sistema.class.php');

74

$nombre = "";

$objUsuario = new Usuario_sistema($id, $nombre, trim($usuario), $contrasenia);

if ($objUsuario->consultarUsuario() == "1") {

session_register('usuarioLogin');

$_SESSION['usuarioLogin']=trim($usuario);

header("Location:modulos/home.php");

} else {

header("Location:index.html");

}

}

if ($accion == "2") {

session_destroy();

header("Location:index.html");

exit;

}

?>

PERMISO.PHP

<?php

session_start();

if (isset($_SESSION['usuarioLogin'])) {

$usuarioLogin = $_SESSION['usuarioLogin'];

} else {

header("location: ../index.html");

exit();

}

?>

PETICIONES.PHP

<?php

require_once('configuraciones.php');

require_once('../clases/conexion.class.php');

75

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

* LU -> Loguear Usuario

*/

if ($accion == "LU") {

require_once('../clases/usuario.class.php');

$objUsuario = new Usuario($id, $nombre, $cedula, trim($usuario), $contrasenia, $estado,

$fecha_creacion, $email);

if ($objUsuario->consultarUsuario() == "1") {

echo "ok";

} else {

echo "Error - Usuario/Contrase�a invalidos";

}

}

/**

* LU -> Registrar Usuario

*/

if ($accion == "RU") {

require_once('../clases/usuario.class.php');

$objUsuario = new Usuario($id, $nombre, $cedula, trim($usuario), $contrasenia, $estado,

$fecha_creacion, $email);

if ($objUsuario->ingresarUsuario() == "1") {

echo "ok";

} else {

echo "error";

}

}

/**

* LU -> Recordar Contraseña

*/

if ($accion == "RC") {

require_once('../clases/usuario.class.php');

require_once('../libs/funciones.php');

76

require_once('../libs/PHPMailer/class.phpmailer.php');

define('GUSER', 'roberto.ramirez@ideasinteligentes.com.ec'); // Gmail username

define('GPWD', 'rr4mirez123'); // Gmail password

$objUsuario = new Usuario($id, $nombre, $cedula, trim($usuario), $contrasenia, $estado,

$fecha_creacion, $email);

$objUsuario->obtenerUsuario();

if ($objUsuario->get_email() != "" && $objUsuario->get_estado() == "1") {

//$msg = 'Para recuperar de clic <a

href="http://www.ideasinteligentes.com.ec/PagosNFC/modulos/recuperarContrasenia.php?usuario=' .

$usuario . '">Aqui</a>';

$msg = 'Para recuperar su contraseña visiste la siguiente dirección:

http://ideasinteligentes.com.ec/PagosNFC/modulos/recuperarContrasenia.php?usuario=' . $usuario;

smtpmailer($objUsuario->get_email(), 'roberto.david.ramirez.veliz@gmail.com',

'Administracion', 'Recuperar contraseña ', $msg);

echo "ok";

} else {

echo "error";

}

}

/**

* IT -> Ingresar Tarjeta

*/

if ($accion == "IT") {

require_once('../clases/usuario.class.php');

require_once('../clases/tarjeta.class.php');

$objUsuario = new Usuario("", "", "", $usuario, "", "", "", "");

if ($objUsuario->consultarPorUsuario()) {

$objTarjeta = new Tarjeta($id, $tarjeta, $codigo, $tipo, $imagen, date("Y-m-d h:i:s"),

$objUsuario->get_id());

if ($objTarjeta->ingresarTarjeta() == "1") {

echo "ok";

} else {

echo "error";

}

} else {

77

echo "error: usuario no registrado en el sistema";

}

}

/*

* Consultar Tarjeta

*/

if ($accion == "CT") {

require_once('../clases/entidad.class.php');

$objEntidad = new Entidad();

$objEntidad->set_numero_tarjeta($numero_tarjeta);

echo $objEntidad->obtener_entidad();

}

/*

* Actualizar Tarjeta

*/

if ($accion == "AT") {

require_once('../clases/tarjeta.class.php');

$objTarjeta = new Tarjeta($id, $tarjeta, $codigo, $tipo, $imagen, $fecha_creacion, "");

if ($objTarjeta->actualizarTarjeta() == "1") {

echo "ok";

} else {

echo "No se realizó ningún cambio.";

}

}

if ($accion == "MC") {

require_once('../clases/usuario.class.php');

$objUsuario = new Usuario("", "", "", trim($usuario), $contrasenia, "", "", "");

if ($objUsuario->modificarContrasenia() == "1") {

echo "ok";

} else {

echo "error";

}

}

?>

78

PETICIONES ENTIDADES

<?php

require_once('configuraciones.php');

require_once('../clases/conexion.class.php');

require_once('../clases/entidad.class.php');

$objEntidad = new entidad($id, $numero_tarjeta, $fecha_vencimiento, $fecha_tope_pago,

$codigo_verificacion, $cedula, $nombre,

$fecha_creacion,$cupo_asignado,$cupo_disponible,$minimo_pagar );

try

{

//Getting records (listAction)

if($action == "list")

{

$listado = $objEntidad->obtener_listado($jtSorting ,$jtStartIndex, $jtPageSize);

//Return result to jTable

$jTableResult = array();

$jTableResult['Result'] = "OK";

$jTableResult['Records'] = $listado;

$jTableResult['TotalRecordCount'] = count($listado);

print json_encode($jTableResult);

}

//Creating a new record (createAction)

else if($_GET["action"] == "create")

{

$objEntidad->ingresar_entidad();

//Return result to jTable

$jTableResult = array();

$jTableResult['Result'] = "OK";

$jTableResult['Record'] = $objEntidad->obtener_entidad2();

print json_encode($jTableResult);

}

79

//Updating a record (updateAction)

else if($_GET["action"] == "update")

{

$objEntidad->actualizar_entidad();

//Return result to jTable

$jTableResult = array();

$jTableResult['Result'] = "OK";

print json_encode($jTableResult);

}

/*

//Deleting a record (deleteAction)

else if($_GET["action"] == "delete")

{

//Delete from database

$result = mysql_query("DELETE FROM people WHERE PersonId = " .

$_POST["PersonId"] . ";");

//Return result to jTable

$jTableResult = array();

$jTableResult['Result'] = "OK";

print json_encode($jTableResult);

}

//Close database connection

mysql_close($con);*/

}

catch(Exception $ex)

{

//Return error message

$jTableResult = array();

$jTableResult['Result'] = "ERROR";

$jTableResult['Message'] = $ex->getMessage();

print json_encode($jTableResult);

}

80

?>

PETICIONES TARJETAS.PHP

<?php

require_once('configuraciones.php');

require_once('../clases/conexion.class.php');

require_once('../clases/tarjeta.class.php');

$objTarjeta = new Tarjeta($id, $tarjeta, $codigo, $tipo, $imagen, $fecha_creacion,$id_usuario);

try

{

//Getting records (listAction)

if($action == "list")

{

$listado = $objTarjeta->obtener_listado($jtSorting ,$jtStartIndex, $jtPageSize);

//Return result to jTable

$jTableResult = array();

$jTableResult['Result'] = "OK";

$jTableResult['Records'] = $listado;

$jTableResult['TotalRecordCount'] = count($listado);

print json_encode($jTableResult);

}

/*

//Creating a new record (createAction)

else if($_GET["action"] == "create")

{

//Insert record into database

$result = mysql_query("INSERT INTO people(Name, Age, RecordDate)

VALUES('" . $_POST["Name"] . "', " . $_POST["Age"] . ",now());");

//Get last inserted record (to return to jTable)

$result = mysql_query("SELECT * FROM people WHERE PersonId =

LAST_INSERT_ID();");

$row = mysql_fetch_array($result);

//Return result to jTable

81

$jTableResult = array();

$jTableResult['Result'] = "OK";

$jTableResult['Record'] = $row;

print json_encode($jTableResult);

}

//Updating a record (updateAction)

else if($_GET["action"] == "update")

{

//Update record in database

$result = mysql_query("UPDATE people SET Name = '" . $_POST["Name"] . "',

Age = " . $_POST["Age"] . " WHERE PersonId = " . $_POST["PersonId"] . ";");

//Return result to jTable

$jTableResult = array();

$jTableResult['Result'] = "OK";

print json_encode($jTableResult);

}

//Deleting a record (deleteAction)

else if($_GET["action"] == "delete")

{

//Delete from database

$result = mysql_query("DELETE FROM people WHERE PersonId = " .

$_POST["PersonId"] . ";");

//Return result to jTable

$jTableResult = array();

$jTableResult['Result'] = "OK";

print json_encode($jTableResult);

}

//Close database connection

mysql_close($con);*/

}

catch(Exception $ex)

{

//Return error message

$jTableResult = array();

$jTableResult['Result'] = "ERROR";

82

$jTableResult['Message'] = $ex->getMessage();

print json_encode($jTableResult);

}

?>

PETICIONES USUARIOS.PHP

<?php

require_once('configuraciones.php');

require_once('../clases/conexion.class.php');

require_once('../clases/usuario.class.php');

$objUsuario = new usuario($id, $nombre, $cedula, $usuario, $contrasenia, $estado, $fecha_creacion,

$email);

try

{

//Getting records (listAction)

if($action == "list")

{

$listado = $objUsuario->obtener_listado($jtSorting ,$jtStartIndex, $jtPageSize);

//Return result to jTable

$jTableResult = array();

$jTableResult['Result'] = "OK";

$jTableResult['Records'] = $listado;

$jTableResult['TotalRecordCount'] = count($listado);

print json_encode($jTableResult);

}

/*

//Creating a new record (createAction)

else if($_GET["action"] == "create")

{

//Insert record into database

$result = mysql_query("INSERT INTO people(Name, Age, RecordDate)

VALUES('" . $_POST["Name"] . "', " . $_POST["Age"] . ",now());");

//Get last inserted record (to return to jTable)

$result = mysql_query("SELECT * FROM people WHERE PersonId =

LAST_INSERT_ID();");

83

$row = mysql_fetch_array($result);

//Return result to jTable

$jTableResult = array();

$jTableResult['Result'] = "OK";

$jTableResult['Record'] = $row;

print json_encode($jTableResult);

}

//Updating a record (updateAction)

else if($_GET["action"] == "update")

{

//Update record in database

$result = mysql_query("UPDATE people SET Name = '" . $_POST["Name"] . "',

Age = " . $_POST["Age"] . " WHERE PersonId = " . $_POST["PersonId"] . ";");

//Return result to jTable

$jTableResult = array();

$jTableResult['Result'] = "OK";

print json_encode($jTableResult);

}

//Deleting a record (deleteAction)

else if($_GET["action"] == "delete")

{

//Delete from database

$result = mysql_query("DELETE FROM people WHERE PersonId = " .

$_POST["PersonId"] . ";");

//Return result to jTable

$jTableResult = array();

$jTableResult['Result'] = "OK";

print json_encode($jTableResult);

}

//Close database connection

mysql_close($con);*/

}

catch(Exception $ex)

{

84

//Return error message

$jTableResult = array();

$jTableResult['Result'] = "ERROR";

$jTableResult['Message'] = $ex->getMessage();

print json_encode($jTableResult);

}

?>

RECUPERAR CONTRASENIA.PHP

<?php

require_once('configuraciones.php');

require_once('../clases/conexion.class.php');

require_once('../clases/usuario.class.php');

$objUsuario = new Usuario("", "", "", trim($usuario), "", "", "", "");

$objUsuario->consultarPorUsuario();

?>

<html lang="en">

<head>

<title>Pagos NFC</title>

<link rel="stylesheet" type="text/css" href="../css/login.css" />

<script src="../js/modernizr.custom.63321.js"></script>

<!--[if lte IE 7]><style>.main{display:none;} .support-note .note-

ie{display:block;}</style><![endif]-->

<script type="text/javascript">

function validarEnvio(){

if(document.getElementById("contrasenia").value!=document.getElementById("password").value){

alert("Las contraseñas no coinciden");

}else{

document.forms[0].action = "peticiones.php";

document.forms[0].submit();

}

}

</script>

</head>

<body>

<div class="container">

85

<section class="main">

<form class="form-1">

<p class="field">

<input type="text" value="<?php echo $objUsuario->get_usuario(); ?>"

placeholder="Usuario" readonly="readonly">

<i class="icon-user icon-large"></i>

</p>

<p class="field">

<input type="password" id="contrasenia" name="contrasenia"

placeholder="Contrase&ntilde;a">

<i class="icon-lock icon-large"></i>

</p>

<p class="field">

<input type="password" id="password" name="password" placeholder="Re-

Contrase&ntilde;a">

<i class="icon-lock icon-large"></i>

</p>

<p class="submit">

<button type="button" name="button" onClick="validarEnvio()"><i class="icon-arrow-

right icon-large"></i></button>

</p>

<input type="hidden" name="accion" value="MC"></input>

<input type="hidden" name="usuario" value="<?php echo $objUsuario->get_usuario();

?>"></input>

</form>

</section>

</div>

</body>

</html>

RECUPERAR CONTRASENIA EXITO.PHP

<?php

require_once('configuraciones.php');

require_once('../clases/conexion.class.php');

require_once('../clases/usuario.class.php');

86

$objUsuario = new Usuario("", "", "", trim($usuario), "", "", "", "");

$objUsuario->consultarPorUsuario();

?>

<html lang="en">

<head>

<title>Pagos NFC</title>

<link rel="stylesheet" type="text/css" href="../css/login.css" />

<script src="../js/modernizr.custom.63321.js"></script>

<!--[if lte IE 7]><style>.main{display:none;} .support-note .note-

ie{display:block;}</style><![endif]-->

<script type="text/javascript">

function validarEnvio(){

if(document.getElementById("contrasenia").value!=document.getElementById("password").value){

alert("Las contraseñas no coinciden");

}else{

document.forms[0].action = "peticiones.php";

document.forms[0].submit();

}

}

</script>

</head>

<body>

<div class="container">

<center>

<h1>Le indicamos que su contrase&ntilde;a fue actualizada con &eacute;xito</h1>

</center>

</div>

</body>

</html>

JQUERY.JTABLE

jTable 2.0.0

http://www.jtable.org

87

* CORE jTable module *

(function ($) {

$.widget("hik.jtable", {

options: {

//Options

actions: {},

fields: {},

animationsEnabled: true,

defaultDateFormat: 'yy-mm-dd',

dialogShowEffect: 'fade',

dialogHideEffect: 'fade',

showCloseButton: false,

loadingAnimationDelay: 500,

ajaxSettings: {

type: 'POST',

dataType: 'json'

},

//Events

closeRequested: function (event, data) { },

formCreated: function (event, data) { },

formSubmitting: function (event, data) { },

formClosed: function (event, data) { },

loadingRecords: function (event, data) { },

recordsLoaded: function (event, data) { },

rowInserted: function (event, data) { },

rowsRemoved: function (event, data) { },

//Localization

messages: {

serverCommunicationError: 'Ocurrio un error mientras se conectaba al servidor.',

loadingMessage: 'cargando registros...',

noDataAvailable: 'No hay datos!',

areYouSure: 'Esta seguro?',

save: 'Guardar',

88

saving: 'Guardando',

cancel: 'Cancelar',

error: 'Error',

close: 'Cerrar',

cannotLoadOptionsFor: 'No se pueden argar las opciones para el campo {0}'

}

},

_$mainContainer: null, //Reference to the main container of all elements that are created by this

plug-in (jQuery object)

_$table: null, //Reference to the main <table> (jQuery object)

_$tableBody: null, //Reference to <body> in the table (jQuery object)

_$tableRows: null, //Array of all <tr> in the table (except "no data" row) (jQuery object array)

_$bottomPanel: null, //Reference to the panel at the bottom of the table (jQuery object)

_$busyDiv: null, //Reference to the div that is used to block UI while busy (jQuery object)

_$busyMessageDiv: null, //Reference to the div that is used to show some message when UI is

blocked (jQuery object)

_$errorDialogDiv: null, //Reference to the error dialog div (jQuery object)

_columnList: null, //Name of all data columns in the table (select column and command columns

are not included) (string array)

_fieldList: null, //Name of all fields of a record (defined in fields option) (string array)

_keyField: null, //Name of the key field of a record (that is defined as 'key: true' in the fields

option) (string)

_firstDataColumnOffset: 0, //Start index of first record field in table columns (some columns can

be placed before first data column, such as select checkbox column) (integer)

_lastPostData: null, //Last posted data on load method (object)

_cache: null, //General purpose cache dictionary (object)

_create: function () {

//Initialization

this._normalizeFieldsOptions();

this._initializeFields();

this._createFieldAndColumnList();

//Creating DOM elements

89

this._createMainContainer();

this._createTableTitle();

this._createTable();

this._createBottomPanel();

this._createBusyPanel();

this._createErrorDialogDiv();

this._addNoDataRow();

},

/* Normalizes some options for all fields (sets default values).

_normalizeFieldsOptions: function () {

var self = this;

$.each(self.options.fields, function (fieldName, props) {

self._normalizeFieldOptions(fieldName, props);

});

},

/* Normalizes some options for a field (sets default values).

_normalizeFieldOptions: function (fieldName, props) {

props.listClass = props.listClass || '';

props.inputClass = props.inputClass || '';

},

/* Intializes some private variables.

_initializeFields: function () {

this._lastPostData = {};

this._$tableRows = [];

this._columnList = [];

this._fieldList = [];

this._cache = [];

},

/* Fills _fieldList, _columnList arrays and sets _keyField variable.

_createFieldAndColumnList: function () {

var self = this;

$.each(self.options.fields, function (name, props) {

90

//Add field to the field list

self._fieldList.push(name);

//Check if this field is the key field

if (props.key == true) {

self._keyField = name;

}

//Add field to column list if it is shown in the table

if (props.list != false && props.type != 'hidden') {

self._columnList.push(name);

}

});

},

/* Creates the main container div.

_createMainContainer: function () {

this._$mainContainer = $('<div />')

.addClass('jtable-main-container')

.appendTo(this.element);

},

/* Creates title of the table if a title supplied in options.

_createTableTitle: function () {

var self = this;

if (!self.options.title) {

return;

}

var $titleDiv = $('<div />')

.addClass('jtable-title')

.appendTo(self._$mainContainer);

$('<div />')

.addClass('jtable-title-text')

.appendTo($titleDiv)

.append(self.options.title);

if (self.options.showCloseButton) {

91

var $textSpan = $('<span />')

.html(self.options.messages.close);

$('<button></button>')

.addClass('jtable-command-button jtable-close-button')

.attr('title', self.options.messages.close)

.append($textSpan)

.appendTo($titleDiv)

.click(function (e) {

e.preventDefault();

e.stopPropagation();

self._onCloseRequested();

});

}

},

/* Creates the table.

_createTable: function () {

this._$table = $('<table></table>')

.addClass('jtable')

.appendTo(this._$mainContainer);

this._createTableHead();

this._createTableBody();

},

/* Creates header (all column headers) of the table.

_createTableHead: function () {

var $thead = $('<thead></thead>')

.appendTo(this._$table);

this._addRowToTableHead($thead);

},

/* Adds tr element to given thead element

_addRowToTableHead: function ($thead) {

var $tr = $('<tr></tr>')

.appendTo($thead);

92

this._addColumnsToHeaderRow($tr);

},

/* Adds column header cells to given tr element.

_addColumnsToHeaderRow: function ($tr) {

for (var i = 0; i < this._columnList.length; i++) {

var fieldName = this._columnList[i];

var $headerCell = this._createHeaderCellForField(fieldName,

this.options.fields[fieldName]);

$headerCell.appendTo($tr);

}

},

/* Creates a header cell for given field.

* Returns th jQuery object.

_createHeaderCellForField: function (fieldName, field) {

field.width = field.width || '10%'; //default column width: 10%.

var $headerTextSpan = $('<span />')

.addClass('jtable-column-header-text')

.html(field.title);

var $headerContainerDiv = $('<div />')

.addClass('jtable-column-header-container')

.append($headerTextSpan);

var $th = $('<th></th>')

.addClass('jtable-column-header')

.css('width', field.width)

.data('fieldName', fieldName)

.append($headerContainerDiv);

return $th;

},

/* Creates an empty header cell that can be used as command column headers.

93

_createEmptyCommandHeader: function () {

return $('<th></th>')

.addClass('jtable-command-column-header')

.css('width', '1%');

},

/* Creates tbody tag and adds to the table.

_createTableBody: function () {

this._$tableBody = $('<tbody></tbody>').appendTo(this._$table);

},

/* Creates bottom panel and adds to the page.

_createBottomPanel: function () {

this._$bottomPanel = $('<div />')

.addClass('jtable-bottom-panel')

.appendTo(this._$mainContainer);

$('<div />').addClass('jtable-left-area').appendTo(this._$bottomPanel);

$('<div />').addClass('jtable-right-area').appendTo(this._$bottomPanel);

},

/* Creates a div to block UI while jTable is busy.

_createBusyPanel: function () {

this._$busyMessageDiv = $('<div />').addClass('jtable-busy-

message').prependTo(this._$mainContainer);

this._$busyDiv = $('<div />').addClass('jtable-busy-panel-

background').prependTo(this._$mainContainer);

this._hideBusy();

},

/* Creates and prepares error dialog div.

_createErrorDialogDiv: function () {

var self = this;

self._$errorDialogDiv = $('<div></div>').appendTo(self._$mainContainer);

self._$errorDialogDiv.dialog({

autoOpen: false,

show: self.options.dialogShowEffect,

hide: self.options.dialogHideEffect,

modal: true,

94

title: self.options.messages.error,

buttons: [{

text: self.options.messages.close,

click: function () {

self._$errorDialogDiv.dialog('close');

}

}]

});

},

BASE DE DATO EN MYSQL

-- phpMyAdmin SQL Dump

-- version 3.2.0.1

-- http://www.phpmyadmin.net

-- Servidor: localhost

-- Tiempo de generación: 31-12-2012 a las 08:19:08

-- Versión del servidor: 5.1.37

-- Versión de PHP: 5.3.0

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

-- Base de datos: `pagosnfc`

-- --------------------------------------------------------

-- Estructura de tabla para la tabla `entidades`

CREATE TABLE IF NOT EXISTS `entidades` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`numero_tarjeta` varchar(20) DEFAULT NULL,

`fecha_vencimiento` date DEFAULT NULL,

`codigo_verificacion` varchar(10) DEFAULT NULL,

`cedula` varchar(20) DEFAULT NULL, `nombre` varchar(200) DEFAULT NULL, `fecha_creacion` date DEFAULT NULL, `cupo_asignado` float DEFAULT NULL, `cupo_disponible` float DEFAULT NULL, `minimo_pagar` float DEFAULT NULL, `fecha_tope_pago` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; -- Volcar la base de datos para la tabla `entidades`

95

INSERT INTO `entidades` (`id`, `numero_tarjeta`, `fecha_vencimiento`, `codigo_verificacion`, `cedula`, `nombre`, `fecha_creacion`, `cupo_asignado`, `cupo_disponible`, `minimo_pagar`, `fecha_tope_pago`) VALUES (1, '9898232323233433', '2013-12-31', '1223', '0998989899', 'ROBERTO RAMIREZ', '2012-12-30', 1000, 11, 354, '2012-12-31'), (2, '46465456465', '2012-12-31', '5646', '0924951635', 'DAVID VELIZ', '2012-12-30', 500, 25, 100, '2012-12-24') --------------------------------------------------------

-- Estructura de tabla para la tabla `tarjetas` CREATE TABLE IF NOT EXISTS `tarjetas` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tarjeta` varchar(20) DEFAULT NULL, `codigo` varchar(200) DEFAULT NULL, `tipo` varchar(20) DEFAULT NULL, `imagen` int(11) DEFAULT NULL, `fecha_creacion` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; -- Volcar la base de datos para la tabla `tarjetas` INSERT INTO `tarjetas` (`id`, `tarjeta`, `codigo`, `tipo`, `imagen`, `fecha_creacion`) VALUES (1, '989898982299', '22222', 'Visa', 2130837514, '2012-11-18'), (2, '9898232323233433', '454555', 'Dinners', 2130837505, '2012-11-18'), (3, '3434343', '2323232', 'America', 2130837504, '2012-11-18'), (4, '344566896', '5678', 'America', 2130837504, '2012-12-30'); -- -------------------------------------------------------- -- Estructura de tabla para la tabla `usuarios` CREATE TABLE IF NOT EXISTS `usuarios` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nombre` varchar(200) DEFAULT NULL, `cedula` varchar(15) DEFAULT NULL, `email` varchar(200) DEFAULT NULL, `usuario` varchar(50) DEFAULT NULL, `contrasenia` varchar(200) DEFAULT NULL, `fecha_creacion` date DEFAULT NULL, `estado` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

96

DICCIONARIO DE DATOS

ENTIDADES

ESQUEMA PÁGINA WEB CLAVE PRIMARIA ID CLAVE FORÁNEA N/A OBJETIVO Almacenar la información de las entidades nuevas ingresadas del

sitio web

CAMPO TIPO PERMITE NULO

OBSERVACIÓN

ID INTEGER NO Identificación única para cada entidad

NUMERO_TARJETA INTEGER SI Número de tarjeta relacionada que manejara la entidad

FECHA_VENCIMIENTO DATE SI Fecha de vencimiento de la tarjeta de crédito

CODIGO_VERIFICACION VARCHAR SI Código de verificación de la tarjeta de crédito

CEDULA VARCHAR SI Cédula de identidad del propietario de la tarjeta de crédito

NOMBRE VARCHAR SI Descripción de la entidad que se crean en la pagina web.

FECHA_CREACION DATE SI Fecha de creación de la página web

CUPO_ASIGNADO INTEGER SI Monto máximo que tiene la tarjeta de crédito

CUPO_DISPONIBLE INTEGER SI Cupo que se puede para realizar alguna compra

MINIMO_PAGAR INTEGER SI El valor que debe cancelar el cliente.

FECHA_TOPE_PAGO DATE SI Fecha máxima

97

TARJETAS

ESQUEMA PÁGINA WEB CLAVE PRIMARIA ID CLAVE FORÁNEA N/A OBJETIVO Almacenar la información de las tarjetas de crédito nuevas

ingresadas desde la aplicación de dispositivo móvil.

CAMPO TIPO PERMITE NULO

OBSERVACIÓN

ID INTEGER NO Identificación única para cada tarjeta.

TARJETA INTEGER SI Número de tarjeta crédito creada en el teléfono Android.

CODIGO VARCHAR SI Código de verificación de la tarjeta de crédito.

TIPO VARCHAR SI Tipo de tarjeta de crédito:Visa, Dinner, etc.

IMAGEN INTEGER SI Tipo de imagen a mostrarse al crear una tarjeta de crédito.

FECHA_CREACION DATE SI Fecha de creación de la tarjeta en la página web.

USUARIOS

ESQUEMA PÁGINA WEB CLAVE PRIMARIA ID CLAVE FORÁNEA N/A OBJETIVO Almacenar la información de los usuarios tarjetas de crédito

ingresados desde la aplicación de dispositivo móvil.

98

CAMPO TIPO PERMITE NULO

OBSERVACIÓN

ID INTEGER NO Identificación única para cada usuario

NOMBRE VARCHAR SI Nombre del usuario creado desde el smartphone

CEDULA VARCHAR SI Cédula de identidad del propietario de la tarjeta de crédito

EMAIL VARCHAR SI Correo electrónico del usuario de la aplicación de pago NFC

USUARIO VARCHAR SI Nombre de usuario de login de la aplicación

CONTRASEIA VARCHAR SI Password del usuario que desea realizar el login a la aplicación.

FECHA_CREACION DATE Fecha de registro del usuario en la aplicación de NFC

LIBRERÍAS ADICIONALES PROTOTYPE

Prototype es un framework de JavaScript que permite un rápido desarrollo de

aplicaciones web dinámicas. La versión utilizada en la creación del sitio web es la 1.6

y puede ser descargada desde la página http://www.prototypejs.org/

TABLEORDERER

TableOrderer es un script simple basado en el prototype1.6.0 que permite crear

dinámicamente tablas HTML con capacidad de ordenamiento. Se lo puede descargar

de la página http://prototools.negko.com/demo/tableorderer/