// variante de método base AgregarEtapa, que corrobora que si el documento es legal tiene que ser recibido (pNomRecibio) por el // propio destinatario (base.NombreDestinatario), y devuelve un bool para éxito o fracaso. public override bool AgregarEtapa(DateTime pFechaIngreso, EtapaEnvio.Etapas pEtapa, OficinaPostal pUbicacion, string pFirmaRecibio, string pNombreRecibio, out string pMensajeError) { bool seHace = true; bool exito = false; if (this.esDocLegal) { if (pEtapa == EtapaEnvio.Etapas.Entregado) { if (pNombreRecibio != base.NombreDestinatario) { seHace = false; } } } if (seHace) { exito = base.AgregarEtapa(pFechaIngreso, pEtapa, pUbicacion, pFirmaRecibio, pNombreRecibio, out pMensajeError); } else { pMensajeError = "El nombre de destinatario asociado a este envio no coincide con el nombre de quien lo recibe"; } return(exito); }
//Metodo que me compara envios por fechas de manera descendente //No es lógico ordenar por fecha de entregado si el envío puede no haberse entregado aún //(si está para entregar en la oficina final). Por lo tanto, ordénenlos por fecha de ENVIADO de forma ascendente. int IComparable <Envio> .CompareTo(Envio env) { int retorno = 0; Envio otro = env as Envio; if (otro != null) { // obtengo la etapa actual de los envios porque no se si el envio esta // "ParaEntregar" o "Entregado", ya que me sirven ambos. En el primer caso, tomo la ultima etapaDeEnvio, y en el 2do caso // tomo la penultima etapa. EtapaEnvio.Etapas etapaEnv1 = env.ObtenerEtapaActual().Etapa; EtapaEnvio.Etapas etapaOtroEnv2 = env.ObtenerEtapaActual().Etapa; int intRestarDeEnv1; int intRestarDeOtroEnv2; if (etapaEnv1 == EtapaEnvio.Etapas.ParaEntregar) { intRestarDeEnv1 = 1; } else { intRestarDeEnv1 = 2; } if (etapaOtroEnv2 == EtapaEnvio.Etapas.ParaEntregar) { intRestarDeOtroEnv2 = 1; } else { intRestarDeOtroEnv2 = 2; } // busco la ultima etapa del envio ("[XX.Count-1]") y busco la fecha de esa etapa, para compararla con la del otro envio retorno = this.EtapasDelEnvio[this.EtapasDelEnvio.Count - intRestarDeEnv1].FechaIngreso. CompareTo(env.EtapasDelEnvio[env.EtapasDelEnvio.Count - intRestarDeOtroEnv2].FechaIngreso); } return(retorno); }
// 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); }