Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.470
  • Registro em

  • Última visita

4 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. 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.
  2. 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.
  3. 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; ?>
  4. 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; ?>
  5. 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?
  6. 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
  7. 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.
  8. 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>
  9. 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.
  10. 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.
  11. 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.
  12. 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
  13. 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>
  14. 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]); } }
  15. 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.
×
×
  • Criar Novo...