// devuelve la etapaEnvio que tiene el enum EnOrigen public EtapaEnvio DevolverEtapaEnOrigen() { EtapaEnvio enOrigen = null; foreach (EtapaEnvio etapa in this.etapasDelEnvio) { if (etapa.Etapa == EtapaEnvio.Etapas.EnOrigen) { enOrigen = etapa; } } return(enOrigen); }
// para el envio actual, determina el precioFinal del mismo, sólo si es un envio que fue entregado y la fecha de ingreso // se encuentra entre las fechas provistas. De forma contraria, el total es igual a 0 public decimal TotalFacturado(DateTime pFechaInicio, DateTime pFechaFinal) { decimal total = 0M; EtapaEnvio etapaActual = this.ObtenerEtapaActual(); if (etapaActual.Etapa == EtapaEnvio.Etapas.Entregado && etapaActual.FechaIngreso >= pFechaInicio && etapaActual.FechaIngreso <= pFechaFinal) { total = this.PrecioFinal; } return(total); }
// constructor convencional public Envio(string pNomDestinatario, Direccion pDirDestino, DateTime pFechaIngreso, OficinaPostal pOficinaIngreso) // <-- firmaRecibio: imagen! { this.NroEnvio = Envio.ultNroEnvio; Envio.ultNroEnvio += 1; // si pongo una propiedad en el atributo, cambiar aca <--- this.NombreDestinatario = pNomDestinatario; this.DirDestinatario = pDirDestino; this.EtapasDelEnvio = new List <EtapaEnvio>(); // si se crea un envio nuevo, en el constructor, de forma automática, se crea la primer // etapa del envio, por eso este constructor toma como parametros tambien la fecha de ingreso // y la oficina en la que ingresó: EtapaEnvio unaEtapa = new EtapaEnvio(pFechaIngreso, EtapaEnvio.Etapas.EnOrigen, pOficinaIngreso); // agrego esa etapa en la lista de etapas recorridas de este envío this.EtapasDelEnvio.Add(unaEtapa); this.FechaIngreso = this.etapasDelEnvio[0].FechaIngreso; }
// revisa las fechas de ingreso de cada etapaDeEnvio, para quedarse con la etapa que tiene la fecha más cercana al // día actual (la ultima fecha encontrada), y devolver el enum de Etapas en que se encuentra esa Etapa, que es el estado // actual del envio <---- public EtapaEnvio ObtenerEtapaActual() { DateTime ultimaFecha = DateTime.MinValue; EtapaEnvio etapaActual = null; if (this.etapasDelEnvio != null && this.etapasDelEnvio.Count > 0) { foreach (EtapaEnvio etp in this.etapasDelEnvio) { if (etp.FechaIngreso >= ultimaFecha) { etapaActual = etp; ultimaFecha = etapaActual.FechaIngreso; } } } return(etapaActual); }
/*Devuelve el total facturado de ese cliente dado un intervalo*/ public decimal TotalFacturadoEnIntervalo(DateTime pFechaInicio, DateTime pFechaFinal) { decimal total = 0M; if (enviosCliente != null && enviosCliente.Count > 0) { foreach (Envio env in enviosCliente) { EtapaEnvio etapaActual = env.ObtenerEtapaActual(); if (etapaActual.Etapa == EtapaEnvio.Etapas.Entregado && etapaActual.FechaIngreso >= pFechaInicio && etapaActual.FechaIngreso <= pFechaFinal) { total = total + env.PrecioFinal; } } } return(total); }
// agregar etapas de rastreo al envío. Es polimórfico para EnvioDocumento, porque Documento necesita corroborar quien // recibe el envio para agregarla (ver metodo en EnvioDocumento) public virtual bool AgregarEtapa(DateTime pFechaIngreso, EtapaEnvio.Etapas pEtapa, OficinaPostal pUbicacion, string pFirmaRecibio, string pNombreRecibio, out string pMensajeError) { string mensajeError = ""; bool sePuedeAgregar = false; EtapaEnvio etapaActual = this.ObtenerEtapaActual(); if (pFechaIngreso >= etapaActual.FechaIngreso) { // como EnOrigen se crea automaticamente con la creación del envío, no se puede utilizar nunca if (pEtapa != EtapaEnvio.Etapas.EnOrigen) { // revisa secuencialidad if (pEtapa >= etapaActual.Etapa) { // revisa si la etapa actual es igual que la anterior, porque solo voy a permitir esto para la etapa enTransito if (etapaActual.Etapa == pEtapa) { // si la etapa actual es enTransito, se va a poder solo si estan en != oficinas if (pEtapa == EtapaEnvio.Etapas.EnTransito) { // si la oficina es la misma que la anterior no deja ingresar la etapa (esto es para todos menos pEtapa = Entregado) if (etapaActual.Ubicacion != pUbicacion) { sePuedeAgregar = true; } else { mensajeError = "La oficina postal no puede ser igual a la etapa anterior excepto para Entregado"; } } else { mensajeError = "La etapa de envío no puede ser igual a la anterior a menos que el envío esté en tránsito"; } } // si la anterior y la que se pretende ingresar no son iguales (o sea, la nueva es mayor que la actual) else { // si la etapa actual es Origen o Transito y es != de la nueva if (etapaActual.Etapa == EtapaEnvio.Etapas.EnOrigen || etapaActual.Etapa == EtapaEnvio.Etapas.EnTransito) { // no pasar a Entregado desde una etapa diferente que no sea ParaEntregar if (pEtapa == EtapaEnvio.Etapas.Entregado) { mensajeError = "Aún no se puede entregar este envío porque se encuentra enOrigen/enTránsito"; } // si quiero pasar a ParaEntregar, tengo que checkear que la direccion de la oficina final sea // distinta que donde entró el emvio inicialmente else if (pEtapa == EtapaEnvio.Etapas.ParaEntregar) { if (pUbicacion != this.DevolverEtapaEnOrigen().Ubicacion) { sePuedeAgregar = true; } else { mensajeError = "No se puede entregar un envío en la misma oficina que la de origen"; } } else { if (pUbicacion != etapaActual.Ubicacion) { sePuedeAgregar = true; } else { mensajeError = "La oficina postal no puede ser igual a la etapa anterior excepto para Entregado"; } } } // si voy a agregar etapa Entregado (estando en ParaEntregar), tiene que ser en la misma oficina else if (etapaActual.Etapa == EtapaEnvio.Etapas.ParaEntregar) { if (etapaActual.Ubicacion == pUbicacion) { sePuedeAgregar = true; } else { mensajeError = "El envío se debe entregar en la misma oficina donde se categorizó Para Entregar"; } } } } else { mensajeError = "La etapa seleccionada ya no se puede ingresar para este envio"; } } else { mensajeError = "La etapa seleccionada ya no se puede ingresar para este envio"; } } else { mensajeError = "La fecha ingresada tiene que ser igual o posterior a la ingresada en la etapa previa"; } if (sePuedeAgregar) { EtapaEnvio etp = new EtapaEnvio(pFechaIngreso, pEtapa, pUbicacion); if (pEtapa == EtapaEnvio.Etapas.Entregado) { this.nombreRecibio = pNombreRecibio; this.firmaRecibio = pFirmaRecibio; } if (pEtapa == EtapaEnvio.Etapas.ParaEntregar) { this.fechaIngresoParaEntregar = pFechaIngreso.ToString(); } this.EtapasDelEnvio.Add(etp); mensajeError = "Se ha agregado la nueva etapa exitosamente!!"; } pMensajeError = mensajeError; return(sePuedeAgregar); }