API REST para atualizar formulários

Boa noite pessoal,

Consegui fazer a criação de novos registros de formulários através da API "/2.0/cards/create" - link;

É possível atualizar esses registros através de chamadas RESTs? Não encontrei nenhum material sobre.

Obrigada!

Renata, como você conseguiu consumir essa API? Consumiu no próprio fluig? Se sim, poderia disponibilizar o código? Obrigado.

Levy, adicionei como resposta!

Oi Renata!

Ainda não está disponível na API pública uma forma de atualizar registros de formulário já existentes. Você pode registrar uma sugestão para a plataforma entrando em contato com o Suporte fluig.

Como paliativo, a cada edição necessária você pode copiar os dados do registro de formulário a ser atualizado, remove-lo e criar um novo registro de formulário com os dados copiados anteriormente (e com as informações atualizadas conforme a necessidade).

Abs,

Marcos

Obrigada Marcos :slight_smile:

Para atualização do formulário, estou utilizando o webservice ECMCardService e na função updateCardData passo os dados que serão atualizados. Faço essa chamada utilizando o WCMAPI.Create()

@Levy, Segue exemplo de código:


dados = 
{
  "parentDocumentId": 6, // código do formulario "pai"
  "version": 1000, //versão
  "formData": [ // lista dos campos 
    {
      "name": "<id_campo>",
      "value": "<valor_campo>"
    },
    {
      "name": "<id_campo>",
      "value": "<valor_campo>"
    }
  ]
};


$.ajax({
    url : '/api/public/2.0/cards/create',
    type : "POST",
    contentType : "application/json",
    Accept : "text/html",
    data : dados,
    success : function(data) {
        console.log("sucesso");
    },
    error : function(data, errorThrown, status) {
        console.log("erro");
    }
});

Você teve que fazer o cadastro de algum serviço ou do Oauth ou apenas utilizou desse jeito? Pois estou sempre recebendo que não estou autorizado :confused:

Oi Levy, não tive não. Usei exatamente esse código que mandei, só alterei o código do formulário para o correto, e os nomes/valores dos campos. O Formulário pai possui permissão de leitura para “todos”?

Renata já é possível sim atualizar formulários, no caso eu utilizo principalmente a chamada "editCard" para atualizar e a "saveNewCardItem" para salvar. Abaixo seguem os exemplos:

Editar Formulários (alterar o header Authorization):


var _returnAjax = {
    'api':        '',
    'data':     {'content': {columns: [], values: []} },
    'mensage':     '',
    'status':    0,
    'error':     ''
};

function saveFormAjax(url, documentId, version, formData){
    var ok = false;
    var rrAjax = null;    

    var api = url + "/ecm/api/rest/ecm/cardView/editCard/" + documentId + "/" + version;
    _returnAjax.api = api;

    if(typeof(formData) == "object"){
        formData = JSON.stringify(formData);
    }

    var settings = {
        "async": false,
        "crossDomain": false,
        "url": api,
        "method": "POST",
        "headers": {
            "Accept": "application/json, text/javascript, */*; q=0.01",
            "Accept-Language": "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7",
            "Content-Type": "application/json; charset=UTF-8",
            "X-Requested-With": "XMLHttpRequest",
            "Authorization": readCookie("jwt.token"),
            "cache-control": "no-cache",
        },
        "data": formData
    }


    $.when(
        $.ajax(settings).done(function(dataAjax, textStatus, jqXHR) {

            ok = true;
            _returnAjax.data     = dataAjax;
            _returnAjax.mensage = 'return.';
            _returnAjax.status     = jqXHR.status;
            _returnAjax.error     = (!ok);
            return  _returnAjax;

        //}).fail(function(data) {
        }).fail(function(jqXHR, textStatus, errorThrown) {
            var msgErro = jqXHR.responseText;

            ok = false;
            _returnAjax.data     = {'content': {columns: [], values: []} };
            _returnAjax.mensage = msgErro;
            _returnAjax.status     = jqXHR.status;
            _returnAjax.error     = (!ok);
            if(ok == false){
                rrAjax = _returnAjax;
            }
            return  _returnAjax;
        })        
    ).then(function( data, textStatus, jqXHR ) {
        rrAjax = _returnAjax;
        if(ok == false){
            console.log( 'ERRO: ' + jqXHR.status + ' - ' + jqXHR.responseText );
        }
    });

    return rrAjax;
}

