Defining an attribute with enumeration type in 7.0 doesn't work properly

Hi forum’s friends,

Is there anyone who encountered problems defining atributes with enumeration data type in v. 7.0 ? (I’m using Cuba Studio 2018.3 Build #CS 183.10.1)

1)I created the new attribute correctly, as show next images:
Crear%20atribut
atribut%20creat

  1. When I saved, the data type changes to integer, as you can see on the next image:
    after%20saving

  2. The code created contains a duplicated declaration that produces the error: “error: method getFCobramente() is already defined in class FacturaComi
    public FacComiFCobEnum getFCobrament()”

code%20created

Here it is the code before creating the attribute:

package com.company.logistica.entity;

import com.company.mestrelegacy.entity.Proveidor;
import com.haulmont.chile.core.annotations.MetaProperty;
import com.haulmont.chile.core.annotations.NamePattern;
import com.haulmont.cuba.core.entity.StandardEntity;
import com.haulmont.cuba.core.entity.annotation.OnDeleteInverse;
import com.haulmont.cuba.core.global.DeletePolicy;
import com.haulmont.cuba.core.global.PersistenceHelper;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@NamePattern("%s |numFac,dataFac")
@Table(name = "LOGIS_FACTURA_COMI")
@Entity(name = "logis$FacturaComi")
public class FacturaComi extends StandardEntity {
    private static final long serialVersionUID = -5303781616687963854L;

    @Column(name = "NUM_FAC", unique = true)
    protected Long numFac;

    @OrderBy("numFactura")
    @OnDeleteInverse(DeletePolicy.DENY)
    @OneToMany(mappedBy = "facComiId")
    protected List<FacturaProv> facturesProveidor;

    @NotNull
    @OnDeleteInverse(DeletePolicy.DENY)
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "PROVEIDOR_ID")
    protected Proveidor proveidor;

    @Temporal(TemporalType.DATE)
    @Column(name = "DATA_FAC")
    protected Date dataFac;

    @Column(name = "IMP_COBRAT", precision = 14, scale = 2)
    protected BigDecimal impCobrat;

    public BigDecimal getImpCobrat() {
        return impCobrat;
    }

    public void setImpCobrat(BigDecimal impCobrat) {
        this.impCobrat = impCobrat;
    }

    public Long getNumFac() {
        return numFac;
    }

    public void setNumFac(Long numFac) {
        this.numFac = numFac;
    }


    @MetaProperty(related = "facturesProveidor")
    public String getFacturesProvTxt() {
        if (PersistenceHelper.isLoaded(this, "facturesProveidor") && facturesProveidor != null) {
            return facturesProveidor.stream()
                    .map(FacturaProv -> FacturaProv.getNumFactura())
                    .collect(Collectors.joining(", "));
        } else {
            return "";
        }
    }

    public void setFacturesProveidor(List<FacturaProv> facturesProveidor) {
        this.facturesProveidor = facturesProveidor;
    }

    public List<FacturaProv> getFacturesProveidor() {
        return facturesProveidor;
    }


    public void setProveidor(Proveidor proveidor) {
        this.proveidor = proveidor;
    }

    public Proveidor getProveidor() {
        return proveidor;
    }


    public void setDataFac(Date dataFac) {
        this.dataFac = dataFac;
    }

    public Date getDataFac() {
        return dataFac;
    }


}

And the code after creating the attribute fCobramente:

package com.company.logistica.entity;

import com.company.mestrelegacy.entity.Proveidor;
import com.haulmont.chile.core.annotations.MetaProperty;
import com.haulmont.chile.core.annotations.NamePattern;
import com.haulmont.cuba.core.entity.StandardEntity;
import com.haulmont.cuba.core.entity.annotation.OnDeleteInverse;
import com.haulmont.cuba.core.global.DeletePolicy;
import com.haulmont.cuba.core.global.PersistenceHelper;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@NamePattern("%s |numFac,dataFac")
@Table(name = "LOGIS_FACTURA_COMI")
@Entity(name = "logis$FacturaComi")
public class FacturaComi extends StandardEntity {
    private static final long serialVersionUID = -5303781616687963854L;

    @Column(name = "NUM_FAC", unique = true)
    protected Long numFac;

    @OrderBy("numFactura")
    @OnDeleteInverse(DeletePolicy.DENY)
    @OneToMany(mappedBy = "facComiId")
    protected List<FacturaProv> facturesProveidor;

