Ir para conteúdo
Fórum Script Brasil
  • 0

Um orçamento em Laravel


Frank K Hosaka

Pergunta

Lá em 1990 eu comecei o projeto Diário no MS Access, em 2020 traduzi na linguagem PHP e agora em 2022 pretendo traduzir na linguagem Laravel. Faz dois meses que eu tento fazer os códigos funcionarem, tudo na base da tentativa e erro, eu não consigo acompanhar os tutoriais do YouTube; para mim, o PHP já é suficiente, mas o Laravel é importante para eu aprender o que é servidor e cliente pois ele trabalha com o tripé roteador, controlador e visualizador.

Eu gostei bastante do esquema Eloquent, apesar do Eloquent presumir que o nome das minhas tabelas está no plural, e isso me força a informar que não está. Ao contrário do mysqli do PHP, o Eloquent força a alterar o meu banco de dados. Numa das tabelas ele me obrigou a criar o campo created_at, sob pena do Laravel não fazer o que eu quero.

O mais bacana é que eu abri um projeto do Laravel dentro da pasta do OneDrive, eu não preciso me preocupar com a cópia de segurança. Tudo o que eu fizer no projeto, o OneDrive vai dar um jeito de sincronizar no servdor da Microsoft.

Finalmente, o orçamento é um desafio para todo programador, além do clássico "Hello World". A seguir eu fiz um pequeno rascunho de como pretendo  implantar o orçamento no Laravel, tem muita coisa que eu já fiz, mas eu vou publicar apenas os trechos que acho mais relevante:

routes>web.php
----------------------------------
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PacientesController;
use App\Http\Controllers\diarioController;
Route::get('astudy',[diarioController::class,'astudy']);

app>Http>Controllers>diarioController.php
----------------------------------------------
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Models\tbsupervariavel;
use App\Models\tbpedido;
use App\Models\tbpessoa;
use App\Models\vw_histped;
use App\Models\tbprod;
class diarioController extends Controller
{
public function astudy(request $request){
   $prods=tbprod::orderBy('prod')->get();
   $produto=$request->input('produto');
   $qt=$request->input('qt');
   if($qt){
      $precoa=tbprod::where('prod',$produto)->get()->toArray();
      $preço=$precoa[0]['custo'];
      $total=$preço*$qt;
   } else {
      $preço=null;
      $total=null;   }
   return view('astudy',['produto'=>$produto,'qt'=>$qt,'preço'=>$preço,'total'=>$total],compact('prods'));}

resources>views>astudy.blade.php
-----------------------------------------------
<form>
<table>
    <th>Produto<th>Qt<th>Preço<th>Total
    <tr>
@if(isset($_GET['produto']))
    <td>{{$produto}}
@else
    <td><input name=produto list=produto>
    <datalist id=produto>
    @foreach($prods as $prod)
        <option value='{{$prod->prod}}'>
    @endforeach
    </datalist>
@endif
@if(isset($_GET['qt']))
    <td>{{$qt}}
@else
    <td><input name=qt onchange=submit()> 
@endif
    <td>{{$preço}}<td>{{$total}}
</table>
</form>

app>Models>tbprod.php
------------------------------------------------------
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class tbprod extends Model
{
    use HasFactory;
    protected $table='tbprod';
}

.env
-------------------------------------------------------
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=diario
DB_USERNAME=root
DB_PASSWORD=

 

Sem título.png

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0
1 hora atrás, lowys disse:

image.thumb.png.d2cfe68863c9080cba7f79f2c0f4eb33.png

Eu sou do tempo do Fortran, onde usávamos variáveis mnemônicas do tipo i e j, e assim dei o nome de tbprod para a tabela de produtos, mas o artigo está certo. Quanto melhor o nome que você dá aos bois mais fácil é identificar o boi que está tumultuando a entrada e saída do curral. "O problema é que idéias novas são fáceis de entender, o problema é esquecer as velhas" (John Maynard Keynes).

Link para o comentário
Compartilhar em outros sites

