function createDataset(fields, constraints, sortFields) {
    var dataset = DatasetBuilder.newDataset();

    dataset.addColumn("C1_FILIAL");
    dataset.addColumn("C1_NUM");
    dataset.addColumn("C1_ITEM");
    dataset.addColumn("C1_PRODUTO");
    dataset.addColumn("C1_DESCRI");
    dataset.addColumn("C1_QUANT");
    dataset.addColumn("C1_VUNIT");
    dataset.addColumn("C1_TOTAL");
    dataset.addColumn("C1_DATPRF");
    dataset.addColumn("C1_CC");
    dataset.addColumn("C1_CONTA");
    dataset.addColumn("C1_SOLICIT");
    dataset.addColumn("C1_EMISSAO");
    dataset.addColumn("C1_APROV");
    dataset.addColumn("C1_COTACAO");
    dataset.addColumn("C1_PEDIDO");
    dataset.addColumn("C1_ITEMPED");
    dataset.addColumn("STATUS");
    dataset.addColumn("data_consulta");
    dataset.addColumn("hora_consulta");
    dataset.addColumn("sucesso");
    dataset.addColumn("COTACOES_JSON");
    dataset.addColumn("COTACAO_ERRO");
    dataset.addColumn("PEDIDO_JSON");
    dataset.addColumn("PEDIDO_ERRO");

    function emptyRow() {
        return ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "false", "", "", "", ""];
    }

    function documentoValido(valor) {
        var v = String(valor || "").trim().toUpperCase();
        if (!v) return false;
        if (/^0+$/.test(v)) return false;
        if (/^X+$/.test(v)) return false;
        if (v == "XXXX" || v == "XXXXXX") return false;
        return true;
    }

    function consultarCotacao(clientService, cotacao) {
        var endpoints = [
            "/UF_MATA130/" + cotacao,
            "/rest/UF_MATA130/" + cotacao,
            "/rest/uf_mata130/" + cotacao
        ];

        var ultimoErro = "";
        for (var i = 0; i < endpoints.length; i++) {
            try {
                var dataCot = {
                    companyId: "1",
                    serviceCode: "Postprod",
                    endpoint: endpoints[i],
                    method: "get",
                    timeoutService: "60000",
                    headers: {
                        "Content-Type": "application/json"
                    }
                };

                var responseCot = clientService.invoke(JSON.stringify(dataCot));
                if (!responseCot || !responseCot.getResult()) {
                    ultimoErro = "Sem resposta ao consultar cotacao";
                    continue;
                }

                var resultCot = JSON.parse(responseCot.getResult());
                if (resultCot && resultCot.sucesso && resultCot.cotacoes && resultCot.cotacoes.length > 0) {
                    return {
                        sucesso: true,
                        cotacoes: resultCot.cotacoes
                    };
                }

                if (resultCot && resultCot.message) {
                    ultimoErro = String(resultCot.message);
                } else {
                    ultimoErro = "Cotacao sem itens retornados";
                }
            } catch (eCot) {
                ultimoErro = String(eCot);
            }
        }

        return {
            sucesso: false,
            erro: ultimoErro || "Falha ao consultar cotacao"
        };
    }

    function consultarPedido(clientService, pedido) {
        var endpoints = [
            "/UF_MATA120/" + pedido,
            "/rest/UF_MATA120/" + pedido,
            "/rest/uf_mata120/" + pedido
        ];

        var ultimoErro = "";
        for (var i = 0; i < endpoints.length; i++) {
            try {
                var dataPed = {
                    companyId: "1",
                    serviceCode: "Postprod",
                    endpoint: endpoints[i],
                    method: "get",
                    timeoutService: "60000",
                    headers: {
                        "Content-Type": "application/json"
                    }
                };

                var responsePed = clientService.invoke(JSON.stringify(dataPed));
                if (!responsePed || !responsePed.getResult()) {
                    ultimoErro = "Sem resposta ao consultar pedido";
                    continue;
                }

                var resultPed = JSON.parse(responsePed.getResult());
                if (resultPed && resultPed.sucesso && resultPed.pedidos && resultPed.pedidos.length > 0) {
                    return {
                        sucesso: true,
                        pedidos: resultPed.pedidos
                    };
                }

                if (resultPed && resultPed.message) {
                    ultimoErro = String(resultPed.message);
                } else {
                    ultimoErro = "Pedido sem itens retornados";
                }
            } catch (ePed) {
                ultimoErro = String(ePed);
            }
        }

        return {
            sucesso: false,
            erro: ultimoErro || "Falha ao consultar pedido"
        };
    }

    try {
        var numeroSC = null;
        if (constraints != null) {
            for (var i = 0; i < constraints.length; i++) {
                if (constraints[i].fieldName == "numeroSCProtheus") {
                    numeroSC = constraints[i].initialValue;
                }
            }
        }

        if (!numeroSC) {
            dataset.addRow(emptyRow());
            return dataset;
        }

        var data = {
            companyId: "1",
            serviceCode: "Postprod",
            endpoint: "/UF_MATA110/" + numeroSC,
            method: "get",
            timeoutService: "60000",
            headers: {
                "Content-Type": "application/json"
            }
        };

        var clientService = fluigAPI.getAuthorizeClientService();
        var response = clientService.invoke(JSON.stringify(data));

        if (response && response.getResult()) {
            var result = JSON.parse(response.getResult());

            if (result.sucesso && result.solicitacoes && result.solicitacoes.length > 0) {
                var sc = result.solicitacoes[0];
                var cotacao = sc.C1_COTACAO || "";
                if (cotacao == "000000" || cotacao == "000001") {
                    cotacao = "";
                }

                var cotacoesJson = "";
                var cotacaoErro = "";
                if (cotacao) {
                    var consultaCot = consultarCotacao(clientService, cotacao);
                    if (consultaCot.sucesso) {
                        cotacoesJson = JSON.stringify(consultaCot.cotacoes || []);
                    } else {
                        cotacaoErro = consultaCot.erro || "";
                    }
                }

                var pedido = String(sc.C1_PEDIDO || "").trim();
                var pedidoJson = "";
                var pedidoErro = "";
                if (documentoValido(pedido)) {
                    var consultaPed = consultarPedido(clientService, pedido);
                    if (consultaPed.sucesso) {
                        pedidoJson = JSON.stringify(consultaPed.pedidos || []);
                    } else {
                        pedidoErro = consultaPed.erro || "";
                    }
                }

                dataset.addRow([
                    sc.C1_FILIAL || "",
                    sc.C1_NUM || "",
                    sc.C1_ITEM || "",
                    sc.C1_PRODUTO || "",
                    sc.C1_DESCRI || "",
                    sc.C1_QUANT || "",
                    sc.C1_VUNIT || "",
                    sc.C1_TOTAL || "",
                    sc.C1_DATPRF || "",
                    sc.C1_CC || "",
                    sc.C1_CONTA || "",
                    sc.C1_SOLICIT || "",
                    sc.C1_EMISSAO || "",
                    sc.C1_APROV || "",
                    cotacao,
                    sc.C1_PEDIDO || "",
                    sc.C1_ITEMPED || "",
                    sc.STATUS || "",
                    result.data_consulta || "",
                    result.hora_consulta || "",
                    "true",
                    cotacoesJson,
                    cotacaoErro,
                    pedidoJson,
                    pedidoErro
                ]);
            } else {
                dataset.addRow(emptyRow());
            }
        } else {
            dataset.addRow(emptyRow());
        }
    } catch (e) {
        dataset.addRow(emptyRow());
    }

    return dataset;
}
