arcadiasuite/plus/app/Http/Controllers/ExportarBalancaController.php

241 lines
9.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Produto;
use App\Models\UsuarioEmpresa;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class ExportarBalancaController extends Controller
{
public function index(){
return view('exportar_balanca.index');
}
// Método para exportar para Toledo MGV5
public function exp_bal_toledo_mgv5()
{
return $this->exportar('toledo_mgv5');
}
// Método para exportar para Toledo MGV6
public function exp_bal_toledo_mgv6()
{
return $this->exportar('toledo_mgv6');
}
// Método para exportar para Filizola
public function exp_bal_filizola()
{
return $this->exportarFilizola();
}
// Método comum para exportação, aceitando o modelo (toledo_mgv5, toledo_mgv6, filizola)
private function exportar($modelo)
{
// Obtém o ID da empresa do usuário autenticado
$empresaId = request()->empresa_id;
// Consulta os produtos filtrando pela empresa
$produtos = Produto::where('status', 1)
->where('empresa_id', $empresaId)
->where('codigo_barras', '!=', '')
->get();
// Nome do arquivo com base no modelo
if ($modelo == 'toledo_mgv5') {
$arquivo = 'TXITENS.TXT';
} elseif ($modelo == 'toledo_mgv6') {
$arquivo = 'ITENSMGV.TXT';
} elseif ($modelo == 'filizola') {
// Este caso agora chama o exportarFilizola para gerar dois arquivos
return $this->exportarFilizola();
} else {
return response()->json(['error' => 'Modelo desconhecido'], 400);
}
// Cria o arquivo para escrita no diretório de storage
$file = fopen(storage_path("app/public/{$arquivo}"), 'w');
// Gera cada linha do arquivo com base no modelo
foreach ($produtos as $produto) {
// Chama a função adequada para o modelo escolhido
if ($modelo == 'toledo_mgv5') {
$linha = $this->gerarLinhaToledoMGV5($produto);
} elseif ($modelo == 'toledo_mgv6') {
$linha = $this->gerarLinhaToledoMGV6($produto);
} elseif ($modelo == 'filizola') {
// Chamando o método correto para Filizola
$linha = $this->gerarLinhaFilizola($produto);
}
// Escreve a linha no arquivo
fwrite($file, $linha);
}
// Fecha o arquivo
fclose($file);
// Retorna uma resposta de sucesso, fazendo o download do arquivo gerado
return response()->download(storage_path("app/public/{$arquivo}"));
}
// Geração da linha para o modelo Toledo MGV5
private function gerarLinhaToledoMGV5($produto)
{
$departamento = str_pad($produto->categoria_id, 2, "0", STR_PAD_LEFT);
$tipo_etiqueta = str_pad($produto->padrao_id, 2, "0", STR_PAD_LEFT);
$tipo_preco = ($produto->unidade == 'kg') ? '0' : '1';
$codigo_produto = str_pad($produto->id, 6, "0", STR_PAD_LEFT);
$preco_unitario = str_pad(intval($produto->valor_unitario * 100), 6, "0", STR_PAD_LEFT);
$validade = str_pad($produto->alerta_validade, 3, "0", STR_PAD_LEFT);
$descricao1 = str_pad(substr($produto->nome, 0, 50), 50, " ");
$descricao2 = str_pad(substr($produto->nome, 50, 50), 50, " ");
$info_extra = str_pad(substr($produto->observacao, 0, 50), 50, " ") .
str_pad(substr($produto->observacao2, 0, 50), 50, " ") .
str_pad(substr($produto->observacao3, 0, 50), 50, " ") .
str_pad(substr($produto->observacao4, 0, 50), 50, " ");
return $departamento . $tipo_etiqueta . $tipo_preco .
$codigo_produto . $preco_unitario . $validade .
$descricao1 . $descricao2 . $info_extra . PHP_EOL;
}
// Geração da linha para o modelo Toledo MGV6
private function gerarLinhaToledoMGV6($produto)
{
// Código do Departamento
$codigoDepartamento = str_pad($produto->categoria_id, 2, '0', STR_PAD_LEFT);
// Tipo de Produto: "0" para peso, "1" para unidade
$tipoProduto = ($produto->unidade == 'kg') ? '0' : '1';
// Código do Item
$codigoItem = str_pad($produto->id, 6, '0', STR_PAD_LEFT);
// Preço do produto (em centavos)
$preco = str_pad(intval($produto->valor_unitario * 100), 6, '0', STR_PAD_LEFT);
// Dias de validade (campo "VVV")
$diasValidade = str_pad($produto->alerta_validade, 3, '0', STR_PAD_LEFT);
// Descrição do Produto (primeira linha e segunda linha)
$descricao1 = str_pad(substr($produto->nome, 0, 25), 25, ' ', STR_PAD_RIGHT);
$descricao2 = str_pad(substr($produto->nome, 25, 25), 25, ' ', STR_PAD_RIGHT);
// Código do Fornecedor (campo "CF")
$codigoFornecedor = str_pad($produto->fornecedor_id, 4, '0', STR_PAD_LEFT); // Exemplo
// Código da Imagem do Item (campo "FFFF")
$codigoImagem = str_pad($produto->codigo_imagem, 4, '0', STR_PAD_LEFT); // Exemplo
// Código do Campo Extra 1 e 2 (campo "CE1", "CE2")
$campoExtra1 = str_pad($produto->campo_extra_1, 4, '0', STR_PAD_LEFT); // Exemplo
$campoExtra2 = str_pad($produto->campo_extra_2, 4, '0', STR_PAD_LEFT); // Exemplo
// Código de Fornecedor Associado (campo "CE3")
$codigoFornecedorAssociado = str_pad($produto->fornecedor_associado_id, 4, '0', STR_PAD_LEFT); // Exemplo
// Preço Promocional (campo "PPPPPP")
$precoPromocional = str_pad(intval($produto->preco_promocional * 100), 6, '0', STR_PAD_LEFT);
// Percentual de Glaciamento (campo "PG")
$percentualGlaciamento = str_pad(intval($produto->percentual_glaciamento * 100), 4, '0', STR_PAD_LEFT);
// Sequência de departamentos associados (campo "DA")
$sequenciaDepartamentos = "|0205|"; // Exemplo de associação com departamentos 2 e 5
// Código do Som (campo "CS")
$codigoSom = str_pad($produto->codigo_som, 4, '0', STR_PAD_LEFT); // Exemplo
// Imprime Data de Validade (campo "DV")
$imprimeValidade = '1'; // Ou '0' dependendo da configuração
// Formatação final da linha, combinando todos os campos
$linha = $codigoDepartamento . $tipoProduto . $codigoItem . $preco . $diasValidade .
$descricao1 . $descricao2 . $codigoFornecedor . $codigoImagem .
$campoExtra1 . $campoExtra2 . $codigoFornecedorAssociado . $precoPromocional .
$percentualGlaciamento . $sequenciaDepartamentos . $codigoSom . $imprimeValidade . PHP_EOL;
return $linha;
}
// Geração da linha para o modelo Filizola
private function gerarLinhaFilizola($produto)
{
// Código do Produto (6 caracteres numéricos)
$codigo_produto = str_pad($produto->id, 6, "0", STR_PAD_LEFT);
// Tipo (P para peso, U para unidade)
$tipo_peso = ($produto->unidade == 'kg') ? 'P' : 'U';
// Descrição (máximo 22 caracteres)
$descricao = substr($produto->nome, 0, 22); // Garantir que tenha no máximo 22 caracteres
$descricao = str_pad($descricao, 22, ' '); // Preencher com espaços se necessário
// Preço por quilo (7 caracteres numéricos)
$valor_unitario = number_format($produto->valor_unitario, 2, '', ''); // R$ 22,00 vira 2200
$valor_unitario = str_pad($valor_unitario, 7, "0", STR_PAD_LEFT);
// Prazo de validade (3 caracteres numéricos)
$validade = str_pad($produto->alerta_validade, 3, "0", STR_PAD_LEFT);
// Montando a string conforme as especificações
return $codigo_produto . $tipo_peso . $descricao . $valor_unitario . $validade . PHP_EOL;
}
public function exportarFilizola(Request $request)
{
// Obtém o ID da empresa do usuário autenticado
$empresaId = auth()->user()->empresa->empresa_id;
// Consulta os produtos filtrando pela empresa
$produtos = Produto::where('exportar_balanca', 1)
->where('empresa_id', $empresaId)
->get();
// Definição dos arquivos
$arquivoCadTxt = 'CADTXT.TXT';
$arquivoSetorTxt = 'SETORTXT.TXT';
$pathCadTxt = storage_path("app/public/{$arquivoCadTxt}");
$pathSetorTxt = storage_path("app/public/{$arquivoSetorTxt}");
// Criando os arquivos
$fileCadTxt = fopen($pathCadTxt, 'w');
$fileSetorTxt = fopen($pathSetorTxt, 'w');
foreach ($produtos as $produto) {
fwrite($fileCadTxt, $this->gerarLinhaFilizola($produto));
fwrite($fileSetorTxt, $this->gerarLinhaSetor($produto));
}
fclose($fileCadTxt);
fclose($fileSetorTxt);
// Obtém o parâmetro 'arquivo' da requisição
$arquivoSolicitado = $request->route('arquivo', 'cad');
// Verifica qual arquivo retornar
if ($arquivoSolicitado === 'setor') {
return response()->download($pathSetorTxt)->deleteFileAfterSend(true);
}
return response()->download($pathCadTxt)->deleteFileAfterSend(true);
}
// Geração da linha para o arquivo SETORTXT.TXT
private function gerarLinhaSetor($produto)
{
// Verifique se o produto tem o setor_id e, caso não, forneça um valor padrão ou trate o erro
$codigoSetor = isset($produto->setor_id) ? str_pad($produto->setor_id, 3, '0', STR_PAD_LEFT) : '000';
// Verifique se está gerando a linha corretamente
return $codigoSetor . PHP_EOL;
}
}