  • 0

Finalmente, depois de muitas tentativas e erros, consegui de terminar a tradução do orcamento.php em Laravel. Aprendi muita coisa, mas principalmente o que significa controlador. Eu imaginei que o controlador fosse uma só coisa, e assim eu decidi colocar a rotina da exclusão de um item do orçamento logo no começo do controlador, mas isso gerou um erro, ele disse que não conhecia a variável total do pedido. Ou seja, o controlador chama o visualizador, mas quando o visualizador volta para o controlador, ele não encontra o mesmo controlador que começou o processo.

A seguir a listagem final do meu orçamento (só do controlador e do visualizador, o resto continua igual como acima)

 

resources.views.orcamento.blade.php
-----------------------------------------------------

@include('menu')
<div><table class='table table-striped'>
<td><form><input type='submit' value='anterior'><input type='hidden' name='anterior' value={{$ped}}></form>
<td style=color:red>Pedido {{$ped}} de {{$diaped}} 
<td><form><input type='submit' value='novo'><input type='hidden' name='novo' value='novo'></form></table>
<form>
<div><table class='table table-striped linha2'><th>Produto<th style=text-align:right>Qt<th>Un<th>Preço<th>Total
@foreach($histped as $item)
<tr>
	<td nowrap>{{$item->prod}}
	<td align=right>
		@if($item->qt==intval($item->qt))
			{{$item->qt}}
		@else
			{{number_format($item->qt,2,',','.')}}
		@endif
	<td><a href=?excluir={{$item->id}}&abater={{$item->subtotal}}>{{$item->un}}</a>
	<td align=right>{{number_format($item->unitario,2,',','.')}}
	<td align=right>{{number_format($item->subtotal,2,',','.')}}
@endforeach
<tr>
@if(!isset($_GET['produto']))	
	<td><input list=lsproduto name=produto placeholder=produto onchange=qt.focus() size=40>
		<datalist id='lsproduto'>
		@foreach($prod as $pr)
		<option value='{{$pr->prod}}'>
		@endforeach
		</datalist>
@else
	<td>{{$orcamento['produto']}}
@endif
@if(!isset($_GET['qt']))
	<td><input id=qt name=qt onchange=submit() size=1 placeholder=qt>
@endif
<tr><td>
	@if(empty($codp))
		<a href=pessoa>Selecione um cliente</a>
	@else
		<details>
			<summary>{{$pessoa}}</summary>
			Endereço {{$end}} <br>
			CNPJ {{$cnpj}} <br>
			Telefone {{$tel}} <br>
			Nota {{$nota}}  <br>
			<a href=pessoa>Mudar cliente</a> <br>
			<a href=pessoa?codp={{$codp}}>Atualizar cliente</a>
		</details>
	@endif
	<td><td><td><td><b>{{$totalped}}
</table>
</div>
      
app.Http.Controllers.diarioController.php
-------------------------------------------------------
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Models\tbsupervariavel;
use App\Models\tbpedido;
use App\Models\tbpessoa;
use App\Models\vw_histped;
use App\Models\tbprod;
use App\Models\tbhistped;
Use helper;

class diarioController extends Controller
{
public function index(request $request) {
   $senhadb=tbsupervariavel::where('codsuper',1)->value('senha');
   $senha=$request->input('senha');
   $menu="Menu";
   if($senha==1045){$request->session()->put('senha','parcial');return view('menu',['menu'=>$menu]);} 
   if($senha==$senhadb){$request->session()->put('senha','completa'); return view('menu',['menu'=>$menu]);}
   if(empty($senha)){$mensagem="";} else {$mensagem="Senha incorreta";}
   return view('index',['mensagem'=>$mensagem]); }
public function orcamento(request $request){
   $ped=tbsupervariavel::where('codsuper',1)->value('ped');
   if($request->input('anterior')){
      $ped=$request->input('anterior');
      $ped--;if($ped==0){$ped=1;}
      tbsupervariavel::where('codsuper',1)->update(['ped'=>$ped]);}
   if($request->input('novo')){ 
      $ultimo=tbpedido::select()->orderBy('ped','desc')->first()->toArray();
      if($ultimo['total']){
         $ped=$ultimo['total']+1; dd($ped);
         tbpedido::insert(['ped'=>$ped,'dia'=>now()]);
         tbsupervariavel::where('codsuper',1)->update(['ped'=>$ped]);}
      else {$ped=$ultimo['ped'];} }
   $collectionA=collect(['menu'=>'Orçamento','ped'=>$ped]);
   tbsupervariavel::where('codsuper',1)->update(['end'=>'orcamento']);
   $detalhe=tbpedido::where('ped',$ped)->get()->toArray();
   $codp=$detalhe[0]['codp'];
   $diaped=date('d/m/Y',strtotime($detalhe[0]['dia']));
   $totalped=$detalhe[0]['total'];$vwtotalped=number_format($totalped,2,',','.');
   $collectionB=collect(['codp'=>$codp,'diaped'=>$diaped,'totalped'=>$vwtotalped]);
   if($request->input('excluir')){
      $id=$request->input('excluir');
      $abater=$request->input('abater');
      tbhistped::find($id)->delete();
      $totalped-=$abater;
      tbpedido::where('ped',$ped)->update(['total'=>$totalped]);
      return redirect('orcamento');return "id $id abater $abater";   }
   $pessoa=tbpessoa::where('codp',$codp)->get()->toArray();
   $histped=vw_histped::where('ped',$ped)->get();
   if($codp){$pessoa1=$pessoa[0];}else{$pessoa1=["falta"=>"definir"];}
   $collectionC=collect($pessoa1);
   $prod=tbprod::orderBy('prod')->get();
   $merged=$collectionA->merge($collectionB)->merge($collectionC);
   $merged=$merged->all();
   $produto=$request->input('produto');
   $qt=$request->input('qt');
   if($qt){
      $qt=str_replace(',','.',$qt);
      $qt=round($qt,2);
      $precoa=tbprod::where('prod',$produto)->get()->toArray();
      if(!$precoa){
         return "<h2>O produto <i>$produto</i> não existe, por favor selecione o produto corretamente</h1>
         <p> <input type=button value=entendi onclick=location.replace('orcamento')>";}
      $preço=$precoa[0]['custo'];
      $un=$precoa[0]['un'];
      $codprod=$precoa[0]['codprod'];
      $total=round($preço*$qt,2);
      tbhistped::insert(['ped'=>$ped,'codprod'=>$codprod,'un'=>$un,'unitario'=>$preço,'subtotal'=>$total,'qt'=>$qt]);
      $totalped+=$total;
      tbpedido::where('ped',$ped)->update(['total'=>$totalped, 'dia'=>now()]);
      return redirect('orcamento');
   } else {
      $preço=null;
      $total=null; 
      $un=null;  }
   $orcamento=['produto'=>$produto,'qt'=>$qt,'un'=>$un,'preço'=>$preço,'total'=>$total];
   return view('orcamento',$merged,compact('histped','prod','orcamento'));}
}

 

Sem título.png

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...