Salvar Formulários (alterar o header Authorization):


var _returnAjax = {
    'api':        '',
    'data':     {'content': {columns: [], values: []} },
    'mensage':     '',
    'status':    0,
    'error':     ''
};
function createFormAjax(url, companyId, publisherId, WDParentDocumentId, attachments, cardDescription, metaListId, cardFormData, objData){    
    var ok = false;
    var rrAjax = null;    

    var api = url + "/ecm/api/rest/ecm/cardPublisher/saveNewCardItem";
    _returnAjax.api = api;

    if(typeof(objData) === 'undefined'){
        var objData = new Object();
        objData = {
           "companyId": companyId,
           "documentId":0,
           "version": 1000,
           "parentDocumentId": WDParentDocumentId,
           "privateDocument":false,
           "manualVersion":false,
           "documentDescription":"",
           "additionalComments":"",
           "versionDescription":null,
           "cardDescription": cardDescription,
           "publisherId": publisherId,
           "inheritSecurity":true,
           "publicDocument":false,
           "inheritApprovers":false,
           "uploadFolder": url + "/webdesk/Upload",
           "deleteUploadFiles":true,
           "documentType":"5",
           "documentTypeId":null,
           "infGeralVO":null,
           "approved":false,
           "securityPermissionVOs":null,
           "securityRestrictionVOs":null,
           "publisherApproverVOs":null,
           "activeApproverTab":false,
           "relatedDocumentVO":null,
           "principalFileName":"",
           "hasParentApprover":false,
           "attachments": attachments,
           "allocatedPK":null,
           "editableDocumentData":"",
           "saveDraft":false,
           "userSecurityLevel":3,
           "defaultPropertyVO":null,
           "ckbDefaultPropertyVO":null,
           "adminUser":false, // true,
           "phisicalFile": url + "/webdesk/streamcontrol/" + WDParentDocumentId + "/0/0/?WDCompanyId=" + companyId + "&WDNrDocto=0&WDNrVersao=0&WDParentDocumentId=" + WDParentDocumentId,
           "folderList":null,
           "formData":null,
           "attach":null,
           "relatedFiles":null,
           "rootPrivateFolder":false,
           "tabActivated":false,
           "metaListId": metaListId,
           "cardFormData": cardFormData,
           "changeAllActiveCards":false,
           "permissionType":0,
           "restrictionType":0,
           "uploadId":null,
           "oldViewer":false,
           "uploadUrl":null,
           "imutable":null,
           "hasPendentApprovals":false,
           "formDatasetVOs":null,
           "message":null,
           "internalFields":[]
        };
    }

    if(typeof(objData) == 'object'){
        objData = JSON.stringify(objData);
    }

    var settings = {
        "async": false,
        "crossDomain": false,
        "url": api,
        "method": "POST",
        "headers": {
            "Accept": "application/json, text/javascript, */*; q=0.01",
            "Accept-Language": "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7",
            "Content-Type": "application/json; charset=UTF-8",
            "X-Requested-With": "XMLHttpRequest",
            "Authorization": readCookie("jwt.token"),
            "cache-control": "no-cache",
        },
        "data": objData
    }


    $.when(
        $.ajax(settings).done(function(dataAjax, textStatus, jqXHR) {

            ok = true;
            _returnAjax.data     = dataAjax;
            _returnAjax.mensage = 'return.';
            _returnAjax.status     = jqXHR.status;
            _returnAjax.error     = (!ok);
            return  _returnAjax;

        //}).fail(function(data) {
        }).fail(function(jqXHR, textStatus, errorThrown) {
            var msgErro = jqXHR.responseText;

            ok = false;
            _returnAjax.data     = {'content': {columns: [], values: []} };
            _returnAjax.mensage = msgErro;
            _returnAjax.status     = jqXHR.status;
            _returnAjax.error     = (!ok);
            if(ok == false){
                rrAjax = _returnAjax;
            }
            return  _returnAjax;
        })        
    ).then(function( data, textStatus, jqXHR ) {
        rrAjax = _returnAjax;
        if(ok == false){
            console.log( 'ERRO: ' + jqXHR.status + ' - ' + jqXHR.responseText );
        }
    });

    return rrAjax;
}