    @NotNull
    @OnDeleteInverse(DeletePolicy.DENY)
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "PROVEIDOR_ID")
    protected Proveidor proveidor;

    @Temporal(TemporalType.DATE)
    @Column(name = "DATA_FAC")
    protected Date dataFac;

    @Column(name = "IMP_COBRAT", precision = 14, scale = 2)
    protected BigDecimal impCobrat;

    @Column(name = "F_COBRAMENTE")
    protected Integer fCobramente;

    public Integer getFCobramente() {
        return fCobramente;
    }

    public FacComiFCobEnum getFCobramente() {
        return fCobramente == null ? null : FacComiFCobEnum.fromId(fCobramente);
    }

    public void setFCobramente(FacComiFCobEnum fCobramente) {
        this.fCobramente = fCobramente == null ? null : fCobramente.getId();
    }

    public BigDecimal getImpCobrat() {
        return impCobrat;
    }

    public void setImpCobrat(BigDecimal impCobrat) {
        this.impCobrat = impCobrat;
    }

    public Long getNumFac() {
        return numFac;
    }

    public void setNumFac(Long numFac) {
        this.numFac = numFac;
    }


    @MetaProperty(related = "facturesProveidor")
    public String getFacturesProvTxt() {
        if (PersistenceHelper.isLoaded(this, "facturesProveidor") && facturesProveidor != null) {
            return facturesProveidor.stream()
                    .map(FacturaProv -> FacturaProv.getNumFactura())
                    .collect(Collectors.joining(", "));
        } else {
            return "";
        }
    }

    public void setFacturesProveidor(List<FacturaProv> facturesProveidor) {
        this.facturesProveidor = facturesProveidor;
    }

    public List<FacturaProv> getFacturesProveidor() {
        return facturesProveidor;
    }


    public void setProveidor(Proveidor proveidor) {
        this.proveidor = proveidor;
    }

    public Proveidor getProveidor() {
        return proveidor;
    }


    public void setDataFac(Date dataFac) {
        this.dataFac = dataFac;
    }

    public Date getDataFac() {
        return dataFac;
    }


}

4- I manually removed the duplicated procedure definition. The application compiled fine.

5- Running the application, the enumeration values shown on the screen contained the name of the enumeration, as next image shows:

pantalla

How can I solve this problem ?

Thanks in advance

I am also having this display format problem

image

I tried to update it in the message file but didn’t work.

Thanks for your answer…I’m not alone ! :wink:

I had similar problem recently Enumeration type parameter doesn't show values - CUBA.Platform
In v. 7 there are some troubles with enumerations.

Hi, Xavier

Thanks for your feedback.

Regarding the first issue. There are several issues with CUBA Studio handling attributes with second uppercase letter. So fCobramente name causes the problem. The quick fix is to rename the attribute, so it has second letter lowercase.
This will be fixed in the next release.

Unfortunately I can’t reproduce the second issue with enumeration values representation.
Could you please attach sources of your FacComiFCobEnum enum and messages.properties file containing this enum localization strings.

Thanks, Alexander, for the workarround.

Here you are the sources you asked for:

package com.company.logistica.entity;

import com.haulmont.chile.core.datatypes.impl.EnumClass;

import javax.annotation.Nullable;


public enum FacComiFCobEnum implements EnumClass<Integer> {

    Xec(10),
    Transferència(20);

    private Integer id;

    FacComiFCobEnum(Integer value) {
        this.id = value;
    }

    public Integer getId() {
        return id;
    }

    @Nullable
    public static FacComiFCobEnum fromId(Integer id) {
        for (FacComiFCobEnum at : FacComiFCobEnum.values()) {
            if (at.getId().equals(id)) {
                return at;
            }
        }
        return null;
    }
}

and the messages.properties file in source folder

