Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Dialog do jsf

Pessoal, tem uma pagina onde tenho um table com alguns itens, dai coloquei um botao para chamar uma Dialog onde carrego uma outra table de tipos de refugo ao selecionar uma linha queria que voltasse para pagina que chamou a dialog e executasse uma rotina mais não estou conseguindo fazer "f:setPropertyActionListener" e carregar o refugo selecionado.

11 respostas

<h:form id="formLista" style="font-size: 12px; width: 1300px">

    <p:dataTable id="dtItens" var="movimento"
        value="#{etiqRoboBean.listaMovtoDiario}" scrollable="true"
        scrollHeight="240">
        <p:column headerText="Item" style="width:130px">
            <h:outputText value="#{movimento.itCodigo}" />
        </p:column>
        <p:column headerText="Descrição" width="350px">
            <h:outputText value="#{movimento.descricao}" />
        </p:column>
        <p:column headerText="Quantidade" width="100px">
            <h:outputText value="#{movimento.quantidade}" />
        </p:column>
        <p:column headerText="Reportar Item"
            style="text-align: center; width: 150px">
            <p:commandButton value="Reportar"
                action="#{etiqRoboBean.criarReport}"
                style="height: 50px; width: 150px ; background-color: blue"
                update="@form :formLista :resultado  @all :messages"  >
                <f:setPropertyActionListener value="#{movimento}"
                    target="#{etiqRoboBean.selectedItem}" />
            </p:commandButton>
        </p:column>
        <p:column headerText="Refugar Item"
            style="text-align: center; width: 150px">
            <p:commandButton value="Refugar" update=":formLista:itemDetail"                            
                oncomplete="PF('cadRefugo').show()" title="Refugar"
                style="height: 50px; width: 150px ; background-color: red">
                <f:setPropertyActionListener value="#{movimento}"
                    target="#{etiqRoboBean.selectedItem}" />
            </p:commandButton>
        </p:column>
    </p:dataTable>


    <p:dialog widgetVar="cadRefugo" modal="true" showEffect="fade"
        hideEffect="fade" maximizable="false" width="600" height="550"
        responsive="true" >
        <h:form prependId="false">

            <p:outputPanel id="itemDetail" style="text-align:center;">

                <p:dataTable id="dtRefugos" var="listaRefugo"
                    value="#{etiqRoboBean.listagemRefugos}" scrollable="true"
                    scrollHeight="250">
                    <p:column headerText="Refugo" style="width:130px">
                        <h:outputText value="#{listaRefugo.codRefugo}" />
                    </p:column>
                    <p:column headerText="Descrição" width="350px">
                        <h:outputText value="#{listaRefugo.nomeRefugo}" />
                    </p:column>
                    <p:column headerText="Refugar Item"
                        style="text-align: center; width: 150px">
                        <p:commandButton value="Refugar" 
                            title="Refugar"                                    
                            style="height: 50px; width: 150px ; background-color: red"
                            process="@this"                                    >

                            <f:setPropertyActionListener value="#{listaRefugo}"
                                target="#{etiqRoboBean.selectedRefugo}" />

                        </p:commandButton>
                    </p:column>
                </p:dataTable>

                <p:outputLabel value=" Refugo: " for="refugo"  />
                <p:inputText id="refugo"  value="#{etiqRoboBean.selectedRefugo.codRefugo}"  size="16" disabled="true"/>

                <p:commandButton id="btCancela" value="Cancela" icon="ui-icon-disk"
                    styleClass="botao-parametro" oncomplete="PF('cadRefugo').hide();" />


                    <p:outputLabel value=" Item: " for="item"  />
            <p:inputText id="item"  value="#{etiqRoboBean.selectedItem.itCodigo}"  size="16" disabled="true"/>
            </p:outputPanel>
        </h:form>    
    </p:dialog>

    <h:panelGrid columns="2">
        <p:graphicImage library="img" name="logo.png" width="300px"
            height="50px" style="position:absolute; right: 10px; top: 15px" />

        <p:outputLabel value="#{etiqRoboBean.estacaoLogada}"
            id="estacaologada"
            style="font-size: 20px; color:black;right: 100px;position:absolute;top: 95px" />

    </h:panelGrid>

