Ir para conteúdo

POWERED BY:

violin101

PHP - Cadastro de Faturamento

Recommended Posts

Caros amigos, saudações.

 

Estou com uma dúvida de como devo fazer.

 

Preciso criar uma Rotina para Cadastrar Faturamento, por exemplo:

1) 28/42/56 dias -> de 28 p/ 42 a dif. é de 14 dias...

2) 30/60/90 dias -> de 30 p/ 60 a dif. é de 30 dias...

3) 0/15/30/45 dias  -> de 0 p/ 15 a dif. é de 15 dias...

 

Como devo fazer para  cadastrar os prazo de vencimento, onde o sistema possa contar as diferenças entre os dias ?

 

Grato,

 

Cesar

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 28/06/2024 at 16:17, violin101 disse:

Como devo fazer para  cadastrar os prazo de vencimento, onde o sistema possa contar as diferenças entre os dias ?

Crie uma tabela no seu database e vincule ao que quer que seja

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caros amigos, saudações.

 

Estou tentando fazer uma Rotina em PHP onde eu possa gerar datas de Vencimentos, o meu problema é que não consigo entender como faço para contar DIFERENÇA entre as data de vencimentos.


Exemplo:
qtde de dias para vencer: 28/42/56.
a 1ª parcela conta 28 dias da Data Atual.

a 2ª parcela conta 14 dias da A PARTIR da 1ª. parcela.

a 3ª parcela conta 14 dias da A PARTIR da 2ª. parcela.

 

ficaria assim: Data Atual: 03/07/2024

1 vcto p/ 31/07/2024

2 vcto p/ 11/09/2024

3 vcto p/ 25/09/2024

 

Abaixo fiz uma Rotina Simples, para fazer os PARCELMENTO, VALORES e VECIMENTOS.

 

<?php
// Definir um fuso horario padrao
date_default_timezone_set('America/Sao_Paulo');
?>
<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <title>Calcula Vencimento</title>
</head>

<body>

    <?php
    // Valor da compra
    $valor_total = 700;

    // Quantidade de parcelas
    $quantidade_parc = 3;

	//Intervalo de Dias para Vencer
    $intervalo=28;	
	
    // Converter o valor para o formato Real separado pela virgula
    echo "Valor da compra: " . number_format($valor_total, 2, ',', '.') . "<br><br>";

    // Imprimir a quantidade de parcelas
    echo "Quantidade de parcelas: $quantidade_parc <br><br>";
	
    // Imprimir a quantidade de parcelas
    echo "Intervalo de Dias p/ Vencer: $intervalo <br><br>";	

    // Calcula o valor de cada parcela
    $valor_parc = $valor_total / $quantidade_parc;

    // Variável do Controle do WHILE
    $controle = 1;

    // Realiza a Sotal das parcelas
    $soma_valor_parc = 0;

    // Data atual
    $data_atual = new DateTime();

    // Laço de repetição
    while ($controle <= $quantidade_parc) {

        // Somar Intervalo de Tempo na Data		
        $data_atual->add(new DateInterval('P' . $intervalo . 'D'));
		
        // Acessa o IF quando é última parcela para corrigir o valor da compra
        if ($controle == $quantidade_parc) {

            // Utilizar a soma das parcelas e subtrair do valor total da 
            // para obter o valor a última parcela e corrigir a diferença
            $valor_ultima_parc = $valor_total - $soma_valor_parc;

            // Converter o valor da parcela para o formato Real separado pela virgula
            echo "Valor da parcela " . number_format($valor_ultima_parc, 2, ',', '.') . "<br>";

            // Somar o valor das parcelas
            $soma_valor_parc += number_format($valor_ultima_parc, 2, '.', '');
        } else {
            // Converter o valor da parcela para o formato Real separado pela virgula
            echo "Valor da parcela " . number_format($valor_parc, 2, ',', '.') . "<br>";

            // Somar o valor das parcelas
            $soma_valor_parc += number_format($valor_parc, 2, '.', '');
        }

        // Converter a data
        echo "Data de Vencimento: " . $data_atual->format('d/m/Y') . "<br><br>";     

        // Incrementar a variável após imprimir a parcela
        $controle++;
    } 

    // Imprimir o valor total da soma das parcelas e converter para o formato Real separado pela virgula
    echo "<br>Valor total Parcelado: " . number_format($soma_valor_parc, 2, ',', '.') . "<br>";
			

    ?>

</body>

</html>

 

Grato,

 