Contracte = Contracte
Contracte.cteCd = Nº Cte
Contracte.cteDt = Data
Contracte.proId = Id. Proveïdor
Contracte.cteNmPro = Nº Cte Prov.
Contracte.cteObs = Observ.
Contracte.conCod = Condició
Contracte.cteFp = Id. Forma Pag.
Contracte.cteQlApr = T. Quilos Aprox.
Contracte.cteRuta = Ruta documents
Contracte.cteTrnfSiNo = Transferència?
Contracte.cteTrnfPer = % Pagament 1 Transf
Contracte.cteTrnfImp = Import pagament 1 Transf
Contracte.cteTrnfDtP = Data pagament 1 Transf.
Contracte.cteTrnf2Pe = % Pagament 2 Transf.
Contracte.cteTrnf2Im = Import pagament 2 Transf.
Contracte.cteTrnf2Dt = Data pagament 2 Transf.
Contracte.bnaId = Id Banc
Contracte.bnaSuc = Id Sucursal Banc
ContracteLin = Contracte Lin
ContracteLin.cteCd = Nº Cte
ContracteLin.cteLnCd = Línia Cte
ContracteLin.agDuCd = Id Agent Duana
ContracteLin.cteLnPrB = Preu Brut
ContracteLin.cteLnPrN = Preu Net
ContracteLin.cteLnDte = % Dte
ContracteLin.cteLnDtOut = Data Sortida
ContracteLin.diCd = Id Divisa
ContracteLin.cteLnSpg = SPG
ContracteLin.cteLnObs = Observ.
ContracteLin.cteLnStat = Estat
ContracteLin.cteLnDtPre = Data prevista
ContracteLin.csCd = Id Consignatària
ContracteLin.navCd = Id Naviera
ContracteLin.tranCd = Id Transitària
ContracteLin.cteLnFPgCd = Id Forma Pag.
ContracteLin.cteLnTQN = T. Quilos Nets
ContracteLin.cteLnTQB = T. Quilos Bruts
ContracteLin.cteLnRefP = Ref. Partida
ContracteLin.cteDivCot = Cotització Div.
ContracteLin.ctePreuTot = Preu total
ContracteLin.cteLnMesDt = Mes previst
ContracteLin.cteLnAnyDt = Any previst
ContracteLin.cteFabrica = Fàbrica
ContracteLin.cteLnHighC = High Cube
ContracteLin.cteQuinzPr = Quinzena previst
ContracteLin.fCteLnQual = Qualitat
ContracteLin.cteLnDtAvi = Data avís
FacturaProv.numFactura = Nº Factura
FacturaProv.data = Data
FacturaProv.venciment = Venciment
FacturaProv.proveidor = Proveïdor
FacturaProv.divisa = Divisa
FacturaProv.importTotal = Import total
FacturaProv.percComissio = % comissió
FacturaProv.importComissio = Import comissió
FacturaProv.importFob = Import FOB
FacturaProv.dataCobrament = Data cobrament
FacturaProv.dataFactura = Data
FacturaProv = Factura proveïdor
FacturaProv.partides = Partides
FacturaProv.client = Client
FacturaProv.remarks = Remarks
FacturaProv.estat = Estat
FacturaProv.facComiId = Debit note Nº
FacturaProv.cobrament=Cobrament
FacProvEstatEnum.Pendent = Pendent
FacProvEstatEnum.Reclamada = Reclamada
FacProvEstatEnum.Cobrada = Cobrada
FacProvEstatEnum.Debit_Note = Debit note
FacturaComi.numFac = Debit Note Nº
FacturaComi.dataFac = Data
FacturaComi = Debit Note
FacturaComi.proveidor = Proveïdor
FacturaComi.facturesProveidor = Factures proveidor
FacturaComi.facturesProvTxt = Factures Proveïdor
FacturaComi.impCobrat=Import cobrat
FacturaComi.fCobramente=FCobramente
FacturaComi.fCobrament=Forma Cobrament
FCobramentEnum=FCobrament enum
FCobramentEnum.Transferència=Forma de cobrament
FacComiFCobEnum=Fac comi FCob enum
Cobrament=Cobrament
Cobrament.importCobrat=Import cobrat
Cobrament.data=Data
Cobrament.proveidor=Proveidor
Cobrament.remarks=Remarks
Cobrament.debitNote=Debit Note
Cobrament.importTotFac=Import total factures
Cobrament.importDifer=Import difer
Cobrament.factures=Factures

and the messages.properties file in build folder