Também existe a maneira de usar os métodos do "ECMCardService" via requisições XML:


function updateFormECM(cardId, campo, valor) {
    let url = parent.WCMAPI.serverURL + "/webdesk/ECMCardService?wsdl";

    let xmlItem = "<item>";
    xmlItem += "    <field>" + campo + "</field>";
    xmlItem += "    <value>" + valor + "</value>";
    xmlItem += "</item>";

    let xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.dm.ecm.technology.totvs.com/">'
        +'<soapenv:Header/>'
        +'<soapenv:Body>'
            +'<ws:updateCardData>'
            +'<companyId>' + top.WCMAPI.organizationId + '</companyId>'
            +'<username></username>'
            +'<password></password>'
            +'<cardId>' + cardId + '</cardId>'
            +'<cardData>'
                + xmlItem
            +'</cardData>'
            +'</ws:updateCardData>'
        +'</soapenv:Body>'
        +'</soapenv:Envelope>';

    requestXML(url, xml);

}

function requestXML(url, xml){
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            var response = (this.responseText);  
            console.log(response);     
        }
    };
    xhr.open("POST", url, false);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.send(xml);
}

Obs: se nada disso funcionar você pode optar por fazer uma requisição ajax chamando um dataset pela API "/api/public/ecm/dataset/datasets", e internamente dentro do dataset utilizar os métodos do ECMCardService:


function createDataset(fields, constraints, sortFields) {
    var cardId = "";
    var cardData = new Array();

    try {
        var ECMCardService = ServiceManager.getService('ECMCardService');
        var serviceLocator = ECMCardService.instantiate('com.totvs.technology.ecm.dm.ws.ECMCardServiceService');
        var service = serviceLocator.getCardServicePort();

        if (constraints != null) {
            for (var i = 0; i < constraints.length; i++) {
                if (constraints[i].fieldName == "CardId") {
                    cardId = constraints[i].initialValue;
                }
                if (constraints[i].fieldName == "CardData") {
                    var cardDataValue = constraints[i].initialValue;
                    cardData.push(cardDataValue.split(';'));                  
                }
            }
        }

        if (cardId == "") throw "Insira o Card Id!";
        if (cardData == "") throw "Insira o Card Data!";

        var serviceObj = ECMCardService.instantiate('com.totvs.technology.ecm.dm.ws.ObjectFactory');
        var cardFieldDtoArray = serviceObj.createCardFieldDtoArray();

        for (var index in cardData) {           
            var cardFieldDto = serviceObj.createCardFieldDto();      
            cardFieldDto.setField(cardData[index][0]);
            cardFieldDto.setValue(cardData[index][1]);
            cardFieldDtoArray.getItem().add(cardFieldDto);
        }

        var result = service.updateCardData(
            1,
            '???@seudominio.com.br',
            'suasenha',
            cardId,
            cardFieldDtoArray
        );

        var dataset = DatasetBuilder.newDataset();

        //Cria as colunas
        dataset.addColumn("Card Id");
        dataset.addColumn("Card Data");
        dataset.addColumn("Result");        

        dataset.addRow(new Array(cardId, cardData[0], result.getItem().get(0).getWebServiceMessage()));

        return dataset;
    } catch (e) {
        log.warn("--Debbug-- Erro: "+ e +" "+e.lineNumber);                   
        var dataset = DatasetBuilder.newDataset();
        dataset.addColumn("Erro");
        dataset.addColumn("Linha");
        dataset.addRow(new Array(e, e.lineNumber));
        return dataset;
    }
}

Maravilhoso, Uákiti! Valeu mesmo!