/* BusinessLogicImplVenta.java * */

Anuncio
/*
* 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
1
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"),(Strin
{
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_C
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=?";
2
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()));
}
3
/**
* 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
4
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"));
5
}
}
}
}
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
6
**/
private int getIdSesion(KernelFields kf) {
int idSesion;
idSesion=((RecordImplSesion)BLSession.createRecord("Sesion")).findIdSesion((String)kf.getValue("Id_Cine"),(String
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
7
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) {
8
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 " +
9
" 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
**/
10
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);
11
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");
}
}
12
Descargar