Cesar

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu  codigo esta certo, mas você precisa fazer algumas correções,  precisa fazer uns ajustes  para que ele funcione conforme você esta  esperado. Código para calcular corretamente as datas de vencimento e os valores das parcelas de acordo com as regras que você especificou. 

 

Intervalos das Parcelas: O intervalo entre as parcelas não está correto. O intervalo para a 2ª parcela e subsequentes é de 14 dias, e não de 28 dias como está definido na variável $intervalo.

 

Soma dos Valores das Parcelas: Ao formatar o valor das parcelas, você está convertendo o valor para uma string e depois somando isso, o que pode levar a erros. A soma deve ser feita usando números, e a formatação para a exibição deve ser feita separadamente.

 

Correção da Última Parcela: A última parcela não está sendo calculada corretamente. O valor da última parcela deve ser ajustado para garantir que a soma total seja igual ao valor total da compra.

 

Vou mostra 3 abordagem que pode ser feita

 

Abordagem 1: Usando Funções Simples e Arrays casi desejar

 

Nesta abordagem, você pode usar arrays para armazenar as datas de vencimento e valores das parcelas. A lógica para calcular as datas e valores é separada em funções para melhorar a organização e a legibilidade.

<?php
// Definir um fuso horário padrão
date_default_timezone_set('America/Sao_Paulo');

// Valor da compra
$valor_total = 700;

// Quantidade de parcelas
$quantidade_parc = 3;

// Intervalo de Dias para Vencer
$intervalo_inicial = 28; 
$intervalo_subsequente = 14; 

// Calcula o valor de cada parcela
$valor_parc = $valor_total / $quantidade_parc;

// Função para calcular a data de vencimento
function calcular_vencimento($data_inicial, $dias) {
    $data = clone $data_inicial;
    $data->add(new DateInterval('P' . $dias . 'D'));
    return $data;
}

// Data atual
$data_atual = new DateTime();

$valores_parcelas = [];
$datas_vencimento = [];
$intervalo = $intervalo_inicial;

for ($i = 1; $i <= $quantidade_parc; $i++) {
    $datas_vencimento[$i] = calcular_vencimento($data_atual, $intervalo);
    if ($i == $quantidade_parc) {
        $valor_parcela_atual = $valor_total - array_sum($valores_parcelas);
    } else {
        $valor_parcela_atual = $valor_parc;
    }
    $valores_parcelas[$i] = $valor_parcela_atual;
    $intervalo = $intervalo_subsequente;
}

?>

<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <title>Calcula Vencimento</title>
</head>

<body>

    <?php
    // Converter o valor para o formato Real separado pela vírgula
    echo "Valor da compra: " . number_format($valor_total, 2, ',', '.') . "<br><br>";

    // Imprimir a quantidade de parcelas
    echo "Quantidade de parcelas: $quantidade_parc <br><br>";

    // Imprimir a quantidade de parcelas
    echo "Intervalo de Dias p/ Vencer: $intervalo_inicial para 1ª parcela e $intervalo_subsequente para as demais<br><br>";    

    for ($i = 1; $i <= $quantidade_parc; $i++) {
        echo "Valor da parcela " . $i . ": " . number_format($valores_parcelas[$i], 2, ',', '.') . "<br>";
        echo "Data de Vencimento: " . $datas_vencimento[$i]->format('d/m/Y') . "<br><br>";     
    }

    // Imprimir o valor total da soma das parcelas e converter para o formato Real separado pela vírgula
    echo "<br>Valor total Parcelado: " . number_format(array_sum($valores_parcelas), 2, ',', '.') . "<br>";
    ?>

</body>

</html>

 

Abordagem 2: Usando uma Classe para Encapsular a Lógica caso desejar também

Nesta abordagem, encapsulamos a lógica em uma classe para melhorar a organização e a reusabilidade do código.

 

<?php
// Definir um fuso horário padrão
date_default_timezone_set('America/Sao_Paulo');

class CalculadorParcelas {
    private $valor_total;
    private $quantidade_parc;
    private $intervalo_inicial;
    private $intervalo_subsequente;

    public function __construct($valor_total, $quantidade_parc, $intervalo_inicial, $intervalo_subsequente) {
        $this->valor_total = $valor_total;
        $this->quantidade_parc = $quantidade_parc;
        $this->intervalo_inicial = $intervalo_inicial;
        $this->intervalo_subsequente = $intervalo_subsequente;
    }

