Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.590
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. Eu não sei mexer no servidor, mas passei a sua questão para o Copilot e ele respondeu: Esse erro ocorre porque a função nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation foi introduzida na versão 1.50.0 do nghttp2, mas parece que a versão do php_curl.dll que você está usando ainda está vinculada a uma versão anterior do nghttp2. Para resolver isso, você pode tentar atualizar a biblioteca nghttp2 para a versão mais recente ou verificar se há uma versão atualizada do php_curl.dll que corresponda à versão do PHP que você está usando. Aqui estão alguns passos que podem ajudar: Atualize o Apache: Às vezes, atualizar o Apache para a versão mais recente pode resolver problemas de compatibilidade. No Laragon, você pode fazer isso clicando com o botão direito no ícone do Apache e selecionando a versão mais recente disponível2. Verifique a versão do nghttp2.dll: Certifique-se de que o arquivo nghttp2.dll esteja presente na mesma pasta que o php_curl.dll ou em um local que esteja no caminho do sistema (PATH). Atualize o PHP e suas extensões: Certifique-se de que todas as extensões PHP e bibliotecas estejam atualizadas para a versão mais recente compatível com o seu PHP. Se essas soluções não resolverem o problema, você pode considerar desativar temporariamente a extensão curl para ver se o erro persiste. No entanto, isso pode afetar o funcionamento de algumas funcionalidades do seu site.
  2. Consultei o Copilot, e ele montou o seguinte código VBA: Sub VerificarPlanilhas() Dim wsCaixa As Worksheet Dim wsRH As Worksheet Dim rngCaixa As Range Dim rngRH As Range Dim celCaixa As Range Dim celRH As Range Dim cpfCaixa As String Dim cpfRH As String Dim valorCaixa As Double Dim valorRH As Double Dim encontrado As Boolean ' Definir as planilhas Set wsCaixa = ThisWorkbook.Sheets("Caixa") Set wsRH = ThisWorkbook.Sheets("RH") ' Definir os intervalos de dados Set rngCaixa = wsCaixa.Range("A2", wsCaixa.Cells(wsCaixa.Rows.Count, 1).End(xlUp)) Set rngRH = wsRH.Range("A2", wsRH.Cells(wsRH.Rows.Count, 1).End(xlUp)) ' Limpar formatação de cor existente rngCaixa.Interior.ColorIndex = xlNone rngRH.Interior.ColorIndex = xlNone ' Verificar CPFs na planilha Caixa For Each celCaixa In rngCaixa cpfCaixa = celCaixa.Value valorCaixa = celCaixa.Offset(0, 1).Value encontrado = False For Each celRH In rngRH If celRH.Value = cpfCaixa Then encontrado = True valorRH = celRH.Offset(0, 1).Value If valorCaixa <> valorRH Then celCaixa.Interior.Color = RGB(255, 255, 0) ' Amarelo celCaixa.Offset(0, 1).Interior.Color = RGB(255, 255, 0) ' Amarelo celRH.Interior.Color = RGB(255, 255, 0) ' Amarelo celRH.Offset(0, 1).Interior.Color = RGB(255, 255, 0) ' Amarelo End If Exit For End If Next celRH If Not encontrado Then celCaixa.Interior.Color = RGB(0, 255, 0) ' Verde celCaixa.Offset(0, 1).Interior.Color = RGB(0, 255, 0) ' Verde End If Next celCaixa ' Verificar CPFs na planilha RH For Each celRH In rngRH cpfRH = celRH.Value encontrado = False For Each celCaixa In rngCaixa If celCaixa.Value = cpfRH Then encontrado = True Exit For End If Next celCaixa If Not encontrado Then celRH.Interior.Color = RGB(255, 0, 0) ' Vermelho celRH.Offset(0, 1).Interior.Color = RGB(255, 0, 0) ' Vermelho End If Next celRH MsgBox "Verificação concluída!" End Sub O código funciona, mas apresentou resultado diferente no caso da Vilma - renda mensal R$ 101,27. Foi pintado de amarelo por constar nas duas planilhas mas com valores divergentes. O critério é muito vago, se a Vilma retirou do caixa R$ 10,00; R$ 10,00; R$ 10,00, e a planilha do RH constar apenas um registro de R$ 10,00, o código não será capaz de pintar coisa alguma.
  3. Desde ontem é que eu percebi que não consigo enxergar todo o plano de contas no celular, modo paisagem. Fazendo vários testes, descobri que o problema está aqui: <div class="hidden fixed ml-4 top-15 border-4 border-gray-400 rounded" id="myModal"> Ao invés do fixed, usei absolute, e assim consigo rolar o plano de contas até o fim no modo paisagem, e também consigo rolar para o lado no modo retrato, no celular. A dica <div class="overflow-x-auto">Lançamentos</div> ajuda a mostrar a maior parte do plano de contas, mas não todo.
  4. Estou usando o ambiente Laravel, HTML <div> e o CSS Tailwind para as visualizações caberem no meu celular Note 10 no modo paisagem. No começo, eu me atrapalhei na hora de usar o Tailwind com o marcador <table>, e assim eu me aventurei com o marcador <div>. O grande problema que eu enfrentei é alinhar a <div>cabecalho</div> com a <div>dados</div>. Só na semana passada é que eu aprendi que só é possível alinhar duas <div> se elas tiverem exatamente o mesmo tamanho. Outro problema é colorir a <div>cabecalho</div>, aqui eu apelei para a improvisação: se <div class="odd:bg-gray-200"> não der certo, então mudar para <div class="even:bg-gray-200">. O Copilot tem várias sugestões para resolver esse tipo de problema, mas eu sinceramente prefiro o velho método da tentativa e erro, claro que o meu método não é lógico, mas é o melhor atalho que eu encontrei para renderizar a página no meu celular no modo paisagem o mais rápido que eu puder. É a famosa política de que os fins justificam os meios: arquivo resources > views > diarioHistorico.blade.php @include('menuView') // define entre outras coisas body {width:630px} <script>btMenu.innerHTML = 'Histórico';document.title = 'Histórico'</script> <div class="flex font-semibold odd:bg-gray-200"> <div class="w-[70px]">Dia</div> <div class="w-[50px] text-right">Lcto</div> <div class="w-[50px] text-right">CtaD</div> <div class="w-[50px] text-right">CtaC</div> <div class="w-[80px] text-right">Valor</div> <div class="w-[328px] ml-2">Histórico</div> </div> @foreach($hist as $h) <div class="flex odd:bg-gray-200"> <div class="w-[70px]">{{dbr($h->dia)}}</div> <div class="w-[50px] text-right"> <a href='diarioEdita?docto={{$h->docto}}' class="text-gray-500 font-semibold"> {{$h->lcto}} </a> </div> <div class="w-[50px] text-right">{{$h->contad}}</div> <div class="w-[50px] text-right">{{$h->contac}}</div> <div class="w-[80px] text-right">{{dec($h->valor)}}</div> <div class="w-[328px] ml-2">{{$h->hist}}</div> </div> @endforeach
  5. Ontem, eu tentei fazer um lançamento contábil pelo celular (no modo paisagem), mas na hora de eu chamar o plano de contas percebi que não consegui rolar o plano de contas para baixo, e assim eu vi que é impossível fazer o lançamento contábil pelo celular. Eu não tive escolha, mandei todo o meu código PHP para o Copilot e pedi ajuda. O código tem duas grandes partes. A <div> do plano de contas. E a <div> do lançamento contábil. O Copilot alterou o meu código, acrescentando <div class="overflow-x-auto"> em torno do <div> do lançamento contábil. Isso não faz o menor sentido para mim, mas isso deu certo no celular, conseguir rolar o plano de contas para baixo. arquivo diarioLcto.php <?php include('menuView.php') ?> <script src="https://cdn.tailwindcss.com"></script> <style> input[type="date"]::-webkit-calendar-picker-indicator { display: none} </style> <script> btMenu.innerHTML='<?=$btnMenu?>' document.title='<?=$btnMenu?>' var idControle,Descricao function ir(controle,destino) { idControle=controle Descricao=destino myModal.classList.remove('hidden') } function voltar(texto) { controle=document.getElementById(idControle) destino=document.getElementById(Descricao) controle.value=texto.substr(0,3) tamanho=texto.strlen destino.innerHTML=texto.substr(4,tamanho) myModal.classList.add('hidden') } function fechar() { myModal.classList.add('hidden') } </script> <div class="hidden fixed ml-4 top-15 border-4 border-gray-400 rounded overflow-y-auto max-h-screen" id="myModal"> <?php foreach($ativo as $key=>$row): ?> <div class="flex"> <div class="w-[300px] pl-2 <?= $key%2==0 ? 'bg-gray-300' : 'bg-white' ?>"> <a onclick="voltar(this.innerHTML)"><?=$row->conta." ".$row->descricao?></a> </div> <?php if($key<$contaPassivo): ?> <div class="flex w-[300px] <?= $key%2==0 ? 'bg-gray-300' : 'bg-white' ?>"> <a onclick="voltar(this.innerHTML)"><?=$passivo[$key]->conta." ".$passivo[$key]->descricao?></a> <?php if($passivo[$key]->conta==415): ?> <a onclick=fechar() class=ml-[100px]>Fechar</a> <?php endif; ?> </div> <?php endif; ?> </div> <?php endforeach; ?> </div> <div class="overflow-x-auto"> <?php if(count($produtos)): ?> <div class="flex even:bg-gray-200"> <div style=width:100px class=text-right>Cod</div> <div style=width:400px class=ml-2>Produto</div> <div style=width:50px class=text-right>Qt</div> <div style=width:50px class=text-right>Un</div> <div style=width:100px class=text-right>Total</div> </div> <?php foreach($produtos as $prod): ?> <div class="flex even:bg-gray-200"> <div class="w-[100px] text-right text-gray-500 font-semibold"> <a href="?Produto.alterarItem.<?=$prod->id?>"> <?=$prod->codprod?> </a> </div> <div class="w-[400px] ml-2"><?=$prod->prod?></div> <div class="w-[50px] text-right"><?=virgula($prod->qt)?></div> <div class="w-[50px] text-right"> <a href="?Produto.excluir.<?=$prod->id?>"> <?=$prod->un?> </a> </div> <div class="w-[100px] text-right"><?=dec($prod->custototal)?></div> </div> <?php endforeach; ?> <div class="flex even:bg-gray-200"> <div class='w-[100px] text-right'> <?=date('d/m/y',strtotime($produtos[0]->dia))?> </div> <div class="w-[500px] flex ml-2 white-space-nowrap"> <form method=post action="?Diario.produto"> <input type=submit name=produto value='Produto' class="mr-[10px] text-gray-500 font-semibold py-0 px-1 bg-transparent rounded-lg"> <?php if($somaProdutos!==0): ?> <a href=?Diario.pessoa class="text-gray-500 font-semibold"> <?=$produtos[0]->pessoa?> </a> <?php endif; ?> </form> </div> <div class="w-[200px] text-end font-semibold"><?=dec($somaProdutos)?></div> </div> <?php else: if($btnMenu!=="Novo Lançamento"): ?> <div class="w-[400px] ml-2"> <form method=post action="?Diario.produto"> <input type=submit name=produto value='Produto' class="text-gray-500 font-semibold hover:bg-gray-200 p-1 rounded-lg"> </form> </div> <?php endif; endif; ?> </div> <form action='<?=$comando?>' method="post" class="container rounded-lg mx-auto border border-gray-200 mt-4"> <?php if($btnMenu=="Edita Lançamento"): ?> <div class="py-2"> <a href="?Diario.cria.<?=$consulta->lcto?>" class="text-gray-500 font-semibold"> Acrescentar no lançamento <?=$consulta->lcto?></a> </div> <?php endif; ?> <div class="flex items-center bg-gray-200 mt-3 h-[35px] rounded-lg"> <label for=dia class="block ml-2 mr-14">Dia</label> <input type="date" name="dia" id=dia value=<?=$consulta->dia?> class='w-[90px] text-gray-500 font-semibold bg-transparent border-none rounded-lg p-1 py-0 text-right focus:ring-1 focus:ring-blue-700 focus:outline-none' onclick=this.showPicker()> </div> <div class="flex items-center mt-1"> <label for=lcto class="block ml-2 mr-16">Lçto</label> <input name=lcto id=lcto value='<?=$consulta->lcto?>' size=4 class='border-none rounded-lg text-gray-500 font-semibold p-1 py-0 text-right bg-transparent'> </div> <div class="flex items-center bg-gray-200 mt-1 h-[35px] rounded-lg"> <label for=contad class="block ml-2 mr-10">ContaD</label> <input name=contad id=contad value='<?=$consulta->contad?>' size=4 onclick="ir(this.id,'DescD')" autocomplete=off class='border-none bg-transparent text-gray-500 font-semibold rounded-lg p-1 py-0 text-right focus:ring-1 focus:ring-blue-700 focus:outline-none'> <span id="DescD" class="ml-4 "></span> </div> <div class="flex items-center mt-1"> <label for=contac class="block ml-2 mr-10">ContaC</label> <input name=contac id=contac value='<?=$consulta->contac?>' size=4 onclick="ir(this.id,'DescC')" autocomplete=off class='border-none text-gray-500 font-semibold rounded-lg p-1 py-0 text-right bg-transparent focus:ring-1 focus:ring-blue-700 focus:outline-none'> <span id="DescC" class="ml-4"></span> </div> <div class="flex items-center bg-gray-200 mt-1 mb-1 h-[35px] rounded-lg"> <label for=valor class="block ml-2 mr-12 text-gray-900">Valor</label> <input name=valor id=valor value='<?=dec($consulta->valor)?>' autocomplete="off" class='border-none text-gray-500 font-semibold bg-transparent rounded-lg p-1 py-0 text-right focus:ring-1 focus:ring-blue-700 focus:outline-none' size=5> </div> <div class="flex items-center mt-1 mb-3"> <label for=hist class="block ml-2 mr-3 text-gray-900">Histórico</label> <input name=hist id=hist value='<?=$consulta->hist?>' autocomplete="off" class='border-none text-gray-500 font-semibold rounded-lg p-1 py-0 bg-transparent focus:ring-1 focus:ring-blue-700 focus:outine:none' size=47 > <input type="hidden" name="docto" value="<?=$consulta->docto?>"> <input type="submit" value="Confirmar" class="border-none text-gray-500 font-semibold hover:bg-gray-200 p-1 py-0 ml-2 rounded"> </div> </form>
  6. A minha função apuração não funciona, então eu pedi ajuda para o Copilot. Mas ele não conseguiu resolver o problema. Na segunda tentativa, o Copilot foi bem mais esperto, ele criou uma rotina para calcular o último ano, se ele não estiver lá, então a função pede a gentileza de incluir o último ano no vetor da apuração: arquivo balancete.php <?php class balancete { function apuracao() { $primeiroDia = (new Conn)->select('dia from tbdiario order by dia')[0]->dia; $ultimoDia = (new Conn)->select('dia from tbdiario order by dia desc')[0]->dia; $anos = []; while (strtotime($primeiroDia) <= strtotime($ultimoDia)) { $anos[] = date('Y', strtotime($primeiroDia)); $data = new DateTime($primeiroDia); $primeiroDia = date_modify($data, '+1 year')->format('Y-m-d'); } $ultimoAno=date('Y',strtotime($ultimoDia)); if(!in_array($ultimoAno,$anos)) { $anos[] = $ultimoAno; } rsort($anos); $meses = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez']; return view('balanceteApuracao', ['anos' => $anos, 'meses' => $meses]); } }
  7. arquivo appView.php <!DOCTYPE html> <html lang="en"> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"> </script> <script src="https://cdn.tailwindcss.com"></script> <style> @media (min-width: 768px) { .geral {width: 700px; margin: auto; font-size: 16px} } @media (max-width: 767px) { body {width: 630px; margin: auto; font-size: 16px} } @media (min-width: 768px) and (max-width:1024px) { body {width:700px;margin: auto; font-size: 16px}} input[type="date"]::-webkit-calendar-picker-indicator {display: none} summary { list-style:none } </style> <title>Projeto Classe</title> <body class=geral> Esse código é uma tremenda aberração. Eu não queria criar a classe "geral" para formatar o laptop, mas esse é o único jeito que eu encontrei para centralizar a renderização no meio da tela. Se eu escrever body no lugar do .geral, tudo fica encostado na esquerda. Apesar do código não respeitar a lógica, consegui definir o body do celular para 630px e do tablet para 700 px. A minha intuição me diz que o mais sensato é esquecer o laptop, o tablet e o celular, e montar todo o código baseado numa só classe, assim <body class="w-[630px] m-auto"> no jargão da Tailwind. O duro é ter que mexer num monte de views que foram projetados para 700 pixels.
  8. O PHP.ini está error_reporting=E_ALL, ou seja, é para considerar todo tipo de erro como acontece na Hostinger. O único jeito é ter paciência, e empurrar a vida com a barriga. Feliz Ano Novo.
  9. Eu olhei o arquivo php.ini [apache module] e lá eu vi error_reporting = E_ALL. O mistério ainda continua.
  10. Frank K Hosaka

    Erro no código

    Simplifiquei o código, e só consegui salvar o xlsx com a ajuda do parâmetro FileFormat: Sub teste() Dim ws As Worksheet Dim Filename As String Set ws = ActiveSheet Filename = ThisWorkbook.Path & "\Venda de veículos.xlsx" On Error GoTo ErrorHandler ws.SaveAs Filename:=Filename, FileFormat:=xlOpenXMLWorkbook MsgBox "Arquivo salvo com sucesso como " & Filename Exit Sub ErrorHandler: MsgBox "Erro ao salvar o arquivo: " & Err.Description End Sub
  11. O <input type="file"> produz um quadro com a frase "Escolha o arquivo" e ali adiante outra mensagem "nenhum arquivo selecionado". O Copilot me passou uma dica de como esconder a segunda parte do marcador, mas ele escondeu todo o input, no lugar colocou um botão personalizado, e acrescentou um código em JavaScript. Eu achei a dica do Copilot muito trabalhoso, então decidi improvisar por conta própria, usando apenas o Tailwind. Não ficou bom, dá para ver que se trata de gambiarra: <?php include 'menuView.php'; ?> <script>btmenu.innerHTML="Nota Faltante";document.title="Nota Faltante"</script> <script src="https://cdn.tailwindcss.com"></script> <div> <form method="post" enctype="multipart/form-data" action="?Bling.faltanteSelecionado"> <div class="flex"> <input type="file" name="pasta" class="w-[133px] font-semibold" onchange=submit()> <div class="font-semibold bg-gray-200 border-t-2 border-r-2 border-b-2 border-black px-1">zipado da Bling</div> </div> </form> </div>
  12. Hoje eu usei o cdn da Tailwind no Laravel, e ele funcionou tanto no notebook bem como no Hostinger, só o JavaScript reclamou que eu não deveria usar o cdn. arquivo route > web.php Route::view('/','index'); arquivo reources > views > index.blade.php <!-- esse arquivo pode ser testado no PHP, mas se não mudar o nome do arquivo, terá que executar localhost/index.blade --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.tailwindcss.com"></script> <body class="w-[500px] m-0 m-auto"> <table class="table table-striped"><!-- tabela zebrada com Bootstrap --> <tr><th class="ml-2">Coluna 1<th>Coluna2 <tr><td>2<td>2 <tr><td>3<td>4 </table> <table class="min-w-full"><!-- tabela zebrada com Tailwind --> <tr class="bg-gray-200"><th>Coluna 1<th>Coluna2 <?php for($i=1;$i<=10;$i++): ?> <tr class="odd:bg-gray-200"><td><?=$i?><td><?=$i?> <?php endfor; ?> </table>
  13. Eu consultei o Copilot, e ele disse que é possível o PERL executar uma macro do Microsoft Access. Ou seja, se a sua consulta funciona no Microsoft Access, você precisa transformar essa consulta numa macro e pedir para o PERL executar a macro: #!/usr/bin/perl use strict; use warnings; use Win32::OLE; # Caminho para o arquivo .mdb my $caminho = 'C:/caminho/para/seu/arquivo.mdb'; # Inicializa o objeto Access my $access = Win32::OLE->new('Access.Application', 'Quit') or die "Não foi possível iniciar o Access: $!"; # Abre o banco de dados my $banco = $access->OpenCurrentDatabase($caminho) or die "Não foi possível abrir o banco de dados: " . $access->LastError(); # Executa a subroutine $banco->RunMacro('NomeDaSubroutine'); # Fecha o banco de dados e o Access $banco->CloseCurrentDatabase(); $access->Quit; Acho que o mais sensato é criar a função calc_idade2 no ambiente do PERL, ou seja, você estuda a fonte original do Access e depois codifica na gramática do PERL. O máximo que dá para fazer com as conexões ODBC é acessar informações contidas nas tabelas e não todos os recursos do Microsoft Access.
  14. Ontem, eu pedi para a Hostinger usar o PHP 8.4, pois eu não vi nenhum problema aqui no Notebook. Hoje eu aprendi que o Notebook é uma coisa, mas o Hostinger é coisa totalmente diferente. Aqui no Notebook, o seguinte comando gera um arquivo CSV: fputcsv($arquivo, $dados[0]); Mas o PHP 8.4 do Hostinger é diferente, ele reclama que o comando está depreciado e que preciso colocar os parâmetros do $escape, assim: fputcsv($arquivo, $dados[0],',','"','\\'); Eu consegui os parâmetros graças ao Copilot. O meu programa orçamento não gera e nem tem credencial para emitir uma NFC-e, o máximo que eu consegui fazer é montar um pedido nos moldes da Bling, depois vou na Bling, importo o pedido, e em seguida emito a NFC-e. O mais comum é o Cupom Fiscal, mas em São Paulo, você precisa do SAT para autenticar o cupom. Já o NFC-e é a antiga NF Série D, na versão eletrônica, e ele não precisa do SAT para ser autenticado e a Bling não tem uma versão para emitir o Cupom Fiscal. A Bling tem rotina para gerar pedido, mas achei oportuno fazer um Orçamento em PHP para facilitar na hora de usar o tablet ou celular: <?php class Orcamento { function apagarBling($pedido) { (new Conn)->update("tbpedido set bling=null where ped=$pedido"); return $this->inicio($pedido); } function bling($pedido) { $pBling=$_GET['pBling']; $verificar=(new Conn)->select("count(bling) as contagem from tbpedido where bling=$pBling")[0]->contagem; if($verificar) { echo "<h1>Pedido Bling $pBling já foi criado. <a href=?Orcamento.inicio>Voltar</a></h1>"; exit; } (new Conn)->update("tbpedido set bling=$pBling where ped=$pedido"); $contato="Consumidor Final"; $itens=(new Conn)->select("* from tbhistped where ped=$pedido"); $previa=(new Conn)->select("sum(subtotal) as soma from tbhistped where subtotal < 0 and ped=$pedido")[0]->soma; $desconto=$previa ? abs($previa) : 0; $total=(new Conn)->select("total from tbpedido where ped=$pedido")[0]->total; $data=date('d/m/Y',strtotime((new Conn)->select("dia from tbpedido where ped = $pedido")[0]->dia)); $dados = array( array("Número pedido","Nome Comprador","Data","CPF/CNPJ Comprador","Endereço Comprador", "Bairro Comprador","Número Comprador","Complemento Comprador","CEP Comprador","Cidade Comprador", "UF Comprador","Telefone Comprador","Celular Comprador","E-mail Comprador","Produto", "SKU","Un","Quantidade","Valor Unitário","Valor Total", "Total Pedido","Valor Frete Pedido","Valor Desconto Pedido","Outras despesas","Nome Entrega", "Endereço Entrega","Número Entrega","Complemento Entrega","Cidade Entrega","UF Entrega", "CEP Entrega","Bairro Entrega","Transportadora","Serviço","Tipo Frete", "Observações","Qtd Parcela","Data Prevista","Vendedor","Forma Pagamento", "ID Forma Pagamento")); foreach($itens as $item) { if($item->subtotal>0) { $dados[]=array($pBling,$contato,$data,null,null, null,null,null,null,null, null,null,null,null,null, $item->codprod,$item->un,$item->qt,$item->unitario,$item->subtotal, $total,null,$desconto,null,null, null,null,null,null,null, null,null,null,null,null, null,1,$data,null,1, 0); } } $arquivo = fopen("$pBling.csv", "w"); fputcsv($arquivo, $dados[0],',','"','\\'); foreach ($dados as $linha) { if ($linha != $dados[0]) { fputcsv($arquivo, $linha,',','"','\\'); } } fclose($arquivo); if (file_exists("$pBling.csv")) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename("$pBling.csv")); header('Content-Length: ' . filesize("$pBling.csv")); readfile("$pBling.csv"); unlink("$pBling.csv"); } } function confirmar() { $ped=$_POST['ped']; if(!empty($_POST['dinheiro'])) { $dinheiro=str_replace(',','.',$_POST['dinheiro']); $troco=str_replace(',','.',$_POST['troco']); } else { $dinheiro=0; $troco=0; } if(isset($_POST['cartao'])){$cartao=1;} else {$cartao=0;} if(isset($_POST['pix'])){$pix=1;} else {$pix=0;} if(!empty($_POST['parcial'])) { if($dinheiro!==0) { echo "<script>location.replace('orcamento.php')></script>";exit; } $dinheiro=$_POST['parcial']; $troco=0; } $horavenda=date('Y-m-d H:i'); (new Conn)->update("tbpedido set horavenda='$horavenda',dinheiro=$dinheiro, troco=$troco,cartao=$cartao,pix=$pix where ped=$ped"); return $this->inicio(); } function corrigir($ped) { (new Conn)->update("tbpedido set horavenda=null,horavenda=null,dinheiro=null, troco=null,cartao=0,pix=0 where ped=$ped"); return $this->inicio(); } function excluir($id) { $ped=$_GET['pedido']; (new Conn)->delete("tbhistped where id=$id"); $novoTotal=(new Conn)->select("sum(subtotal) as soma from tbhistped where ped=$ped")[0]->soma; if($novoTotal==null) { $novoTotal='null'; } (new Conn)->update("tbpedido set total=$novoTotal where ped=$ped"); return $this->inicio($ped); } function historicoOrc($hist) { $where=""; if($hist) { $ped=$_SESSION['referencia']+$hist; $where="where ped <= $ped"; } $pedidos=(new Conn)->select("* from tbpedido left join tbpessoa on tbpedido.codp = tbpessoa.codp $where order by ped desc limit 20"); $_SESSION['referencia']=$pedidos[0]->ped; return view('orcamentoHist',['pedidos'=>$pedidos]); } function inicio($pedido = null) { $prod=(new Conn)->select("* from tbprod order by prod"); $maquina=strpos($_SERVER['HTTP_USER_AGENT'],"Windows"); $hoje=date('Y-m-d'); $where=""; if($pedido) { $where="where ped=$pedido"; $vr['codprod']=(isset($_SESSION['codprod'])) ? $_SESSION['codprod'] : null; if($vr['codprod']) { $codprod=$vr['codprod']; $produto=(new Conn)->select("* from tbprod where codprod=$codprod")[0]; $vr['prod']=$produto->prod; $vr['un']=$produto->un; $custo=$produto->custo; $margem=$produto->marg; $vr['preço']=pvenda($custo,$margem); } else { unset($_SESSION['codprod']); $vr=['ped'=>'','diaped'=>$hoje,'totalped'=>'','codp'=>'','pessoa'=>'', 'end'=>'','cnpj'=>'','tel'=>'','nota'=>'','codprod'=>'','un'=>'', 'prod'=>null,'preço'=>'','horavenda'=>'','bling'=>'']; } } $ped=(new Conn)->select("* from tbpedido $where order by ped desc")[0]; $vr['ped']=$ped->ped; $_SESSION['ped']=$ped->ped; $vr['diaped']=$ped->dia; $vr['horavenda']=$ped->horavenda; $vendido=($ped->horavenda) ? true : false; $vr['totalped']=$ped->total; $vr['bling']=$ped->bling; $vr['codp']=$ped->codp; if(isset($_SESSION['codp'])) { $vr['codp']=$_SESSION['codp']; unset($_SESSION['codp']); } if($vr['codp']) { $pessoa=(new Conn)->select("* from tbpessoa where codp=". $vr['codp'])[0]; $vr['pessoa']=$pessoa->pessoa; $vr['end']=$pessoa->end; $vr['cnpj']=$pessoa->cnpj; $vr['tel']=$pessoa->tel; $vr['nota']=$pessoa->nota; } $histped=(new Conn)->select("tbhistped.id,tbhistped.ped, tbhistped.codprod, tbhistped.qt as qt, tbhistped.unitario as unitario, tbhistped.subtotal, tbprod.prod as prod, tbprod.un as un from tbhistped inner join tbprod on tbhistped.codprod = tbprod.codprod and tbhistped.ped = $ped->ped order by tbhistped.id"); return view('orcamentoView',['vr'=>$vr,'histped'=>$histped,'prod'=>$prod, 'maquina'=>$maquina,'vendido'=>$vendido]); } function menu() { unset($_SESSION['codprod']); unset($_SESSION['codp']); unset($_SESSION['pessoa']); return $this->inicio(); } function novo() { $pedido=(new Conn)->select("* from tbpedido order by ped desc")[0]; $ped=$pedido->ped; $total=$pedido->total; if($total!==null) { $ped++; $dia=date('Y-m-d'); (new Conn)->insert("tbpedido (dia,ped) values ('$dia',$ped)"); } return header("location:?Orcamento.inicio.$ped"); } function pedido($pedido) { $_SESSION['ped']=$pedido; return $this->inicio($pedido); } function pessoa($pedido) { $_SESSION['end']="?Orcamento.pessoaSelecionada.$pedido"; if(isset($_GET['codp'])){ $codp=$_GET['codp']; return header("location:?pessoa.inicio.$codp"); } return header("location:?Pessoa.inicio"); } function pessoaSelecionada($pedido) { $codp=$_SESSION['codp']; (new Conn)->update("tbpedido set codp = $codp where ped=$pedido"); return $this->inicio($pedido); } function produto() { $pedido=$_SESSION['ped']; $_SESSION['end']="?Orcamento.inicio.$pedido"; $produto=str_replace(" ","%",$_POST['produto']); $tamanho=strlen($produto); $posicao=strpos($produto,":"); if($posicao==0) { if($produto!=="") { $_SESSION['criterio']="where prod like '%$produto%' order by prod"; } return header("location:?Produto.inicio"); } $_SESSION['codprod']=substr($produto,$posicao+1,$tamanho-$posicao); return $this->inicio($_SESSION['ped']); } function qt() { $qt=deca($_POST['qt']); $codprod=$_SESSION['codprod']; unset($_SESSION['codprod']); if($qt==0 || $qt=='') { return $this->inicio(); } $produto=(new Conn)->select("* from tbprod where codprod=$codprod")[0]; $ped=$_SESSION['ped']; $un=$produto->un; $custo=$produto->custo; $margem=$produto->marg; $unitario=pvenda($custo,$margem); $subtotal=$qt*$unitario; (new Conn)->insert("tbhistped (ped,codprod,un,unitario,subtotal,qt) values ($ped,$codprod,'$un',$unitario,$subtotal,$qt)"); $novoTotal=(new Conn)->select("sum(subtotal) as soma from tbhistped where ped=$ped")[0]->soma; (new Conn)->update("tbpedido set total=$novoTotal where ped=$ped"); return $this->inicio($ped); } }
  15. Durante quatro horas fiz vários testes para ver o que eu fiz de errado no código PHP, mas não consegui encontrar nada. Até que eu fui tentar fazer diretamente no terminal, no Workbench MySQL: update tbnf set custoanterior=15.8, e o MySQL reclamou que os dados estavam truncados. Mudei o tipo do campo de float para double para int, mas nada disso resolveu. Finalmente decidi estudar toda a tabela, e dentro do campo codprod encontrei algo assim <b>Ver</ b>, isso é uma gambiarra HTML que eu coloquei dentro de um campo tipo varchar. O Copilot me explicou que o varchar é só para texto puro e que não pode usar o marcador HTML. Para corrigir o problema, ele sugeriu mudar o tipo do campo para TEXT. Eu imaginei que o problema era a consulta, mas acabei descobrindo que a tabela é que estava detonada, algo parecido com o PHP, se você abre um bloco {, o PHP não faz nada se você não fechar o bloco com }. Resumindo, VARCHAR e TEXT é quase a mesma coisa, você só não pode usar marcador HTML no VARCHAR. Agora eu entendo porque é tão difícil estudar o banco de dados.
  16. Frank K Hosaka

    O $epsilon

    Hoje apareceu uma nota fiscal fora do estado, onde eu tive que calcular o ICMS substituição tributária e o ICMS diferencial de alíquota. Eu fiz o cálculo usando o Excel, e também codifiquei o código no PHP para calcular a mesma coisa. Deu uma diferença de R$ 0,01. O Copilot me ofereceu quatro dicas que não funcionaram. Então, ele apresentou o $epsilon. O Copilot é engenhoso! <?php echo round(76.25*0.18-9.15,2) . "<br>"; echo number_format(76.25*0.18-9.15,2,'.','') . "<br>"; bcscale(2); $parte1=bcmul('76.25','0.18'); echo bcsub($parte1,'9.15') . "<br>"; $parte1 = 76.25 * 0.18; $parte2 = $parte1 - 9.15; echo number_format($parte2,2,'.','') . "<br>"; $epsilon = 0.00001; $valor=76.25*0.18-9.15; echo round($valor + $epsilon,2);
  17. Eu raramente uso chave externa, pois eu não sei qual a categoria do produto. Aconselho a fazer o mesmo, não crie a chave externa. Mas se você sabe a categoria do produto, e você tem chave externa para ela, você é obrigado a incluir a categoria do produto, toda vez que for incluir um produto, assim: CREATE DEFINER=`root`@`localhost` PROCEDURE `testandoNulo`() BEGIN DROP TABLE IF EXISTS tb_produtos; DROP TABLE IF EXISTS tb_categoria; CREATE TABLE tb_categoria ( id_categoria INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL, desc_categoria VARCHAR(255) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; INSERT INTO tb_categoria (desc_categoria) VALUES ('Produtos que envolvem dispositivos eletrônicos e inovações tecnológicas.'), ('Roupas e acessórios que seguem tendências de estilo e design.'), ('Produtos e tratamentos para cuidados pessoais e estética.'); CREATE TABLE tb_produtos ( id_produtos INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, desc_produtos VARCHAR(255) NOT NULL, valor DECIMAL(10,2), id_categorias INT(11) NOT NULL, CONSTRAINT fk_id_categoria FOREIGN KEY (id_categorias) REFERENCES tb_categoria(id_categoria) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO tb_produtos (desc_produtos, valor, id_categorias) VALUES ('Dispositivo portátil que combina funções de telefone, computador e câmera em um único aparelho.', 600, 1), ('Peça de roupa feminina que cobre o corpo desde os ombros até a parte inferior das pernas.', 80, 2), ('Produto cosmético usado para manter a pele hidratada e suave.', 30, 3); END
  18. CREATE DEFINER=`root`@`localhost` PROCEDURE `calcular_notas`() BEGIN DROP TABLE IF EXISTS aluno; DROP TABLE IF EXISTS resposta; DROP TABLE IF EXISTS gabarito; CREATE TABLE `aluno` ( `id` int NOT NULL AUTO_INCREMENT, `nome` varchar(80) COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; CREATE TABLE `resposta` ( `Id` int NOT NULL AUTO_INCREMENT, `Aluno_id` int DEFAULT NULL, `Questao` int DEFAULT NULL, `Resposta` varchar(45) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; CREATE TABLE `gabarito` ( `Id` int NOT NULL AUTO_INCREMENT, `Questao` int DEFAULT NULL, `Solucao` varchar(45) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; INSERT INTO aluno (Nome) values ('João'),('José'),('Lucas'); INSERT INTO resposta (Aluno_Id,Questao,Resposta) values (1,1,'A'),(1,2,'D'),(1,3,'E'),(1,4,'C'),(1,5,'B'), (2,1,'C'),(2,2,'E'),(2,3,'E'),(2,4,'C'),(2,5,'A'),(3,1,'B'),(3,2,'D'),(3,3,'A'),(3,4,'A'),(3,5,'A'); INSERT INTO gabarito (Questao, Solucao) VALUES (1, 'C'),(2, 'D'),(3, 'E'),(4,'C'),(5,'A'); SELECT r.Aluno_Id, a.Nome, COUNT(*) AS acertos FROM resposta r JOIN gabarito g ON r.Questao = g.Questao JOIN aluno a ON a.id = r.Aluno_id WHERE r.Resposta = g.Solucao GROUP BY r.Aluno_Id; END
  19. Eu acho bem bacana o roteador do Laravel, e eu pensei fazer o mesmo no PHP. O Copilot sugeriu criar o arquivo .htaccess: RewriteEngine On RewriteRule ^([^/]+)/?$ index.php [L] No teste que eu fiz no Hostinger, não precisei do arquivo .htaccess O meu roteador ficou assim: <?php class Teste { function teste() {echo "olá mundo!";} function beleza($alfa = null) { if($alfa){echo $alfa;} else {echo "o mundo e belo";} } } $request = $_SERVER['REQUEST_URI']; $script_name = $_SERVER['SCRIPT_NAME']; $base = str_replace(basename($script_name), '', $script_name); $path = str_replace($base, '', $request); $path = trim($path, '/'); if(strpos($path,'?')===false){$path .= '?';} list($before,$after)=explode('?',$path,2); $rota=['teste'=>'Teste.teste','beleza'=>'Teste.beleza']; $segmentos=explode('.',$rota[$before]); $nomeControle=$segmentos[0]; $metodo=$segmentos[1]; $parametro=$after ?? null; (new $nomeControle())->$metodo($parametro); ?> Ele funcionou quando escrevi localhost/astudy/teste, localhost/astudy/beleza, localhost/astudy/beleza?variavel=15
  20. Depois de cinco anos, graças ao Copilot, consegui tirar o ícone do calendário do <input type="date"> <?php $hoje=date('Y-m-d'); ?> <style> input[type="date"]::-webkit-calendar-picker-indicator { display: none} input {border: none; width:80px} body {width:630px;margin:0 auto;margin-top:200px} </style> <input type="date" value="<?=$hoje?>" onclick="this.showPicker()">
  21. [copilot.microsoft.com] arquivo diferencial.py import numpy as np import matplotlib.pyplot as plt # Definindo a função f(x, y) def f(x, y): return 1/x**2 - 2*y # Método de Euler para resolver a equação diferencial def euler_method(f, x0, y0, h, x_end): x = np.arange(x0, x_end + h, h) y = np.zeros(x.size) y[0] = y0 for i in range(1, x.size): y[i] = y[i-1] + h * f(x[i-1], y[i-1]) return x, y # Condições iniciais e parâmetros x0 = 1 y0 = -1 h = 0.01 x_end = 2 # Resolvendo a equação diferencial x, y = euler_method(f, x0, y0, h, x_end) # Plotando a solução plt.plot(x, y, label="Solução de y' = 1/x^2 - 2y") plt.xlabel('x') plt.ylabel('y') plt.title("Solução da Equação Diferencial") plt.legend() plt.grid(True) plt.show()
  22. Eu criei um formulário UserForm1 e dentro dele coloquei um combobox ComboBox1, e no código VBA coloquei o seguinte código: Private Sub UserForm_Initialize() ' Define o intervalo de células A1:A3 como fonte de dados para o ComboBox ComboBox1.List = Sheets("Plan1").Range("A1:A3").Value End Sub Private Sub ComboBox1_Change() ' Coloca o valor selecionado na célula B1 da planilha "Plan1" Sheets("Plan1").Range("B1").Value = ComboBox1.Value End Sub Também criei um código para a planilha Plan1: Sub MostrarUserForm() UserForm1.Show End Sub Para testar eu coloquei alfa, beta e gama nas células a1, a2, a3. Pedi para executar a macro MostrarUserForm, e o valor selecionado foi colocado na célula B1.
  23. Não se trata de um laço for, cada linha representa um link, ou uma informação. O problema é que a informação precisa de dois ou três <div>, mas eu não consegui alinhar as <div> onde eu queria, assim apelei para a gambiarra. Muito tempo depois de eu publicar o código, descobri que o CSS Tailwind tem o width em pixels, e assim eu não preciso mais da gambiarra: arquivo outrosView.blade.php @include('menuView') <script>btmenu.innerHTML='Outros';document.title="Outros"</script> <div class="bg-gray-200"><a href=estoqueBaixar>Baixar Estoque</a></div> <div><a href=balanceteTBW>Criar tbw</a></div> <div class="bg-gray-200"><a href=produtoDescontinuar>Descontinuar Produto</a></div> <div><a href=estoqueDiferenca>Diferença no Estoque</a></div> <div class="bg-gray-200"><a href=blingDiferenca>Diferença na Bling</a></div> <div><a href=estoqueEntrada>Entrada de Produtos</a></div> <div class="bg-gray-200"><a href=outrosEtiqueta>Etiquetas</a></div> <div><a href=outrosMegaSena>Mega-Sena</a></div> <div class="bg-gray-200"><a href=diarioMercado>Mercado Pago</a></div> <div><a href=nfInicio>Nota do Fornecedor</a></div> <div class="bg-gray-200"><a href=blingFalta>Nota Faltante</a></div> <div class=flex> <div class=w-[200px]>session('codp')</div> <div>{{$vetor['codp']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('codprod')</div> <div>{{$vetor['codprod']}}</div> </div> <div class="flex"> <div class=w-[200px]>session('criterio')</div> <div class=truncate>{{$vetor['criterio']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('criterioPessoa')</div> <div>{{$vetor['criterioPessoa']}}</div> </div> <div class="flex"> <div class=w-[200px]>session('dia')</div> <div>{{dbr($vetor['dia'])}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('end')</div> <div>{{$vetor['end']}}</div> </div> <div class="flex"> <div class=w-[200px]>session('id')</div> <div>{{$vetor['id']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('lcto')</div> <div>{{$vetor['lcto']}}<td></div> </div> <div class="flex"> <div class=w-[200px]>session('pessoa')</div> <div>{{$vetor['pessoa']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>env('lctoBaixaEstoque')</div> <div class=w-[100px]>{{$baixa}}</div> <div class='text-red-600 text-right'>{{dec($valorBaixa)}}</div> </div> <div class="flex"> <div class=w-[200px]>env('lctoAcertoMais')</div> <div class=w-[100px]>{{$mais}}</div> <div class='text-red-600 text-end'>{{dec($valorMais)}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>env('lctoAcertoMenos')</div> <div class=w-[100px]>{{$menos}}</div> <div class='text-red-600 text-right'>{{dec($valorMenos)}}</div> </div> <div class="flex"> <div class=w-[200px]>env('diaAcerto')</div> <div>{{dbr($diaAcerto)}}</div> </div>
  24. Eu ainda não sei fazer a roda, você tem o tutorial, de preferência em PHP?
  25. Imagine que você vende repolho por peça, mas o seu fornecedor vende num saco de 10 peças. Eu tive um trabalho danado para adaptar o banco de dados ao XML do fornecedor. Imagine que apareceu outro fornecedor que vende por peça e não por saco. E assim foi o meu pesadelo no último ano. Hoje eu tive a brilhante ideia de adaptar o XML ao banco de dados. A ideia é pegar o XML, colocar tudo numa tabela provisória (tbnf), alterar a quantidade na unha, e depois mandar para a tabela definitiva (tbhistprod). Ele ficou assim: arquivo NF.php <?php class NF{ function atualiza(){ $previa=(new Conn)->select("* from tbnf"); extract($_SESSION['vetor']); return view('NFview',['previa'=>$previa,'nNF' => $nNF,'xNome' => $xNome, 'codp' => $codp,'vNF' => $vNF,'difAliqICMS' => $difAliqICMS, 'soma'=>$soma]); } function custo(){ $custoAtual = $_POST['custoAtual']; $codprod = $_POST['codprod']; $previa=(new Conn)->select("marg from tbprod where codprod=$codprod")[0]; $venda=pvenda($custoAtual,$previa->marg); $class="class=text-end"; (new Conn)->update("tbnf set custoanterior=$custoAtual, class='$class' where codprod=$codprod"); return (new Conn)->update("tbprod set custo=$custoAtual, venda=$venda where codprod = $codprod"); } function incluir(){ $lcto=$_POST['lcto']; $verifica=count((new Conn)->select("* from tbhistprod where lcto=$lcto")); if($verifica){ $mensagem="<h1>Nota já lançada. <a href=?NF.atualiza>Voltar</a></h1>"; return view('mensagemView',['mensagem'=>$mensagem]); } $dia=(new Conn)->select("dia from tbdiario where lcto=$lcto")[0]->dia; $matriz=(new Conn)->select("* from tbnf"); foreach($matriz as $vetor){ (new Conn)->insert("tbhistprod (codprod,dia,qt,custototal,codp,lcto) values ($vetor->codprod,'$dia',$vetor->qt,$vetor->custototal,$vetor->codp,$lcto)"); } return header("location:?Diario.inicio.$dia"); } function inicio(){return view('NFarquivo');} function qt(){ $qt=$_POST['qt']; $id=$_POST['id']; $previa=(new Conn)->select("* from tbnf where id=$id")[0]; $novoClass=$previa->class; $custoAtual=intval($previa->custototal/$qt*100)/100; if($custoAtual!==$previa->custoanterior){ $novoClass="class=\"text-danger text-end\""; } (new Conn)->update("tbnf set class='$novoClass', custoatual=$custoAtual, qt=$qt where id=$id"); return $this->atualiza(); } function selecionada(){ (new Conn)->delete("tbnf"); (new Conn)->exec("alter table tbnf auto_increment = 1"); $nfe=simplexml_load_file($_FILES['arquivo']['tmp_name']); $itens=$nfe->NFe->infNFe->det; $difAliqICMS=0; $aliquotaInterna=0.18; foreach ($itens as $item){ if ((string)$item->prod->CFOP == 6102){ $vBC = (string)$item->imposto->ICMS->ICMS10->vBC; $vICMS = (string)$item->imposto->ICMS->ICMS10->vICMS;; $difAliqICMS += intval(($vBC * $aliquotaInterna - $vICMS) * 100) / 100; } } $vNF = (string)$nfe->NFe->infNFe->total->ICMSTot->vNF; $nNF = (string)$nfe->NFe->infNFe->ide->nNF; $xNome = (string)$nfe->NFe->infNFe->emit->xFant; $nome = explode(" ", $xNome)[0]; $codp = (new Conn)->select("codp from tbpessoa where pessoa like '%$nome%'")[0]->codp; $soma=0; foreach ($itens as $item){ // no campo codforn uso a primeira letra para identificar o fornecedor $codforn = (string)$item->prod->cProd; $criterio= $nome[0].$codforn; $consulta = (new Conn)->select("codprod from tbprod where codforn like '%$criterio%' "); $codprod = 'Verificar'; if (count($consulta) == 1){ $codprod = $consulta[0]->codprod; } $produto = (string)$item->prod->xProd; $quantidade = (string)$item->prod->qCom; if (is_numeric($codprod)){ $produtoDobrado = [506, 507, 508, 509, 510, 519, 1768, 1770, 1772]; if (in_array($codprod, $produtoDobrado)){ $quantidade = 2 * $quantidade; } $produtox5=[1798]; if (in_array($codprod,$produtox5 )){ $quantidade = 5 * $quantidade; } $produtoX10 = [2192, 2190,1782,2456]; if (in_array($codprod, $produtoX10)){ $quantidade = 10 * $quantidade; } } $vICMSST = ((string)$item->imposto->ICMS->ICMS10->vICMSST) ? (string)$item->imposto->ICMS->ICMS10->vICMSST : null; $difAliq = 0; if ((string)$item->prod->CFOP == 6102){ $vBC = (string)$item->imposto->ICMS->ICMS10->vBC; $vICMS = $item->imposto->ICMS->ICMS10->vICMS; $difAliq = intval(($vBC * $aliquotaInterna - $vICMS) * 100) / 100; } $vIPI = 0; if ((string)$item->imposto->IPI->vIPI){ $vIPI = (string)$item->imposto->IPI->vIPI; } $vProd = (string)$item->prod->vProd; $valorTotal = $vProd + $vICMSST + $difAliq + $vIPI; $soma += $valorTotal; $class = "class=text-end"; if (is_numeric($codprod)){ $custoAtual = intval($valorTotal / $quantidade * 100) / 100; $consulta = (new Conn)->select("custo from tbprod where codprod=$codprod"); $custoAnterior = $consulta[0]->custo; if (abs($custoAnterior - $custoAtual) > 0.02){ $class = "class=\"text-end text-danger\""; } } (new Conn)->insert("tbnf (codforn,codprod,prod,qt,custoatual,custoanterior,class,custototal,codp) values ($codforn,$codprod,'$produto',$quantidade,$custoAtual,$custoAnterior,'$class',$valorTotal,$codp)"); } $previa=(new Conn)->select("* from tbnf"); $_SESSION['vetor']=['nNF' => $nNF,'xNome' => $xNome, 'codp' => $codp,'vNF' => $vNF,'difAliqICMS' => $difAliqICMS, 'soma'=>$soma]; return view('NFview',['previa'=>$previa,'nNF' => $nNF,'xNome' => $xNome, 'codp' => $codp,'vNF' => $vNF,'difAliqICMS' => $difAliqICMS, 'soma'=>$soma]); } } arquivo NFarquivo.php <?php require 'menuView.php' ?> <script>btmenu.innerHTML="Nota do Fornecedor";document.title="Nota do Fornecedor"</script> <div class=mb-3> <form method=post enctype="multipart/form-data" action="?NF.selecionada"> <label for=arquivo class=form-label>Escolha o arquivo XML</label> <input type=file name=arquivo class=form-control id=formfile required onchange=submit()> </form> </div> arquio NFView.php <?php include('menuView.php'); ?> <script> btmenu.innerHTML='NF Fornecedor';document.title="NF Fornecedor" function atualizar(custoAtual,custoAnterior,codprod){ confirma=confirm("Atualizar?\ncusto atual: "+custoAtual+"\ncusto anterior: "+custoAnterior) if(confirma){ xmlhttp=new XMLHttpRequest() url = "?NF.custo" formData = new FormData() formData.append('custoAtual',custoAtual) formData.append('codprod',codprod) xmlhttp.open("POST",url,true) xmlhttp.send(formData) location.replace('?NF.atualiza') } } </script> <table class='table table-striped table-sm'> <tr class=fw-semibold><td colspan=3>NF <?=$nNF." ".substr($xNome,0,4)." codp ".$codp?><td><td><td class=text-end><?=dec($vNF)?> <?php if($difAliqICMS!==0): ?> <tr class=fw-semibold><td><td><td>Diferença de Alíquota de ICMS<td><td class=text-end><?=dec($difAliqICMS)?> <tr class=fw-semibold><td><td><td>Total a conferir<td><td class=text-end><?=dec($difAliqICMS+$vNF)?> <?php endif; ?> </table> <table class="table table-striped table-sm"> <th style="max-width:50px">Cforn <th style="width:50px"> <th style="width:360px">Produto <th class=text-end>Qt <th class=text-end>Custo <th class=text-end>Total <?php foreach($previa as $p): ?> <tr><td style="max-width:50px" class=text-end><?=$p->codforn?> <td style="max-width:50px" class=text-end><?=$p->codprod?> <td style="max-width:360px" class="overflow-hidden" ><?=$p->prod?> <td> <form method=post action=?NF.qt> <input name=qt value='<?=$p->qt?>' class="inv text-end" size='1' onchange=submit()> <input type=hidden name=id value='<?=$p->id?>'> </form> <td <?=$p->class?> onclick="atualizar(<?=$p->custoatual?>,<?=$p->custoanterior?>,<?=$p->codprod?>)"><?=dec($p->custoatual)?> <td class=text-end><?=dec($p->custototal)?> <?php endforeach; ?> <tr class=fw-semibold><td><td><td>Total dos itens<td><td></td><td class=text-end><?=dec($soma)?> </table> <div> Enviar tudo para o banco de dados <form action=?NF.incluir method=post> <input name=lcto placeholder="Número do Lançamento" required> <input type=submit> </form> </div>
×
×
  • Criar Novo...