</h:form>

Não consigo selecionar : <f:setPropertyActionListener value="#{listaRefugo}" target="#{etiqRoboBean.selectedRefugo}" />

Que erro tá dando?

André tudo bem!

Então, me tire uma duvida! O bean da pagina que chamou a dialog acaba ou a Dialog pode executar qualquer método do bean da primeira pagina? porque neste <p:commandButton value="Refugar" coloquei um onclick "#{etiqRoboBean.criarRefugo}" e o mesmo da erro que não encontra o método.

Hum, não sei. Preciso estudar mais, esperava encontrar algum erro de javascript onde pudesse te ajudar. Algum instrutor consegue nos ajudar pra chegar nesse solução?

HELPPPPPPP, alguem ai???

Não consigo fazer disparar da Dialog o action="#{etiqRoboBean.criarRefugo}"> e nem o <f:setPropertyActionListener value="#{listaRefugo}" target="#{etiqRoboBean.selectedRefugo}" />

vou colocar o codigo todo algume pode me ajudar algum professor ???

`

<h:head>

<script type="text/javascript">
    function setFocus() {
        document.getElementById("formOee:operacao").focus();
    }
</script>

<h:body onload="setFocus()">

<p:messages globalOnly="true" />
<p:growl id="messages" showDetail="true" autoUpdate="true"/>
<h:form id="formLista" style="font-size: 12px; width: 1300px">

    <p:dataTable id="dtItens" var="movimento"
        value="#{etiqRoboBean.listaMovtoDiario}" scrollable="true"
        scrollHeight="240">
        <p:column headerText="Item" style="width:130px">
            <h:outputText value="#{movimento.itCodigo}" />
        </p:column>
        <p:column headerText="Descrição" width="350px">
            <h:outputText value="#{movimento.descricao}" />
        </p:column>
        <p:column headerText="Quantidade" width="100px">
            <h:outputText value="#{movimento.quantidade}" />
        </p:column>
        <p:column headerText="Reportar Item"
            style="text-align: center; width: 150px">
            <p:commandButton value="Reportar"
                action="#{etiqRoboBean.criarReport}"
                style="height: 50px; width: 150px ; background-color: blue"
                update="@form :formLista :resultado  @all :messages"  >
                <f:setPropertyActionListener value="#{movimento}"
                    target="#{etiqRoboBean.selectedItem}" />
            </p:commandButton>
        </p:column>
        <p:column headerText="Refugar Item"
            style="text-align: center; width: 150px">
            <p:commandButton value="Refugar" update=":formLista:itemDetail"                            
                oncomplete="PF('cadRefugo').show()" title="Refugar"
                style="height: 50px; width: 150px ; background-color: red">
                <f:setPropertyActionListener value="#{movimento}"
                    target="#{etiqRoboBean.selectedItem}" />
            </p:commandButton>
        </p:column>
    </p:dataTable>


    <p:dialog widgetVar="cadRefugo" modal="true" showEffect="fade"
        hideEffect="fade" maximizable="false" width="600" height="550"
        responsive="true" >
        <h:form prependId="false">

            <p:outputPanel id="itemDetail" style="text-align:center;">

                <p:dataTable id="dtRefugos" var="listaRefugo"
                    value="#{etiqRoboBean.listagemRefugos}" scrollable="true"
                    scrollHeight="250">
                    <p:column headerText="Refugo" style="width:130px">
                        <h:outputText value="#{listaRefugo.codRefugo}" />
                    </p:column>
                    <p:column headerText="Descrição" width="350px">
                        <h:outputText value="#{listaRefugo.nomeRefugo}" />
                    </p:column>
                    <p:column headerText="Refugar Item"
                        style="text-align: center; width: 150px">
                        <p:commandButton value="Refugar" 
                            title="Refugar"                                    
                            style="height: 50px; width: 150px ; background-color: red"
                            update="@form :formLista :resultado  @all :messages"  
                            process="@this" 
                            action="#{etiqRoboBean.criarRefugo}">    

                            <f:setPropertyActionListener value="#{listaRefugo}"
                                target="#{etiqRoboBean.selectedRefugo}" />

                        </p:commandButton>
                    </p:column>
                </p:dataTable>

                <p:outputLabel value=" Refugo: " for="refugo"  />
                <p:inputText id="refugo"  value="#{etiqRoboBean.selectedRefugo.codRefugo}"  size="16" disabled="true"/>

                <p:commandButton id="btCancela" value="Cancela" icon="ui-icon-disk"
                    styleClass="botao-parametro" oncomplete="PF('cadRefugo').hide();" />


                    <p:outputLabel value=" Item: " for="item"  />
            <p:inputText id="item"  value="#{etiqRoboBean.selectedItem.itCodigo}"  size="16" disabled="true"/>
            </p:outputPanel>
        </h:form>    
    </p:dialog>

    <h:panelGrid columns="2">
        <p:graphicImage library="img" name="logo.png" width="300px"
            height="50px" style="position:absolute; right: 10px; top: 15px" />

        <p:outputLabel value="#{etiqRoboBean.estacaoLogada}"
            id="estacaologada"
            style="font-size: 20px; color:black;right: 100px;position:absolute;top: 95px" />

    </h:panelGrid>

</h:form>

.....

<h:form id="resultado" style="height:200px; width:1330px">
        <p:panel style="height:180px; width: 290px; left: 10px; top: 260px">

            <div
                style="left: 10px; top: 278px; height: 60px; background-color: #87CEFA; width: 297px; position: absolute; text-align: center;">
                <h:outputLabel value="PREVISTO"
                    style="font-size: 40px; color:black; " />
            </div>

            <p:outputLabel value="#{etiqRoboBean.previsto}" id="previsto"
                style="font-size: 90px; color:black;top: 340px;position:absolute" />

        </p:panel>

        <p:panel
            style="height:180px; width: 290px; left: 330px;position:absolute;top: 278px">

            <div
                style="left: 0px; top: 0px; height: 60px; background-color: #87CEFA; width: 297px; position: absolute; text-align: center;">
                <p:outputLabel value="REALIZADO"
                    style="font-size: 40px; color:black; background:#87CEFA" />
            </div>

            <p:outputLabel id="realizado" value="#{etiqRoboBean.realizado}"
                style="font-size: 90px; color:black;top: 60px;position:absolute" />

        </p:panel>

        <p:panel
            style="height:180px; width: 290px; left: 650px;position:absolute;top: 278px">
            <div
                style="left: 0px; top: 0px; height: 60px; background-color: #87CEFA; width: 297px; position: absolute; text-align: center;">
                <p:outputLabel value="OK"
                    style="font-size: 40px; color:black; background:#87CEFA" />
            </div>
            <p:outputLabel id="ok" value="#{etiqRoboBean.valorOk}"
                style="font-size: 90px; color:black;top: 60px;position:absolute" />

        </p:panel>

        <p:panel
            style="height:180px; width: 350px; left: 970px;position:absolute;top: 278px">

            <div
                style="left: 0px; top: 0px; height: 60px; background-color: #87CEFA; width: 357px; position: absolute; text-align: center;">
                <p:outputLabel value="REJEIÇÃO"
                    style="font-size: 40px; color:black; background:#87CEFA" />
            </div>
            <div
                style="left: 0px; top: 80px; height: 115px; width: 357px; position: absolute; text-align: center; #{etiqRoboBean.colorRef}">

                <p:outputLabel id="rejeicao" value="#{etiqRoboBean.percRefugo}%"
                    style="font-size: 90px; color:black;left: 20px ;position:absolute" />
            </div>

        </p:panel>

    </h:form>

    <h:form id="formOee" style="width:480px; height:100px;">
        <p:growl id="growl" showDetail="true" sticky="true" />

        <p:panel style="width:480px; height:340px">

            <div
                style="left: 10px; top: 475px; height: 80px; background-color: #87CEFA; width: 487px; position: absolute; text-align: center;">
                <p:outputLabel value="OEE CELULA"
                    style="font-size: 50px; color:black; background:#87CEFA;horizontal-align:center " />

            </div>
            <!-- style="left: 10px;top: 420px; height:165px;    
                     width: 487px;position:absolute -->
            <div
                style="left: 10px; top: 540px; height: 280px; width: 487px; position: absolute; text-align: center; #{etiqRoboBean.colorOee}">

                <p:outputLabel id="oecelula" value="#{etiqRoboBean.deOee}%"
                    style="font-size: 110px;color:black; right: 15px;width:80px;
                        left: 10px ;top: 70px;position:absolute;horizontal-align:center" />
            </div>

            <p:chart type="bar" responsive="true"
                model="#{etiqRoboBean.carregaGrafico()}"
                style="height:360px; width: 820px; position:absolute; right: 240px;left: 520px;top: 480px ;font-size: 10px " />


        </p:panel>


    </h:form>



</h:body>

</html>
package br.com.cieautoapp.bean;

import java.io.Serializable;
import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;


import org.primefaces.model.chart.BarChartModel;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.totvs.framework.ws.execbo.service.CheckExceptionsFaultBean;

import br.com.cieautoapp.dao.ChartRefugoDao;
import br.com.cieautoapp.dao.MovtoDiarioDao;
import br.com.cieautoapp.dao.ReporteDao;
import br.com.cieautoapp.models.Etiqueta;
import br.com.cieautoapp.models.MovtoDiario;
import br.com.cieautoapp.models.Refugo;
import br.com.cieautoapp.models.ReporteProd;
import br.com.cieautoapp.models.ReporteRef;
import br.com.cieautoapp.models.Usuario;
import br.com.cieautoapp.service.ServiceWs;

@SuppressWarnings("serial")
@ManagedBean
@RequestScoped
public class EtiqRoboBean implements Serializable {

    private int realizado;
    private int valorOk;
    private BigDecimal percRefugo;
    private int previsto;
    private String estacaoLogada;
    private BigDecimal deOee;
    private String colorOee ;
    private String colorRef ;
    private MovtoDiario selectedItem;
    private Refugo selectedRefugo;


    private List<Refugo> listagemRefugos;
    private List<MovtoDiario> listaMovtoDiario;    
    private FacesContext context = FacesContext.getCurrentInstance();
    private Usuario usuarioLogadoTotvs = (Usuario) context.getExternalContext().getSessionMap().get("usuarioLogado");

    private Etiqueta etiqueta = new Etiqueta();
    private Gson gson = new Gson();


    @PostConstruct
    public void init() throws CheckExceptionsFaultBean, RemoteException {

        atualizaMovimentoDiario();

    }

    private void atualizaMovimentoDiario() throws CheckExceptionsFaultBean, RemoteException {
        MovtoDiarioDao movtoDiarioDao = new MovtoDiarioDao();


        List<MovtoDiario> carregaMovtoDiario = movtoDiarioDao.getCarregaMovtoDiario(usuarioLogadoTotvs.getEstabelecimento(), usuarioLogadoTotvs.getEmpresa(),
                usuarioLogadoTotvs.getEstacao());

        carregaMovtoDiario.sort(Comparator.comparing(MovtoDiario::getQuantidade).reversed());

        this.setListaMovtoDiario(carregaMovtoDiario);
        this.setEstacaoLogada(usuarioLogadoTotvs.getNomeEstacao()); 
        try {

            etiqueta.setItCodigo(usuarioLogadoTotvs.getEtiqueta().getItCodigo());
        } catch (Exception e) {
            //Null
        }


        totalMovimentosDiario();        

    }

    public void totalMovimentosDiario() throws CheckExceptionsFaultBean, RemoteException {

        ServiceWs serviceWs = new ServiceWs();

        try {

            String valorRetornado = serviceWs.wstovs(usuarioLogadoTotvs.getEstabelecimento(), usuarioLogadoTotvs.getEmpresa(), "getTotal", "character",
                    "pEstacao", String.valueOf(usuarioLogadoTotvs.getEstacao()));


            JsonArray jsonArray = (JsonArray) gson.fromJson(valorRetornado, JsonElement.class);

            for (int i = 0; i < jsonArray.size(); i++) {
                JsonElement element = jsonArray.get(i);
                String JsonString = element.toString();

                JsonObject jsonObjRet = (JsonObject) gson.fromJson(JsonString, JsonElement.class);

                this.realizado = jsonObjRet.get("deTotal").getAsInt();
                this.valorOk = jsonObjRet.get("deTotalOk").getAsInt();
                this.setPrevisto(jsonObjRet.get("dePrevisto").getAsInt());

                String valorPercString = jsonObjRet.get("percRefugo").getAsString().replaceAll(",", ".");
                this.percRefugo = new BigDecimal(valorPercString);

                String valorPercOee    = jsonObjRet.get("deOee").getAsString().replaceAll(",", ".");
                this.setDeOee(new BigDecimal(valorPercOee));

                this.colorRef = jsonObjRet.get("colorRef").getAsString();
                this.colorOee = jsonObjRet.get("colorOee").getAsString();    




            }

        } catch (Exception ex) {

            //null

        }

    }
    continua..
public void criarReport() throws CheckExceptionsFaultBean, RemoteException {
        System.out.println("Reportando.. " + getSelectedItem().getItCodigo());

        geraReporte("fechar", getSelectedItem().getItCodigo(), 0,"");
    }

    public void criarRefugo() {

        System.out.println("Refugar item.. " + getSelectedItem().getItCodigo());
        System.out.println("Codigo do refugo.. " + getSelectedRefugo().getCodRefugo());

    }

    public void carregarRefugos() throws CheckExceptionsFaultBean, RemoteException {
        ServiceWs serviceWs = new ServiceWs();

        String valorRetornado = serviceWs.wstovs(usuarioLogadoTotvs.getEstabelecimento(), usuarioLogadoTotvs.getEmpresa(), "listaRefugos", "character",
                "pEstacao", String.valueOf(usuarioLogadoTotvs.getEstacao()));

        JsonArray jsonArrayMovito = (JsonArray) gson.fromJson(valorRetornado, JsonElement.class);

        List<Refugo> listaRefugo = new ArrayList<Refugo>();

        for (int i = 0; i < jsonArrayMovito.size(); i++) {

            JsonElement element = jsonArrayMovito.get(i);
            String JsonString = element.toString();

            JsonObject jsonObjRet = (JsonObject) gson.fromJson(JsonString, JsonElement.class);

            Refugo listaRef = new Refugo();
            listaRef.setCodRefugo(jsonObjRet.get("refugo").getAsString());
            listaRef.setNomeRefugo(jsonObjRet.get("descricao").getAsString());
            listaRefugo.add(listaRef);

        }

        setListagemRefugos(listaRefugo);        

    }



    public void geraReporte(String operacaoReporte,
                            String itCodigo,
                            int nrEtiqueta,
                            String nrRefugo) throws CheckExceptionsFaultBean, RemoteException {

        List<MovtoDiario> collectMovitoDiario = listaMovtoDiario.stream()
                .filter(m -> m.getItCodigo().equalsIgnoreCase(itCodigo)).collect(Collectors.toList());


        if (collectMovitoDiario.isEmpty() || collectMovitoDiario.equals(null)) {

            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error!",
                    "Item não encontrado na estação de trabalho"));
            return;

        }

        String reporteMsgRetorno = "[]";
        System.out.println(operacaoReporte);

        if (operacaoReporte.equalsIgnoreCase("fechar")) {

            ReporteProd reporteProd = new ReporteProd();

            reporteProd.setItCodigo(itCodigo);
            reporteProd.setEstacao(usuarioLogadoTotvs.getEstacao());
            reporteProd.setUsuario(usuarioLogadoTotvs.getCodUsuario());

            String jsonReporte = gson.toJson(reporteProd);

            jsonReporte = "{\"reporteProd\":    [" + jsonReporte;
            jsonReporte = jsonReporte + "]}";

            System.out.println(jsonReporte);        
            reporteMsgRetorno = ReporteDao.Reporte("reporte", jsonReporte, usuarioLogadoTotvs);

            //setOperacaoInput("");    

        }else {        

            ReporteRef reporteRef = new ReporteRef();

            reporteRef.setCodRefugo(nrRefugo);
            reporteRef.setItCodigo(itCodigo);
            reporteRef.setQuantidade(1);
            reporteRef.setEstacao(usuarioLogadoTotvs.getEstacao());
            reporteRef.setUsuario(usuarioLogadoTotvs.getCodUsuario());

            String jsonReporte = gson.toJson(reporteRef);    

            jsonReporte = "{\"reporteRef\":    [" + jsonReporte;
            jsonReporte = jsonReporte + "]}";

            reporteMsgRetorno = ReporteDao.Reporte("reporteRef", jsonReporte, usuarioLogadoTotvs);


        }        

        String messageReporte = messageReporte(reporteMsgRetorno);

        if (messageReporte != "") {

            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERRO!",    messageReporte ));
        }


        atualizaMovimentoDiario();


    }
continua..
solução!
private String messageReporte(String reporteMsgRetorno) {
        String msgReporte = "";


        reporteMsgRetorno = reporteMsgRetorno.replace("]", "");
        reporteMsgRetorno = reporteMsgRetorno + "]";


        JsonArray jsonArray = (JsonArray) gson.fromJson(reporteMsgRetorno, JsonElement.class);

        loop:
        for (int i = 0; i < jsonArray.size(); i++) {
            JsonElement element = jsonArray.get(i);
            String JsonString = element.toString();

            JsonObject jsonObjRet = (JsonObject) gson.fromJson(JsonString, JsonElement.class);

            if (jsonObjRet.get("cd-erro").getAsString().equals("201")) break loop;

            msgReporte = msgReporte + jsonObjRet.get("cd-erro").getAsString();
            msgReporte  = msgReporte + " - " + jsonObjRet.get("mensagem").getAsString();        

        }

        return msgReporte;

    }

    public BarChartModel carregaGrafico() throws CheckExceptionsFaultBean, RemoteException  {


        ChartRefugoDao chartRefugoDao = new ChartRefugoDao();

        return chartRefugoDao.getRefugoModel();

    }


    public String getEstacaoLogada() {
        return estacaoLogada;
    }

    public void setEstacaoLogada(String estacaoLogada) {
        this.estacaoLogada = estacaoLogada;
    }

    public List<MovtoDiario> getListaMovtoDiario() {
        return listaMovtoDiario;
    }

    public void setListaMovtoDiario(List<MovtoDiario> listaMovtoDiario) {
        this.listaMovtoDiario = listaMovtoDiario;
    }

    public int getPrevisto() {
        return previsto;
    }

    public void setPrevisto(int previsto) {
        this.previsto = previsto;
    }

    public int getValorOk() {
        return valorOk;
    }

    public void setValorOk(int valorOk) {
        this.valorOk = valorOk;
    }

    public int getRealizado() {
        return realizado;
    }

    public void setRealizado(int realizado) {
        this.realizado = realizado;
    }

    public BigDecimal getPercRefugo() {
        return percRefugo;
    }

    public void setPercRefugo(BigDecimal percRefugo) {
        this.percRefugo = percRefugo;
    }

    public String getColorRef() {
        return colorRef;
    }

    public void setColorRef(String colorRef) {
        this.colorRef = colorRef;
    }

    public String getColorOee() {
        return colorOee;
    }

    public void setColorOee(String colorOee) {
        this.colorOee = colorOee;
    }

    public BigDecimal getDeOee() {
        return deOee;
    }

    public void setDeOee(BigDecimal deOee) {
        this.deOee = deOee;
    }


    public Etiqueta getEtiqueta() {
        return etiqueta;
    }

    public void setEtiqueta(Etiqueta etiqueta) {
        this.etiqueta = etiqueta;
    }

    public MovtoDiario getSelectedItem() {
        return selectedItem;
    }

    public void setSelectedItem(MovtoDiario selectedItem) throws CheckExceptionsFaultBean, RemoteException {
        this.selectedItem = selectedItem;
        carregarRefugos();
    }

    public List<Refugo> getListagemRefugos() {
        return listagemRefugos;
    }

    public void setListagemRefugos(List<Refugo> listagemRefugos) {
        this.listagemRefugos = listagemRefugos;
    }

    public Refugo getSelectedRefugo() {
        return selectedRefugo;
    }

    public void setSelectedRefugo(Refugo selectedRefugo) {
        this.selectedRefugo = selectedRefugo;
        System.out.println("passa");
        criarRefugo();
    }


}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software