    public function calcularParcelas() {
        $valor_parc = $this->valor_total / $this->quantidade_parc;
        $data_atual = new DateTime();
        $valores_parcelas = [];
        $datas_vencimento = [];
        $intervalo = $this->intervalo_inicial;

        for ($i = 1; $i <= $this->quantidade_parc; $i++) {
            $data_vencimento = clone $data_atual;
            $data_vencimento->add(new DateInterval('P' . $intervalo . 'D'));
            $datas_vencimento[$i] = $data_vencimento;

            if ($i == $this->quantidade_parc) {
                $valor_parcela_atual = $this->valor_total - array_sum($valores_parcelas);
            } else {
                $valor_parcela_atual = $valor_parc;
            }
            $valores_parcelas[$i] = $valor_parcela_atual;
            $intervalo = $this->intervalo_subsequente;
        }

        return [$valores_parcelas, $datas_vencimento];
    }
}

// Inicializando a classe
$calculador = new CalculadorParcelas(700, 3, 28, 14);
list($valores_parcelas, $datas_vencimento) = $calculador->calcularParcelas();

?>

<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <title>Calcula Vencimento</title>
</head>

<body>

    <?php
    // Converter o valor para o formato Real separado pela vírgula
    echo "Valor da compra: " . number_format(700, 2, ',', '.') . "<br><br>";

    // Imprimir a quantidade de parcelas
    echo "Quantidade de parcelas: 3 <br><br>";

    // Imprimir a quantidade de parcelas
    echo "Intervalo de Dias p/ Vencer: 28 para 1ª parcela e 14 para as demais<br><br>";    

    for ($i = 1; $i <= 3; $i++) {
        echo "Valor da parcela " . $i . ": " . number_format($valores_parcelas[$i], 2, ',', '.') . "<br>";
        echo "Data de Vencimento: " . $datas_vencimento[$i]->format('d/m/Y') . "<br><br>";     
    }

    // Imprimir o valor total da soma das parcelas e converter para o formato Real separado pela vírgula
    echo "<br>Valor total Parcelado: " . number_format(array_sum($valores_parcelas), 2, ',', '.') . "<br>";
    ?>

</body>

</html>

 

Abordagem 3: Usando uma Função de Agregação se assim você também desejar rsrs

Abordagem é criar uma função que retorna todas as informações necessárias para o cálculo das parcelas e exibição dos resultados.

 

<?php
// Definir um fuso horário padrão
date_default_timezone_set('America/Sao_Paulo');

function calcularParcelas($valor_total, $quantidade_parc, $intervalo_inicial, $intervalo_subsequente) {
    $valor_parc = $valor_total / $quantidade_parc;
    $data_atual = new DateTime();
    $parcelas = [];

    for ($i = 1; $i <= $quantidade_parc; $i++) {
        $data_vencimento = clone $data_atual;
        $intervalo = ($i == 1) ? $intervalo_inicial : $intervalo_subsequente;
        $data_vencimento->add(new DateInterval('P' . $intervalo . 'D'));

        $valor_parcela_atual = ($i == $quantidade_parc) ? $valor_total - array_sum(array_column($parcelas, 'valor')) : $valor_parc;

        $parcelas[] = [
            'data' => $data_vencimento,
            'valor' => $valor_parcela_atual
        ];
    }

    return $parcelas;
}

$parcelas = calcularParcelas(700, 3, 28, 14);

?>

<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <title>Calcula Vencimento</title>
</head>

<body>

    <?php
    // Converter o valor para o formato Real separado pela vírgula
    echo "Valor da compra: " . number_format(700, 2, ',', '.') . "<br><br>";

    // Imprimir a quantidade de parcelas
    echo "Quantidade de parcelas: 3 <br><br>";

    // Imprimir a quantidade de parcelas
    echo "Intervalo de Dias p/ Vencer: 28 para 1ª parcela e 14 para as demais<br><br>";    

    foreach ($parcelas as $index => $parcela) {
        echo "Valor da parcela " . ($index + 1) . ": " . number_format($parcela['valor'], 2, ',', '.') . "<br>";
        echo "Data de Vencimento: " . $parcela['data']->format('d/m/Y') . "<br><br>";
    }

    // Imprimir o valor total da soma das parcelas e converter para o formato Real separado pela vírgula
    echo "<br>Valor total Parcelado: " . number_format(array_sum(array_column($parcelas, 'valor')), 2, ',', '.') . "<br>";
    ?>

</body>

</html>

Espero que seja o que deseja

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.