Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.540
  • Registro em

  • Última visita

6 Seguidores

Sobre Frank K Hosaka

Últimos Visitantes

O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.

Frank K Hosaka's Achievements

0

Reputação

  1. Foi uma semana bem difícil, tentei fazer o Laravel 12 funcionar no VPS do Hostinger, usando o tutorial do Livewire e do Flux no Nginx. Foram várias tentativas e nada deu certo, é possível que tenha usado o comando Linux de maneira errada ou configurado o Nginx de maneira errada. Antes de jogar a toalha no chão, eu aprendi um novo comando do Laravel: php artisan list, ele lista todos os comandos do Laravel pela linha de comando, e uma delas é o vendor:publish. Executei php artisan vendor:publish e encontrei três tópicos que mencionam o Livewire, pedi para publicar todos eles, selecionando um de cada vez. E assim consegui cadastrar a minha conta e chegar no dashboard. Eu acho estranho o flux ter funcionado no login.blade.php e não funcionar no dashboard, mas enfim estou contente com o Laravel 12, eu só precisava mesmo é da rotina de autenticação. O resto continua tudo igual, ou seja, eu vou continuar usando o JavaScript ao invés do Liveware.
  2. Tanto no notebook quanto no Hostinger, o Livewire consegue colocar o login.blade.php no monitor. Para eu conseguir um negócio desses, eu usaria o comando return view('login'), mas o controlador Login do Livewire não usa nada disso. Ele usa: #[Layout('components.layouts.auth')] Fazendo auditoria, o máximo que eu consegui foram duas camadas de códigos que preparam para receber um { $slot }, a minha dúvida é como colocar o login.blade.php dentro desse $slot. A minha precária imaginação acredita que a diretriz #[Layout('components.layouts.auth')] vai buscar o nome do arquivo blade correspondente à classe que for definida depois dele. Isso não é óbvio e não encontrei nenhum tutorial para corroborar a minha tese. Mas, enfim, o login funciona no meu notebook, mas não funciona na Hostinger. O web console reclama que faltam dois arquivos: o livewire.js e o flux.js. Para eu resolver o problema do livewire.js, eu usei php artisan vendor:publish, e assim consegui chegar na tela do dashboard. Só que nada funciona lá, o web console reclama que falta o arquivo flux.js.
  3. Eu ainda não consegui fazer o Laravel 12 com Liveware funcionar na Hostinger com Nginx, mesmo assim estou fazendo testes aqui no meu notebook com Windows e Apache, e descobri que ele suporta o JavaScript, onde montei um modal para o lançamento contábil. Ele só não suporta esse código <script>document.title="Menu";menu.innerHTML="Menu"</script> O erro estava no segundo comando, não existe nenhum objeto com o nome de menu. No Laravel 11 não dava para perceber nenhum erro no código JavaScript, a não ser que você consultasse o web console, já no Laravel 12, qualquer erro no JavaScript é fatal.
  4. Eu usei o arquivo .env para definir o banco de dados Diario hospedado no Hostinger (lá o Linux não autoriza o nome do banco de dados em minúsculo). Eu usei o arquivo .env.local para definir o bando de dados diario hospedado no meu notebook (aqui o Windows não autoriza o nome do banco de dados em maiúsculo). Por muito tempo, eu queria que esses dois arquivos fossem iguais tanto no Hostinger quanto no meu notebook. Graças a ajuda do Copilot, consegui alcançar o meu objetivo com esse código: arquivo bootstrap > app.php <?php use Illuminate\Foundation\Application; use Illuminate\Foundation\Configuration\Exceptions; use Illuminate\Foundation\Configuration\Middleware; $basePath = dirname(__DIR__); $envFile = file_exists($basePath . '/.env.local') && getenv('APP_ENV') === 'local' ? '.env.local' : '.env'; // Força o carregamento do arquivo `.env` ou `.env.local` $dotenv = Dotenv\Dotenv::createImmutable($basePath, $envFile); $dotenv->load(); return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { // }) ->withExceptions(function (Exceptions $exceptions) { // })->create();
  5. Encontrei matéria que fala do Livewire e o servidor nginx, aqui: https://benjamincrozat.com/livewire-js-404-not-found#using-nginx Linux não é a minha praia, pedi ajuda para o Copilot. Entrei no Hostinger VPS Web Terminal, e lá usei cd .. cd etc cd nginx nano nginx.conf dentro do bloco http, acrescentei o bloco server http { server { location = /livewire/livewire.js { expires off; try_files $uri $uri/ /index.php?$query_string; } } } Usando CTRL-X e ENTER, salvei as alterações Para saber se a sintaxe está correta, usei sudo nginx -t Para reiniciar o nginx, vou usar o comando sudo systemctl restart nginx mas vou fazer a noite para não atrapalhar o meu irmão.
  6. Ele pára na rotina de login, tudo indica que não há conexão entre a classe Login do Livewire com o formulário. É uma pena.
  7. Como não é possível trabalhar com o JavaScript e Livewire ao mesmo tempo no Laravel 12 Livewire, fui obrigado a usar o método da tentativa e erro para simular o modal: arquivo app > Livewire > Modal.php <?php namespace App\Livewire; use Livewire\Component; class Modal extends Component { public $usernamePlaceholder="Olá mundo"; public $showModal = false; public $conta = null; public $contaDevedora = null; public $contaCredora = null; public $inputEscolhido = null; public function setConta($conta) { if($this->inputEscolhido=="Devedora") { $this->contaDevedora=$conta; } else { $this->contaCredora=$conta; } return $this->closeModal(); } public function openModalDevedora() { $this->showModal = true; $this->inputEscolhido = 'Devedora'; } public function openModalCredora() { $this->showModal = true; $this->inputEscolhido = 'Credora'; } public function closeModal() { $this->showModal = false; } public function render() { return view('livewire.modal'); } } arquivo resources > views > livewire > modal.blade.php <div class="w-[500px] m-0 m-auto"> <form method=post action=logout>@csrf<button type="submit">Sair</button></form> <flux:input value={{$contaDevedora}} wire:click=openModalDevedora class="border p-2 rounded" label="Conta Devedora" /> <flux:input value={{$contaCredora}} wire:click=openModalCredora class="border p-2 rounded" label="Conta Credora" /> @if ($showModal) <div class="fixed inset-0 flex items-center justify-center z-50"> <div class="bg-white p-5 rounded shadow-md"> <h2 class="text-lg font-bold">Plano de Contas</h2> <div wire:click="setConta('Ativo')">Ativo</div> <div wire:click="setConta('Passivo')">Passivo</div> <div wire:click="setConta('Despesa')">Despesa</div> <div wire:click="setConta('Receita')">Receita</div> <button wire:click="closeModal" class="btn btn-danger">Fechar</button> </div> </div> <div class="fixed inset-0 bg-black opacity-50"></div> @endif </div> arquivo resources > views > menuView.blade.php <livewire:scripts /> <livewire:styles /> <livewire:modal />
  8. Ontem, o Copilot tentou me ensinar como criar uma barra de navegação, usando o Liveware. Eu achei muito complicado e fiquei apavorado! Mas eu encontrei o arquivo resources > views > components > layouts > app > sider.blade.php, eu gostei a beça dele, e consultando a internet eu consegui montar o meu arquivo resources > views > components > layouts > app > navbar.blade.php <flux:header> <flux:navbar> <flux:navbar.item>Laravel 12</flux:navbar.item> <flux:dropdown> <flux:navbar.item icon-trailing="chevron-down">Menu</flux:navbar.item> <flux:navmenu> @if(auth()->user()->id==1) <flux:navmenu.item href="diarioInicio">Diário</flux:navmenu.item> @endif <flux:navmenu.item href="orcamentoMenu">Orçamento</flux:navmenu.item> <flux:navmenu.item href="vendaInicio">Relatório de Venda</flux:navmenu.item> </flux:navmenu> </flux:dropdown> <flux:dropdown> <flux:navbar.item icon-trailing="chevron-down">{{ auth()->user()->nome }}</flux:navbar.item> <flux:navmenu> <form method="POST" action="{{ route('logout') }}" class="w-full"> @csrf <flux:menu.item as="button" type="submit" icon="arrow-right-start-on-rectangle" class="w-full"> {{ __('Sair') }} </flux:menu.item> </form> <form method="POST" action="{{ route('logout') }}" class="w-full"> @csrf <flux:menu.item as="button" type="submit" icon="arrow-right-start-on-rectangle" class="w-full"> {{ __('Mudar a senha') }} </flux:menu.item> </form> </flux:navmenu> </flux:dropdown> </flux:navbar> {{$slot}} @fluxScripts </flux:header> O meu arquivo menuView.blade.php não funciona no Laravel 12, só funciona se você atualizar o navegador. Ele usava JavaScript, e acredito que o paradigma do LiveWare é trocar o JavaScript pelo PHP. E assim, o meu arquivo resources > views > menuView.blade.php ficou assim: @vite(['resources/css/app.css', 'resources/js/app.js']) <div class="w-[500px] m-auto m-0"> <x-layouts.app.navbar /> </div> Por enquanto, tudo é tentativa e erro. Para o diarioView.blade.php funcionar, eu fiz assim: @include('appView') <div class="w-[500px] m-0 m-auto"> <x-layouts.app.navbar /> <input type=submit value='Lançamentos' class="hover:bg-gray-200 py-1 px-2 font-semibold rounded text-gray-500" onclick="location.replace('diarioCria')" /> do dia <input type=date value=<?=$dia?> class="border-none font-semibold py-1 px-2 w-[110px] hover:bg-gray-200 rounded text-gray-500" onclick=this.showPicker() onchange="location.replace('diarioNovaData?data='+this.value)"> <?=$mensagem?> <a href=previsaoInicio class=text-blue-700>Previsão</a> <div class="py-1"></div> <div class="shadow-sm"> <div class="bg-gray-100"> <div class="flex bg-gray-200 py-1"> <div class='w-[40px] whitespace-nowrap px-2'>Lçto</div> <div class='w-[60px] whitespace-nowrap text-right'>Ctad</div> <div class='w-[60px] whitespace-nowrap text-right'>Ctac</div> <div class="w-[100px] whitespace-nowrap text-right">Valor</div> <div> <form action=diarioHistorico method=post> @csrf <input name=hist placeholder="Procurar no Histórico" onchange=submit() class="rounded py-0 ml-2 border-none bg-transparent text-black font-semibold" autocomplete=off> </form> </div> </div> <?php foreach ($lctos as $index => $lcto): ?> <div class="flex odd:bg-gray-200 even:bg-white"> <div class="w-[40px] px-2"> <a href="diarioEdita?docto=<?=$lcto->docto?>" class="text-gray-500 font-semibold"><?=$lcto->lcto?></a> </div> <div class="w-[60px] text-right"><?= $lcto->contad ?></div> <div class="w-[60px] text-right"><?= $lcto->contac ?></div> <div class="w-[100px] text-right"><?= dec($lcto->valor) ?></div> <div class="w-[370px] truncate px-2"><?= $lcto->hist ?></div> </div> <?php endforeach; ?> <div class="flex font-semibold odd:bg-gray-200 even:bg-white"> <div style="width:260px" class="text-right font-semibold"> {{dec($somaDebito)}} </div> <div class='whitespace-nowrap px-2 text-red-500'> @if($somaDebito!==$somaCredito) {{"Soma de Crédito ".dec($somaCredito)}} @endif </div> </div> </div> </div> </div> Tudo isso é gambiarra, não existe nenhum tutorial afirmando que essa é forma correta de usar o <flux>.
  9. Depois de atualizar o Laravel Installer fica bem mais fácil colocar o Laravel 12 no notebook, o problema é que ele pede para escolher uma extensão (React, Vue, LiveWire) ou nenhum. O problema do Laravel puro é que ele não tem uma rotina para o login, assim eu não tive outra escolha senão selecionar uma extensão, no meu caso foi o LiveWire. Após terminar a instalação, o Laravel manda você direto para a tela do 'dashboard' se passar pela rotina do login, é uma tela bonita, mas eu não tenho a menor ideia de como trabalhar com ela. Eu só sei trabalhar com texto, e assim eu tenho o meu 'menuView'. Eu encontrei a rotina do login, e eu alterei assim: arquivo app > Livewire > Auth > Login.php (listagem parcial) <?php //... class Login extends Component { //... public function login(): void { $this->validate(); $this->ensureIsNotRateLimited(); if (! Auth::attempt(['email' => $this->email, 'password' => $this->password], $this->remember)) { RateLimiter::hit($this->throttleKey()); throw ValidationException::withMessages(['email' => __('auth.failed'),]); } RateLimiter::clear($this->throttleKey()); Session::regenerate(); $this->redirectIntended(default: route('menuView', absolute: false), navigate: true); } //... } Fiz logoff, entrei de novo, mas acabei de cara com o 'dashboard'. Então, decidi fechar o navegador, e pedi para o VS Code executar composer dump-autoload, e só assim é que consegui chegar no menuView, depois da rotina do login.
  10. Criei um novo projeto para conhecer o Laravel 12, e acabei me perdendo. A tela de boas vindas mudou, só tem dois botões. Um fala sobre a documentação do Laravel 12 e outro é Deploy, e ele me mandou para o Laravel Cloud, onde eu abri a minha conta, e depois fiquei sem saber o que fazer. Procurei o YouTube, e ele não me ajudou em nada, o vídeo falava da época em que o pessoa pretendia atualizar o Laravel. Assim, eu tive que improvisar. Procurei o Laravel 11, e de lá eu instalei o Breeze Blade (isso não existe no Laravel 12); e assim eu consegui colocar a opção de login na tela de boas vindas e cheguei no painel de controle. Pelo que pude deduzir o Laravel 12 é para quem tem o código hospedado no Github, mas por enquanto vou continuar usando o meu notebook. Na minha opinião, o pessoal precisa colocar um tutorial de como usar o Laravel 12, não adianta mandar eu ler os conceitos básicos do Laravel que eu vou acabar dormindo. ============================================== No fórum do Laracasts encontrei a solução: https://laracasts.com/discuss/channels/laravel/add-livewire-starter-kit-to-existing-base-laravel-12-installation A primeira tarefa é atualizar o instalador do Laravel assim: composer global remove laravel/installer composer global require laravel/installer Em seguida, você usa o comando: laravel new novoProjeto Ele vai fazer uma série de perguntas, uma delas é starter kit, eu escolhi o LiveWire, apesar de não ter a menor ideia de como usar isso, e também tem um outro tanto de perguntas que fui respondendo de acordo com o meu nariz, e assim ele já embutiu a rotina de login no projeto. Como eu trabalho com mysql, eu alterei o arquivo .env. Durante dois dias fiquei batendo a cabeça na parede, mas hoje eu vi que o Laravel 12 é muito mais fácil de instalar. Eles mudaram o script para executar o código no computador local, você não precisa mais ter dois terminais, um para ativar o servidor e outro para ativar o vite, agora faz as duas tarefas com o comando composer run dev
  11. Nessa semana, eu consegui fazer o cálculo do Simples Nacional no meu notebook, mas eu não consegui fazer o valor do imposto ser igual ao que foi calculado pela Contabilidade, a diferença é de alguns centavos, mas eu posso usar o meu programa como uma estimativa. O problema foi na hora de copiar o meu código PHP na Hostinger, lá o PHP reclamou que o comando scandir não encontrou o diretório que mandei procurar. Levei um tempão para entender porque o scandir não funciona: o que funciona no notebook nem sempre vai funcionar na Hostinger. Na base da tentativa e erro, fui procurar a solução no HTML, no <input type="file" multiple>, mas o máximo que eu consegui foi obter uma lista de 20 arquivos, quando precisava ver coisa da ordem de 700 arquivos. O Copilot explicou que o navegador e o servidor podem definir restrição para o <input type="file" multiple>, e o Copilot disse que eu preciso estudar mais, ir além do PHP e aprender como fazer a Hostinger ter acesso remoto ao meu notebook, e assim calcular o Simples Nacional na internet. A minha primeira tentativa de calcular o Simples foi pelo comando zipArchive do PHP, e eu consegui fazer funcionar uma vez ou outra. O Windows sempre consegue abrir o arquivo .zip, já o comando zipArchive do PHP sempre reclamava que encontrou erro no arquivo, assim eu desisti dele. Conclusão: eu não sei se é possível calcular o Simples Nacional na internet, mas eu consegui calcular aqui no notebook com o PHP. Mas para calcular o Simples aqui no notebook, eu preciso da venda dos doze últimos meses que está no MySQL que está hospedado lá na Hostinger. Isso é constrangedor, mas pelo menos eu posso chorar a vontade, isso é o que dá para fazer quando estou num beco sem saída. bling.php (parcial) <?php class Bling { static function simplesSelecionado() { $diretorio="C:/Users/Frank/Downloads/".substr($_FILES['pasta']['full_path'],0,-4); $contaArquivos = count(scandir($diretorio)) - 2 - 2 ; $notasFiscais = []; $nfCanceladas = []; $nfces = scandir($diretorio); $notasCanceladas=0; $somaTotal=0; $comST=0; $semST=0; foreach($nfces as $nfce) { if($nfce !== '.' && $nfce !=='..' ) { if(strpos($nfce,'-can') !== false) { $nfCanceladas[] = intval(substr($nfce,28,6)); $notasCanceladas++; continue; } $numeroNota=intval(substr($nfce,28,6)); if(in_array($numeroNota,$nfCanceladas)) { continue; } $notasFiscais[]=$numeroNota; $dom = new DOMDocument(); $dom->load("$diretorio/$nfce"); $nfe=$dom->documentElement; if($nfe->getElementsByTagName('vNF')->item(0)) { $somaNF=$nfe->getElementsByTagName('vNF')->item(0)->nodeValue; $somaTotal+=$somaNF; $produtos=$nfe->getElementsByTagName('prod'); foreach($produtos as $p) { $cfop=$p->getElementsByTagName('CFOP')->item(0)->nodeValue; $vProd=$p->getElementsByTagName('vProd')->item(0)->nodeValue; $vDesc=0; if($p->getElementsByTagName('vDesc')->item(0)) { $vDesc=$p->getElementsByTagName('vDesc')->item(0)->nodeValue; } if($cfop==5405) { $comST += $vProd - $vDesc; } else { $semST += $vProd - $vDesc; } } } } } sort($notasFiscais); $primeiraNota=intval($notasFiscais[0]); $ultimaNota=intval($notasFiscais[$contaArquivos-1]); $totalDeNotas=count($notasFiscais); $rendas=bd::x('select * from tbrendabruta order by id desc limit 13')->get(); $renda=0; foreach($rendas as $key=>$r) { if($key>0) { $renda += $r->renda; } } // indices da primeira faixa da tabela do Simples Nacional 2025 no comércio $aliqICMS=1.36; $ICMS=round($semST*$aliqICMS/100,2); $aliqIRPJ=0.22; $IRPJ=round($somaTotal*$aliqIRPJ/100,2); $aliqCSLL=0.14; $CSLL=round($somaTotal*$aliqCSLL/100,2); $aliqCOFINS=0.5096; $COFINS=round($somaTotal*$aliqCOFINS/100,2); $aliqPIS=0.1105; $PIS=round($somaTotal*$aliqPIS/100,2); $aliqINSS=1.66; $INSS=intval($somaTotal*$aliqINSS)/100; $aliqSimples=4; $Simples=$ICMS+$IRPJ+$CSLL+$COFINS+$PIS+$INSS; view('blingSimples',['primeiraNota'=>$primeiraNota,'ultimaNota'=>$ultimaNota, 'notasFiscais'=>$notasFiscais,'somaTotal'=>$somaTotal, 'contaArquivos'=>$contaArquivos,'notasCanceladas'=>$notasCanceladas, 'totalDeNotas'=>$totalDeNotas,'nfCanceladas'=>$nfCanceladas, 'comST'=>$comST,'semST'=>$semST,'renda'=>$renda, 'aliqICMS'=>$aliqICMS,'ICMS'=>$ICMS, 'aliqIRPJ'=>$aliqIRPJ,'IRPJ'=>$IRPJ, 'aliqCSLL'=>$aliqCSLL,'CSLL'=>$CSLL, 'aliqCOFINS'=>$aliqCOFINS,'COFINS'=>$COFINS, 'aliqPIS'=>$aliqPIS,'PIS'=>$PIS, 'aliqINSS'=>$aliqINSS,'INSS'=>$INSS, 'aliqSimples'=>$aliqSimples,'Simples'=>$Simples, 'rendas'=>$rendas]); } } arquivo blingSimples.php (ele usa o CSS https://cdn.tailwindcss.com) <?php include 'menuView.php'; ?> <script>btMenu.innerHTML="Simples";document.title="Simples"</script> <div class=flex> <div>Total de Notas</div> <div class="ml-2"><?=$totalDeNotas?></div> </div> <div class=flex> <div>Notas Canceladas</div> <div class="ml-2 text-right mr-2"><?=$notasCanceladas.": ";?></div> <?php foreach($nfCanceladas as $n): echo $n."<br>"; endforeach; ?> </div> <div class=flex> <div>Total das Notas Fiscais</div> <div class="text-right ml-2"><?=dec($somaTotal)?></div> </div> <div class=flex> <div>Primeira Nota</div> <div class="text-right ml-2"><?=$primeiraNota?></div> </div> <div class=flex> <div>Última Nota</div> <div class="text-right ml-5"><?=$ultimaNota?></div> </div> <div class=flex> <div class="w-[120px]">Renda 12 Meses</div> <div class="w-[100px] text-right"><?=dec($renda)?></div> </div> <div class="flex"> <?php $contador = 0; foreach($rendas as $key=>$r): if($key>0): if ($contador % 4 === 0 && $contador !== 0): ?> </div><div class="flex"> <?php endif; ?> <div class="w-[50px]"><?php echo $r->apuracao; ?></div> <div class="w-[80px] text-right font-semibold mr-2"><?php echo dec($r->renda); ?></div> <?php $contador++; endif; endforeach; ?> </div> <div class=flex> <div class="w-[120px]">Com ST</div> <div class="w-[100px] text-right"><?=dec($comST)?></div> </div> <div class=flex> <div class="w-[120px]">Sem ST ICMS</div> <div class="w-[100px] text-right"><?=dec($semST)?></div> <div class="w-[100px] text-right"><?=dec($aliqICMS)."%"?></div> <div class="w-[100px] text-right"><?=dec($ICMS)?></div> </div> <div class=flex> <div class="w-[120px]">IRPJ</div> <div class="w-[100px] text-right"><?=dec($somaTotal)?></div> <div class="w-[100px] text-right"><?=dec($aliqIRPJ)."%"?></div> <div class="w-[100px] text-right"><?=dec($IRPJ)?></div> </div> <div class=flex> <div class="w-[120px]">CSLL</div> <div class="w-[100px] text-right"><?=dec($somaTotal)?></div> <div class="w-[100px] text-right"><?=dec($aliqCSLL)."%"?></div> <div class="w-[100px] text-right"><?=dec($CSLL)?></div> </div> <div class=flex> <div class="w-[120px]">COFINS</div> <div class="w-[100px] text-right"><?=dec($somaTotal)?></div> <div class="w-[100px] text-right"><?=dec($aliqCOFINS)."%"?></div> <div class="w-[100px] text-right"><?=dec($COFINS)?></div> </div> <div class=flex> <div class="w-[120px]">PIS</div> <div class="w-[100px] text-right"><?=dec($somaTotal)?></div> <div class="w-[100px] text-right"><?=dec($aliqPIS)."%"?></div> <div class="w-[100px] text-right"><?=dec($PIS)?></div> </div> <div class=flex> <div class="w-[120px]">INSS</div> <div class="w-[100px] text-right"><?=dec($somaTotal)?></div> <div class="w-[100px] text-right"><?=dec($aliqINSS)."%"?></div> <div class="w-[100px] text-right"><?=dec($INSS)?></div> </div> <div class=flex> <div class="w-[120px]">Simples</div> <div class="w-[100px] text-right">Estimativa</div> <div class="w-[100px] text-right"><?=dec($aliqSimples)."%"?></div> <div class="w-[100px] text-right font-semibold"><?=dec($Simples)?></div> </div>
  12. Frank K Hosaka

    PHP: continue

    Comecei a estudar o cálculo do Simples Nacional, começando com um arquivo zipado da Bling, onde tem um monte de NFCE. O problema é a nota cancelada. A nota comum tem o formato 35...123-nfe.xml, já a nota cancelada tem o formato 35...123-can.xml. No Windows Explorer, o arquivo -can aparece antes do -nfe. Usei o famoso método da tentativa e erro e presumi que o comando PHP scandir($diretorio) seguisse o mesmo formato do Windows Explorer. O problema é como desconsiderar o arquivo -can e o arquivo -nfe correspondente. E assim o Copilot me ensinou a usar um novo comando do PHP, o continue. Eu achei esse comando muito esperto, digno de receber uma nota aqui no fórum, o comando continue simplesmente faz o ciclo foreach pular para o item seguinte: <?php class Bling { function faltanteSelecionado() { $diretorio="C:/Users/Frank/Downloads/".substr($_FILES['pasta']['full_path'],0,-4); $contaArquivos = count(scandir($diretorio)) - 2 - 2 ; $notasFiscais = []; $nfCanceladas = []; $nfces = scandir($diretorio); $notasCanceladas=0; $somaTotal=0; $comST=0; $semST=0; foreach($nfces as $nfce) { if($nfce !== '.' && $nfce !=='..' ) { if(strpos($nfce,'-can') !== false) { $nfCanceladas[] = intval(substr($nfce,28,6)); $notasCanceladas++; continue; } $numeroNota=intval(substr($nfce,28,6)); if(in_array($numeroNota,$nfCanceladas)) { continue; } $notasFiscais[]=$numeroNota; $dom = new DOMDocument(); $dom->load("$diretorio/$nfce"); $nfe=$dom->documentElement; if($nfe->getElementsByTagName('vNF')->item(0)) { $somaNF=$nfe->getElementsByTagName('vNF')->item(0)->nodeValue; $somaTotal+=$somaNF; $produtos=$nfe->getElementsByTagName('prod'); foreach($produtos as $p) { $cfop=$p->getElementsByTagName('CFOP')->item(0)->nodeValue; $vProd=$p->getElementsByTagName('vProd')->item(0)->nodeValue; $vDesc=0; if($p->getElementsByTagName('vDesc')->item(0)) { $vDesc=$p->getElementsByTagName('vDesc')->item(0)->nodeValue; } if($cfop==5405) { $comST += $vProd - $vDesc; } else { $semST += $vProd - $vDesc; } } } } } sort($notasFiscais); $primeiraNota=intval($notasFiscais[0]); $ultimaNota=intval($notasFiscais[$contaArquivos-1]); $totalDeNotas=count($notasFiscais); view('blingFaltante',['primeiraNota'=>$primeiraNota,'ultimaNota'=>$ultimaNota, 'notasFiscais'=>$notasFiscais,'somaTotal'=>$somaTotal, 'contaArquivos'=>$contaArquivos,'notasCanceladas'=>$notasCanceladas, 'totalDeNotas'=>$totalDeNotas,'nfCanceladas'=>$nfCanceladas, 'comST'=>$comST,'semST'=>$semST]); } }
  13. Ao invés de usar uma caixa de texto, usei uma célula do lado. Se a célula estiver vazia, isso gera erro. Para contornar esse contratempo, o melhor é pedir para o VBA não considerar se a célula estiver vazia, tipo: Sub Teste() If Not IsEmpty(Range("L5").Value) Then Range("K5").Value = Format(Range("L5").Value, "dd,mm,yyyy") Else MsgBox "A célula L5 está vazia. Por favor, insira um valor antes de executar a macro.", vbExclamation, "Aviso" End If End Sub
  14. Tentei fazer do seu jeito, insert into meus_contatos (id_contatos,sobrenome) values (null,'frank') e deu certo. Acredito que o problema estava nas aspas, eu tive que mudar um monte de aspas curvas com aspas simples '
  15. CREATE TABLE meus_contatos ( id_contatos INT NOT NULL AUTO_INCREMENT PRIMARY KEY, sobrenome VARCHAR(30), primeiro_nome VARCHAR(20), sexo CHAR(1), email VARCHAR(50) UNIQUE, aniversario DATE, profissao VARCHAR(50), locall VARCHAR(50), estado_civil VARCHAR(20), interesses VARCHAR(100), procura VARCHAR(100) ); INSERT INTO meus_contatos (sobrenome, primeiro_nome, sexo, email, aniversario, profissao, locall, estado_civil, interesses, procura) VALUES ('Almeida', 'Jose', 'M', 'jose@gmail.com', '1970-02-02', 'pedreiro', 'brazlandia', 'casado', 'cinema', 'emprego'), ('Prado', 'Joao', 'M', 'joao@gmail.com', '1971-02-02', 'marceneiro', 'brazlandia', 'casado', 'jogos', 'relacionamento'), ('Oliveira Souza', 'Jonas', 'M', 'jonas@gmail.com', '1973-02-02', 'empresario', 'brazlandia', 'casado', 'futebol', 'emprego'), ('Gomes', 'Sergio', 'M', 'sergio@gmail.com', '1979-02-02', 'marceneiro', 'brazlandia', 'solteiro', 'voleibol', 'relacionamento'), ('Gomes', 'Joana', 'F', 'joana@gmail.com', '1980-02-02', 'marceneiro', 'brazlandia', 'casada', 'educacao', 'viagens');
×
×
  • Criar Novo...