$(document).ready(async function () {

    const produtoCodigo = await retornaCodigodoProdutoUrl();
    let ordemManutencao = 0;
    // ta aqui pra prestar manutenção? sinto muito kkkkkkkk 

    function criaPesquisaF4(input, btn) {
        $(`#${input}`).keyup(function (e) {
            if (e.keyCode == 115) {
                $(`#${btn}`).click();
                e.preventDefault();
                e.stopPropagation();
            }
        });
    }

    $('#btn-CodigoConsumo').pesquisa_serverside(['#txtCodigoConsumo'], ['CODIGO'], ['DESCRICAO'], '{"tabela":"PRODUTO", "camposSelect":[ "CODIGO", "DESCRICAO"], "where": null}', 'Pesquisa de Produto');
    $('#txtCodigoConsumo').autocompleta(1, 'JSON={ "tabela":"PRODUTO", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}');

    criaPesquisaF4('txtCodigoConsumo', 'btn-CodigoConsumo')

    $('#btnManutencao').on('click', async function () {
        $('#tabelaConsumos').DataTable().$('tr.selected').removeClass('selected');
        carregaModalManutencao()
        $('#modal-manutencaoconsumos').modal('show')
    })

    $('#btnEdicao').on('click', async function () {
        $('#btnEdicao').addClass('d-none');
        $('#btnGravar').removeClass('d-none');
        $('#btnCancelar').removeClass('d-none');
        $('#btnImportaCons').removeClass('d-none');
        $('#btnExcluir').addClass('d-none');
        $('#btnImprimir').addClass('d-none');
        $('#btnFotoMaterial').addClass('d-none');
    });

    $('#btnCancelar').on('click', async function () {
        $('#btnEdicao').removeClass('d-none');
        $('#btnGravar').addClass('d-none');
        $('#btnCancelar').addClass('d-none');
        $('#btnImportaCons').addClass('d-none');
        $('#btnExcluir').removeClass('d-none');
        $('#btnImprimir').removeClass('d-none');
        $('#btnFotoMaterial').removeClass('d-none');
    });

    $('#cbSomenteCorAtiva').on('change', async function () {
        if ($('#cbSomenteCorAtiva').is(':checked')) {
            const cbSomenteCorAtiva = true;
            await fazConsulta(cbSomenteCorAtiva);
        } else {
            await fazConsulta(false);
        }
    });

    $('#txtCodigoConsumo').on('blur', async function () {
        if ($('#txtCodigoConsumo').val() != '') {
            try {
                $.LoadingOverlay('show');
                const codigoConsultado = pegaChave('#txtCodigoConsumo');
                window.location.href = `${btoa(codigoConsultado)}`;
            } catch (error) {
                msgErro('Não foi possível buscar os consumos.');
            } finally {
                $.LoadingOverlay('hide');
            }
        };
    });

    $('#tabelaConsumos').on('click', '#btnAlterarConsumo', async function () {
        $('#tabelaConsumos').DataTable().$('tr.selected').removeClass('selected')
        $($(this).parents("tr")).addClass('selected')
        carregaModalManutencao()
        const data = $("#tabelaConsumos").DataTable().row($(this).parents("tr")).data()
        await retornaDadosModalModificacoes(data)
        $('#modal-manutencaoconsumos').modal('show')
    })

    $('#tabelaConsumos').on('click', '#btn-excluirConsumo', async function (event) {
        msgAlerta('Você realmente deseja excluir esse consumo?', async () => {
            try {
                $.LoadingOverlay('show');
                const data = $("#tabelaConsumos").DataTable().row($(this).parents("tr"));
                await data.remove().draw(false);
                const listaFormatada = await criaListaParaGravar();

                if (listaFormatada == '') {
                    const url = '/sisplan/cadconsumo/v1/excluitodosconsumos?';
                    const response = await requisicao("DELETE", url, `CODIGO_PROD=${produtoCodigo}`, null);
                    if (response.status == 200) {
                        criaMensagemSucesso('Consumo excluído com sucesso!', () => { window.location.reload(true) });
                    };
                } else {
                    const url = '/sisplan/cadconsumo/v1/incluiconsumos?';
                    const response = await requisicao('POST', url, '', `LISTADECONSUMOS=${encodeURIComponent(JSON.stringify({ LISTACONSUMOSCRIADOS: listaFormatada }))}`, 360000);
                    if (response.status == 200) {
                        criaMensagemSucesso('Consumo excluído com sucesso!', () => { window.location.reload(true) });
                    };
                }
            } catch (error) {
                console.error(error);
                msgErro('Não foi possível fazer a exclusão do consumo! Verifique.');
            } finally {
                $.LoadingOverlay('hide');
            }

        });
    });

    $('#btnExcluirConsumos').on('click', async function () {
        msgAlerta('Você realmente deseja excluir todos os consumos?', async () => {
            const registroData = $("#tabelaConsumos").DataTable().rows();
            const url = '/sisplan/cadconsumo/v1/excluitodosconsumos?';
            const response = await requisicao("DELETE", url, `CODIGO_PROD=${produtoCodigo}`, null);

            if (response.status === 400) {
                msgAlerta('Não foi possível fazer a exclusão dos consumos! Verifique.');
                return;
            }

            if (response.status === 200) {
                registroData.remove().draw(false);
                criaMensagemSucesso('Todos os consumos do produto foram excluídos com sucesso!', () => { window.location.reload(true); });
                return;
            }

        });
    });

    $('#btnImprimir').on('click', async function () {
        try {
            $.LoadingOverlay("show");
            try {
                const url = `/sisplan/impressao/v1/imprimirconsumos?CODIGO_PRODUTO=${produtoCodigo}`;
                const bImprimeAutomatico = await verificaImprimirAutomatico('RelConsumos');
                const arquivo = await GeraRelatorio(`${url}`, "GET", 100000, false, 'RelConsumos');
                if (arquivo != undefined) {
                    if (!bImprimeAutomatico) {
                        window.open(`${BASE_URI}/relatorios_api/pdf/${arquivo}`, "_blank");
                    }
                    await limparRelatorios();
                }
            } catch (error) {
                console.error(error);
            }
        } finally {
            $.LoadingOverlay("hide");
        }
    });

    async function retornaCodigodoProdutoUrl() {
        const queryString = window.location.href;
        const parametros = queryString.split('/');
        const produtoUrl = atob(parametros[parametros.length - 1]);
        await preencheInputCodigo(produtoUrl);

        return produtoUrl;
    };

    function retornaBotaoOpcoes(data) {
        var retorno = '<div style="text-align:start;"> ' +
            '    <button class="btn btn-info btn-sm dropdown-toggle btnVerificaOpcoes" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> ' +
            '      ' + data + ' ' +
            '    </button> ' +
            '    <div class="dropdown-menu"> ' +
            '    <button type="button" class="dropdown-item" style="width: 100%" id="btnAlterarConsumo">Alterar</button>  ' +
            '    <button type="button" class="dropdown-item" style="width: 100%" id="btn-excluirConsumo">Excluir</button>  ' +
            '</div>';
        return retorno;
    };

    function retornaBotaoOpcoesGradeTam(data) {
        let hidden
        const linhaSelecionada = $('#tabelaConsumos').DataTable().row($('tr.selected')).count() > 0
        if (linhaSelecionada) {
            hidden = 'hidden'
        } else {
            hidden = ''
        }

        var retorno = '<div style="text-align:start;"> ' +
            `    <button class="btn btn-info btn-sm dropdown-toggle btnVerificaOpcoes btnAcoesGradeConsumo" id="btnOrdemGradeTam${data}" value="${data}" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> ` +
            '      ' + data + ' ' +
            '    </button> ' +
            '    <div class="dropdown-menu"> ' +
            `    <button class="dropdown-item" style="width: 100%" type="button" value="${data}" title="Alterar" id="btn-alterarGradeConsumo">Alterar</button>  ` +
            `    <button class="dropdown-item" style="width: 100%" type="button" value="${data}" title="Excluir" id="btn-excluirGradeConsumo" ${hidden}>Excluir</button>  ` +
            '</div>';
        return retorno;
    };

    function retornaCoresProdInsumoTabConsumos(linhaDataTable) {
        const titulosColunas = $('#tabelaConsumos').DataTable().columns().header().toArray().map(function (header) {
            return header.textContent
        });

        titulosColunas.splice(0, 12);
        const coresProdInsumo = [];

        for (p = 0; p < titulosColunas.length; p++) {
            const tituloSemPipe = {
                Cor_P: titulosColunas[p].substring(0, titulosColunas[p].indexOf('|')),
                Cor_I: linhaDataTable[p + 12].substring(0, linhaDataTable[p + 12].indexOf('|')),
            };
            coresProdInsumo.push(tituloSemPipe);
        };
        return coresProdInsumo;
    };

    async function criaListaParaGravar() {
        const listaDeConsumos = [];

        const dataTabelaConsumosAntigos = $('#tabelaConsumos').DataTable().data().toArray();

        for (i = 0; i < dataTabelaConsumosAntigos.length; i++) {
            const consumoAntigo = {
                Produto_Codigo: produtoCodigo,
                Insumo_Tipo: dataTabelaConsumosAntigos[i][0],
                Insumo_IdCons: dataTabelaConsumosAntigos[i][1],
                Insumo_Ordem: dataTabelaConsumosAntigos[i][2],
                Insumo_Codigo: dataTabelaConsumosAntigos[i][3],
                Insumo_Descricao: dataTabelaConsumosAntigos[i][4],
                Insumo_Unidade: dataTabelaConsumosAntigos[i][5],
                Insumo_Setor: dataTabelaConsumosAntigos[i][6],
                Insumo_Aplicacao: dataTabelaConsumosAntigos[i][7],
                Insumo_Parte: dataTabelaConsumosAntigos[i][8],
                Insumo_Faixa: dataTabelaConsumosAntigos[i][9],
                Insumo_Preco: dataTabelaConsumosAntigos[i][10],
                Insumo_Consumo: dataTabelaConsumosAntigos[i][11],
                Insumo_ListaCores: retornaCoresProdInsumoTabConsumos(dataTabelaConsumosAntigos[i]),
            };
            listaDeConsumos.push(consumoAntigo);
        };

        const tamanhosProduto = await retornaGradeTamanhosProduto();

        if ($.fn.DataTable.isDataTable('#tabelaGradeTamanho')) {

            const novosItensTabela = $('#tabelaGradeTamanho').DataTable().data().toArray()

            novosItensTabela.forEach((linhaTabela) => {
                return tamanhosProduto.forEach((tamanhoProduto) => {
                    const arrayCoresTabela = JSON.parse(linhaTabela.CORES_PRODUTO)
                    const coresProduto = arrayCoresTabela?.map((e) => {
                        return {
                            cor_p: e?.corProduto,
                            cor_i: e?.corInsumo,
                            descCor_i: e?.descricaoCorInsumo,
                        }
                    })
                    const { TAMANHO: tamanho } = tamanhoProduto
                    const qtdeFormatada = parseFloat(linhaTabela[tamanho] === '' ? 0 : linhaTabela[tamanho])
                    if (qtdeFormatada > 0) {
                        listaDeConsumos.push({
                            Produto_Codigo: produtoCodigo,
                            Insumo_Tipo: linhaTabela.TIPO,
                            Insumo_IdCons: '',
                            Insumo_Ordem: listaDeConsumos.length + 1,
                            Insumo_Codigo: linhaTabela.CODIGO,
                            Insumo_Descricao: linhaTabela.DESCRICAO,
                            Insumo_Unidade: linhaTabela.UNIDADE,
                            Insumo_Setor: linhaTabela.SETOR,
                            Insumo_Aplicacao: linhaTabela.APLICACAO,
                            Insumo_Parte: linhaTabela.PARTE,
                            Insumo_Faixa: tamanho,
                            Insumo_Preco: 'S',
                            Insumo_Consumo: qtdeFormatada,
                            Insumo_ListaCores: coresProduto,
                        })
                    }
                })
            })
        }
        return listaDeConsumos;
    };

    async function preencheInputCodigo(sCodigoConsumo) {
        const pesquisaDescricao = {
            tabela: 'PRODUTO',
            camposSelect: ['DESCRICAO', 'UNIDADE', 'FAIXA'],
            where: [`CODIGO = '${sCodigoConsumo}'`]
        };

        const jsonProduto = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaDescricao));

        if (jsonProduto.length == 0) {
            return;
        };

        const pesquisaFaixaDesc = {
            tabela: 'FAIXA',
            camposSelect: ['DESCRICAO'],
            where: [`CODIGO = '${jsonProduto[0].FAIXA}'`]
        }

        const jsonFaixa = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaFaixaDesc));

        if (jsonFaixa.length == 0) {
            return;
        };

        $('#txtCodigoConsumo').val(`[${sCodigoConsumo}] - ${jsonProduto[0].DESCRICAO} - ${jsonProduto[0].UNIDADE}`);
        $('#txtFaixaProduto').html(`${jsonFaixa[0].DESCRICAO}`);
        $('#txtCodigoProdTittle').html(`${sCodigoConsumo} - ${jsonProduto[0].DESCRICAO}`);
    };

    async function retornaCoresProduto(cbSomenteCorAtiva) {
        const codigosCores = []
        let whereCorAtiva = '';
        if (cbSomenteCorAtiva) {
            whereCorAtiva = `AND PA_ITEN.ATIVO = 'S'`;
        };
        const pesquisaParam = {
            tabela: 'PA_ITEN',
            camposSelect: ['DISTINCT PA_ITEN.COR', 'CADCOR.DESCRICAO'],
            where: [`PA_ITEN.CODIGO = '${produtoCodigo}' ${whereCorAtiva}`],
            innerJoin: [{ tabela: "CADCOR", condicao: "PA_ITEN.COR = CADCOR.COR" }]
        };
        const jsonStr = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaParam));
        if (jsonStr.length == 0) {
            return;
        };
        const jsonFormatado = [];
        for (let i = 0; i < jsonStr.length; i++) {
            jsonFormatado.push(jsonStr[i].COR + '|' + jsonStr[i].DESCRICAO);
            codigosCores.push({ cor: jsonStr[i].COR });
        };
        return {
            jsonFormatado,
            codigosCores
        }
    };

    async function carregaDataTable(pesquisaInsumo, pesquisaCoresInsumo, cbSomenteCorAtiva) {

        if ($.fn.DataTable.isDataTable('#tabelaConsumos')) {
            $('#tabelaConsumos').DataTable().destroy();
            $('#tabelaConsumos').empty();
        };

        const dataSetCols = [];
        let dataSetData = [];
        const dataSetDataInfo = [];

        dataSetCols.push({
            title: "Tipo",
        });

        dataSetCols.push({
            title: "ID Cons",
        });

        dataSetCols.push({
            title: "Ordem",
        });

        dataSetCols.push({
            title: "Código",
        });

        dataSetCols.push({
            title: "Descrição",
        });

        dataSetCols.push({
            title: "Unid.",
        });

        dataSetCols.push({
            title: "Setor",
        });

        dataSetCols.push({
            title: "Aplic.",
        });

        dataSetCols.push({
            title: "Parte",
        });

        dataSetCols.push({
            title: "Faixa",
        });

        dataSetCols.push({
            title: "Preço",
        });

        dataSetCols.push({
            title: "Consumo",
        });


        const { jsonFormatado: coresdoProduto } = await retornaCoresProduto(cbSomenteCorAtiva);

        for (j in coresdoProduto) {
            dataSetCols.push({
                title: coresdoProduto[j],
            });
        };

        let contadorConsumo = 0;

        for (i in pesquisaInsumo) {
            contadorConsumo++

            dataSetData.push(pesquisaInsumo[i].TIPO == 'P' ? 'P' : 'M');

            dataSetData.push(pesquisaInsumo[i].ID_CONS);

            dataSetData.push(contadorConsumo);

            dataSetData.push(pesquisaInsumo[i].INSUMO);

            dataSetData.push(pesquisaInsumo[i].DESCRICAO);

            dataSetData.push(pesquisaInsumo[i].UNIDADE);

            dataSetData.push(pesquisaInsumo[i].SETOR);

            dataSetData.push(pesquisaInsumo[i].APLICACAO);

            dataSetData.push(pesquisaInsumo[i].PARTE);

            dataSetData.push(pesquisaInsumo[i].FAIXA);

            dataSetData.push(pesquisaInsumo[i].PRECO);

            dataSetData.push(pesquisaInsumo[i].CONSUMO);

            for (y in coresdoProduto) {
                const indiceCodigoCor = coresdoProduto[y].indexOf('|');
                const apenasCodigoCor = coresdoProduto[y].substring(0, indiceCodigoCor);
                const data = pesquisaCoresInsumo.filter(coresInsumo => coresInsumo.ID == pesquisaInsumo[i].ID && coresInsumo.COR == apenasCodigoCor);
                if (data.length > 0) {
                    dataSetData.push(data[0].COR_I + '|' + data[0].DESC_COR);
                } else {
                    dataSetData.push('');
                }

            };

            dataSetDataInfo.push(dataSetData);
            dataSetData = [];
        }

        if (pesquisaInsumo == 0 && pesquisaCoresInsumo == 0) {
            $('#tabelaConsumos').DataTable({
                bPaginate: false,
                autoWidth: true,
                searching: false,
                destroy: true,
                language: {
                    sEmptyTable: "Nenhum registro encontrado",
                    sInfo: "_TOTAL_ registros",
                    sInfoEmpty: " 0 registros",
                    sInfoFiltered: "(Filtrados de _MAX_ registros)",
                    sInfoPostFix: "",
                    sInfoThousands: ".",
                    sLengthMenu: "_MENU_ resultados",
                    sLoadingRecords: "Carregando...",
                    sProcessing: "Processando...",
                    sZeroRecords: "Nenhum registro encontrado",
                    sSearch: "Pesquisar",
                    oPaginate: {
                        sNext: "Próximo",
                        sPrevious: "Anterior",
                        sFirst: "Primeiro",
                        sLast: "Último",
                    },
                    oAria: {
                        sSortAscending: ": Ordenar colunas de forma ascendente",
                        sSortDescending: ": Ordenar colunas de forma descendente",
                    },
                },
                columns: dataSetCols,
            });
        } else {
            $('#tabelaConsumos').DataTable({
                bPaginate: false,
                searching: false,
                scrollX: false,
                destroy: true,
                language: {
                    sEmptyTable: "Nenhum registro encontrado",
                    sInfo: "_TOTAL_ registros",
                    sInfoEmpty: " 0 registros",
                    sInfoFiltered: "(Filtrados de _MAX_ registros)",
                    sInfoPostFix: "",
                    sInfoThousands: ".",
                    sLengthMenu: "_MENU_ resultados",
                    sLoadingRecords: "Carregando...",
                    sProcessing: "Processando...",
                    sZeroRecords: "Nenhum registro encontrado",
                    sSearch: "Pesquisar",
                    oPaginate: {
                        sNext: "Próximo",
                        sPrevious: "Anterior",
                        sFirst: "Primeiro",
                        sLast: "Último",
                    },
                    oAria: {
                        sSortAscending: ": Ordenar colunas de forma ascendente",
                        sSortDescending: ": Ordenar colunas de forma descendente",
                    },
                },
                autoWidth: true,
                columns: dataSetCols,
                data: dataSetDataInfo,
                columnDefs: [
                    {
                        targets: [11],
                        render(data) {
                            return parseFloat(data).toFixed(5).replace('.', ',')
                        }
                    },
                    {
                        targets: [1],
                        render(data) {
                            return retornaBotaoOpcoes(data)
                        }
                    },
                ]
            });
        }
    };

    async function fazConsulta(cbSomenteCorAtiva) {
        const PesquisaInsumo = {
            tabela: "PCPFT2",
            camposSelect: ["PCPFT2.*",
                "CASE WHEN PCPFT2.TIPO = 'P' THEN PRODUTO.DESCRICAO ELSE MATERIAL.DESCRICAO END DESCRICAO",
                "CASE WHEN PCPFT2.TIPO = 'P' THEN PRODUTO.UNIDADE ELSE MATERIAL.UNIDADE END UNIDADE",
                "PCPAPL.DESCRICAO DESC_APL",
                "TIPO_APL.DESCRICAO AS DESC_PARTE"
            ],
            leftJoin: [
                { "tabela": "MATERIAL", "condicao": "PCPFT2.INSUMO = MATERIAL.CODIGO" },
                { "tabela": "PRODUTO", "condicao": "PCPFT2.INSUMO = PRODUTO.CODIGO" },
                { "tabela": "PCPAPL", "condicao": "PCPAPL.CODIGO = PCPFT2.APLICACAO" },
                { "tabela": "TIPO_APL", "condicao": "PCPFT2.PARTE = TIPO_APL.CODIGO" }
            ],
            where: [`PCPFT2.CODIGO = '${produtoCodigo}'`],
            orderBy: ["PCPFT2.ID"]
        };

        const jsonStrPesquisaInsumo = await retornaJsonPesquisaPadrao(JSON.stringify(PesquisaInsumo));

        const PesquisaCoresInsumo = {
            tabela: "PCPFT3",
            camposSelect: ["PCPFT3.COR_I",
                "PCPFT3.LOTE_TINTUR",
                "CADCOR.DESCRICAO DESC_COR",
                "PCPFT3.ID",
                "PCPFT3.COR",
                "CADCOR2.DESCRICAO DESC_COR2",
                "PCPFT3.CODIGO"
            ],
            leftJoin: [
                { "tabela": "CADCOR", "condicao": "PCPFT3.COR_I = CADCOR.COR" },
                { "tabela": "CADCOR", "alias": "CADCOR2", "condicao": "PCPFT3.COR = CADCOR2.COR" }
            ],
            where: [`PCPFT3.CODIGO = '${produtoCodigo}'`]
        };

        const jsonStrPesquisaCoresInsumo = await retornaJsonPesquisaPadrao(JSON.stringify(PesquisaCoresInsumo));

        await carregaDataTable(jsonStrPesquisaInsumo, jsonStrPesquisaCoresInsumo, cbSomenteCorAtiva);
    };

    await fazConsulta(false);

    await preencheDivConsumosPorTamanho();
    await retornaCoresDoProduto();
    await criaDataTableCoresInsumo(false);

    /// aqui começa as funções do modal de manutenção 

    function bloqueiaCamposModal() {
        $('#txtInsumo').prop('disabled', true);
        $('#txtSetorInsumo').prop('disabled', true);
        $('#txtAplicacaoInsumo').prop('disabled', true);
        $('#txtParteInsumo').prop('disabled', true);
        $('#btn-CodigoInsumo').prop('disabled', true);
        $('#btn-CodigoInsumoProd').prop('disabled', true);
        $('#btn-limpa-CodigoInsumo').prop('disabled', true);
        $('#btn-SetorInsumo').prop('disabled', true);
        $('#btn-limpa-SetorInsumo').prop('disabled', true);
        $('#btn-AplicacaoInsumo').prop('disabled', true);
        $('#btn-limpa-AplicacaoInsumo').prop('disabled', true);
        $('#btn-ParteInsumo').prop('disabled', true);
        $('#btn-limpa-ParteInsumo').prop('disabled', true);
        $('#btn-limpa-CodigoInsumo').prop('disabled', true);
        $('.inputsTamanho').prop('disabled', true);
        $('.inputsCorInsumo').prop('disabled', true);
    };

    function desbloqueiaCamposModal() {
        $('#txtInsumo').prop('disabled', false);
        $('#txtSetorInsumo').prop('disabled', false);
        $('#txtAplicacaoInsumo').prop('disabled', false);
        $('#txtParteInsumo').prop('disabled', false);
        $('.inputsCorInsumo').prop('disabled', false);
        $('.inputsTamanho').prop('disabled', false);
        $('#btn-CodigoInsumo').prop('disabled', false);
        $('#btn-CodigoInsumoProd').prop('disabled', false);
        $('#btn-limpa-CodigoInsumo').prop('disabled', false);
        $('#btn-SetorInsumo').prop('disabled', false);
        $('#btn-limpa-SetorInsumo').prop('disabled', false);
        $('#btn-AplicacaoInsumo').prop('disabled', false);
        $('#btn-limpa-AplicacaoInsumo').prop('disabled', false);
        $('#btn-ParteInsumo').prop('disabled', false);
        $('#btn-limpa-ParteInsumo').prop('disabled', false);
        $('#btn-limpa-CodigoInsumo').prop('disabled', false);
    };

    function retornaInputDeCorInsumo({ COR: cor }) {
        return `<div class="input-group">
        <input type="text" autocomplete="off" class="input-default focus form-control inputsCorInsumo" disabled id="txtCorInsumo${cor}" name="txtCorInsumo${cor}" class="form-control" data-cor="${cor}">
        <div class="input-group-append">
            <button class="btn bg-danger btn-consumo" id="btn-CorInsumo${cor}" name="btn-CorInsumo${cor}" data-button="absolute" type="button"><i class="m-0 p-0 fas fa-search"></i></button>
        </div>
        </div>`
    };

    function retornaInputDeDescricaoInsumo({ COR: cor }) {
        return `<input type="text" class="input-default form-control descInsumo" disabled id="txtDescricaoInsumo${cor}" class="form-control"></input>`
    };

    async function retornaCoresDoProduto() {

        const dataSetCols = [];

        dataSetCols.push({
            title: 'Cor',
            data: 'COR'
        });

        dataSetCols.push({
            title: 'Descrição',
            data: 'DESCRICAO'
        });

        dataSetCols.push({
            title: 'Cor Insumo(F4)',
            data: 'CAMPOVAZIO1'
        });

        dataSetCols.push({
            title: 'Descrição Cor Insumo',
            data: 'CAMPOVAZIO2'
        });

        const pesquisaParam = {
            tabela: 'PA_ITEN',
            camposSelect: ['DISTINCT PA_ITEN.COR', 'CADCOR.DESCRICAO', `'CAMPOVAZIO1' AS CAMPOVAZIO1`, `'CAMPOVAZIO2' AS CAMPOVAZIO2 `],
            where: [`PA_ITEN.CODIGO = '${produtoCodigo}'`],
            innerJoin: [{ tabela: "CADCOR", condicao: "PA_ITEN.COR = CADCOR.COR" }]
        };
        const jsonStr = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaParam));

        if (jsonStr.length == 0) {
            return;
        };

        if ($.fn.DataTable.isDataTable('#tabelaCoresProduto')) {
            $("#tabelaCoresProduto").DataTable().destroy();
            $("#tabelaCoresProduto").empty();
        };

        $('#tabelaCoresProduto').DataTable({
            bPaginate: false,
            order: false,
            sort: false,
            autoWidth: true,
            scrollY: '100px',
            searching: false,
            destroy: true,
            language: {
                sEmptyTable: "Nenhum registro encontrado",
                sInfo: "_TOTAL_ registros",
                sInfoEmpty: " 0 registros",
                sInfoFiltered: "(Filtrados de _MAX_ registros)",
                sInfoPostFix: "",
                sInfoThousands: ".",
                sLengthMenu: "_MENU_ resultados",
                sLoadingRecords: "Carregando...",
                sProcessing: "Processando...",
                sZeroRecords: "Nenhum registro encontrado",
                sSearch: "Pesquisar",
                oPaginate: {
                    sNext: "Próximo",
                    sPrevious: "Anterior",
                    sFirst: "Primeiro",
                    sLast: "Último",
                },
                oAria: {
                    sSortAscending: ": Ordenar colunas de forma ascendente",
                    sSortDescending: ": Ordenar colunas de forma descendente",
                },
            },
            columns: dataSetCols,
            columnDefs: [
                {
                    targets: [2, 3], render: function (data, _, row) {
                        if (data == 'CAMPOVAZIO1') {
                            return retornaInputDeCorInsumo(row);
                        } else if (data == 'CAMPOVAZIO2') {
                            return retornaInputDeDescricaoInsumo(row);
                        }
                    }
                }
            ],
            data: jsonStr,
        });
    };

    // async function retornaTargets(tamanhosProduto) {
    //     const listaTargets = [];
    //     for (u in tamanhosProduto) {
    //         listaTargets.push(u)
    //     };

    //     return listaTargets;
    // };

    async function preencheDivConsumosPorTamanho() {
        const tamanhosProd = await retornaGradeTamanhosProduto();

        if ($.fn.DataTable.isDataTable('#tabelaTamanhosDiv')) {
            $("#tabelaTamanhosDiv").DataTable().destroy();
            $("#tabelaTamanhosDiv").empty();
        };

        const listaTams = [];
        const listaTamsData = [];
        let objTamanhoData = {};

        for (h in tamanhosProd) {
            listaTams.push({
                'title': `<div style="padding-left: 28px;">${tamanhosProd[h].TAMANHO}</div>`,
                'data': tamanhosProd[h].TAMANHO,
                'width': '75px'
            });

            objTamanhoData[`${tamanhosProd[h].TAMANHO}`] = `<input type="text" autocomplete="off" class="input-default focus form-control inputsTamanho" style="width: 70px; padding: 0px 5px" disabled id="txtTamanho${tamanhosProd[h].TAMANHO}" name="txtTamanho${tamanhosProd[h].TAMANHO}" class="form-control">`;
        };

        listaTamsData.push(objTamanhoData);

        $('#tabelaTamanhosDiv').DataTable({
            bPaginate: false,
            order: false,
            sort: false,
            autoWidth: true,
            // scrollY: '100px',
            scrollX: true,
            searching: false,
            destroy: true,
            language: {
                sEmptyTable: "Nenhum registro encontrado",
                sInfo: "_TOTAL_ registros",
                sInfoEmpty: " 0 registros",
                sInfoFiltered: "(Filtrados de MAX registros)",
                sInfoPostFix: "",
                sInfoThousands: ".",
                sLengthMenu: "_MENU_ resultados",
                sLoadingRecords: "Carregando...",
                sProcessing: "Processando...",
                sZeroRecords: "Nenhum registro encontrado",
                sSearch: "Pesquisar",
                oPaginate: {
                    sNext: "Próximo",
                    sPrevious: "Anterior",
                    sFirst: "Primeiro",
                    sLast: "Último",
                },
                oAria: {
                    sSortAscending: ": Ordenar colunas de forma ascendente",
                    sSortDescending: ": Ordenar colunas de forma descendente",
                },
            },
            columns: listaTams,
            data: listaTamsData,
        });

        //aplicarEstilosNasCelulas()
    };


    function aplicarEstilosNasCelulas() {
        const cells = document.querySelectorAll('#tabelaTamanhosDiv tbody td');

        cells.forEach(cell => {
            cell.style.width = '70px';
            cell.style.overflow = 'hidden';
        });
    }

    async function retornaGradeTamanhosProduto() {
        const pesquisaTamanhos = {
            tabela: 'PRODUTO',
            camposSelect: ['FAIXA_ITEN.TAMANHO '],
            innerJoin: [
                { "tabela": "FAIXA_ITEN", "condicao": "PRODUTO.FAIXA = FAIXA_ITEN.FAIXA" }
            ],
            where: [`PRODUTO.CODIGO = '${produtoCodigo}'`],
            orderBy: ['FAIXA_ITEN.POSICAO']
        };

        const jsonStrTamanhos = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaTamanhos));

        return jsonStrTamanhos;
    };

    async function criaPesquisas(ehProduto) {

        const insumoCodigo = pegaChave('#txtInsumo')

        if (insumoCodigo == '') {
            return;
        }

        const { codigosCores } = await retornaCoresProduto();

        codigosCores.forEach((e) => {
            const tabela = ehProduto ? 'PA_ITEN' : 'MAT_ITEN'
            $(`#btn-CorInsumo${e?.cor}`).pesquisa_serverside([`#txtCorInsumo${e?.cor}`, `#txtDescricaoInsumo${e?.cor}`], ['CADCOR.COR', 'CADCOR.DESCRICAO'], ['CADCOR.DESCRICAO', 'CADCOR.COR'], `{"tabela":"${tabela}", "camposSelect":[ "CADCOR.COR", "CADCOR.DESCRICAO"], "innerJoin": [{"tabela": "CADCOR", "condicao": "CADCOR.COR = ${tabela}.COR" }], "where": ["${tabela}.CODIGO = '${insumoCodigo}'"], "groupBy": ["CADCOR.COR", "CADCOR.DESCRICAO"]}`, 'Pesquisa de Cor', '', [true, true])
            $(`#txtCorInsumo${e?.cor}`).autocompleta(1, `JSON={"tabela":"${tabela}", "camposSelect":[ "CADCOR.COR CHAVE", "CADCOR.DESCRICAO"], "innerJoin": [{"tabela": "CADCOR", "condicao": "CADCOR.COR = ${tabela}.COR" }], "where": ["${tabela}.CODIGO = '${insumoCodigo}'"], "groupBy": ["CADCOR.COR", "CADCOR.DESCRICAO"]}`, [`#txtCorInsumo${e?.cor}`], ['CHAVE'], [], () => { }, [true])
        })
    };

    function limpaCampos() {
        $('.inputsTamanho').val('');
        $('.inputsCorInsumo').val('');
        $('.descInsumo').val('');
        $('#txtInsumo').val('');
        $('#txtSetorInsumo').val('');
        $('#txtAplicacaoInsumo').val('');
        $('#txtParteInsumo').val('');
    };

    async function pesquisaUnidadeInsumo(bProduto) {

        if ($('#txtInsumo').val() == '') {
            return;
        }

        const pesquisaUnidadeInsumo = {
            tabela: !bProduto ? 'MATERIAL' : 'PRODUTO',
            camposSelect: ['UNIDADE'],
            where: [`CODIGO = '${pegaChave('#txtInsumo')}'`],
        };

        const jsonStrTamanhos = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaUnidadeInsumo));

        return jsonStrTamanhos[0].UNIDADE;
    };

    async function pesquisaSetorInsumo(setor) {

        if (setor == '') {
            return;
        }

        const pesquisaSetorInsumo = {
            tabela: 'CADFLUXO',
            camposSelect: ['CODIGO', 'DESCRICAO'],
            where: [`CODIGO = '${setor}'`],
        };

        const jsonStrSetor = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaSetorInsumo));

        const setorFormatado = `[${jsonStrSetor[0].CODIGO}] - ${jsonStrSetor[0].DESCRICAO}`

        return setorFormatado;
    };

    async function pesquisaAplicacaoInsumo(aplicacao) {

        if (aplicacao == '') {
            return;
        }

        const pesquisaAplicacaoinsumo = {
            tabela: 'PCPAPL',
            camposSelect: ['CODIGO', 'DESCRICAO'],
            where: [`CODIGO = '${aplicacao}'`],
        };

        const jsonStrAplicacao = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaAplicacaoinsumo));

        const aplicacaoFormatada = `[${jsonStrAplicacao[0].CODIGO}] - ${jsonStrAplicacao[0].DESCRICAO}`

        return aplicacaoFormatada;
    };

    async function pesquisaParteInsumo(parte) {

        if (parte == '') {
            return;
        }

        const pesquisaParteInsumo = {
            tabela: 'TIPO_APL',
            camposSelect: ['CODIGO', 'DESCRICAO'],
            where: [`CODIGO = '${parte}'`],
        };

        const jsonStrParte = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaParteInsumo));

        const parteFormatada = `[${jsonStrParte[0].CODIGO}] - ${jsonStrParte[0].DESCRICAO}`

        return parteFormatada;
    };

    async function adicionaRegistroGradeTam() {

        ///pelo amor de Deus, se tiver duvida, pergunta, nao mexa nisso sem saber o pq das coisa..... bruno
        const insumoCodigo = pegaChave('#txtInsumo');
        const bProduto = await validaSeEhProduto(insumoCodigo)
        const arrayTamanhos = await retornaGradeTamanhosProduto();
        const tabelaGradeTamanho = $("#tabelaGradeTamanho").DataTable()
        const linhaSelecionada = tabelaGradeTamanho.rows(".selected")
        const indexes = linhaSelecionada.indexes().toArray()
        const novaOrdem = tabelaGradeTamanho.rows().count() + 1

        if (indexes && indexes.length > 0) {
            throw new Error()
        }

        const novaLinha = {
            TIPO: bProduto ? 'P' : 'M',
            ORDEM: retornaBotaoOpcoesGradeTam(novaOrdem),
            CODIGO: pegaChave('#txtInsumo'),
            DESCRICAO: pegaDescricao('#txtInsumo'),
            UNIDADE: $('#txtUndInsumo').val(),
            SETOR: pegaChave('#txtSetorInsumo'),
            APLICACAO: pegaChave('#txtAplicacaoInsumo'),
            PARTE: pegaChave('#txtParteInsumo'),
        }

        const coresProdutoData = $('#tabelaCoresProduto').DataTable().data().toArray()
        const arrayCoresProduto = coresProdutoData?.map((e) => {
            return {
                corProduto: e?.COR,
                corInsumo: $(`#txtCorInsumo${e?.COR}`).val(),
                descricaoCorInsumo: $(`#txtDescricaoInsumo${e?.COR}`).val(),
            }
        })
        novaLinha.CORES_PRODUTO = JSON.stringify(arrayCoresProduto)

        const coresInsumoData = $('#tabelaCoresInsumo').DataTable().data().toArray()
        const arrayCoresInsumo = coresInsumoData?.map((e) => {
            return {
                cor: e?.COR,
                descricao: e?.DESCRICAO,
            }
        })
        novaLinha.CORES_INSUMO = JSON.stringify(arrayCoresInsumo)

        arrayTamanhos?.forEach((e) => {
            const { TAMANHO: tamanho } = e
            novaLinha[tamanho] = $(`#txtTamanho${tamanho}`).val()
        })

        tabelaGradeTamanho.row.add(novaLinha).draw(false)

        limpaCampos();
        bloqueiaCamposModal();
        $('#btnConfirmarGrade').addClass('d-none');
        $('#btnCancelarGrade').addClass('d-none');
        $('#btnAbreImportarCons').addClass('d-none');
        $('#btnIncluirGrade').removeClass('d-none');
        $("#tabelaCoresProduto").dataTable().$("tr.selected").removeClass("selected");
    };

    async function alteraRegistroGradeTam() {

        ///pelo amor de Deus, se tiver duvida, pergunta, nao mexa nisso sem saber o pq das coisa..... bruno

        try {
            const arrayTamanhos = await retornaGradeTamanhosProduto();
            const tabelaGradeTamanho = $("#tabelaGradeTamanho").DataTable()
            const linhaSelecionada = tabelaGradeTamanho.rows(".selected")

            const indexes = linhaSelecionada.indexes().toArray()

            if (indexes && indexes.length > 1) {
                throw new Error()
            }

            const [index] = indexes
            const currentRowData = tabelaGradeTamanho.row(index).data()

            const novaLinha = {
                ...currentRowData,
                CODIGO: pegaChave('#txtInsumo'),
                DESCRICAO: pegaDescricao('#txtInsumo'),
                UNIDADE: $('#txtUndInsumo').val(),
                SETOR: pegaChave('#txtSetorInsumo'),
                APLICACAO: pegaChave('#txtAplicacaoInsumo'),
                PARTE: pegaChave('#txtParteInsumo'),
            }

            const coresProdutoData = $('#tabelaCoresProduto').DataTable().data().toArray()
            const arrayCoresProduto = coresProdutoData?.map((e) => {
                return {
                    corProduto: e?.COR,
                    corInsumo: $(`#txtCorInsumo${e?.COR}`).val(),
                    descricaoCorInsumo: $(`#txtDescricaoInsumo${e?.COR}`).val(),
                }
            })
            novaLinha.CORES_PRODUTO = JSON.stringify(arrayCoresProduto)

            const coresInsumoData = $('#tabelaCoresInsumo').DataTable().data().toArray()
            const arrayCoresInsumo = coresInsumoData?.map((e) => {
                return {
                    cor: e?.COR,
                    descricao: e?.DESCRICAO,
                }
            })
            novaLinha.CORES_INSUMO = JSON.stringify(arrayCoresInsumo)

            arrayTamanhos?.forEach((e) => {
                const { TAMANHO: tamanho } = e
                novaLinha[tamanho] = $(`#txtTamanho${tamanho}`).val()
            })

            tabelaGradeTamanho.row(index).data(novaLinha).draw(false)
            tabelaGradeTamanho.$("tr.selected").removeClass("selected")
            $("#tabelaCoresProduto").dataTable().$("tr.selected").removeClass("selected");
        } catch (e) {
            console.log(e)
            msgErro('Ocorreu um erro ao confirmar.')
        }
    };

    async function criaDataTableCoresInsumo(insumoTaInformado) {

        if ($.fn.DataTable.isDataTable('#tabelaCoresInsumo')) {
            $("#tabelaCoresInsumo").DataTable().destroy();
            $("#tabelaCoresInsumo").empty();
        };

        const insumoPesquisado = pegaChave('#txtInsumo');

        const pesquisaCoresInsumo = {
            tabela: 'MAT_ITEN',
            camposSelect: ['DISTINCT CADCOR.COR', 'CADCOR.DESCRICAO'],
            innerJoin: [
                { "tabela": "CADCOR", "condicao": "CADCOR.COR = MAT_ITEN.COR" }
            ],
            where: [`MAT_ITEN.CODIGO = '${insumoPesquisado}'`],
        };

        const jsonStrCoresInsumo = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaCoresInsumo));

        const colunasDataTable = [];

        colunasDataTable.push({
            'title': 'Cor',
            'data': 'COR',
        });

        colunasDataTable.push({
            'title': 'Descrição',
            'data': 'DESCRICAO'
        });

        if (insumoTaInformado && insumoPesquisado != '') {

            $('#tabelaCoresInsumo').DataTable({
                bPaginate: false,
                order: false,
                sort: false,
                autoWidth: true,
                scrollY: '100px',
                searching: false,
                destroy: true,
                language: {
                    sEmptyTable: "Nenhum registro encontrado",
                    sInfo: "_TOTAL_ registros",
                    sInfoEmpty: " 0 registros",
                    sInfoFiltered: "(Filtrados de _MAX_ registros)",
                    sInfoPostFix: "",
                    sInfoThousands: ".",
                    sLengthMenu: "_MENU_ resultados",
                    sLoadingRecords: "Carregando...",
                    sProcessing: "Processando...",
                    sZeroRecords: "Nenhum registro encontrado",
                    sSearch: "Pesquisar",
                    oPaginate: {
                        sNext: "Próximo",
                        sPrevious: "Anterior",
                        sFirst: "Primeiro",
                        sLast: "Último",
                    },
                    oAria: {
                        sSortAscending: ": Ordenar colunas de forma ascendente",
                        sSortDescending: ": Ordenar colunas de forma descendente",
                    },
                },
                columns: colunasDataTable,
                data: jsonStrCoresInsumo,
            });

        } else {

            $('#tabelaCoresInsumo').DataTable({
                bPaginate: false,
                order: false,
                sort: false,
                autoWidth: true,
                scrollY: '100px',
                searching: false,
                destroy: true,
                language: {
                    sEmptyTable: "Nenhum registro encontrado",
                    sInfo: "_TOTAL_ registros",
                    sInfoEmpty: " 0 registros",
                    sInfoFiltered: "(Filtrados de _MAX_ registros)",
                    sInfoPostFix: "",
                    sInfoThousands: ".",
                    sLengthMenu: "_MENU_ resultados",
                    sLoadingRecords: "Carregando...",
                    sProcessing: "Processando...",
                    sZeroRecords: "Nenhum registro encontrado",
                    sSearch: "Pesquisar",
                    oPaginate: {
                        sNext: "Próximo",
                        sPrevious: "Anterior",
                        sFirst: "Primeiro",
                        sLast: "Último",
                    },
                    oAria: {
                        sSortAscending: ": Ordenar colunas de forma ascendente",
                        sSortDescending: ": Ordenar colunas de forma descendente",
                    },
                },
                columns: colunasDataTable,
            });
        }
    };

    async function criaDataTableGradeTam(data = []) {

        if ($.fn.DataTable.isDataTable('#tabelaGradeTamanho')) {
            $("#tabelaGradeTamanho").DataTable().destroy();
            $("#tabelaGradeTamanho").empty();
        };

        const tamanhosProduto = await retornaGradeTamanhosProduto();

        const dataSetCols = [
            {
                title: 'Ordem',
                data: 'ORDEM'

            },
            {
                title: 'Código',
                data: 'CODIGO'
            },
            {
                title: 'Descrição',
                data: 'DESCRICAO'
            },
            {
                title: 'Unid.',
                data: 'UNIDADE'
            },
            {
                title: 'Setor',
                data: 'SETOR'
            },
            {
                title: 'Aplic.',
                data: 'APLICACAO'
            },
            {
                title: 'Parte.',
                data: 'PARTE'
            },
        ]

        if (tamanhosProduto.length > 0) {
            for (i in tamanhosProduto) {
                dataSetCols.push({
                    title: tamanhosProduto[i]?.TAMANHO,
                    data: tamanhosProduto[i]?.TAMANHO,
                })
            };
        }

        dataSetCols.push(
            {
                title: 'Cores Produto',
                data: 'CORES_PRODUTO',
            },
            {
                title: 'Cores Insumo',
                data: 'CORES_INSUMO',
            },
            {
                title: 'Tipo',
                data: 'TIPO',
            }
        )

        $('#tabelaGradeTamanho').DataTable({
            bPaginate: false,
            order: false,
            sort: false,
            searching: false,
            destroy: true,
            language: {
                sEmptyTable: "Nenhum registro encontrado",
                sInfo: "_TOTAL_ registros",
                sInfoEmpty: " 0 registros",
                sInfoFiltered: "(Filtrados de _MAX_ registros)",
                sInfoPostFix: "",
                sInfoThousands: ".",
                sLengthMenu: "_MENU_ resultados",
                sLoadingRecords: "Carregando...",
                sProcessing: "Processando...",
                sZeroRecords: "Nenhum registro encontrado",
                sSearch: "Pesquisar",
                oPaginate: {
                    sNext: "Próximo",
                    sPrevious: "Anterior",
                    sFirst: "Primeiro",
                    sLast: "Último",
                },
                oAria: {
                    sSortAscending: ": Ordenar colunas de forma ascendente",
                    sSortDescending: ": Ordenar colunas de forma descendente",
                },
            },
            columnDefs: [
                {
                    targets: [dataSetCols.length - 1, dataSetCols.length - 2, dataSetCols.length - 3],
                    visible: false,
                }
            ],
            columns: dataSetCols,
            data,
        })
    };

    async function removeCoresSemConsumo(listaInsumos) {
        for (i = 0; i < listaInsumos.length; i++) {

            const novaListaCores = [];

            for (k = 0; k < listaInsumos[i].CORES_LISTA.length; k++) {
                const CorP = listaInsumos[i].CORES_LISTA[k].Cor_P;
                const CorI = listaInsumos[i].CORES_LISTA[k].Cor_I;
                const descCorP = listaInsumos[i].CORES_LISTA[k].DescCor_P;
                const descCorI = listaInsumos[i].CORES_LISTA[k].DescCor_I;

                const novaCorLista = {
                    Cor_P: CorP,
                    Cor_I: CorI,
                    DescCor_P: descCorP,
                    DescCor_I: descCorI
                };

                if (novaListaCores.length <= 0) {
                    novaListaCores.push(novaCorLista);
                } else {

                    const index = novaListaCores.findIndex(item => item.Cor_P == CorP);

                    if (index != -1) {
                        if (novaListaCores[index].Cor_I == '') {
                            novaListaCores[index].Cor_I = CorI
                            novaListaCores[index].DescCor_I = descCorI
                        }
                    } else {
                        novaListaCores.push(novaCorLista)
                    }
                };
            };

            listaInsumos[i].CORES_LISTA = novaListaCores;
        };

        return listaInsumos;
    };

    async function importaConsumos(produtoImportado, descricaoProdutoImportado, parteImportada) {
        $.LoadingOverlay('show');

        try {
            const camposFiltro = {
                produto: produtoImportado,
                parte: parteImportada,
            }

            const response = await requisicao("GET", '/sisplan/cadconsumo/v1/retornadadosimportacao?', `FILTROS=${JSON.stringify(camposFiltro)}`, null);

            if (response.status !== 200) {
                throw new Error()
            }

            responseJson = await response.json()

            const { resultado } = responseJson
            const arrayTamanhos = await retornaGradeTamanhosProduto();
            const listaCoresProd = $('#tabelaCoresProduto').DataTable().data().toArray()
            const { consumos, coresProdutoImportado: arrayCoresProdutoImportado } = resultado
            const coresValidacao = listaCoresProd.map(cor => cor.COR)
            const coresProdutoImportado = arrayCoresProdutoImportado.map(cor => ({ cor }))
            const validacaoCoresProd = coresProdutoImportado.some(obj =>
                coresValidacao.includes(obj.cor)
            )

            if (!validacaoCoresProd) {
                msgAlertaSemConfirmacao(`Produto importado não possui nenhuma cor em comum com o produto: ${pegaChave('#txtCodigoConsumo')} - ${pegaDescricao('#txtCodigoConsumo')}`)

                limpaCampos();
                bloqueiaCamposModal();
                $('#btnConfirmarGrade').addClass('d-none');
                $('#btnCancelarGrade').addClass('d-none');
                $('#btnAbreImportarCons').addClass('d-none');
                $('#btnIncluirGrade').removeClass('d-none');
                $("#tabelaCoresProduto").dataTable().$("tr.selected").removeClass("selected");
                return
            }

            const datatableData = $('#tabelaGradeTamanho').DataTable().data().toArray()
            let maximaOrdemAtual = datatableData?.reduce((max, obj) => {
                return obj.ORDEM > max ? obj.ORDEM : max
            }, 0)

            consumos?.forEach((itemConsumo) => {
                let existePeloMenosUmTamanhoEmComum = false
                const novoRegistro = {}
                const { camposPrincipais, consumoTamanhos, coresInsumo: arrayCoresInsumo, coresProduto } = itemConsumo

                arrayTamanhos?.forEach((item) => {
                    const { TAMANHO: tamanho } = item
                    const tamanhoConsumoEncontrado = consumoTamanhos?.find(e => e?.tamanho === tamanho)
                    const { consumo } = tamanhoConsumoEncontrado
                    novoRegistro[tamanho] = parseFloat(consumo).toFixed(5) || '0.00000'
                    if (!existePeloMenosUmTamanhoEmComum && tamanhoConsumoEncontrado) {
                        existePeloMenosUmTamanhoEmComum = true
                    }
                })

                if (!existePeloMenosUmTamanhoEmComum) {
                    return
                }

                const arrayCoresProduto = coresValidacao?.map((cor) => {
                    const corEncontrada = coresProduto?.find(e => e?.corProduto === cor)
                    return {
                        corProduto: cor,
                        corInsumo: corEncontrada?.corInsumo || '',
                        descricaoCorInsumo: corEncontrada?.descricaoCorInsumo || '',
                    }
                })

                maximaOrdemAtual += 1
                novoRegistro.ORDEM = retornaBotaoOpcoesGradeTam(maximaOrdemAtual)
                novoRegistro.CODIGO = camposPrincipais?.insumo
                novoRegistro.DESCRICAO = camposPrincipais?.descricaoInsumo
                novoRegistro.UNIDADE = camposPrincipais?.unidade
                novoRegistro.SETOR = camposPrincipais?.setor
                novoRegistro.APLICACAO = camposPrincipais?.aplicacao
                novoRegistro.PARTE = camposPrincipais?.parte
                novoRegistro.TIPO = camposPrincipais?.tipo
                novoRegistro.CORES_PRODUTO = JSON.stringify(arrayCoresProduto)
                novoRegistro.CORES_INSUMO = JSON.stringify(arrayCoresInsumo)
                $('#tabelaGradeTamanho').DataTable().row.add(novoRegistro)
            })

            $('#tabelaGradeTamanho').DataTable().draw(false)
            $('#btnCancelarGrade').trigger('click')
        } catch (error) {
            console.error(error);
            msgErro(`Não foi possível importar os consumos do produto [${produtoImportado}] - ${descricaoProdutoImportado}! Tente novamente.`);
            return;
        } finally {
            $.LoadingOverlay('hide');
            $('#modalImportaConsumos').modal('hide');
        }
    };

    async function criaPesquisaF4Manutencao() {
        criaPesquisaF4('txtInsumo', 'btn-CodigoInsumo')
        criaPesquisaF4('txtSetorInsumo', 'btn-SetorInsumo')
        criaPesquisaF4('txtAplicacaoInsumo', 'btn-AplicacaoInsumo')
        criaPesquisaF4('txtParteInsumo', 'btn-ParteInsumo')
    }

    async function carregaModalManutencao() {
        bloqueiaCamposModal();
        limpaCampos();
        await criaDataTableGradeTam();
        $('#btn-CodigoInsumo').pesquisa_serverside([`#txtInsumo`], ["CODIGO"], ["DESCRICAO"], `{"tabela":"MATERIAL", "camposSelect":["CODIGO", "DESCRICAO", "UNIDADE", "CODCLI", "GRUPO", "SUB_GRUPO", "CODFIS", "CODTRI", "LINHA", "ATIVO", "EMP_ID"], "where": ["1=1"]}`, 'Pesquisa de Material');
        $('#txtInsumo').autocompleta(1, 'JSON={ "tabela":"MATERIAL", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}');
        $('#btn-limpa-CodigoInsumo').on('click', function () {
            $('#txtInsumo').val('');
        });
        //
        $('#btn-CodigoInsumoProd').pesquisa_serverside([`#txtInsumo`], ["CODIGO"], ["DESCRICAO"], `{"tabela":"PRODUTO", "camposSelect":["CODIGO", "DESCRICAO", "UNIDADE", "CODCLI", "GRUPO", "CODFIS", "LINHA", "ATIVO", "EMP_ID"], "where": ["1=1"]}`, 'Pesquisa de Produto');
        $('#txtInsumo').autocompleta(1, 'JSON={ "tabela":"PRODUTO", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}');
        $('#btn-limpa-CodigoInsumo').on('click', function () {
            $('#txtInsumo').val('');
        });
        $(`#txtInsumo`).keyup(function (e) {
            if (e.keyCode == 113) {
                $(`#btn-CodigoInsumoProd`).click();
                e.preventDefault();
                e.stopPropagation();
            }
        });
        //
        $('#btn-SetorInsumo').pesquisa_serverside(['#txtSetorInsumo'], ['CODIGO'], ['DESCRICAO'], '{"tabela":"CADFLUXO", "camposSelect":["CODIGO","DESCRICAO", "ORDEM", "CUSTO", "ATIVO", "TIPO"], "where": null}', 'Pesquisa de Setor');
        $('#txtSetorInsumo').autocompleta(1, 'JSON={ "tabela":"CADFLUXO", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}');
        $('#btn-limpa-SetorInsumo').on('click', function () {
            $('#txtSetorInsumo').val('');
        });
        //
        $('#btn-AplicacaoInsumo').pesquisa_serverside(['#txtAplicacaoInsumo'], ['CODIGO'], ['DESCRICAO'], '{"tabela":"PCPAPL", "camposSelect":["DESCRICAO", "TIPOAPL", "ATIVO", "CODIGO", "TIPO"], "where": null}', 'Pesquisa de Aplicação');
        $('#txtAplicacaoInsumo').autocompleta(1, 'JSON={ "tabela":"PCPAPL", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}');
        $('#btn-limpa-AplicacaoInsumo').on('click', function () {
            $('#txtAplicacaoInsumo').val('');
        });
        //
        $('#btn-ParteInsumo').pesquisa_serverside(['#txtParteInsumo'], ['CODIGO'], ['DESCRICAO'], '{"tabela":"TIPO_APL", "camposSelect":["DESCRICAO", "ATIVO", "CODIGO", "ESTOQUE"], "where": null}', 'Pesquisa de Parte');
        $('#txtParteInsumo').autocompleta(1, 'JSON={ "tabela":"TIPO_APL", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}');
        $('#btn-limpa-ParteInsumo').on('click', function () {
            $('#txtParteInsumo').val('');
        })
        await criaPesquisaF4Manutencao()

        const linhaSelecionada = $('#tabelaConsumos').DataTable().row($('tr.selected')).count() > 0;
        if (linhaSelecionada) {
            $('#btnIncluirGrade').prop('disabled', true)
            return
        }

        $('#btnIncluirGrade').prop('disabled', false)
    };

    async function validaSeEhProduto(codigo) {
        const pesquisaProd = {
            tabela: 'PRODUTO',
            camposSelect: ['PRODUTO.CODIGO '],
            where: [`PRODUTO.CODIGO = '${codigo}'`],
        };

        const jsonStrProdutos = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaProd));

        return jsonStrProdutos.length >= 1 ? true : false
    }

    $('#modal-manutencaoconsumos').on('shown.bs.modal', async function () {
        $('#tabelaCoresProduto').DataTable().columns.adjust().draw(false);
        $('#tabelaCoresInsumo').DataTable().columns.adjust().draw(false);
        $('#tabelaGradeTamanho').DataTable().columns.adjust().draw(false);
        $('#tabelaTamanhosDiv').DataTable().columns.adjust().draw(false);


        $('.inputsCorInsumo').on('focusin', async function () {
            $("#tabelaCoresProduto").dataTable().$("tr.selected").removeClass("selected");
            $(this).closest('tr').addClass("selected");
        });

        /// gambiarra, mas funcionou, time que ta ganhando nao mexe - Bruno
        $(`.inputsCorInsumo`).on('change', async function () {
            if ($(this).val() === '') {
                const cor = String($(this).data('cor'))
                $(`#txtDescricaoInsumo${cor}`).val('');
            };
        });

        $('#txtInsumo').on('blur', async function () {
            const bProduto = await validaSeEhProduto(pegaChave('#txtInsumo'))

            await criaPesquisas(bProduto);
            await criaDataTableCoresInsumo(true);
            $('#txtUndInsumo').val(await pesquisaUnidadeInsumo(bProduto));
            $('.inputsCorInsumo').val('')
            $('.descInsumo').val('')
        });

        $('.inputsTamanho').on('blur', async function () {
            const qtdeInputTamanho = Number($(this).val().replace(',', '.'));
            $(this).val(qtdeInputTamanho.toFixed(5));
        });
    });

    $('#modal-manutencaoconsumos').on('hide.bs.modal', async function () {
        ordemManutencao = 0
        $('#tabelaConsumos').DataTable().$('tr.selected').removeClass('selected')
        if ($.fn.DataTable.isDataTable('#tabelaGradeTamanho')) {
            $('#tabelaGradeTamanho').DataTable().destroy()
            $('#tabelaGradeTamanho').empty()
        }
    })

    $('#btnIncluirGrade').on('click', async function () {
        desbloqueiaCamposModal();
        $('#btnConfirmarGrade').removeClass('d-none');
        $('#btnCancelarGrade').removeClass('d-none');
        $('#btnIncluirGrade').addClass('d-none');
        $('#btnAbreImportarCons').removeClass('d-none');
    });

    $('#btnCancelarGrade').on('click', async function () {
        bloqueiaCamposModal();
        limpaCampos();
        await criaDataTableCoresInsumo(false);
        $('#btnConfirmarGrade').addClass('d-none');
        $('#btnCancelarGrade').addClass('d-none');
        $('#btnIncluirGrade').removeClass('d-none');
        $('#btnAbreImportarCons').addClass('d-none');
        $('.btnAcoesGradeConsumo').prop('disabled', false)
        $('#tabelaGradeTamanho').DataTable().$('tr.selected').removeClass('selected');
    });

    $('#btnDesistirManutencao').on('click', async function () {
        $('#modal-manutencaoconsumos').modal('hide');
        bloqueiaCamposModal();
        limpaCampos();
        await criaDataTableCoresInsumo(false);
        $('#btnConfirmarGrade').addClass('d-none');
        $('#btnCancelarGrade').addClass('d-none');
        $('#btnIncluirGrade').removeClass('d-none');
        $('#btnAbreImportarCons').addClass('d-none');
    });

    $('#btnGravarManutencao').on('click', async function () {
        const qtdeRegistrosNovos = $('#tabelaGradeTamanho').DataTable().data().toArray();

        if (qtdeRegistrosNovos <= 0) {
            msgErro('Não existe nenhum registro novo para gravar!');
            return;
        };

        const linhaSelecionada = $('#tabelaConsumos').DataTable().row($('tr.selected'));
        if (linhaSelecionada.count() > 0) {
            await gravaAlteracaoConsumos(linhaSelecionada.data())
            return
        }

        try {
            $.LoadingOverlay('show');

            const listaFormatada = await criaListaParaGravar();
            const url = '/sisplan/cadconsumo/v1/incluiconsumos?';
            const response = await requisicao('POST', url, '', `LISTADECONSUMOS=${encodeURIComponent(JSON.stringify({ LISTACONSUMOSCRIADOS: listaFormatada }))}`, 360000);

            if (response.status == 200) {
                criaMensagemSucesso('Consumos cadastrados com sucesso!', () => { window.location.reload(true); });
                return;
            };

            if (response.status != 200) {
                msgErro('Não foi possível cadastrar os consumos! Verifique.');
                return;
            };

        } catch (error) {
            console.error(error);
            msgErro('Não foi possível cadastrar os consumos! Verifique.');
        } finally {
            $.LoadingOverlay('hide');
            // window.location.href = window.location.href;
        };
    });

    $('#btnConfirmarGrade').on('click', async function () {
        $('#btnAbreImportarCons').addClass('d-none');
        const qtdeCoresProd = $('#tabelaCoresProduto').DataTable().data().toArray();

        if ($('#txtInsumo').val() == '') {
            msgErro('Insumo não informado! Por favor, verifique.');
            return;
        };

        if ($('#txtSetorInsumo').val() == '') {
            msgErro('Setor não informado! Por favor, verifique.');
            return;
        };

        if ($('#txtAplicacaoInsumo').val() == '') {
            msgErro('Aplicação não informada! Por favor, verifique.');
            return;
        };

        let NaoExisteCorInsumoInformada = false;

        for (i = 0; i < qtdeCoresProd.length; i++) {
            if ($(`#txtCorInsumo${qtdeCoresProd[i].COR}`).val() !== '' && $(`#txtCorInsumo${qtdeCoresProd[i].COR}`).val() !== undefined) {
                NaoExisteCorInsumoInformada = true;
                break;
            };
        };

        if (!NaoExisteCorInsumoInformada) {
            msgErro('Não foi informado nenhuma cor de insumo.');
            return;
        };

        const linhasSelecionadas = $("#tabelaGradeTamanho").DataTable().rows(".selected").data().toArray()
        const alteracao = linhasSelecionadas && linhasSelecionadas.length > 0
        if (alteracao) {
            await alteraRegistroGradeTam();
        } else {
            await adicionaRegistroGradeTam();
        }

        bloqueiaCamposModal();
        limpaCampos();
        await criaDataTableCoresInsumo(false);
        $('#btnConfirmarGrade').addClass('d-none');
        $('#btnCancelarGrade').addClass('d-none');
        $('#btnIncluirGrade').removeClass('d-none');
        $('#btnAbreImportarCons').addClass('d-none');
        $('.btnAcoesGradeConsumo').prop('disabled', false)
    });

    $('#tabelaGradeTamanho').on('click', '#btn-excluirGradeConsumo', async function () {
        const data = $("#tabelaGradeTamanho").DataTable().row($(this).parents("tr"));
        const btnOrdem = $($(this).parents("tr"));
        const ordemRemovida = btnOrdem[0].cells[0].children[0].children[0].value;
        data.remove().draw(false);
    });

    $('#tabelaGradeTamanho').on('click', '#btn-alterarGradeConsumo', async function () {
        try {
            $("#tabelaGradeTamanho").dataTable().$("tr.selected").removeClass("selected");
            $($(this).parents("tr")).addClass('selected')
            const datatableData = $("#tabelaGradeTamanho").DataTable().row($(this).parents("tr")).data()

            insereValor('#txtInsumo', datatableData?.CODIGO, datatableData?.DESCRICAO)
            insereValor('#txtUndInsumo', datatableData?.UNIDADE)
            insereValor('#txtSetorInsumo', datatableData?.SETOR, { tabela: 'CADFLUXO', campoBusca: 'DESCRICAO', campoWhere: 'CODIGO', valorWhere: datatableData?.SETOR })
            insereValor('#txtAplicacaoInsumo', datatableData?.APLICACAO, { tabela: 'PCPAPL', campoBusca: 'DESCRICAO', campoWhere: 'CODIGO', valorWhere: datatableData?.APLICACAO })
            insereValor('#txtParteInsumo', datatableData?.PARTE, { tabela: 'TIPO_APL', campoBusca: 'DESCRICAO', campoWhere: 'CODIGO', valorWhere: datatableData?.PARTE })

            for (key in datatableData) {
                if (!['ORDEM', 'CODIGO', 'DESCRICAO', 'UNIDADE', 'SETOR', 'APLICACAO', 'PARTE'].includes(key)) {
                    insereValor(`#txtTamanho${key}`, datatableData[key])
                }
            }

            const { CORES_PRODUTO, CORES_INSUMO } = datatableData

            const coresProduto = JSON.parse(CORES_PRODUTO)
            const coresInsumo = JSON.parse(CORES_INSUMO)

            coresProduto.forEach((e) => {
                const { corProduto, corInsumo, descricaoCorInsumo } = e
                insereValor(`#txtCorInsumo${corProduto}`, corInsumo)
                insereValor(`#txtDescricaoInsumo${corProduto}`, descricaoCorInsumo)
            })

            $("#tabelaCoresInsumo").DataTable().rows().remove()

            coresInsumo.forEach((e) => {
                $('#tabelaCoresInsumo').DataTable().row.add({
                    COR: e?.cor,
                    DESCRICAO: e?.descricao,
                })
            })
            $('#tabelaCoresInsumo').DataTable().draw(false)

            criaPesquisas(datatableData?.TIPO === 'P')
            desbloqueiaCamposModal()
            $('#btnConfirmarGrade').removeClass('d-none')
            $('#btnCancelarGrade').removeClass('d-none')
            $('#btnIncluirGrade').addClass('d-none')
            $('.btnAcoesGradeConsumo').prop('disabled', true)
        } catch (e) {
            console.log(e)
            msgErro('Ocorreu um erro ao alterar o registro.')
        }
    })

    $('#btnAbreImportarCons').on('click', function () {
        $('#modalImportaConsumos').modal('show');
        $('#btn-CodigoImportacaoConsumos').pesquisa_serverside([`#txtCodigoImportacao`], ["CODIGO"], ["DESCRICAO"], `{"tabela":"PRODUTO", "camposSelect":["CODIGO", "DESCRICAO"], "where": ["1=1"]}`, 'Pesquisa de Produto');
        $('#txtCodigoImportacao').autocompleta(1, 'JSON={ "tabela":"PRODUTO", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}');
        $('#btn-limpa-CodigoImportacaoConsumos').on('click', function () {
            $('#txtCodigoImportacao').val('');
        });

        $('#btn-ParteImportacaoConsumos').pesquisa_serverside(['#txtParteImportacaoConsumos'], ['CODIGO'], ['DESCRICAO'], '{"tabela":"TIPO_APL", "camposSelect":["DESCRICAO", "ATIVO", "CODIGO", "ESTOQUE"], "where": null}', 'Pesquisa de Parte');
        $('#txtParteImportacaoConsumos').autocompleta(1, 'JSON={ "tabela":"TIPO_APL", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}');
        $('#btn-limpa-ParteImportacaoConsumos').on('click', function () {
            $('#txtParteImportacaoConsumos').val('');
        });
    });

    $('#btnImportaCons').on('click', async function () {
        const prodImportado = pegaChave('#txtCodigoImportacao');
        const descProdImportado = pegaDescricao('#txtCodigoImportacao');
        const parteImportada = pegaChave('#txtParteImportacaoConsumos');
        await importaConsumos(prodImportado, descProdImportado, parteImportada);
    });

    $('#btnModificacoes').on('click', function () {
        $('#modal-modificacoes').modal('show');
    })

    $('#modal-modificacoes').on('show.bs.modal', async function () {
        $('#btn-CodigoProdutoModificacao').pesquisa_serverside([`#txtProdutoModificacao`], ["CODIGO"], ["DESCRICAO"], `{"tabela":"PRODUTO", "camposSelect":["CODIGO", "DESCRICAO", "UNIDADE", "CODCLI", "GRUPO", "CODFIS", "LINHA", "ATIVO", "EMP_ID"], "where": ["1=1"]}`, 'Pesquisa de Produto');
        $('#txtProdutoModificacao').autocompleta(1, 'JSON={ "tabela":"PRODUTO", "camposSelect":[ "CODIGO CHAVE", "DESCRICAO DESCRICAO"], "where": null}');
        $('#btn-limpa-CodigoProdutoModificacao').on('click', function () {
            $('#txtProdutoModificacao').val('');
        });
        criaPesquisaF4('txtProdutoModificacao', 'btn-CodigoProdutoModificacao');

        insereValor('#txtProdutoModificacao', produtoCodigo, { tabela: 'PRODUTO', campoBusca: 'DESCRICAO', campoWhere: 'CODIGO', valorWhere: produtoCodigo })
    })

    $('#modal-modificacoes').on('shown.bs.modal', async function () {
        $('#btnConsultarModificacoes').trigger('click')
    })

    $('#btnConsultarModificacoes').on('click', async function () {
        await fazConsultaModificacoes();
    })


    async function fazConsultaModificacoes() {
        if ($.fn.DataTable.isDataTable('#tabelaModificacoes')) {
            $("#tabelaModificacoes").DataTable().destroy();
            $("#tabelaModificacoes").empty();
        }
        try {
            dataSetCols = [];
            $.LoadingOverlay('show');
            try {
                const url = "/sisplan/cadconsumo/v1/consultamodificacoes?";
                const response = await requisicao("GET", url, `PRODUTO=${pegaChave('#txtProdutoModificacao')}`, "", 360000);

                if (!response) {
                    return;
                }

                const jsonStr = await response.json();

                if (jsonStr.length == 0) {
                    msgAlerta("Nenhum registro encontrado!");
                    $("#txtMeta").val();
                    if ($.fn.DataTable.isDataTable('#tabelaModificacoes')) {
                        $('#tabelaModificacoes').DataTable().destroy();
                        $('#tabelaModificacoes').empty();
                    }
                    return;
                }

                if (response.status != 200) {
                    msgAlerta(jsonStr.mensagem);
                    return;
                };

                let keys = Object.keys(jsonStr[0]);

                keys.forEach((k) => {
                    dataSetCols.push({
                        title: k,
                        data: k,
                    });
                });

                $('#tabelaModificacoes').DataTable({
                    bPaginate: true,
                    destroy: true,
                    colReorder: true,
                    language: {
                        sEmptyTable: "Nenhum registro encontrado",
                        sInfo: "_TOTAL_ registros",
                        sInfoEmpty: " 0 registros",
                        sInfoFiltered: "(Filtrados de _MAX_ registros)",
                        sInfoPostFix: "",
                        sInfoThousands: ".",
                        sLengthMenu: "_MENU_ resultados",
                        sLoadingRecords: "Carregando...",
                        sProcessing: "Processando...",
                        sZeroRecords: "Nenhum registro encontrado",
                        sSearch: "Pesquisar",
                        oPaginate: {
                            sNext: "Próximo",
                            sPrevious: "Anterior",
                            sFirst: "Primeiro",
                            sLast: "Último",
                        },
                        oAria: {
                            sSortAscending: ": Ordenar colunas de forma ascendente",
                            sSortDescending: ": Ordenar colunas de forma descendente",
                        },
                    },
                    autoWidth: true,
                    columns: dataSetCols,
                    data: jsonStr,
                });

            } catch (error) {
                console.error(error);
                msgErro("Não foi possível fazer consulta das Modificações! Tente novamente.");
                return;
            }
        } finally {
            $.LoadingOverlay("hide");
        }
    };

    $('#modalImportaConsumos').on('hide.bs.modal', function () {
        $('#txtCodigoImportacao').val('');
        $('#txtParteImportacaoConsumos').val('');
    });

    async function retornaDadosModalModificacoes(data) {
        try {
            $.LoadingOverlay('show')
            const camposFiltro = {
                tipo: data[0],
                produto: pegaChave('#txtCodigoConsumo'),
                insumo: data[3],
                setor: data[6],
                aplicacao: data[7],
                parte: data[8],
            }

            const response = await requisicao("GET", '/sisplan/cadconsumo/v1/retornadadosmodal?', `FILTROS=${JSON.stringify(camposFiltro)}`, null);

            if (response.status !== 200) {
                throw new Error()
            }

            const responseJson = await response.json()

            const { resultado } = responseJson

            alimentaModalModificacoes(resultado)
        } catch (e) {
            console.log(e)
            msgErro('Ocorreu um erro ao carregar os dados.')
        } finally {
            $.LoadingOverlay('hide')
        }
    }

    async function alimentaModalModificacoes({ camposPrincipais, consumoTamanhos, coresProduto, coresInsumo }) {
        insereValor('#txtInsumo', camposPrincipais?.insumo, camposPrincipais?.descricaoInsumo)
        insereValor('#txtUndInsumo', camposPrincipais?.unidade)
        insereValor('#txtSetorInsumo', camposPrincipais?.setor, camposPrincipais?.descricaoSetor)
        insereValor('#txtAplicacaoInsumo', camposPrincipais?.aplicacao, camposPrincipais?.descricaoAplicacao)
        insereValor('#txtParteInsumo', camposPrincipais?.parte, camposPrincipais?.descricaoParte)

        const novaLinha = {
            ORDEM: retornaBotaoOpcoesGradeTam(1),
            CODIGO: camposPrincipais?.insumo,
            DESCRICAO: camposPrincipais?.descricaoInsumo,
            UNIDADE: camposPrincipais?.unidade,
            SETOR: camposPrincipais?.setor,
            APLICACAO: camposPrincipais?.aplicacao,
            PARTE: camposPrincipais?.parte,
            TIPO: camposPrincipais?.tipo,
        }

        consumoTamanhos?.forEach((e) => {
            const { tamanho, consumo } = e
            const consumoFormatado = parseFloat(consumo).toFixed(5)
            insereValor(`#txtTamanho${tamanho}`, consumoFormatado)
            novaLinha[tamanho] = consumoFormatado
        })

        const arrayCores = []
        coresProduto?.forEach((e) => {
            const { corProduto, corInsumo, descricaoCorInsumo } = e
            insereValor(`#txtCorInsumo${corProduto}`, corInsumo)
            insereValor(`#txtDescricaoInsumo${corProduto}`, descricaoCorInsumo)
            arrayCores.push({
                corProduto,
                corInsumo,
                descricaoCorInsumo,
            })
        })
        novaLinha.CORES_PRODUTO = JSON.stringify(arrayCores)

        const arrayCoresInsumo = []
        coresInsumo?.forEach((e) => {
            $('#tabelaCoresInsumo').DataTable().row.add({
                COR: e?.cor,
                DESCRICAO: e?.descricao,
            })
            arrayCoresInsumo.push({
                cor: e?.cor,
                descricao: e?.descricao,
            })
        })

        $('#tabelaCoresInsumo').DataTable().draw(false)
        novaLinha.CORES_INSUMO = JSON.stringify(arrayCoresInsumo)
        await criaDataTableGradeTam([novaLinha])
        desbloqueiaCamposModal()
        $('#btnConfirmarGrade').removeClass('d-none')
        $('#btnCancelarGrade').removeClass('d-none')
        $('#btnIncluirGrade').addClass('d-none')
        $('.btnAcoesGradeConsumo').prop('disabled', true)
        $($('#tabelaGradeTamanho tr')[1]).addClass('selected')
        criaPesquisas(camposPrincipais?.tipo === 'P')
    }

    async function gravaAlteracaoConsumos(dados) {
        try {
            $.LoadingOverlay('show')
            const produto = produtoCodigo
            const insumo = dados[3]
            const setor = dados[6]
            const aplicacao = dados[7]
            const parte = dados[8]
            const arrayConsumosAnteriores = []
            const arrayConsumosPosteriores = []
            const arrayConsumos = $('#tabelaConsumos').DataTable().data().toArray()
            const [_, _2, ordemMinima] = arrayConsumos.find(e => e[3] === insumo && e[6] === setor && e[7] === aplicacao && e[8] === parte)
            const [_3, _4, ordemMaxima] = arrayConsumos.slice().reverse().find(e => e[3] === insumo && e[6] === setor && e[7] === aplicacao && e[8] === parte)

            arrayConsumos.forEach((e) => {
                const arrayCores = retornaCoresProdInsumoTabConsumos(e)
                const objConsumo = {
                    Produto_Codigo: produto,
                    Insumo_Tipo: e[0],
                    Insumo_IdCons: e[1],
                    Insumo_Ordem: e[2],
                    Insumo_Codigo: e[3],
                    Insumo_Descricao: e[4],
                    Insumo_Unidade: e[5],
                    Insumo_Setor: e[6],
                    Insumo_Aplicacao: e[7],
                    Insumo_Parte: e[8],
                    Insumo_Faixa: e[9],
                    Insumo_Preco: e[10],
                    Insumo_Consumo: e[11],
                    Insumo_ListaCores: arrayCores,
                }
                if (e[2] < ordemMinima) {
                    arrayConsumosAnteriores.push(objConsumo)
                }

                if (e[2] > ordemMaxima) {
                    arrayConsumosPosteriores.push(objConsumo)
                }
            })

            const arrayConsumosNovos = []

            const tamanhosProduto = await retornaGradeTamanhosProduto();

            if ($.fn.DataTable.isDataTable('#tabelaGradeTamanho')) {

                const novosItensTabela = $('#tabelaGradeTamanho').DataTable().data().toArray()

                novosItensTabela.forEach((linhaTabela) => {
                    return tamanhosProduto.forEach((tamanhoProduto) => {
                        const arrayCoresTabela = JSON.parse(linhaTabela.CORES_PRODUTO)
                        const coresProduto = arrayCoresTabela?.map((e) => ({
                            cor_p: e?.corProduto,
                            cor_i: e?.corInsumo,
                            descCor_i: e?.descricaoCorInsumo,
                        }))

                        const { TAMANHO: tamanho } = tamanhoProduto
                        const qtdeFormatada = parseFloat(linhaTabela[tamanho] === '' ? 0 : linhaTabela[tamanho])
                        if (qtdeFormatada > 0) {
                            arrayConsumosNovos.push({
                                Produto_Codigo: produtoCodigo,
                                Insumo_Tipo: linhaTabela.TIPO,
                                Insumo_IdCons: '',
                                Insumo_Ordem: 0,
                                Insumo_Codigo: linhaTabela.CODIGO,
                                Insumo_Descricao: linhaTabela.DESCRICAO,
                                Insumo_Unidade: linhaTabela.UNIDADE,
                                Insumo_Setor: linhaTabela.SETOR,
                                Insumo_Aplicacao: linhaTabela.APLICACAO,
                                Insumo_Parte: linhaTabela.PARTE,
                                Insumo_Faixa: tamanho,
                                Insumo_Preco: 'S',
                                Insumo_Consumo: qtdeFormatada,
                                Insumo_ListaCores: coresProduto,
                            })
                        }
                    })
                })
            }

            const arrayFinal = [...arrayConsumosAnteriores, ...arrayConsumosNovos, ...arrayConsumosPosteriores].map((e, i) => {
                return {
                    ...e,
                    Insumo_Ordem: i + 1,
                }
            })

            const url = '/sisplan/cadconsumo/v1/incluiconsumos?';
            const response = await requisicao('POST', url, '', `LISTADECONSUMOS=${encodeURIComponent(JSON.stringify({ LISTACONSUMOSCRIADOS: arrayFinal }))}`, 360000);

            if (response.status == 200) {
                criaMensagemSucesso('Consumos cadastrados com sucesso!', () => { window.location.reload(true); });
                return;
            };

            if (response.status != 200) {
                msgErro('Não foi possível cadastrar os consumos! Verifique.');
                return;
            };
        } catch (e) {
            console.log(e)
            msgErro('Ocorreu um erro ao gravar os dados.')
        } finally {
            $.LoadingOverlay('hide')
        }
    }
})