Contracte = Contracte
Contracte.cteCd = Nº Cte
Contracte.cteDt = Data
Contracte.proId = Id. Proveïdor
Contracte.cteNmPro = Nº Cte Prov.
Contracte.cteObs = Observ.
Contracte.conCod = Condició
Contracte.cteFp = Id. Forma Pag.
Contracte.cteQlApr = T. Quilos Aprox.
Contracte.cteRuta = Ruta documents
Contracte.cteTrnfSiNo = Transferència?
Contracte.cteTrnfPer = % Pagament 1 Transf
Contracte.cteTrnfImp = Import pagament 1 Transf
Contracte.cteTrnfDtP = Data pagament 1 Transf.
Contracte.cteTrnf2Pe = % Pagament 2 Transf.
Contracte.cteTrnf2Im = Import pagament 2 Transf.
Contracte.cteTrnf2Dt = Data pagament 2 Transf.
Contracte.bnaId = Id Banc
Contracte.bnaSuc = Id Sucursal Banc
ContracteLin = Contracte Lin
ContracteLin.cteCd = Nº Cte
ContracteLin.cteLnCd = Línia Cte
ContracteLin.agDuCd = Id Agent Duana
ContracteLin.cteLnPrB = Preu Brut
ContracteLin.cteLnPrN = Preu Net
ContracteLin.cteLnDte = % Dte
ContracteLin.cteLnDtOut = Data Sortida
ContracteLin.diCd = Id Divisa
ContracteLin.cteLnSpg = SPG
ContracteLin.cteLnObs = Observ.
ContracteLin.cteLnStat = Estat
ContracteLin.cteLnDtPre = Data prevista
ContracteLin.csCd = Id Consignatària
ContracteLin.navCd = Id Naviera
ContracteLin.tranCd = Id Transitària
ContracteLin.cteLnFPgCd = Id Forma Pag.
ContracteLin.cteLnTQN = T. Quilos Nets
ContracteLin.cteLnTQB = T. Quilos Bruts
ContracteLin.cteLnRefP = Ref. Partida
ContracteLin.cteDivCot = Cotització Div.
ContracteLin.ctePreuTot = Preu total
ContracteLin.cteLnMesDt = Mes previst
ContracteLin.cteLnAnyDt = Any previst
ContracteLin.cteFabrica = Fàbrica
ContracteLin.cteLnHighC = High Cube
ContracteLin.cteQuinzPr = Quinzena previst
ContracteLin.fCteLnQual = Qualitat
ContracteLin.cteLnDtAvi = Data avís
FacturaProv.numFactura = Nº Factura
FacturaProv.data = Data
FacturaProv.venciment = Venciment
FacturaProv.proveidor = Proveïdor
FacturaProv.divisa = Divisa
FacturaProv.importTotal = Import total
FacturaProv.percComissio = % comissió
FacturaProv.importComissio = Import comissió
FacturaProv.importFob = Import FOB
FacturaProv.dataCobrament = Data cobrament
FacturaProv.dataFactura = Data
FacturaProv = Factura proveïdor
FacturaProv.partides = Partides
FacturaProv.client = Client
FacturaProv.remarks = Remarks
FacturaProv.estat = Estat
FacturaProv.facComiId = Debit note Nº
FacturaProv.cobrament=Cobrament
FacProvEstatEnum.Pendent = Pendent
FacProvEstatEnum.Reclamada = Reclamada
FacProvEstatEnum.Cobrada = Cobrada
FacProvEstatEnum.Debit_Note = Debit note
FacturaComi.numFac = Debit Note Nº
FacturaComi.dataFac = Data
FacturaComi = Debit Note
FacturaComi.proveidor = Proveïdor
FacturaComi.facturesProveidor = Factures proveidor
FacturaComi.facturesProvTxt = Factures Proveïdor
FacturaComi.impCobrat=Import cobrat
FacturaComi.fCobramente=FCobramente
FacturaComi.fCobrament=Forma Cobrament
FCobramentEnum=FCobrament enum
FCobramentEnum.Transferència=Forma de cobrament
FacComiFCobEnum=Fac comi FCob enum
Cobrament=Cobrament
Cobrament.importCobrat=Import cobrat
Cobrament.data=Data
Cobrament.proveidor=Proveidor
Cobrament.remarks=Remarks
Cobrament.debitNote=Debit Note
Cobrament.importTotFac=Import total factures
Cobrament.importDifer=Import difer
Cobrament.factures=Factures

Thanks for your quicky answer.

As I see in the sources, there are no localization provided for your enumeration values.
You need to add two lines to the messages.properties file
FacComiFCobEnum.Xec = <Xec localization string>
FacComiFCobEnum.Transferència = <Transferència localization string>

Thanks, Alexander, for your comments.
I’ve been using Cuba Studio, since my first projects with Cuba Platform, and the problem was I’m not used to the new UI on latest Cuba Studio versions.

Best regards,