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

599 lines
24 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\ExcelImport;
use App\Models\CategoriaProduto;
use App\Models\Cliente;
use App\Models\Fornecedor;
use App\Models\NaturezaOperacao;
use App\Models\Transportadora;
use App\Models\Produto;
use App\Models\Estoque;
use App\Models\Localizacao;
use App\Models\Nfe;
use App\Models\ItemNfe;
use App\Models\FaturaNfe;
use App\Models\ProdutoLocalizacao;
use App\Models\Empresa;
use App\Models\Nfce;
use App\Models\ItemNfce;
use App\Models\FaturaNfce;
use App\Models\ListaPreco;
use App\Models\ItemListaPreco;
use App\Models\ContaReceber;
use App\Models\ContaPagar;
class ImportadorController extends Controller
{
public function index(Request $request){
return view('importador.index');
}
public function store(Request $request){
if ($request->hasFile('file')) {
if (!is_dir(public_path('extract_importador'))) {
mkdir(public_path('extract_importador'), 0777, true);
}
$zip = new \ZipArchive();
$zip->open($request->file);
$destino = public_path('extract_importador');
$this->clearFolder($destino);
if($zip->extractTo($destino) == TRUE){
$this->salvaCategorias($destino);
$this->salvaClientes($destino);
$this->salvaFornecedores($destino);
$this->salvaNaturezasOperacao($destino);
$this->salvaTransportadoras($destino);
$this->salvaProdutos($destino);
$this->salvaVendasPedido($destino);
$this->salvaVendasCaixa($destino);
$this->salvaListaPreco($destino);
$this->salvaContasReceber($destino);
$this->salvaContasPagar($destino);
session()->flash('flash_success', 'Dados importados!');
return redirect()->route('home');
}else {
session()->flash('flash_error', "Erro ao desconpactar arquivo");
return redirect()->back();
}
$zip->close();
}
}
private function salvaCategorias($destino){
$file = $destino."/categorias.xlsx";
$rows = Excel::toArray(new ExcelImport, $file);
foreach ($rows as $row) {
foreach ($row as $key => $r) {
if($key > 0){
$objeto = [
'empresa_id' => request()->empresa_id,
'_id_import' => $r[0],
'nome' => $r[1],
];
CategoriaProduto::updateOrCreate($objeto);
}
}
}
}
private function salvaClientes($destino){
$file = $destino."/clientes.xlsx";
$rows = Excel::toArray(new ExcelImport, $file);
foreach ($rows as $row) {
foreach ($row as $key => $r) {
if($key > 0){
// dd($r);
$objeto = [
'empresa_id' => request()->empresa_id,
'_id_import' => $r[0],
'razao_social' => $r[1],
'nome_fantasia' => $r[2] ?? '',
'cpf_cnpj' => $r[3],
'ie' => $r[4],
'rua' => $r[5] ?? '',
'numero' => $r[6] ?? '',
'bairro' => $r[7] ?? '',
'cep' => $r[8] ?? '',
'cidade_id' => $r[9],
'telefone' => $r[10],
'email' => $r[11],
'consumidor_final' => $r[12],
'contribuinte' => $r[13],
'status' => $r[14],
];
// dd($objeto);
Cliente::updateOrCreate($objeto);
}
}
}
}
private function salvaFornecedores($destino){
$file = $destino."/fornecedores.xlsx";
$rows = Excel::toArray(new ExcelImport, $file);
foreach ($rows as $row) {
foreach ($row as $key => $r) {
if($key > 0){
// dd($r);
$objeto = [
'empresa_id' => request()->empresa_id,
'_id_import' => $r[0],
'razao_social' => $r[1],
'nome_fantasia' => $r[2] ?? '',
'cpf_cnpj' => $r[3],
'ie' => $r[4],
'rua' => $r[5],
'numero' => $r[6],
'bairro' => $r[7],
'cep' => $r[8] ?? '',
'cidade_id' => $r[9],
'telefone' => $r[10],
'email' => $r[11],
'contribuinte' => $r[12],
];
// dd($objeto);
Fornecedor::updateOrCreate($objeto);
}
}
}
}
private function salvaNaturezasOperacao($destino){
$file = $destino."/natureza_operacao.xlsx";
$rows = Excel::toArray(new ExcelImport, $file);
foreach ($rows as $row) {
foreach ($row as $key => $r) {
if($key > 0){
$objeto = [
'empresa_id' => request()->empresa_id,
'_id_import' => $r[0],
'descricao' => $r[1],
];
NaturezaOperacao::updateOrCreate($objeto);
}
}
}
}
private function salvaTransportadoras($destino){
$file = $destino."/transportadoras.xlsx";
$rows = Excel::toArray(new ExcelImport, $file);
foreach ($rows as $row) {
foreach ($row as $key => $r) {
if($key > 0){
$endereco = $r[3];
$objeto = [
'empresa_id' => request()->empresa_id,
'_id_import' => $r[0],
'razao_social' => $r[1],
'nome_fantasia' => '',
'cpf_cnpj' => $r[2],
'ie' => '',
'rua' => $endereco,
'numero' => '',
'bairro' => '',
'cidade_id' => $r[4],
'telefone' => $r[6] ?? '',
'email' => $r[5] ?? '',
];
Transportadora::updateOrCreate($objeto);
}
}
}
}
private function salvaProdutos($destino){
$file = $destino."/produtos.xlsx";
$rows = Excel::toArray(new ExcelImport, $file);
$localizacaoPadrao = Localizacao::where('empresa_id', request()->empresa_id)
->first();
foreach ($rows as $row) {
foreach ($row as $key => $r) {
if($key > 0){
// dd($r);
$categoria = CategoriaProduto::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[6])->first();
$objeto = [
'empresa_id' => request()->empresa_id,
'_id_import' => $r[0],
'nome' => $r[1],
'valor_unitario' => ($r[2]),
'valor_compra' => ($r[3]),
'unidade' => $r[4],
'codigo_barras' => $r[5],
'categoria_id' => $categoria != null ? $categoria->id : null,
'gerenciar_estoque' => $r[8],
'cfop_estadual' => $r[9],
'cfop_outro_estado' => $r[10],
'ncm' => $r[11],
'cest' => $r[12] ?? '',
'cst_csosn' => $r[13],
'cst_pis' => $r[14],
'cst_cofins' => $r[15],
'cst_ipi' => $r[16],
'perc_icms' => $r[17],
'perc_pis' => $r[18],
'perc_cofins' => $r[19],
'perc_ipi' => $r[20],
'status' => 1
];
// dd($objeto);
$produto = Produto::updateOrCreate($objeto);
ProdutoLocalizacao::updateOrCreate([
'produto_id' => $produto->id,
'localizacao_id' => $localizacaoPadrao->id
]);
if($r[7]){
$objeto = [
'produto_id' => $produto->id,
'quantidade' => $r[7],
'produto_variacao_id' => null,
'local_id' => $localizacaoPadrao->id
];
Estoque::updateOrCreate($objeto);
}
}
}
}
}
private function salvaVendasPedido($destino){
$file = $destino."/vendas_pedido.xlsx";
$rows = Excel::toArray(new ExcelImport, $file);
$proximoVenda = 0;
$proximoItem = 0;
$proximoFatura = 0;
$localizacaoPadrao = Localizacao::where('empresa_id', request()->empresa_id)
->first();
$empresa = Empresa::findOrFail(request()->empresa_id);
foreach ($rows as $row) {
foreach ($row as $key => $r) {
if($key > 0){
try{
if($r[0] == 'Venda'){
$proximoVenda = 1;
$proximoItem = 0;
$proximoFatura = 0;
}
elseif($r[0] == 'PRODUTO ID'){
$proximoItem = 1;
}
elseif($r[0] == 'TIPO DE PAGAMENTO'){
$proximoFatura = 1;
$proximoItem = 0;
}
else{
if($proximoVenda == 1){
$cliente = Cliente::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[1])->first();
$natureza = NaturezaOperacao::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[2])->first();
$transportadora = null;
if($r[3]){
$transportadora = Transportadora::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[3])->first();
}
$objetoVenda = [
'cliente_id' => $cliente->id,
'natureza_id' => $natureza->id,
'transportadora_id' => $transportadora ? $transportadora->id : null,
'total' => ($r[4]),
'desconto' => ($r[5]),
'acrescimo' => ($r[6]),
'estado' => Nfe::getEstadoImport($r[7]),
'numero' => $r[8],
'chave' => $r[9] ?? '',
'observacao' => $r[10],
'created_at' => $r[11],
'local_id' => $localizacaoPadrao->id,
'empresa_id' => request()->empresa_id,
'tipo' => 0,
'numero_serie' => $empresa->numero_serie_nfe ?? 1,
'tpNF' => 1
];
if($objetoVenda['estado'] == 'aprovado'){
//upload arquivo
$fileXml = $destino."/".$objetoVenda['chave'].".xml";
if(file_exists($fileXml)){
copy($fileXml, public_path('xml_nfe/').$objetoVenda['chave'].".xml");
}
}
$nfe = Nfe::create($objetoVenda);
$nfe->created_at = $r[11];
$nfe->save();
//salvar itens
}
if($proximoItem == 1){
$produto = Produto::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[0])->first();
$objetoItem = [
'nfe_id' => $nfe->id,
'produto_id' => $produto->id,
'quantidade' => ($r[1]),
'valor_unitario' => ($r[2]),
'sub_total' => ($r[3]),
];
ItemNfe::create($objetoItem);
}
if($proximoFatura == 1){
$fat = FaturaNfe::create([
'nfe_id' => $nfe->id,
'tipo_pagamento' => $r[0],
'data_vencimento' => $r[1],
'valor' => ($r[2])
]);
// dd($fat);
}
$proximoVenda = 0;
}
}catch(\Exception $e){
echo $e->getMessage();
die;
}
}
}
}
}
private function salvaVendasCaixa($destino){
$file = $destino."/vendas_caixa.xlsx";
$rows = Excel::toArray(new ExcelImport, $file);
$proximoVenda = 0;
$proximoItem = 0;
$proximoFatura = 0;
$localizacaoPadrao = Localizacao::where('empresa_id', request()->empresa_id)
->first();
$empresa = Empresa::findOrFail(request()->empresa_id);
foreach ($rows as $row) {
foreach ($row as $key => $r) {
if($key > 0){
// dd($r);
try{
if($r[0] == 'Venda'){
$proximoVenda = 1;
$proximoItem = 0;
$proximoFatura = 0;
}
elseif($r[0] == 'PRODUTO ID'){
$proximoItem = 1;
}
elseif($r[0] == 'TIPO DE PAGAMENTO'){
$proximoFatura = 1;
$proximoItem = 0;
}
else{
if($proximoVenda == 1){
$cliente = null;
$cliente = Cliente::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[1])->first();
$natureza = NaturezaOperacao::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[2])->first();
$transportadora = null;
if($r[3]){
$transportadora = Transportadora::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[3])->first();
}
$objetoVenda = [
'cliente_id' => $cliente ? $cliente->id : null,
'natureza_id' => $natureza->id,
'ambiente' => $empresa->ambiente,
'total' => ($r[3]),
'desconto' => ($r[4]),
'acrescimo' => ($r[5]),
'estado' => Nfe::getEstadoImport($r[11]),
'numero' => $r[12],
'chave' => $r[13] ?? '',
'observacao' => $r[14],
'local_id' => $localizacaoPadrao->id,
'empresa_id' => request()->empresa_id,
'numero_serie' => $empresa->numero_serie_nfce ?? 1,
'cliente_cpf_cnpj' => $r[9] ?? '',
'cliente_nome' => $r[10] ?? '',
'troco' => $r[6] ?? 0,
];
// dd($objetoVenda);
if($objetoVenda['estado'] == 'aprovado'){
//upload arquivo
$fileXml = $destino."/".$objetoVenda['chave'].".xml";
if(file_exists($fileXml)){
copy($fileXml, public_path('xml_nfce/').$objetoVenda['chave'].".xml");
}
}
// dd($objetoVenda);
$nfe = Nfce::create($objetoVenda);
$nfe->created_at = $r[15];
$nfe->save();
//salvar itens
}
if($proximoItem == 1){
$produto = Produto::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[0])->first();
$objetoItem = [
'nfce_id' => $nfe->id,
'produto_id' => $produto->id,
'quantidade' => ($r[1]),
'valor_unitario' => ($r[2]),
'sub_total' => ($r[3]),
];
// dd($objetoItem);
ItemNfce::create($objetoItem);
}
if($proximoFatura == 1){
$fat = FaturaNfce::create([
'nfce_id' => $nfe->id,
'tipo_pagamento' => $r[0],
'data_vencimento' => $r[1],
'valor' => ($r[2])
]);
// dd($fat);
}
$proximoVenda = 0;
}
}catch(\Exception $e){
// echo $e->getMessage();
}
}
}
}
}
private function salvaListaPreco($destino){
$file = $destino."/lista_preco.xlsx";
$rows = Excel::toArray(new ExcelImport, $file);
$proximoItem = 0;
$proximoLista = 0;
foreach ($rows as $row) {
foreach ($row as $key => $r) {
if($key > 0){
if($r[0] == 'LISTA'){
$proximoLista = 1;
$proximoItem = 0;
}
elseif($r[0] == 'LISTA ID'){
$proximoItem = 1;
}
else{
if($proximoLista == 1){
$objeto = [
'empresa_id' => request()->empresa_id,
'nome' => $r[1],
'percentual_alteracao' => ($r[2]),
'ajuste_sobre' => $r[3] == 1 ? 'valor_compra' : 'valor_venda',
'tipo' => $r[3] == 1 ? 'incremento' : 'reducao',
];
$lista = ListaPreco::create($objeto);
}
if($proximoItem == 1){
$produto = Produto::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[1])->first();
ItemListaPreco::create([
'lista_id' => $lista->id,
'produto_id' => $produto->id,
'valor' => ($r[3]),
'percentual_lucro' => ($r[2]),
]);
}
$proximoLista = 0;
}
}
}
}
}
private function salvaContasReceber($destino){
$file = $destino."/contas_receber.xlsx";
$rows = Excel::toArray(new ExcelImport, $file);
$localizacaoPadrao = Localizacao::where('empresa_id', request()->empresa_id)
->first();
foreach ($rows as $row) {
foreach ($row as $key => $r) {
if($key > 0){
$cliente = Cliente::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[1])->first();
$objeto = [
'empresa_id' => request()->empresa_id,
'cliente_id' => $cliente ? $cliente->id : null,
'data_vencimento' => $r[2],
'data_recebimento' => $r[3],
'valor_integral' => ($r[4]),
'valor_recebido' => ($r[5]),
'status' => $r[6],
'observacao' => $r[7] ?? '',
'tipo_pagamento' => $r[8] ?? '01',
'local_id' => $localizacaoPadrao->id
];
// dd($objeto);
$conta = ContaReceber::create($objeto);
$conta->created_at = $r[9];
$conta->save();
}
}
}
}
private function salvaContasPagar($destino){
$file = $destino."/contas_pagar.xlsx";
$rows = Excel::toArray(new ExcelImport, $file);
$localizacaoPadrao = Localizacao::where('empresa_id', request()->empresa_id)
->first();
foreach ($rows as $row) {
foreach ($row as $key => $r) {
if($key > 0){
$fornecedor = Fornecedor::where('empresa_id', request()->empresa_id)
->where('_id_import', $r[1])->first();
$objeto = [
'empresa_id' => request()->empresa_id,
'fornecedor' => $fornecedor ? $fornecedor->id : null,
'data_vencimento' => $r[2],
'data_pagamento' => $r[3],
'valor_integral' => ($r[4]),
'valor_pago' => ($r[5]),
'status' => $r[6],
'observacao' => $r[7] ?? '',
'tipo_pagamento' => $r[8] ?? '01',
'local_id' => $localizacaoPadrao->id
];
// dd($objeto);
$conta = ContaPagar::create($objeto);
$conta->created_at = $r[9];
$conta->save();
}
}
}
}
private function clearFolder($destino){
$files = glob($destino."/*");
foreach($files as $file){
if(is_file($file)) unlink($file);
}
}
}