Hola, a ver si le sucede a alguien más esto..
1.-
Tengo un referencia marcada con @NoFrame, y al cargar la entidad de inicio se ve bien, pero cuando se carga la referencia, pone el marco????
2.-
Tengo un grupo con propiedades de sólo lectura y no puedo cerrarlo como los demás, tengo que pulsar F5 para verlo cerrado o abierto después de pulsar la flechita. Con el resto de marcos no sucede.
3.-
No pueden existir dos grupos que se llamen igual, los confunde la interfaz de usuario y pinta lo de uno de ellos en todos los grupos que se llamen igual, aunque las propiedades definidas en la vista sean otras
Last edit: JOSE ELIAS 2014-08-07
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
He probado los puntos 1 y 2 y a mi no me falla, ¿podrías poner el código?
No pueden existir dos grupos que se llamen igual
Normal, ¿no? Si en Java intentas poner dos propiedades con el mismo nombre te da error de compilación. Yo lo veo normal. El nombre del grupo lo identifica, no puedes repetirlo. Permitir nombre de grupo repetidos sería dificil de implementar en OpenXava, pero también sería confuso para el programador, por ejemplo si quisieras ocultar unos de los dos grupos que se llaman igual, ¿qué nombre tendrías que poner en el setHidden()? Permitir nombres duplicados no tiene sentido.
Si quieres que de cara al usuario tengan la misma etiqueta modifica los archivos i18n.
Ayuda a otros en este foro como yo te ayudo a ti.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
//para tener el total del importe de la factura
@Stereotype("DINERO")
public BigDecimal getSumaImporte(){
BigDecimal suma = new BigDecimal(0.00);
if( this.getConceptos() != null ){
for(DetalleFacturaRecibida pos: this.getConceptos() )
suma = suma.add(pos.getImporte());
}
return suma;
}//end--getSumaImporte
//para tener el total de la cuota de iva
@Stereotype("DINERO")
public BigDecimal getSumaCuota(){
BigDecimal suma = new BigDecimal(0.00);
if( this.getConceptos() != null ){
for(DetalleFacturaRecibida pos: this.getConceptos() )
suma = suma.add(pos.getCuota());
}
return suma;
}//end--getSumaCuota
//para tener el total de la factura
@Stereotype("DINERO")
public BigDecimal getSumaTotal(){
BigDecimal suma = new BigDecimal(0.00);
if( this.getConceptos() != null ){
for(DetalleFacturaRecibida pos: this.getConceptos() )
suma = suma.add(pos.getTotal());
}
return suma;
}//end--getSumaTotal
////////métodos de retrollamada////////////////////////////////////////////////////////////////////
//actualizar las partidas del documento contable
@PostPersist @PostUpdate
public void actualizarPartidasContables(){
System.out.println(getClass().getName() + "::actualizarPartidasContables");
//////////////////////////1.-GASTO
System.out.println("Importe de gasto:" + getSumaImporte().toString());
if( getSumaImporte().compareTo(BigDecimal.ZERO) != 0){ //si tiene valos distinto de 0
System.out.println("Generando partida contable de línea de GASTO...");
if ( getLineaGasto() == null) //si no hay línea de gasto registrada la creamos
setLineaGasto(new DetalleDocumentoContable()); //la asociamos a la factura
getLineaGasto().setDocumento(this);
getLineaGasto().setConcepto(getTipoGasto());
getLineaGasto().setNombre(getTipoGasto().getNombre());
getLineaGasto().setImporte(getSumaImporte().abs()); //el importe contable siempre en positivo
getLineaGasto().setFechaVencimiento(getFechaContable());
if( getSumaImporte().compareTo(BigDecimal.ZERO) >= 0 ) //si es positivo
getLineaGasto().setClavePosicion(DetalleDocumentoContable.Posiciones.D);
else //importe en negativo, es un abono
getLineaGasto().setClavePosicion(DetalleDocumentoContable.Posiciones.H);
//si no están creadas las posiciones las creamos
if ( getPosiciones() == null)
setPosiciones(new ArrayList<DetalleDocumentoContable>());
//incluir como partida contable la línea de gasto generada
getPosiciones().add(getLineaGasto());
}//endif-getSumaImporte
else{ //no funciona quitar la línea automáticamente
setLineaGasto(null); //quitar la FK de factura
}
/////////////////////////2.-CUOTA DE IVA DE LA FACTURA
System.out.println("Importe de IVA de factura:" + getSumaCuota().toString());
if( getSumaCuota().compareTo(BigDecimal.ZERO) != 0){ //si tiene valos distinto de 0
System.out.println("Generando partida contable de línea de IVA...");
if ( getLineaIva() == null) //si no hay línea de gasto registrada la creamos
setLineaIva(new DetalleDocumentoContable()); //la asociamos a la factura
getLineaIva().setDocumento(this);
getLineaIva().setConcepto(getTipoIva());
getLineaIva().setNombre(getTipoIva().getNombre());
getLineaIva().setImporte(getSumaCuota().abs()); //el importe contable siempre en positivo
getLineaIva().setFechaVencimiento(getFechaContable());
if( getSumaCuota().compareTo(BigDecimal.ZERO) >= 0 ) //si es positivo
getLineaIva().setClavePosicion(DetalleDocumentoContable.Posiciones.D);
else //importe en negativo, es un abono
getLineaIva().setClavePosicion(DetalleDocumentoContable.Posiciones.H);
//incluir como partida contable la línea de gasto generada
getPosiciones().add(getLineaIva());
}//endif-getSumaImporte
else{ //no funciona quitar la línea automáticamente
setLineaIva(null); //quitar la FK de factura
}
/////////////////////////3.-TOTAL, PARTE PTE DE PAGO AL PROVEEDOR
System.out.println("Importe de total de factura:" + getSumaTotal().toString());
if( getSumaTotal().compareTo(BigDecimal.ZERO) != 0){ //si tiene valos distinto de 0
System.out.println("Generando partida contable de línea de TOTAL...");
if ( getLineaTotal() == null) //si no hay línea de gasto registrada la creamos
setLineaTotal(new DetalleDocumentoContable()); //la asociamos a la factura
getLineaTotal().setDocumento(this);
getLineaTotal().setConcepto(getConceptoAsociado());
getLineaTotal().setNombre(getConceptoAsociado().getNombre());
getLineaTotal().setImporte(getSumaTotal().abs()); //el importe contable siempre en positivo
getLineaTotal().setPersona(getProveedor());
getLineaTotal().setFechaVencimiento(getFechaVencimiento());
if( getSumaTotal().compareTo(BigDecimal.ZERO) >= 0 ) //si es positivo
getLineaTotal().setClavePosicion(DetalleDocumentoContable.Posiciones.H);
else //importe en negativo, es un abono
getLineaTotal().setClavePosicion(DetalleDocumentoContable.Posiciones.D);
//incluir como partida contable la línea de gasto generada
getPosiciones().add(getLineaTotal());
}//endif-getSumaImporte
else{ //no funciona quitar la línea automáticamente
setLineaTotal(null); //quitar la FK de factura
}
}//end-actualizarPartidasContables
//clase mapeada para usarse como clave autogenerada donde se requiera
@MappedSuperclass
@View(members="Datos de Registro[creado, creadoPor, modificado, modificadoPor, bloqueado];")
public class Identificable {
@Id
@Column(length=4)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer oid;
@Column(length=15)
@Stereotype("FECHAHORA")
@ReadOnly
private Date creado;
@ReadOnly
@Column(length=15)
private String creadoPor;
@Column(length=15)
@Stereotype("FECHAHORA")
@ReadOnly
private Date modificado;
@ReadOnly
@Column(length=15)
private String modificadoPor;
private Boolean bloqueado; //xa bloquear una entidad(maestra)
private Boolean eliminado; //para marcar una entidad como eliminada
@Column(length=50)
@ReadOnly(forViews="Establecimiento")
private String nombre; //literal para todas las entidades
//////////// getter y setter ////////////////////////////////
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
public Date getCreado() {
return creado;
}
public void setCreado(Date creado) {
this.creado = creado;
}
public String getCreadoPor() {
return creadoPor;
}
public void setCreadoPor(String creadoPor) {
this.creadoPor = creadoPor;
}
public Date getModificado() {
return modificado;
}
public void setModificado(Date modificado) {
this.modificado = modificado;
}
public String getModificadoPor() {
return modificadoPor;
}
public void setModificadoPor(String modificadoPor) {
this.modificadoPor = modificadoPor;
}
public Boolean getEliminado() {
return eliminado;
}
public void setEliminado(Boolean eliminado) {
if(eliminado==null)
this.eliminado=false;
else
this.eliminado = eliminado;
}
public Boolean getBloqueado() {
return bloqueado;
}
public void setBloqueado(Boolean bloqueado) {
if(bloqueado==null)
this.bloqueado=false;
else
this.bloqueado = bloqueado;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
/**********Métodos de retrollamada JPA*********************************************************************/
/* En la primera grabación, Admin, quitar los @Pre */
//en la primera grabación, empleado que realiza la grabación
@PrePersist
public void registraCreado() throws Exception {
//recuperar el empleado - usuario conectado
String usuario;
usuario = Users.getCurrent();
//si no es la creacion del propio administrador
this.setCreadoPor(usuario);
this.setCreado(new java.util.Date());
if( this.getBloqueado() == null)
this.setBloqueado(false);
if( this.getEliminado() == null)
this.setEliminado(false);
}//registraCreado
//actualización de modificado en cada grabación
@PreUpdate
@PreDelete
public void registraModificado() throws Exception {
//recuperar el empleado - usuario conectado
String usuario;
usuario = Users.getCurrent();
this.setModificadoPor(usuario);
this.setModificado(new java.util.Date());
if( this.getBloqueado() == null)
this.setBloqueado(false);
if( this.getEliminado() == null)
this.setEliminado(false);
}//registraModificado*/
}//endclass
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
antes de nada actualizate a XavaPro 5.0.1, porque en él están corregidos muchos bugs relacionados con el nuevo renderer y es fácil que se arregle tu problema.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Estuve de vacaciones con la publicación e intenté la descarga pero tuve muchos problemas de conexión y he perdido, por tiempo, la posibilidad de descargarlo. No sé si es posible recuperar el link de descarga.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola Javier,
el problema con los marcos no se ha resuelto. No he comentado que el problema viene con las propiedades de clases heredadas visualizadas en la clase que extiende.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
necesito un código lo suficientemente sencillo para que lo pueda copiar y pegar en mi entorno y reproducirlo, el código que adjuntas tienes demasiadas referencias. Si al menos supiera porque es podria hacerme yo mismo el ejemplo, pero todos los casos que he probado me funcionan bien.
Crea un pequeño proyecto nuevo y pega en él tu clase. Después simplifícala lo más posible, si es posible quitando todas las referencias a las demás clases. Comprueba que con ese código te sigue dando el problema y adjunta aquí las clases de ese proyecto (idealmente una, aunque pudieran ser más). Lo probaré.
Ayuda a otros en este foro como yo te ayudo a ti.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
//clase mapeada para usarse como clave autogenerada donde se requiera
@MappedSuperclass
@View(members="Datos de Registro[creado, creadoPor, modificado, modificadoPor, bloqueado];")
public class Identificable {
@Id
@Column(length=4)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer oid;
@Column(length=15)
@Stereotype("FECHAHORA")
@ReadOnly
private Date creado;
@ReadOnly
@Column(length=15)
private String creadoPor;
@Column(length=15)
@Stereotype("FECHAHORA")
@ReadOnly
private Date modificado;
@ReadOnly
@Column(length=15)
private String modificadoPor;
private Boolean bloqueado; //xa bloquear una entidad(maestra)
private Boolean eliminado; //para marcar una entidad como eliminada
@Column(length=50)
private String nombre; //literal para todas las entidades
//////////// getter y setter ////////////////////////////////
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
public Date getCreado() {
return creado;
}
public void setCreado(Date creado) {
this.creado = creado;
}
public String getCreadoPor() {
return creadoPor;
}
public void setCreadoPor(String creadoPor) {
this.creadoPor = creadoPor;
}
public Date getModificado() {
return modificado;
}
public void setModificado(Date modificado) {
this.modificado = modificado;
}
public String getModificadoPor() {
return modificadoPor;
}
public void setModificadoPor(String modificadoPor) {
this.modificadoPor = modificadoPor;
}
public Boolean getEliminado() {
return eliminado;
}
public void setEliminado(Boolean eliminado) {
if(eliminado==null)
this.eliminado=false;
else
this.eliminado = eliminado;
}
public Boolean getBloqueado() {
return bloqueado;
}
public void setBloqueado(Boolean bloqueado) {
if(bloqueado==null)
this.bloqueado=false;
else
this.bloqueado = bloqueado;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
/**********Métodos de retrollamada JPA*********************************************************************/
/* En la primera grabación, Admin, quitar los @Pre */
//en la primera grabación, empleado que realiza la grabación
@PrePersist
public void registraCreado() throws Exception {
//recuperar el empleado - usuario conectado
String usuario;
usuario = Users.getCurrent();
//si no es la creacion del propio administrador
this.setCreadoPor(usuario);
this.setCreado(new java.util.Date());
if( this.getBloqueado() == null)
this.setBloqueado(false);
if( this.getEliminado() == null)
this.setEliminado(false);
}//registraCreado
//actualización de modificado en cada grabación
@PreUpdate
@PreDelete
public void registraModificado() throws Exception {
//recuperar el empleado - usuario conectado
String usuario;
usuario = Users.getCurrent();
this.setModificadoPor(usuario);
this.setModificado(new java.util.Date());
if( this.getBloqueado() == null)
this.setBloqueado(false);
if( this.getEliminado() == null)
this.setEliminado(false);
}//registraModificado*/
}//endclass
package com.openxava.oxsigo.modelo;
import javax.persistence.*;
import org.openxava.annotations.*;
/
* marco - clase de prueba para fallo de cierre de marcos
* @author jegomez
/
@Entity
@View(extendsView = "super.DEFAULT",members="; oid, nombre")
public class marco extends Identificable {
}
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Se supone que el nombre de grupo debería ser un identificador válido de Java y por ende no tener espacios. Pero parece que eso no es tan obvio como yo pensaba.
Realmente no es un bug, pero añadelo como tal para que piense en una solución para que no volvamos a perder tiempo otra vez por algo así.
Ayuda a otros en este foro como yo te ayudo a ti.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Mi humilde opinión es mantenerlo cómo está y "aprender lo que hay que aprender" que para eso está.
Estoy de acuerdo en no soportar el espacio como nombre de identificador. Lo que quiero evitar es que otros programadores en el futuro tengan que perder varias depurando, como nos ha tocado hacer ahora a nosotros. Quizás una excepción diciendo "Blancos no permitidos como nombres de módulos" o simpemente un mensaje de advertencia en el log podría ayudar bastante.
Sí, añadelo como bug, veré como lo puedo mejorar.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola, a ver si le sucede a alguien más esto..
1.-
Tengo un referencia marcada con @NoFrame, y al cargar la entidad de inicio se ve bien, pero cuando se carga la referencia, pone el marco????
2.-
Tengo un grupo con propiedades de sólo lectura y no puedo cerrarlo como los demás, tengo que pulsar F5 para verlo cerrado o abierto después de pulsar la flechita. Con el resto de marcos no sucede.
3.-
No pueden existir dos grupos que se llamen igual, los confunde la interfaz de usuario y pinta lo de uno de ellos en todos los grupos que se llamen igual, aunque las propiedades definidas en la vista sean otras
Last edit: JOSE ELIAS 2014-08-07
Hola José,
¿Qué versión de OpenXava o XavaPro estás usando?
He probado los puntos 1 y 2 y a mi no me falla, ¿podrías poner el código?
Normal, ¿no? Si en Java intentas poner dos propiedades con el mismo nombre te da error de compilación. Yo lo veo normal. El nombre del grupo lo identifica, no puedes repetirlo. Permitir nombre de grupo repetidos sería dificil de implementar en OpenXava, pero también sería confuso para el programador, por ejemplo si quisieras ocultar unos de los dos grupos que se llaman igual, ¿qué nombre tendrías que poner en el setHidden()? Permitir nombres duplicados no tiene sentido.
Si quieres que de cara al usuario tengan la misma etiqueta modifica los archivos i18n.
Ayuda a otros en este foro como yo te ayudo a ti.
Estoy usando XavaPro 5.0.
Claro el 3º punto, OK. Respecto de los otros dos: En esta misma entidad pasa las dos cosas:
Mira la imagen, activo tiene marco y mira su declaración:
package com.openxava.oxsigo.modelo;
import java.io.;
import java.math.;
import java.util.*;
import javax.persistence.*;
import org.hibernate.validator.;
import org.openxava.annotations.;
import org.openxava.jpa.;
import org.openxava.model.;
import com.openxava.oxsigo.acciones.;
import com.openxava.oxsigo.calculadores.;
import com.openxava.oxsigo.validadores.*;
/*
* @fecha 07082014
* @author José Elías
* @description Registro de facturas recibidas.
/
@Entity
@Views({
@View(members="Datos de Registro[creado, creadoPor, modificado, modificadoPor];"
+ "oid, numeroFr, contabilizacionPrevia, fichero;"
+ "Factura{ fechaFactura, fechaVencimiento;"
+ "empresa, seccion;"
+ "activo, sitio;"
+ "Proveedor[proveedor, conceptoAsociado];"
+ "DetalleFactura[tipoGasto, tipoIva; conceptos]}"
+ "DocumentoContable{fechaContable, fechaDocumento;"
+ "numero, clase; textoCabecera;"
+ "Detalle[saldoPosiciones; posiciones]}"),
@View(name="ConSitio", members="oid, numeroFr, contabilizacionPrevia, fichero;"
+ "Factura{ fechaFactura, fechaVencimiento;"
+ "empresa, seccion;"
+ "sitio;"
+ "Proveedor[proveedor, conceptoAsociado];"
+ "DetalleFactura[tipoGasto, tipoIva; conceptos]}"
+ "DocumentoContable{fechaContable, fechaDocumento;"
+ "numero, clase; textoCabecera;"
+ "Detalle[saldoPosiciones; posiciones]}"),
@View(name="ConActivo", members="oid, numeroFr, contabilizacionPrevia, fichero;"
+ "Factura{ fechaFactura, fechaVencimiento;"
+ "empresa, seccion;"
+ "activo;"
+ "Proveedor[proveedor, conceptoAsociado];"
+ "DetalleFactura[tipoGasto, tipoIva; conceptos]}"
+ "DocumentoContable{fechaContable, fechaDocumento;"
+ "numero, clase; textoCabecera;"
+ "Detalle[saldoPosiciones; posiciones]}"),
@View(name="SinSitioyActivo", members="oid, numeroFr, contabilizacionPrevia, fichero;"
+ "Factura{ fechaFactura, fechaVencimiento;"
+ "empresa, seccion;"
+ "Proveedor[proveedor, conceptoAsociado];"
+ "DetalleFactura[tipoGasto, tipoIva; conceptos]}"
+ "DocumentoContable{fechaContable, fechaDocumento;"
+ "numero, clase; textoCabecera;"
+ "Detalle[saldoPosiciones; posiciones]}")
})
@Tab(properties="oid, fechaDocumento, fechaContable, empresa.abreviatura, textoCabecera, contabilizacionPrevia")
@EntityValidator( value=ValidadorDocumentoContable.class, // Clase con la lógica de validación
properties={@PropertyValue(name="empresa"),
@PropertyValue(name="fechaContable"),
@PropertyValue(name="saldoPosiciones"),
@PropertyValue(name="posiciones"),
@PropertyValue(name="contabilizacionPrevia")
}
)
public class FacturaRecibida extends DocumentoContable implements Serializable {
///////////propiedades calculadas //////////////////////////////////////////////
////////métodos de retrollamada////////////////////////////////////////////////////////////////////
//////////////////////////1.-GASTO
System.out.println("Importe de gasto:" + getSumaImporte().toString());
if( getSumaImporte().compareTo(BigDecimal.ZERO) != 0){ //si tiene valos distinto de 0
/////////////////////////2.-CUOTA DE IVA DE LA FACTURA
System.out.println("Importe de IVA de factura:" + getSumaCuota().toString());
if( getSumaCuota().compareTo(BigDecimal.ZERO) != 0){ //si tiene valos distinto de 0
/////////////////////////3.-TOTAL, PARTE PTE DE PAGO AL PROVEEDOR
System.out.println("Importe de total de factura:" + getSumaTotal().toString());
if( getSumaTotal().compareTo(BigDecimal.ZERO) != 0){ //si tiene valos distinto de 0
////////buscadores /////////////////////////////////////////////////////////////////////////////////
////////// getter + setter //////////////////////////////
}//endclass
Respecto del punto 2: que no se cierran los marcos hasta que se pulsa "F5"
package com.openxava.oxsigo.modelo;
import java.util.;
import javax.persistence.;
import org.openxava.annotations.;
import org.openxava.util.;
//clase mapeada para usarse como clave autogenerada donde se requiera
@MappedSuperclass
@View(members="Datos de Registro[creado, creadoPor, modificado, modificadoPor, bloqueado];")
public class Identificable {
//////////// getter y setter ////////////////////////////////
public Integer getOid() {
return oid;
}
}//endclass
Hola José,
antes de nada actualizate a XavaPro 5.0.1, porque en él están corregidos muchos bugs relacionados con el nuevo renderer y es fácil que se arregle tu problema.
Estuve de vacaciones con la publicación e intenté la descarga pero tuve muchos problemas de conexión y he perdido, por tiempo, la posibilidad de descargarlo. No sé si es posible recuperar el link de descarga.
Hola José,
acabo de reenviarte el vínvulo para que te descargues XavaPro Enterprise. Si tienes algún problema con la descarga o instalación no dudes en decirlo.
Hola Javier,
el problema con los marcos no se ha resuelto. No he comentado que el problema viene con las propiedades de clases heredadas visualizadas en la clase que extiende.
Hola José,
necesito un código lo suficientemente sencillo para que lo pueda copiar y pegar en mi entorno y reproducirlo, el código que adjuntas tienes demasiadas referencias. Si al menos supiera porque es podria hacerme yo mismo el ejemplo, pero todos los casos que he probado me funcionan bien.
Crea un pequeño proyecto nuevo y pega en él tu clase. Después simplifícala lo más posible, si es posible quitando todas las referencias a las demás clases. Comprueba que con ese código te sigue dando el problema y adjunta aquí las clases de ese proyecto (idealmente una, aunque pudieran ser más). Lo probaré.
Ayuda a otros en este foro como yo te ayudo a ti.
Hola Javier, aquí está la clase más simple, verás como el marco no cierra hasta que se pulsa F5. (Son dos clases, identificable y marco)
package com.openxava.oxsigo.modelo;
import java.util.;
import javax.persistence.;
import org.openxava.annotations.;
import org.openxava.util.;
//clase mapeada para usarse como clave autogenerada donde se requiera
@MappedSuperclass
@View(members="Datos de Registro[creado, creadoPor, modificado, modificadoPor, bloqueado];")
public class Identificable {
//////////// getter y setter ////////////////////////////////
public Integer getOid() {
return oid;
}
}//endclass
package com.openxava.oxsigo.modelo;
import javax.persistence.*;
import org.openxava.annotations.*;
/
* marco - clase de prueba para fallo de cierre de marcos
* @author jegomez
/
@Entity
@View(extendsView = "super.DEFAULT",members="; oid, nombre")
public class marco extends Identificable {
}
Hola José,
para que tu ejemplo funcione has de cambiar:
por
y ya funcionará.
Se supone que el nombre de grupo debería ser un identificador válido de Java y por ende no tener espacios. Pero parece que eso no es tan obvio como yo pensaba.
Realmente no es un bug, pero añadelo como tal para que piense en una solución para que no volvamos a perder tiempo otra vez por algo así.
Ayuda a otros en este foro como yo te ayudo a ti.
Mi humilde opinión es mantenerlo cómo está y "aprender lo que hay que aprender" que para eso está. Pero si quieres lo añado a bugs.
Hola Jose,
Estoy de acuerdo en no soportar el espacio como nombre de identificador. Lo que quiero evitar es que otros programadores en el futuro tengan que perder varias depurando, como nos ha tocado hacer ahora a nosotros. Quizás una excepción diciendo "Blancos no permitidos como nombres de módulos" o simpemente un mensaje de advertencia en el log podría ayudar bastante.
Sí, añadelo como bug, veré como lo puedo mejorar.