Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.532
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. O que eu mais gostei no Laravel foi o Eloquent (ele usa a sintaxe tbdiario::where('lcto',12)->get( )) e o roteador. O problema do roteador web.php é que você precisa criar uma nova rota para cada novo comando. O roteador que inventei não trabalha com um monte de rota, mas trabalha com a sintaxe classeMetodo, assim: arquivo .htaccess RewriteEngine On # Redirecionar tudo para index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [L] arquivo bd.php <?php class BD { public static $pdo; private static $initialized = false; public static function initialize() { if (!self::$initialized) { $host = 'localhost'; $dbname = 'diario'; $username = 'root'; $password = ''; $dsn = 'mysql:host=' . $host . ';dbname=' . $dbname; self::$pdo = new PDO($dsn, $username, $password); self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); self::$initialized = true; } } } ?> arquivo diario.php <?php class Diario extends BD { public static function getValor($lcto) { self::initialize(); // Certificando que a inicialização está sendo feita $sql = 'SELECT valor FROM tbdiario WHERE lcto = :lcto'; $stmt = self::$pdo->prepare($sql); $stmt->bindParam(':lcto', $lcto); $stmt->execute(); return $stmt->fetchColumn(); } public static function inicio() { self::initialize(); // Certificando que a inicialização está sendo feita echo "olá mundo<br>"; echo self::getValor(12); } } ?> arquivo index.php <?php spl_autoload_register(fn ($class) => require str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php'); $requestUri = $_SERVER['REQUEST_URI']; $basePath = '/astudy/'; $path = substr($requestUri, strlen($basePath)); if($path=="") { header('location:teste.php'); exit; } if (preg_match('/^([a-z]+)([A-Z].*)$/', $path, $matches)) { $classe = $matches[1]; $metodo = $matches[2]; } $classe::$metodo(); arquivo teste.php <a href=diarioInicio>teste</a>
  2. Encontrei um vídeo no YouTube que ensina como conectar o VBA no WhatsApp versão web, ele usa o comando VBA Shell e SendKeys. O chato é ter que trabalhar com o temporizador, muda de laptop para laptop, mas eu consegui chegar até a caixa de contatos: Sub WhatsApp() Shell "C:\Program Files\Google\Chrome\Application\Chrome.exe" Application.Wait Now + TimeValue("00:00:03") SendKeys "https://web.whatsapp.com/" Application.Wait Now + TimeValue("00:00:03") SendKeys "~" Application.Wait Now + TimeValue("00:00:13") For i = 1 To 10 SendKeys "{TAB}" Application.Wait Now + TimeValue("00:00:02") Next End Sub
  3. O Copilot disse que o Power Automate é capaz de enviar documentos para o WhatsApp, mas você precisa ter uma conta no WhatsApp Business Api, desconfio que o Power Automate não faz parte do Office (que cobra R$ 459,00 por ano) e a API do WhatsApp também não é de graça. Se eu fosse você pegaria um morador de rua e pediria para ele encaminhar cada documento pelo WhatsApp do desktop para o número correspondente, prometendo que você garantiria a pinga no final do serviço. Estava pensando em colocar todos os holerites numa página da empresa, cada um pega o seu. O problema é o safado que vai pegar o holerite do outro e vai reclamar com o patrão que ele ganha bem menos. Nesse caso, iria criptografar o pdf com o CPF do colaborador, mas aí a Adobe quer R$ 100,00 por mês. Isso é um problema difícil de resolver. Boa sorte. Ah, lembrei agora, eu fiz o teste com duas Galaxy da Samsung, ele tem a tecnologia NFC e consegue transferir arquivos entre si, sem precisar usar o Bluetooth ou outro canal de comunicação, tudo por aproximação. Já o iPhone é jogo duro, e tem muito colaborador que tem celular, mas não tem Android nem iOs, e desconfio que o WhatsApp não funciona nesses celulares. Seja qual for a solução, por favor, publique a sua solução, muita gente vai querer saber da sua experiência.
  4. Pelo que eu entendi você quer cadastrar um administrador da tabela admin na tabela users. Para simplificar, a tabela admin só tem um campo chamado nome e o users também. O meu modelo ficou assim: app > Models > User.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use HasFactory, Notifiable; public $timestamps = false; protected $fillable = ['name',]; } app > Models > Admin.php <?php namespace App\Models; class Admin extends User { protected $table="admin"; } app > Http > Controllers > Teste.php <?php namespace App\Http\Controllers; use App\Models\User; use App\Models\Admin; class Teste { function index(){ $admin=Admin::where('id',1)->value('nome'); User::create(['name'=>$admin]); } } Eu gostei do verbo extends no model, eu não preciso mais fazer aquela longa lista de biblioteca que o model precisa usar, mas para pegar uma informação numa tabela e colocar em outra, acho mais fácil jogar o serviço para o Eloquent.
  5. Instalei o selenium, o ChromeDriveManager e o webdriver_manager pelo comando pip install. Eu tive problema com o Service na quarta linha, então o Copilot corrigiu a segunda linha capitalizando a palavra Service. Com outras alterações do Copilot, o código ficou assim: arquivo rascunho.py from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service) driver.get("https://www.exemplo.com") e a mensagem que recebi foi bem diferente do que você apresentou, quando executei o comando python rascunho.py
  6. Todas as notas fiscais são feitas no formato XML. O Excel é um excelente aplicativo que consegue importar o XML no formato CSV e assim você consegue montar a memória de cálculo para diferença de alíquota de ICMS ou ICMS Substituição Tributária no caso das compras fora do estado de São Paulo. Eu já uso o PHP que tem uma boa ferramenta para importar o XML para a memória do computador (eu já uso uma tabela provisória do MySQL), comparo o novo custo do produto com o velho e atualizo, e em seguida uso todas as informações para dar entrada no estoque. Nem sempre o fornecedor manda o arquivo XML, nesse caso eu peço para o meu irmão tirar uma foto da chave do DANFE, e com essa chave eu vou no portal da Nota Fiscal Eletrônica e peço para fazer o download do arquivo (o portal só autoriza a consulta plena ou o download com o certificado digital da empresa que consta na Nota Fiscal Eletrônica). Estamos em 2025, esse é um mundo totalmente diferente. No meu tempo, a gente ajuntava todas as notas para encaminhar para a contabilidade para fazer a escrituração, apuração e imprimir os livros fiscais. Hoje não. A Contabilidade tem um esquema que consegue puxar todos os xml com o CNJP do cliente. Não sei que mágica é essa, tudo o que sei é que existe uma empresa por trás disso, como eles conseguem fazer esse serviço, isso é um mistério para mim. O que eu mando para a contabilidade são os xml que eu criei para vender. Se você tem PHP, aqui está um código parcial que eu fiz (eu criei um query builder baseado no PDO->query()) e roteador bem simples que passa pelo arquivo index com a sintaxe ?classe.método.argumento): 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,'st'=>$st]); } function CFOP() { return view('nfArquivo',['action'=>'?NF.CFOPselecionado']); } function CFOPatualizar() { $cfop = $_POST['cfop']; $codprod = $_POST['codprod']; (new Conn)->update("tbprod set cfop='$cfop' where codprod = $codprod"); } function CFOPselecionado() { (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; $nNF = (float)$nfe->NFe->infNFe->ide->nNF; $xNome = (string)$nfe->NFe->infNFe->emit->xNome; $nome = explode(" ", $xNome)[0]; $codp = (new Conn)->select("codp from tbpessoa where pessoa like '%$nome%'")[0]->codp; foreach ($itens as $item){ // no campo codforn uso a primeira letra para identificar o fornecedor $codforn = (string)$item->prod->cProd; $criterio= strtolower($nome[0].$codforn); $consulta = (new Conn)->select("* from tbprod where codforn like '%$criterio%' "); $codprod = 'null'; if (count($consulta) == 1) { $codprod = $consulta[0]->codprod; } if (count($consulta) > 1) { $consulta2 = (new Conn)->select("* from tbprod where codforn like '%$criterio' "); if(count($consulta2) == 1){ $codprod = $consulta2[0]->codprod; $consulta = $consulta2; } else { echo "existem vários produtos com codforn com o critério $criterio"; foreach($consulta as $c) { echo "<br>".$c->codprod." ".$c->prod; } exit; } } if (count($consulta)==0) { echo "nenhum produto encontrado com o critério $criterio"; exit; } $produto = substr((string)$item->prod->xProd,0,79); $cfop = (string)$item->prod->CFOP; if($cfop==6101 || $cfop==6102 || $cfop==5101) { $cfop=5102; } if($cfop==6401 || $cfop==6402 || $cfop==6403 || $cfop==5401) { $cfop=5405; } $class=($cfop == $consulta[0]->cfop) ? "w-[50px] text-right" : "w-[50px] text-red-500 text-right"; $ncm = (string)$item->prod->NCM; $class2=($ncm == $consulta[0]->cf) ? "w-[100px] text-right" : "w-[100px] text-red-500 text-right"; (new Conn)->insert("tbnf (codforn,codprod,prod,cfop,codp,ncm,class,class2) values ($codforn,$codprod,'$produto','$cfop',$codp,'$ncm','$class','$class2')"); } $previa=(new Conn)->select("* from tbnf"); return view('nfCFOPview',['previa'=>$previa,'nNF' => $nNF,'xNome' => $xNome, 'codp' => $codp]); } function custo() { $custoAtual = $_POST['custoAtual']; $codprod = $_POST['codprod']; $margem=(new Conn)->select("marg from tbprod where codprod=$codprod")[0]->marg; $venda=pvenda($custoAtual,$margem); $class="class=text-end"; (new Conn)->update("tbnf set custoanterior=$custoAtual, class='$class' where codprod=$codprod"); (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',['action'=>'?NF.selecionada']); } 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; $st=0; $aliquotaInterna=0.18; foreach ($itens as $item) { if ((float)$item->prod->CFOP == 6102 || (float)$item->prod->CFOP ==6101) { $vBC = (float)$item->imposto->ICMS->ICMS10->vBC; $vBC = $vBC ? $vBC : (float)$item->imposto->ICMS->ICMS00->vBC; $vICMS = (float)$item->imposto->ICMS->ICMS10->vICMS; $vICMS = $vICMS ? $vICMS : (float)$item->imposto->ICMS->ICMS00->vICMS; if((float)$item->prod->NCM == 40169300) { $st += round($vBC*(1.4)*$aliquotaInterna-$vICMS+0.00001,2); // anel de vedação } else { $difAliqICMS += round(($vBC * $aliquotaInterna - $vICMS+0.00001),2); } } } $vNF = (float)$nfe->NFe->infNFe->total->ICMSTot->vNF; $nNF = (float)$nfe->NFe->infNFe->ide->nNF; $xNome = (string)$nfe->NFe->infNFe->emit->xNome; $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= strtolower($nome[0].$codforn); $consulta = (new Conn)->select("* from tbprod where codforn like '%$criterio%' "); $codprod = 'null'; if (count($consulta) == 1) { $codprod = $consulta[0]->codprod; } if (count($consulta) > 1) { echo "existem vários produtos com codforn com o critério $criterio"; foreach($consulta as $c) { echo "<br>".$c->codprod." ".$c->prod; } exit; } if (count($consulta)==0) { echo "nenhum produto encontrado com o critério $criterio"; exit; } $produto = substr((string)$item->prod->xProd,0,79); $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; } $produtox12 = [2403,2406,2496,2497,2498,2499]; if (in_array($codprod, $produtox12)) { $quantidade = 12 * $quantidade; } $produtox24 = [2493,2405,2494,2495,2409]; if (in_array($codprod, $produtox24)) { $quantidade = 24 * $quantidade; } } $vICMSST1 = ((float)$item->imposto->ICMS->ICMS10->vICMSST) ? (float)$item->imposto->ICMS->ICMS10->vICMSST : null; $vICMSST2 = ((float)$item->imposto->ICMS->ICMSSN202->vICMSST) ? (float)$item->imposto->ICMS->ICMSSN202->vICMSST : null; $vICMSST = $vICMSST1 ? $vICMSST1 : $vICMSST2; $difAliq = 0; if ((float)$item->prod->CFOP == 6102 || (float)$item->prod->CFOP == 6101){ $vBC = (float)$item->imposto->ICMS->ICMS10->vBC; $vBC = $vBC ? $vBC : (float)$item->imposto->ICMS->ICMS00->vBC; $vICMS = (float)$item->imposto->ICMS->ICMS10->vICMS; $vICMS = $vICMS ? $vICMS : (float)$item->imposto->ICMS->ICMS00->vICMS; if((float)$item->prod->NCM == 40169300) { $difAliq = round($vBC * 1.4 * $aliquotaInterna -$vICMS+0.00001,2); // usando variável $difAliq como st } else { $difAliq = round(($vBC * $aliquotaInterna - $vICMS+0.00001),2); } } $vIPI = (float)$item->imposto->IPI->IPITrib->vIPI ? (float)$item->imposto->IPI->IPITrib->vIPI : 0; $vProd = (string)$item->prod->vProd; $valorTotal = $vProd + $vICMSST + $difAliq + $vIPI; $soma += $valorTotal; $class = "class=text-end"; $custoAtual=0; $custoAnterior=0; 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\""; } } $produto=str_replace("'","''",$produto); (new Conn)->insert("tbnf (codforn,codprod,prod,qt,custoatual, custoanterior,class,custototal,codp,cfop,class2) values ('$codforn',$codprod,'$produto',$quantidade,$custoAtual, $custoAnterior,'$class',$valorTotal,$codp,'5405','text-right')"); } $previa=(new Conn)->select("* from tbnf"); $_SESSION['vetor']=['nNF' => $nNF,'xNome' => $xNome, 'codp' => $codp,'vNF' => $vNF,'difAliqICMS' => $difAliqICMS, 'soma'=>$soma,'st'=>$st]; return view('nfView',['previa'=>$previa,'nNF' => $nNF,'xNome' => $xNome, 'codp' => $codp,'vNF' => $vNF,'difAliqICMS' => $difAliqICMS, 'soma'=>$soma,'st'=>$st]); } function verXML(){ return view('nfArquivo',['action'=>'?NF.xml']); } function xml(){ $nfe=simplexml_load_file($_FILES['arquivo']['tmp_name']); return imprime($nfe); } } 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="<?=$action?>"> <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> arquivo nfCFOPview.php <?php include('menuView.php'); ?> <script> btMenu.innerHTML='NF Fornecedor CFOP';document.title="NF Fornecedor CFOP" function getCsrfToken() { return document.querySelector('meta[name="csrf-token"]').getAttribute('content'); } function atualizar(cfop, codprod) { var xmlhttp = new XMLHttpRequest(); var url = "nfCFOPatualizar"; var formData = new FormData(); formData.append('cfop', cfop); formData.append('codprod', codprod); formData.append('_token', getCsrfToken()); xmlhttp.open("POST", url, true); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4) { console.log("Estado da requisição: " + xmlhttp.readyState); if (xmlhttp.status == 200) { location.reload(); } else { alert("Erro na requisição: " + xmlhttp.status); } } }; xmlhttp.send(formData); } </script> <div class="flex"> <div class="w-[50px] text-right">Cforn</div> <div class="w-[50px] text-right">Cod</div> <div class="w-[448px] ml-2">Produto</div> <div class="w-[50px] text-right">CFOP</div> <div class="w-[100px] text-right">NCM</div> </div> <?php foreach($previa as $p): ?> <div class="flex odd:bg-gray-200"> <div class="w-[50px] text-right"><?=$p->codforn?></div> <div class="w-[50px] text-right"><?=$p->codprod?></div> <div class="w-[448px] ml-2 truncate"><?=$p->prod?></div> <div class="<?=$p->class?>" onclick="atualizar(<?=$p->cfop?>,<?=$p->codprod?>)"> <?=$p->cfop?> </div> <div class="<?=$p->class2?>"><?=$p->ncm?></div> </div> <?php endforeach; ?> arquivo nfView.php <?php include('menuView.php'); ?> <script> btMenu.innerHTML='NF Fornecedor';document.title="NF Fornecedor" function atualizar(custoAtual, custoAnterior, codprod) { var confirma = confirm("Atualizar?\ncusto atual: " + custoAtual + "\ncusto anterior: " + custoAnterior); if (confirma) { var xmlhttp = new XMLHttpRequest(); var url = "?NF.custo"; var formData = new FormData(); formData.append('custoAtual', custoAtual); formData.append('codprod', codprod); xmlhttp.open("POST", url, true); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4) { console.log("Estado da requisição: " + xmlhttp.readyState); if (xmlhttp.status == 200) { // console.log("Status da resposta: " + xmlhttp.status); // alert("Resposta do servidor: " + xmlhttp.responseText); location.replace("?NF.atualiza"); } else { alert("Erro na requisição: " + xmlhttp.status); } } }; xmlhttp.send(formData); } } </script> <table class='table table-striped table-sm'> <tr class=fw-semibold><td colspan=3>NF <?=$nNF." ".substr($xNome,0,10)." codp ".$codp?><td><td><td class=text-end><?=dec($vNF)?> <?php if($difAliqICMS!==0 || $st!==0): ?> <tr class=fw-semibold><td><td><td>Diferença de Alíquota de ICMS<td><td><td class=text-end><?=dec($difAliqICMS)?> <tr class=fw-semibold><td><td><td>Substituição Tributária<td><td><td class=text-end><?=dec($st)?> <tr class=fw-semibold><td><td><td>Total a conferir<td><td><td class=text-end><?=dec($difAliqICMS+$vNF+$st)?> <?php endif; ?> </table> <table class="table table-striped table-sm"> <th style="max-width:50px">Cforn <th style="width:50px text-end">Cod <th style="width:330px">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:80px" class=text-end><?=$p->codforn?> <td style="max-width:50px" class=text-end><?=$p->codprod?> <td style="max-width:330px" 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>
  7. Tem jeito de compartilhar o código do arquivo para a gente testar aqui?
  8. Eu acho bem difícil dominar o SQL em apenas duas horas, ele exige uma boa base teórica. Eu por exemplo levei vinte anos para entender o que é chave primária de uma tabela, hoje eu não me assusto quando usam o campo id na tabela produtos, id na tabela contatos, id na tabela pedido e assim por diante. Eu ainda não sei usar a chave externa, mas em 2020 conheci o PHP, ele me livrou do problema dos relacionamentos. E finalmente em 2024 conheci o Copilot, comentei com ele que o meu programa balancete levava cinco horas para aparecer na tela. O Copilot leu o meu código, e fez algumas correções, e agora consigo ver o balancete em menos de cinco segundos. Eu aconselho a fazer o curso de SQL só quem souber o que é atomização da informação, sem isso, tudo é dinheiro perdido.
  9. <?php function menorNumero($numero1, $numero2) { if ($numero1 < $numero2) { return $numero1; } else { return $numero2; } } // Exemplo de uso $numero1 = 10; $numero2 = 20; echo "O menor número é: " . menorNumero($numero1, $numero2); ?>
  10. O problema é criar o critério. Não sei o que devo procurar na primeira e na segunda planilhas. Se ambas usassem uma chave tipo CPF+PagamentoMês, aí dá para pintar uma chave presente numa planilha e ausente na outra, ou pintar de cor diferente se for de valores diferentes, ou não pintar se as chaves e valores forem iguais. No seu caso, você repete o CPF várias vezes com valores diferentes, por exemplo Vilma 10, Vilma 10, Vilma 10, e na outra planilha tenho Vilma 15, não dá para fazer nada, não dá saber qual a relação do primeiro dado com o dado na outra planilha. Na teoria do banco de dados, o nome disso é chave primária, sem isso é impossível fazer qualquer tipo de trabalho.
  11. Eu tenho 66 anos, e estudo programação para tentar colocar um pouco de lógica na minha vida, bem como familiarizar com as novas tecnologias. Enfrento vários problemas, mas não sei quem pode me ajudar, eu queria que o serviço de impressão fosse mais rápido pelo celular, eu queria consertar a guilhotina da minha impressora térmica, eu queria consertar o touch pad do meu irmão. Eu tento ensinar o meu irmão a usar o computador com critério, sempre ajuntar a fatura com o comprovante de pagamento num só arquivo, e nomear de forma que seja fácil localizar. Eu queria ter coragem de abrir o Excel no celular de um arquivo hospedado no OneDrive, mas toda vez que eu abro, isso gera um monte de dificuldade na hora de abrir no laptop. Enfim, é só experiência e conhecimento que você ganha ao estudar a programação. O dinheiro só depende de você usar a lógica na sua vida. Por exemplo, o que impede você de pegar R$ 2,00 do seu vizinho, prometendo lavar o banheiro dele? É que você não sabe o nome dele, e ele não sabe o seu nome. Se você conseguir aproveitar o estudo da programação para você se tornar visível, certamente vale a pena estudar. O mais importante é o cliente, você precisa aprender a respeitá-lo, mostrar que você pode ajudá-lo. E quando você conquistar a confiança dele, certamente o dinheiro será o menor dos seus problemas.
  12. O JavaScript é o único programa que eu conheço que é capaz de atualizar a página onde ele está, através do comando location.reload( ), e isso eu consegui no código PHP. O Laravel é outra história, qualquer solicitação que você faz precisa usar a ferramenta @csrf. Mas o @csrf só é usado com o marcador <form>, e não queria sair da página porque isso ia ser um grande desastre. Copiei o código JavaScript do PHP no Laravel, e obtive o erro 419, esse é o famoso erro da ausência do csrf. O Copilot pediu para criar um comando <meta> que gera o crsf e também pedir para o JavaScript encaminhar o crsf adiante. E deu certo. Eu não sou bom com o JavaScript, mas quando consigo fazer o JavaScript trabalhar para mim, eu fico feliz da vida: arquivo resources > views > nfCFOPview.blade.php <meta name="csrf-token" content="{{ csrf_token() }}"> @include('menuView') <script> btMenu.innerHTML='NF Fornecedor CFOP';document.title="NF Fornecedor CFOP" function getCsrfToken() { return document.querySelector('meta[name="csrf-token"]').getAttribute('content'); } function atualizar(cfop, codprod) { var xmlhttp = new XMLHttpRequest(); var url = "nfCFOPatualizar"; var formData = new FormData(); formData.append('cfop', cfop); formData.append('codprod', codprod); formData.append('_token',getCsrfToken()) xmlhttp.open("POST", url, true); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4) { console.log("Estado da requisição: " + xmlhttp.readyState); if (xmlhttp.status == 200) { location.reload(); } else { alert("Erro na requisição: " + xmlhttp.status); } } }; xmlhttp.send(formData); } </script> <div class="flex"> <div class="w-[50px] text-right">Cforn</div> <div class="w-[50px] text-right">Cod</div> <div class="w-[378px] ml-2">Produto</div> <div class="w-[50px] text-right">CFOP</div> <div class="w-[100px] text-right">NCM</div> </div> <?php foreach($previa as $p): ?> <div class="flex odd:bg-gray-200"> <div class="w-[50px] text-right"><?=$p->codforn?></div> <div class="w-[50px] text-right"><?=$p->codprod?></div> <div class="w-[378px] ml-2 truncate"><?=$p->prod?></div> <div class="<?=$p->class?>" onclick="atualizar(<?=$p->cfop?>,<?=$p->codprod?>)"> <?=$p->cfop?> </div> <div class="<?=$p->class2?>"><?=$p->ncm?></div> </div> <?php endforeach; ?>
  13. Frank K Hosaka

    CFOP

    Semana passada a Bling me orientou que existe no menu de configurações a rotina para Nota Fiscal > Natureza da Operação, onde podem ser definidas as regras de tributação, e assim definir uma CFOP para cada produto de acordo com a NCM. O MySQL me informou que eu tenho atualmente 256 NCM dentro da tbprod, o problema é saber quem tem substituição tributária e quem não tem. A Secretaria da Fazenda tem o regulamento do ICMS bem como planilhas que definem os produtos que tem substituição tributária, mas aquilo é bem difícil de entender e trabalhar. A minha saída é olhar cada nota fiscal do fornecedor e corrigir o banco de dados. Na tbprod eu criei o campo string cfop, e defini para todas elas 5405. A seguir criei uma rotina em PHP para olhar a nota do fornecedor no formato xml, comparar os dados com a tbprod, e assim corrigir o que for necessário: arquivo nf.php <?php class NF { function CFOP() { return view('nfArquivo',['action'=>'?NF.CFOPselecionado']); } function CFOPatualizar() { $cfop = $_POST['cfop']; $codprod = $_POST['codprod']; (new Conn)->update("tbprod set cfop='$cfop' where codprod = $codprod"); } function CFOPselecionado() { (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; $nNF = (float)$nfe->NFe->infNFe->ide->nNF; $xNome = (string)$nfe->NFe->infNFe->emit->xNome; $nome = explode(" ", $xNome)[0]; $codp = (new Conn)->select("codp from tbpessoa where pessoa like '%$nome%'")[0]->codp; foreach ($itens as $item){ // no campo codforn uso a primeira letra para identificar o fornecedor $codforn = (string)$item->prod->cProd; $criterio= strtolower($nome[0].$codforn); $consulta = (new Conn)->select("* from tbprod where codforn like '%$criterio%' "); $codprod = 'null'; if (count($consulta) == 1) { $codprod = $consulta[0]->codprod; } if (count($consulta) > 1) { $consulta2 = (new Conn)->select("* from tbprod where codforn like '%$criterio' "); if(count($consulta2) == 1){ $codprod = $consulta2[0]->codprod; } else { echo "existem vários produtos com codforn com o critério $criterio"; foreach($consulta as $c) { echo "<br>".$c->codprod." ".$c->prod; } exit; } } if (count($consulta)==0) { echo "nenhum produto encontrado com o critério $criterio"; exit; } $produto = substr((string)$item->prod->xProd,0,79); $cfop = (string)$item->prod->CFOP; if($cfop==6101 || $cfop==6102 || $cfop==5101) { $cfop=5102; } if($cfop==6401 || $cfop==6402 || $cfop==5401) { $cfop=5405; } $class=($cfop == $consulta[0]->cfop) ? "w-[50px] text-right" : "w-[50px] text-red-500 text-right"; $ncm = (string)$item->prod->NCM; $class2=($ncm == $consulta[0]->cf) ? "w-[100px] text-right" : "w-[100px] text-red-500 text-right"; (new Conn)->insert("tbnf (codforn,codprod,prod,cfop,codp,ncm,class,class2) values ($codforn,$codprod,'$produto','$cfop',$codp,'$ncm','$class','$class2')"); } $previa=(new Conn)->select("* from tbnf"); $_SESSION['vetor']=['nNF' => $nNF,'xNome' => $xNome, 'codp' => $codp]; return view('nfCFOPView',['previa'=>$previa,'nNF' => $nNF,'xNome' => $xNome, 'codp' => $codp]); } } 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="<?=$action?>"> <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> arquivo nfCFOPview.php <?php include('menuView.php'); ?> <script> btMenu.innerHTML='NF Fornecedor CFOP';document.title="NF Fornecedor CFOP" function atualizar(cfop, codprod) { var xmlhttp = new XMLHttpRequest(); var url = "?NF.CFOPatualizar"; var formData = new FormData(); formData.append('cfop', cfop); formData.append('codprod', codprod); xmlhttp.open("POST", url, true); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4) { console.log("Estado da requisição: " + xmlhttp.readyState); if (xmlhttp.status == 200) { location.reload(); } else { alert("Erro na requisição: " + xmlhttp.status); } } }; xmlhttp.send(formData); } </script> <div class="flex"> <div class="w-[50px] text-right">Cforn</div> <div class="w-[50px] text-right">Cod</div> <div class="w-[448px] ml-2">Produto</div> <div class="w-[50px] text-right">CFOP</div> <div class="w-[100px] text-right">NCM</div> </div> <?php foreach($previa as $p): ?> <div class="flex odd:bg-gray-200"> <div class="w-[50px] text-right"><?=$p->codforn?></div> <div class="w-[50px] text-right"><?=$p->codprod?></div> <div class="w-[448px] ml-2 truncate"><?=$p->prod?></div> <div class="<?=$p->class?>" onclick="atualizar(<?=$p->cfop?>,<?=$p->codprod?>)"> <?=$p->cfop?> </div> <div class="<?=$p->class2?>"><?=$p->ncm?></div> </div> <?php endforeach; ?>
  14. Eu ouvi dizer que os bancos trabalham com muitos técnicos de informação, mas eu não conheço nenhum em particular. Eu aconselho a pegar uma pessoa real e ver a história particular dele, principalmente quanto que ele ganha. Eu fiz o estudo da programação por conta própria. Quem me ajudou a ter noção de programação foi o recurso da macro encontrado dentro da planilha Excel. Além da macro, o Excel oferece Visual Basic for Aplications. O tutorial deles é de amargar, fiz vários testes e experimentei várias frustrações. Em 2020, eu vi um vídeo bacana do professor Guanabara, ele me ensinou a instalar o servidor WampServe. Levei dois meses para instalar no meu notebook, depois de ver e ler várias matérias espalhadas na internet. Depois que eu consegui instalar o servidor, eu ganhei de brinde o MySQL e o PHP. Levei mais dois meses para mexer com ele. Enfim, comecei o meu projeto chamado orçamento, e eu sofri muito porque não sabia nada de HTML e nem de JavaScript. Finalmente chegou 2024, e surgiu o Copilot da Microsoft. Ele me ajudou a programar melhor, dominar principalmente o espinhoso capítulo do CSS. Enfim, eu já sei como escrever "olá mundo" na tela do celular, eu consegui hospedar o meu código na Hostinger, o plano inicial é de R$ 10,00 por mês, só que não dá para usar o programa npm e nem node. Logo, ao invés de assinar um curso, por que você não conversa com o Copilot? Aqui o endereço: www.copilot.com. A página está em inglês, mas você pode usar a gramática portuguesa, comece assim: olá Copilot, eu não sei nada de programação, por onde eu começo?
  15. Recebi a resposta da Bling, ainda não tive tempo de verificar, mas acho oportuno publicar a resposta aqui, uma vez que é o nome da Bling é que está em jogo: Atendente: Maria M. Mensagem: Bom dia, tudo bem? Espero que sim! Temos como criar regras por produtos, NCM e grupo de produtos. Na natureza de operação, você poderá criar regras tributárias para diferentes produtos. Para isso, siga os passos descritos abaixo: Passo 1: Posicione o mouse sobre o ícone da engrenagem > Todas as configurações > Notas fiscais > Naturezas de operação Passo 2: Clique sobre a natureza desejada Passo 3: Em Regras de Tributação, clique sobre a regra que deseja alterar ou em '+ Adicionar regra' para adicionar uma nova regra Passo 4: Clicando sobre a opção 'Qualquer produto', selecione uma das opções: • Produto • NCM • Grupo de Produtos Exemplo em anexo: https://prnt.sc/y0t0BUfWpWEj E preencha o campo ao lado com a informação: Caso tenha selecionado a opção 'Produto', informe o nome do produto cadastrado, e selecione-o. Caso tenha selecionado a opção 'NCM', informe o NCM do produto e selecione-o. Caso tenha selecionado a opção 'Grupo de Produtos', informe o nome do grupo cadastrado, e selecione-o. Clique aqui para verificar mais sobre o grupo de produtos OBS: Caso deseje adicionar mais de um produto, basta clicar na opção 'Adicionar outro item', para produtos que compartilharão das mesmas regras tributárias. Em seguida, preencha os dados tributários conforme orientado por sua contabilidade. Ao finalizar as alterações, clique em 'Salvar'. Em seguida, salve a natureza. Assim, após a configuração das regras por produto, a informação e tributos serão informados automaticamente nas notas com essa natureza de operação selecionada. Para saber quais informações preencher, seria somente com a contabilidade. Em caso de dúvidas, sigo a disposição! -- Atenciosamente, Eduarda M. - Suporte Bling (54) 3771-7278
  16. Eu sou do tempo que se emitia a Nota Fiscal na mão, eu tinha que ter o cuidado na hora de preencher a Natureza da Operação, e em seguida registrava a NF no Livro de Saída. Hoje é 2025, tudo é moderno, você não usa mais a caneta e o papel de carbono para emitir, basta um teclado. O máximo que eu consegui fazer com o PHP é montar um orçamento, mas eu não sou capaz de fazer um código que emita uma nota fiscal. Eu contratei a Bling, e hoje ela cobra R$ 70,00 por mês para emitir a Nota Fiscal do tipo NFCe. Uso a Bling para importar o orçamento que fiz no PHP, e de lá eu emito a NFCe. Tudo parece fácil e tudo parece mágica, me faz acreditar que os R$ 70,00 é uma pechincha. A NFCe é gravado na Secretaria da Fazenda, tudo parece tranquilo. Só que eu pedi o Registro de Saída do serviço contábil, e eu cai de costa. Todas as NFCe foram registrados como 5.102 venda a não contribuinte, quando tem muito produto que eu vendo e que foram previamente tributados pelo ICMS antecipado, ou seja, eu esperava que o livro mostrasse um monte de CFOP 5.405 e um pouco de 5.102. Eu pedi socorro para o Copilot e a resposta dele é bem imprecisa, indica vários vídeos do YouTube que são mais imprecisas. A Inteligência Artificial ainda não está preparada para entender o Regulamento do ICMS e ensinar como emitir a Nota Fiscal. Estou muito tranquilo com o meu programa Orçamento que não emite Nota Fiscal. O que me deixa apavorado é a Bling emitir a Nota Fiscal sem nenhum contador ou fiscal da Secretaria da Fazenda para homologar o serviço que eu pago: de que adianta pagar R$ 70,00 para emitir a Nota Fiscal com a natureza da operação errada? Eu não posso exigir muito do Copilot, pois ele é um serviço gratuito. Mas quem está pagando um serviço melhor que o Copilot, por favor, pergunte a ele se é possível saber se uma Nota Fiscal foi emitida corretamente, principalmente no tópico Natureza da Operação. Grato.
  17. Eu tenho um projeto chamado orçamento que estou desenvolvendo desde 1999, eu uso o código PHP e o código Laravel, ambos têm a mesma lógica e a mesma imagem, menos o formulário do login. O formulário do Laravel é capaz de preencher toda a tela do celular, no modo retrato, e isso eu não consegui no código PHP. Você pode traduzir o código PHP em Laravel, o contrário é impossível. Por exemplo, o Laravel não deixa você submeter um formulário se não usar o recurso Blade @csrf, já o PHP não tem esse recurso. A minha única saída foi tentar copiar o código HTML produzido pelo Laravel e copiar no PHP. Eu nunca imaginei que fosse possível ver o código fonte no navegador do celular, mas hoje o Copilot me deu a dica de modificar a barra de endereço de "https://frank.com" para "view-source:https://frank.com", e assim consegui ver o código HTML no celular. Selecionei tudo, copiei num bloco do Google Keep, e no notebook eu copiei o código para o Visual Studio, e assim consegui criar o código PHP que faz a mesma mágica que o Laravel: arquivo loginView.php <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://cdn.tailwindcss.com"></script> <script>document.title="Login"</script> <div class="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100"> <div class="text-2xl">Projeto Classe</div> <div class="w-full sm:max-w-md mt-6 px-6 py-4 bg-white shadow-md overflow-hidden sm:rounded-lg"> <form method="POST" action="?Login.menu"> <div> <label class="block font-medium text-sm text-gray-700" for="email"> Email </label> <input class="px-2 border rounded-md shadow-sm mt-2 focus:outline-blue-700" id="email" type="email" name="email" required="required" autofocus autocomplete="username"> </div> <!-- Password --> <div class="mt-4"> <label class="block font-medium text-sm text-gray-700" for="password"> Senha </label> <input class="px-2 border rounded-md shadow-sm block mt-1 focus:outline-blue-700" id="password" type="password" name="password" required="required" autocomplete="current-password"> </div> <button type="submit" class="px-2 mt-4 rounded-lg text-gray-500 font-semibold hover:bg-gray-200"> Entrar </button> </form> </div> </div>
  18. 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.
  19. 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.
  20. 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.
  21. 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
  22. 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>
  23. 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]); } }
  24. 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.
  25. 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.
×
×
  • Criar Novo...