Informática

Programación. Lenguaje. Java. Gráfica

  • Enviado por: Paco
  • Idioma: castellano
  • País: España España
  • 10 páginas
publicidad
publicidad

/*

* BusinessLogicImplVenta.java

*

*/

package org.app.antares.businesslogic;

import org.elf.businesslayer.*;

import org.elf.businesslayer.kernel.services.record.*;

import org.elf.businesslayer.kernel.services.record.businesslogic.*;

import org.elf.common.MiscUtil;

import org.elf.datalayer.*;

public class BusinessLogicImplVenta extends BusinessLogic {

/**

* Método que se llama antes de hacer una acción sobre el Record

* y que debe comprobar si los datos que hay en el Record

* con correctos.

*

* @param blv Contexto desde el que se llama a la lógica de negocio

*/

public void validate(BusinessLogicContextValidate blv) {

if (blv.getOperation()==BusinessLogicOperation.INSERT) {

{//Validar el Nº de tarjeta en la inserción

String numTarjeta=(String)blv.getFields().getValue("NumTarjeta");

String tipoTarjeta=(String)blv.getFields().getValue("Id_TPTarjeta");

if ((numTarjeta!=null) && (tipoTarjeta!=null)) {

//Validar el Nº de tarjeta según el tipo

if (isValidCardType(numTarjeta,tipoTarjeta)==false) {

blv.getMessages().addMessage("La numeración no es válida para el tipo de tarjeta");

}

//Validar el dígito de control

if (isValidCCNumber(numTarjeta)==false) {

blv.getMessages().addMessage("El número de la tarjeta no es válido");

}

}

}

{//Validar si los importes son correctos

if (!blv.getFields().getValue("Total_Importe").equals(getTotalImporte((Integer)blv.getFields().getValue("Id_Venta")))) {

blv.getMessages().addMessage("El importe total no es correcto");

}

if (!blv.getFields().getValue("Total_Gastos").equals(getTotalGastos((Integer)blv.getFields().getValue("Id_Venta"),(String)blv.getFields().getValue("Id_Canal"),(String)blv.getFields().getValue("Id_Cine")))) {

blv.getMessages().addMessage("El total de los gastos no correcto");

}

}

{ //Validar Si las entradas pertencen a la sesión

int idSesion=((RecordImplSesion)BLSession.createRecord("Sesion")).findIdSesion((String)blv.getFields().getValue("Id_Cine"),(String)blv.getFields().getValue("Id_Sala"),(DLDate)blv.getFields().getValue("FechaSesion"),(String)blv.getFields().getValue("HoraSesion"));

RecordSet rstEntradasSesion;

Parameters entradasSesionParameters=new Parameters();

entradasSesionParameters.addParameter(idSesion,DataType.DT_INT);

entradasSesionParameters.addParameter(blv.getFields().getValue("Id_Venta"),DataType.DT_INT);

String sql="SELECT * FROM Entrada E WHERE E.Id_Sesion<>? AND E.Id_Venta=?";

rstEntradasSesion=DLSession.getConnection().executeQuery(sql,entradasSesionParameters);

if (rstEntradasSesion.next()) {

//Si entramos pos aqui es qe hay entradas para esta venta en otra sesión y eso no puede ser

blv.getMessages().addMessage("Ya existen entradas para otra sesión en esta venta,debe borrarlas primero");

}

}

}

}

/**

* Método que se llama después de crear una nueva fila en memoria

*

* @param bl Contexto desde el que se llama a la lógica de negocio

*/

public void postNew(BusinessLogicContext bl) {

//Poner la hora de la venta

bl.getFields().setValue("Fecha_Venta",new DLDateTime());

}

/**

* Método que se llama antes de actualizar una fila en la base de datos

*

* @param bl Contexto desde el que se llama a la lógica de negocio

*/

public void preUpdate(BusinessLogicContext bl) {

//Calculamos el Id_Sesion

bl.getFields().setValue("Id_Sesion",getIdSesion(bl.getFields()));

}

/**

* Método que se llama antes de insertar una nueva fila en la base de datos

*

* @param bl Contexto desde el que se llama a la lógica de negocio

*/

public void preInsert(BusinessLogicContext bl) {

//Calculamos el Id_Sesion en función del resto de datos virtuales del Record

bl.getFields().setValue("Id_Sesion",getIdSesion(bl.getFields()));

}

public void postRead(BusinessLogicContext bl) {

{ //Obtener los datos de la SESION y ponerlos en los campos virtuales del Record

Messages messages=new Messages();

Record rstSesion=BLSession.createRecord("Sesion");

rstSesion.getFields().setValue("Id_Sesion",bl.getFields().getValue("Id_Sesion"));

if (rstSesion.read(messages,false)==false) {

throw new RuntimeException("No existe la sesión:" + bl.getFields().getValue("Id_Sesion"));

}

bl.getFields().setValue("Id_Cine",rstSesion.getFields().getValue("Id_Cine"));

bl.getFields().setValue("Id_Sala",rstSesion.getFields().getValue("Id_Sala"));

bl.getFields().setValue("FechaSesion",rstSesion.getFields().getValue("Fecha_Hora"));

DLDateTime dt=(DLDateTime)rstSesion.getFields().getValue("Fecha_Hora");

String horaSesion=MiscUtil.numberToStringZeroPadding(dt.getDateParts().getHour(),2) + ":" + MiscUtil.numberToStringZeroPadding(dt.getDateParts().getMinute(),2);

bl.getFields().setValue("HoraSesion",horaSesion);

}

{ //Obtener el valor del campo virtual Nº de entradas

RecordSet rstNumEntradas=DLSession.getConnection().executeQuery("SELECT COUNT(*) FROM Entrada WHERE Id_Venta=?",bl.getFields().getValue("Id_Venta"),bl.getFields().getDefColumn("Id_Venta").getDataType());

rstNumEntradas.next();

bl.getFields().setValue("NumEntradas",rstNumEntradas.getObject(0));

}

}

/**

* Método que se llama antes de borrar una fila en la base de datos

*

* @param bl Contexto desde el que se llama a la lógica de negocio

*/

public void preDelete(BusinessLogicContext bl) {

{//Borramos todas las entradas de esta venta

RecordSet rstEntradas=DLSession.getConnection().executeQuery("SELECT Id_Entrada FROM Entrada WHERE Id_Venta=?",bl.getFields().getValue("Id_Venta"),bl.getFields().getDefColumn("Id_Venta").getDataType());

while (rstEntradas.next()) {

Record recordEntrada=BLSession.createRecord("Entrada");

recordEntrada.getFields().setValue("Id_Entrada",rstEntradas.getObject("Id_Entrada"));

if (recordEntrada.read(new Messages(),true)==false) {

throw new RuntimeException("No existe la entrada " + recordEntrada.getFields().getValue("Id_Entrada"));

}

if (recordEntrada.edit(new Messages(),true)==false) {

throw new RuntimeException("No se ha posido editar la entrada " + recordEntrada.getFields().getValue("Id_Entrada"));

}

if (recordEntrada.delete(new Messages(),true)==false) {

throw new RuntimeException("No se ha posido borrar la entrada " + recordEntrada.getFields().getValue("Id_Entrada"));

}

}

}

}

public void preCancel(BusinessLogicContext bl) {

{//Borramos todas las entradas de esta venta

RecordSet rstEntradas=DLSession.getConnection().executeQuery("SELECT Id_Entrada FROM Entrada WHERE Id_Venta=?",bl.getFields().getValue("Id_Venta"),bl.getFields().getDefColumn("Id_Venta").getDataType());

while (rstEntradas.next()) {

Record recordEntrada=BLSession.createRecord("Entrada");

recordEntrada.getFields().setValue("Id_Entrada",rstEntradas.getObject("Id_Entrada"));

if (recordEntrada.read(new Messages(),true)==false) {

throw new RuntimeException("No existe la entrada " + recordEntrada.getFields().getValue("Id_Entrada"));

}

if (recordEntrada.edit(new Messages(),true)==false) {

throw new RuntimeException("No se ha posido editar la entrada " + recordEntrada.getFields().getValue("Id_Entrada"));

}

if (recordEntrada.delete(new Messages(),true)==false) {

throw new RuntimeException("No se ha posido borrar la entrada " + recordEntrada.getFields().getValue("Id_Entrada"));

}

}

}

}

/**

* Obtiene el "Id_Sesion" en función de los datos de la sala , fecha y hora

**/

private int getIdSesion(KernelFields kf) {

int idSesion;

idSesion=((RecordImplSesion)BLSession.createRecord("Sesion")).findIdSesion((String)kf.getValue("Id_Cine"),(String)kf.getValue("Id_Sala"),(DLDate)kf.getValue("FechaSesion"),(String)kf.getValue("HoraSesion"));

return idSesion;

}

/**

* Obtiene si el nº de una tarjeta es válida en función del tipo de tarjeta

* @param number Nº de la tarjeta

* @param cardType Tipo de la tarjeta, siendo:

* VI: Visa

* AE: American Express

* MC: Master Card

* @retrun Retorna 'true' si la numeración de la tarjeta es válida según su tipo , sino 'false'

**/

static public boolean isValidCardType(String number,String cardType) {

boolean valid=false;

if (number.length()>=4) {

if (cardType.equals("VI")) {

if ( (number.substring(0,1).equals("4")) && ((number.length()==13) || (number.length()==16))) {

//Es una VISA

valid=true;

}

} else if (cardType.equals("AE")) {

if ((number.substring(0,2).equals("34") || number.substring(0,2).equals("37")) && (number.length()==15)) {

//Es una American Express

valid=true;

}

} else if (cardType.equals("MC")) {

if ( ((number.substring(0,2).compareTo("51")>=0 && number.substring(0,2).compareTo("55")<=0)) && (number.length()==16)) {

//Es una Master Card

valid=true;

}

}

}

return valid;

}

/**

* Comprueba si el número de una tarjeta es válido

* @param numbre Nº de la tarjeta

* @retrun Retorna 'true' si el número es válido , sino retorna false

*/

static public boolean isValidCCNumber(String number) {

int j=number.length();

String [] s1 = new String[j];

for (int i=0; i < number.length(); i++) {

s1[i] = "" + number.charAt(i);

}

int checksum=0;

for (int i=s1.length-1; i >= 0; i-= 2) {

int k = 0;

if (i > 0) {

k = Integer.valueOf(s1[i-1]).intValue() * 2;

if (k > 9) {

String s = "" + k;

k = Integer.valueOf(s.substring(0,1)).intValue() +

Integer.valueOf(s.substring(1)).intValue();

}

checksum += Integer.valueOf(s1[i]).intValue() + k;

} else {

checksum += Integer.valueOf(s1[0]).intValue();

}

}

return ((checksum % 10) == 0);

}

/**

* Obtene el importe de una venta

* @param idVenta Identificarador de la venta sobre la que se buscan las entradas

* @param fechaSesion Fecha de la sesión

* @return Importe de la venta

**/

static public Object getTotalImporte(int idVenta) {

String sql=

" SELECT " +

" SUM(Precio_Entrada) " +

" FROM " +

" Entrada " +

" WHERE " +

" Entrada.Id_Venta=? ";

RecordSet rst=DLSession.getConnection().executeQuery(sql,idVenta,DataType.DT_INT);

rst.next();

return BLSession.createValue(rst.getDouble(0),"Venta.Total_Importe");

}

/**

* Obtiene los gastos que tiene una venta

* @param idVenta Identificarador de la venta sobre la que se calculan los gasto

* @param idCanal Canal de venta de las entradas

* @return Gastos de la venta

**/

static public Object getTotalGastos(int idVenta,String idCanal,String idCine) {

double totalGastos;

//No hay gastos en taquilla

if ("TA".equalsIgnoreCase(idCanal)) {

totalGastos=0;

} else {

totalGastos=getNumEntradasVenta(idVenta)*getGastosGestionCine(idCine);

}

return BLSession.createValue(totalGastos,"Venta.Total_Gastos");

}

/**

* Obtene El nº de entradas de esta venta

* @param idVenta Identificarador de la venta sobre la que se buscan las entradas

* @return Importe de la venta

**/

static public int getNumEntradasVenta(int idVenta) {

String sql=

" SELECT " +

" COUNT(*) " +

" FROM " +

" Entrada " +

" WHERE " +

" Entrada.Id_Venta=?";

RecordSet rst=DLSession.getConnection().executeQuery(sql,idVenta,DataType.DT_INT);

rst.next();

return rst.getInt(0);

}

/**

* Obtiene los gastos asociados a un cine

* @param idCine Identificarador del cine sobre el que se obtienen el gasto asociado

* @return

**/

static public double getGastosGestionCine(String idCine) {

Record r=BLSession.createRecord("Cine");

r.getFields().setValue("Id_Cine",idCine);

if (r.read(new Messages(),true)==false) { throw new RuntimeException("No ha sido posible obtener los datos del cine:" + idCine); }

return (Double)r.getFields().getValue("Gatos_Gestion");

}

static public int getIdTarifa(int idSesion) {

Record r=BLSession.createRecord("Sesion");

r.getFields().setValue("Id_Sesion",idSesion);

if (r.read(new Messages(),true)==false) { throw new RuntimeException("No se han podido leer los datos de la sesión"); }

return (Integer)r.getFields().getValue("Id_Tarifa");

}

}