241 lines
9.7 KiB
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;
|
|
}
|
|
|
|
}
|