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

649 lines
26 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\Models\Empresa;
use App\Models\Produto;
use App\Models\TributacaoCliente;
use App\Models\Cliente;
use App\Models\PlanoPendente;
use App\Models\Plano;
use App\Models\Fornecedor;
use App\Models\ListaPrecoUsuario;
use App\Models\Nfce;
use App\Models\PadraoTributacaoProduto;
use App\Models\ProdutoVariacao;
use App\Models\CategoriaProduto;
use App\Models\Marca;
use App\Models\VariacaoModelo;
use App\Models\MercadoLivreConfig;
use App\Models\Nfe;
use App\Models\NaturezaOperacao;
use App\Models\ContadorEmpresa;
use App\Models\User;
use App\Models\FaturaCliente;
use App\Models\ConfigGeral;
use App\Models\UsuarioEmpresa;
use NFePHP\Common\Certificate;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use App\Utils\EmpresaUtil;
use App\Utils\UploadUtil;
use App\Models\UnidadeMedida;
class ContadorAdminController extends Controller
{
protected $empresaUtil;
protected $uploadUtil;
public function __construct(EmpresaUtil $empresaUtil, UploadUtil $uploadUtil)
{
$this->empresaUtil = $empresaUtil;
$this->uploadUtil = $uploadUtil;
}
public function setEmpresa($id){
$contador = Empresa::findOrFail(request()->empresa_id);
$contador->empresa_selecionada = $id;
$contador->save();
return redirect()->back();
}
public function profile(Request $request){
$contador = Empresa::findOrFail(request()->empresa_id);
if($contador->usuarios[0] == null){
die;
}
$item = $contador->usuarios[0]->usuario;
return view('contador.profile', compact('contador', 'item'));
}
public function profileUpdate(Request $request, $id){
$usuario = User::findOrFail($id);
try {
$file_name = $usuario->imagem;
if ($request->hasFile('image')) {
$this->uploadUtil->unlinkImage($usuario, '/usuarios');
$file_name = $this->uploadUtil->uploadImage($request, '/usuarios');
}
if ($request->password) {
$request->merge([
'password' => Hash::make($request->password),
'imagem' => $file_name
]);
} else {
$request->merge([
'password' => $usuario->password,
'imagem' => $file_name
]);
}
$usuario->fill($request->all())->save();
session()->flash("flash_success", "Usuário alterado!");
} catch (\Exception $e) {
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
}
return redirect()->route('home');
}
public function show(){
$contador = Empresa::findOrFail(request()->empresa_id);
$item = Empresa::findOrFail($contador->empresa_selecionada);
$dadosCertificado = null;
if ($item != null && $item->arquivo) {
$dadosCertificado = $this->getInfoCertificado($item);
}
$naturezas = NaturezaOperacao::where('empresa_id', $item->id)->get();
// return view('config.index', compact('empresa', 'usuario', 'item', 'dadosCertificado', 'naturezas'));
return view('contador.show', compact('item', 'naturezas', 'dadosCertificado'));
}
public function update(Request $request, $id)
{
$item = Empresa::findOrFail($id);
try {
$file_name = $item->logo;
if ($request->hasFile('image')) {
$this->util->unlinkImage($item, '/logos');
$file_name = $this->util->uploadImage($request, '/logos');
}
$request->merge([
# 'cpf_cnpj' => preg_replace('/[^0-9]/', '', $request->cpf_cnpj),
'logo' => $file_name,
]);
if ($request->hasFile('certificado')) {
$file = $request->file('certificado');
$fileTemp = file_get_contents($file);
$request->merge([
'arquivo' => $fileTemp
]);
}
$item->fill($request->all())->save();
session()->flash("flash_success", "Empresa atualizada!");
} catch (\Exception $e) {
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
}
return redirect()->back();
}
private function getInfoCertificado($item)
{
try {
$infoCertificado = Certificate::readPfx($item->arquivo, $item->senha);
$publicKey = $infoCertificado->publicKey;
$inicio = $publicKey->validFrom->format('Y-m-d H:i:s');
$expiracao = $publicKey->validTo->format('Y-m-d H:i:s');
return [
'serial' => $publicKey->serialNumber,
'inicio' => \Carbon\Carbon::parse($inicio)->format('d-m-Y H:i'),
'expiracao' => \Carbon\Carbon::parse($expiracao)->format('d-m-Y H:i'),
'id' => $publicKey->commonName
];
} catch (\Exception $e) {
return [];
}
}
public function produtos(Request $request){
$contador = Empresa::findOrFail(request()->empresa_id);
$empresaSelecionada = $contador->empresa_selecionada;
$data = Produto::where('empresa_id', $empresaSelecionada)
->when(!empty($request->nome), function ($q) use ($request) {
return $q->where(function ($quer) use ($request) {
return $quer->where('nome', 'LIKE', "%$request->nome%");
});
})
->when(!empty($request->codigo_barras), function ($q) use ($request) {
return $q->where(function ($quer) use ($request) {
return $quer->where('codigo_barras', 'LIKE', "%$request->codigo_barras%");
});
})
->paginate(__itensPagina());
return view('contador.produtos', compact('data'));
}
public function produtoShow($id){
$item = Produto::findOrFail($id);
$empresa = Empresa::findOrFail($item->empresa_id);
$listaCTSCSOSN = Produto::listaCSOSN();
if ($empresa->tributacao == 'Regime Normal') {
$listaCTSCSOSN = Produto::listaCST();
}
$padroes = PadraoTributacaoProduto::where('empresa_id', $item->empresa_id)->get();
$categorias = CategoriaProduto::where('empresa_id', $item->empresa_id)->where('status', 1)->get();
$cardapio = 0;
if (isset($request->cardapio)) {
$cardapio = 1;
}
$marcas = Marca::where('empresa_id', $item->empresa_id)->get();
$variacoes = VariacaoModelo::where('empresa_id', $item->empresa_id)
->where('status', 1)->get();
$configMercadoLivre = MercadoLivreConfig::where('empresa_id', $item->empresa_id)
->first();
$unidades = UnidadeMedida::where('empresa_id', $item->empresa_id)
->where('status', 1)->get();
$configGeral = ConfigGeral::where('empresa_id', $item->empresa_id)
->first();
return view('contador.produtos_show',
compact('item', 'listaCTSCSOSN', 'padroes', 'categorias', 'cardapio', 'marcas', 'variacoes', 'configMercadoLivre',
'unidades', 'configGeral'));
}
public function produtoEdit($id){
$item = Produto::findOrFail($id);
__validaObjetoEmpresaContador(request()->empresa_id, $item->empresa_id);
$empresa = Empresa::findOrFail($item->empresa_id);
$listaCTSCSOSN = Produto::listaCSOSN();
if ($empresa->tributacao == 'Regime Normal') {
$listaCTSCSOSN = Produto::listaCST();
}
$padroes = PadraoTributacaoProduto::where('empresa_id', $item->empresa_id)->get();
$categorias = CategoriaProduto::where('empresa_id', $item->empresa_id)->where('status', 1)
->where('categoria_id', null)
->get();
$cardapio = 0;
if (isset($request->cardapio)) {
$cardapio = 1;
}
$marcas = Marca::where('empresa_id', $item->empresa_id)->get();
$variacoes = VariacaoModelo::where('empresa_id', $item->empresa_id)
->where('status', 1)->get();
$configMercadoLivre = MercadoLivreConfig::where('empresa_id', $item->empresa_id)
->first();
$unidades = UnidadeMedida::where('empresa_id', $item->empresa_id)
->where('status', 1)->get();
$configGeral = ConfigGeral::where('empresa_id', $item->empresa_id)
->first();
return view('contador.produtos_edit',
compact('item', 'listaCTSCSOSN', 'padroes', 'categorias', 'cardapio', 'marcas', 'variacoes', 'configMercadoLivre',
'unidades', 'configGeral'));
}
public function clientes(Request $request){
$contador = Empresa::findOrFail(request()->empresa_id);
$empresaSelecionada = $contador->empresa_selecionada;
$data = Cliente::where('empresa_id', $empresaSelecionada)
->when(!empty($request->razao_social), function ($q) use ($request) {
return $q->where(function ($quer) use ($request) {
return $quer->where('razao_social', 'LIKE', "%$request->razao_social%");
});
})
->when(!empty($request->cpf_cnpj), function ($q) use ($request) {
return $q->where(function ($quer) use ($request) {
return $quer->where('cpf_cnpj', 'LIKE', "%$request->cpf_cnpj%");
});
})
->paginate(__itensPagina());
return view('contador.clientes', compact('data'));
}
public function fornecedores(Request $request){
$contador = Empresa::findOrFail(request()->empresa_id);
$empresaSelecionada = $contador->empresa_selecionada;
$data = Fornecedor::where('empresa_id', $empresaSelecionada)
->when(!empty($request->razao_social), function ($q) use ($request) {
return $q->where(function ($quer) use ($request) {
return $quer->where('razao_social', 'LIKE', "%$request->razao_social%");
});
})
->when(!empty($request->cpf_cnpj), function ($q) use ($request) {
return $q->where(function ($quer) use ($request) {
return $quer->where('cpf_cnpj', 'LIKE', "%". preg_replace('/[^0-9]/', '', ($request->cpf_cnpj)) ."%");
});
})
->paginate(__itensPagina());
return view('contador.fornecedores', compact('data'));
}
public function empresaCreate(){
$contador = Empresa::findOrFail(request()->empresa_id);
if(sizeof(__empresasDoContador()) >= $contador->limite_cadastro_empresas){
session()->flash("flash_error", "Você atingiu o limite de cadastro de empresas");
return redirect()->back();
}
return view('contador.create_empresa', compact('contador'));
}
public function empresaStore(Request $request){
$this->__validate($request);
try{
DB::transaction(function () use ($request) {
$contador = Empresa::findOrFail(request()->empresa_id);
if ($request->hasFile('certificado')) {
$file = $request->file('certificado');
$fileTemp = file_get_contents($file);
$request->merge([
'arquivo' => $fileTemp ?? '',
// 'cpf_cnpj' => preg_replace('/[^0-9]/', '', $request->cpf_cnpj),
'senha' => $request->senha_certificado,
'token' => $request->token ?? '',
]);
}
$email = $request->email;
$request->merge([
'email' => $request->email_empresa
]);
$empresa = Empresa::create($request->all());
$this->empresaUtil->initLocation($empresa);
$this->empresaUtil->initNaturezaTributacao($empresa);
if ($request->usuario) {
$usuario = User::create([
'name' => $request->usuario ?? null,
'email' => $email ?? null,
'password' => Hash::make($request['password']) ?? '',
'remember_token' => Hash::make($request['remember_token']) ?? ''
]);
UsuarioEmpresa::create([
'empresa_id' => $empresa->id,
'usuario_id' => $usuario->id ?? null
]);
}
ContadorEmpresa::create([
'empresa_id' => $empresa->id,
'contador_id' => $contador->id
]);
return true;
});
session()->flash("flash_success", "Empresa cadastrada!");
} catch (\Exception $e) {
// echo $e->getMessage();
// die;
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
}
return redirect()->route('home');
}
private function __validate(Request $request)
{
$rules = [
'nome' => 'required',
'cpf_cnpj' => 'required',
'ie' => 'required',
'celular' => 'required',
'csc' => 'required',
'csc_id' => 'required',
'cep' => 'required',
'rua' => 'required',
'numero' => 'required',
'bairro' => 'required',
'cidade_id' => 'required',
'numero_ultima_nfe_producao' => 'required',
'numero_ultima_nfe_homologacao' => 'required',
'numero_serie_nfe' => 'required',
'numero_ultima_nfce_producao' => 'required',
'numero_ultima_nfce_homologacao' => 'required',
'numero_serie_nfce' => 'required',
'numero_ultima_cte_producao' => 'required',
'numero_ultima_cte_homologacao' => 'required',
'numero_serie_cte' => 'required',
'email' => 'unique:users',
];
$messages = [
'nome.required' => 'Campo Obrigatório',
'cpf_cnpj.required' => 'Campo Obrigatório',
'ie.required' => 'Campo Obrigatório',
'email.required' => 'Campo Obrigatório',
'celular.required' => 'Campo Obrigatório',
'csc.required' => 'Campo Obrigatório',
'csc_id.required' => 'Campo Obrigatório',
'cep.required' => 'Campo Obrigatório',
'rua.required' => 'Campo Obrigatório',
'numero.required' => 'Campo Obrigatório',
'bairro.required' => 'Campo Obrigatório',
'cidade_id.required' => 'Campo Obrigatório',
'numero_ultima_nfe_producao.required' => 'Campo Obrigatório',
'numero_ultima_nfe_homologacao.required' => 'Campo Obrigatório',
'numero_serie_nfe.required' => 'Campo Obrigatório',
'numero_ultima_nfce_producao.required' => 'Campo Obrigatório',
'numero_ultima_nfce_homologacao.required' => 'Campo Obrigatório',
'numero_serie_nfce.required' => 'Campo Obrigatório',
'email.unique' => 'Já existe um usuário com este email',
];
$this->validate($request, $rules, $messages);
}
public function plano($id){
$item = Empresa::findOrFail($id);
$planos = Plano::where('visivel_contadores', 1)->get();
return view('contador.plano', compact('item', 'planos'));
}
public function setPlano(Request $request, $id){
try{
PlanoPendente::create([
'plano_id' => $request->plano_id,
'valor' => __convert_value_bd($request->valor),
'empresa_id' => $id,
'contador_id' => request()->empresa_id
]);
session()->flash("flash_success", "Plano solicitado, aguarde a liberação do administrador!");
} catch (\Exception $e) {
// echo $e->getMessage();
// die;
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
}
return redirect()->route('home');
}
public function produtoUpdate(Request $request, $id){
$item = Produto::findOrFail($id);
try {
$file_name = $item->imagem;
if ($request->hasFile('image')) {
$this->util->unlinkImage($item, '/produtos');
$file_name = $this->uploadUtil->uploadImage($request, '/produtos');
}
$request->merge([
'valor_unitario' => __convert_value_bd($request->valor_unitario),
'valor_prazo' => __convert_value_bd($request->valor_prazo),
'valor_compra' => $request->valor_compra ? __convert_value_bd($request->valor_compra) : 0,
'valor_minimo_venda' => $request->valor_minimo_venda ? __convert_value_bd($request->valor_minimo_venda) : 0,
'imagem' => $file_name,
'codigo_anp' => $request->codigo_anp ?? '',
'perc_glp' => $request->perc_glp ? __convert_value_bd($request->perc_glp) : 0,
'perc_gnn' => $request->perc_gnn ? __convert_value_bd($request->perc_gnn) : 0,
'perc_gni' => $request->perc_gni ? __convert_value_bd($request->perc_gni) : 0,
'valor_partida' => $request->valor_partida ? __convert_value_bd($request->valor_partida) : 0,
'unidade_tributavel' => $request->unidade_tributavel ?? '',
'quantidade_tributavel' => $request->quantidade_tributavel ? __convert_value_bd($request->quantidade_tributavel) : 0,
'adRemICMSRet' => $request->adRemICMSRet ? __convert_value_bd($request->adRemICMSRet) : 0,
'pBio' => $request->pBio ? __convert_value_bd($request->pBio) : 0,
'pOrig' => $request->pOrig ? __convert_value_bd($request->pOrig) : 0,
'indImport' => $request->indImport ?? '',
'cUFOrig' => $request->cUFOrig ?? '',
'perc_icms' => $request->perc_icms ?? 0,
'perc_pis' => $request->perc_pis ?? 0,
'perc_cofins' => $request->perc_cofins ?? 0,
'perc_ipi' => $request->perc_ipi ?? 0,
'cfop_estadual' => $request->cfop_estadual ?? '',
'cfop_outro_estado' => $request->cfop_outro_estado ?? '',
'valor_combo' => $request->valor_combo ? __convert_value_bd($request->valor_combo) : 0,
'margem_combo' => $request->margem_combo ? __convert_value_bd($request->margem_combo) : 0,
'valor_atacado' => $request->valor_atacado ? __convert_value_bd($request->valor_atacado) : 0,
'empresa_id' => $item->empresa_id
]);
$item->fill($request->all())->save();
if($request->variavel){
// $item->variacoes()->delete();
$variacaoDelete = [];
for($i=0; $i<sizeof($request->valor_venda_variacao); $i++){
$dataVariacao = [
'produto_id' => $item->id,
'descricao' => $request->descricao_variacao[$i],
'valor' => __convert_value_bd($request->valor_venda_variacao[$i]),
'codigo_barras' => $request->codigo_barras_variacao[$i],
'referencia' => $request->referencia_variacao[$i],
];
if(isset($request->variacao_id[$i])){
$variacao = ProdutoVariacao::findOrfail($request->variacao_id[$i]);
$file_name = $variacao->imagem;
if(isset($request->imagem_variacao[$i])){
if($file_name != null){
$this->util->unlinkImage($variacao, '/produtos');
}
$imagem = $request->imagem_variacao[$i];
$file_name = $this->util->uploadImageArray($imagem, '/produtos');
}
$dataVariacao['imagem'] = $file_name;
$variacao->fill($dataVariacao)->save();
$variacaoDelete[] = $request->variacao_id[$i];
}else{
$file_name = '';
if(isset($request->imagem_variacao[$i])){
$imagem = $request->imagem_variacao[$i];
$file_name = $this->util->uploadImageArray($imagem, '/produtos');
}
$dataVariacao['imagem'] = $file_name;
$v = ProdutoVariacao::create($dataVariacao);
$variacaoDelete[] = $v->id;
}
}
foreach($item->variacoes as $v){
if(!in_array($v->id, $variacaoDelete)){
$itemNfce = \App\Models\ItemNfce::where('variacao_id', $v->id)
->first();
$itemNfe = \App\Models\ItemNfe::where('variacao_id', $v->id)
->first();
if($itemNfce == null && $itemNfe == null){
if($v->estoque){
$v->estoque->delete();
}
if($v->movimentacaoProduto){
$v->movimentacaoProduto->delete();
}
$v->delete();
}else{
session()->flash("flash_error", "Esta variação $v->descricao já possui vendas ou compras não é possivel remover");
return redirect()->back();
}
}
}
}else{
ProdutoVariacao::where('produto_id', $item->id)->delete();
}
session()->flash("flash_success", "Produto atualizado!");
} catch (\Exception $e) {
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
return redirect()->back();
}
return redirect()->route('contador-empresa.produtos');
}
public function clienteEdit($id){
$item = Cliente::findOrFail($id);
__validaObjetoEmpresaContador(request()->empresa_id, $item->empresa_id);
$listasPreco = ListaPrecoUsuario::select('lista_precos.*')
->join('lista_precos', 'lista_precos.id', '=', 'lista_preco_usuarios.lista_preco_id')
->where('lista_preco_usuarios.usuario_id', get_id_user())
->get();
$config = ConfigGeral::where('empresa_id', request()->empresa_id)->first();
$tiposPagamento = Nfce::tiposPagamento();
if($config != null){
$config->tipos_pagamento_pdv = $config != null && $config->tipos_pagamento_pdv ? json_decode($config->tipos_pagamento_pdv) : [];
$temp = [];
if(sizeof($config->tipos_pagamento_pdv) > 0){
foreach($tiposPagamento as $key => $t){
if(in_array($t, $config->tipos_pagamento_pdv)){
$temp[$key] = $t;
}
}
$tiposPagamento = $temp;
}
}
return view('contador.clientes_edit', compact('item', 'listasPreco', 'tiposPagamento'));
}
public function fornecedorEdit($id){
$item = Fornecedor::findOrFail($id);
__validaObjetoEmpresaContador(request()->empresa_id, $item->empresa_id);
return view('contador.fornecedores_edit', compact('item'));
}
public function clienteUpdate(Request $request, $id){
$item = Cliente::findOrFail($id);
try {
$request->merge([
'ie' => $request->ie ?? '',
'valor_cashback' => $request->valor_cashback ? __convert_value_bd($request->valor_cashback) : 0,
'valor_credito' => $request->valor_credito ? __convert_value_bd($request->valor_credito) : 0,
'empresa_id' => $item->empresa_id
]);
$item->fill($request->all())->save();
$this->cadastraTributacao($item, $request);
if($request->dias_vencimento[0] != ''){
$item->fatura()->delete();
for($i=0; $i<sizeof($request->dias_vencimento); $i++){
FaturaCliente::create([
'cliente_id' => $item->id,
'tipo_pagamento' => $request->tipo_pagamento[$i] ?? null,
'dias_vencimento' => $request->dias_vencimento[$i]
]);
}
}
session()->flash("flash_success", "Cliente atualizado!");
} catch (\Exception $e) {
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
return redirect()->back();
}
return redirect()->route('contador-empresa.clientes');
}
private function cadastraTributacao($cliente, Request $request){
if($cliente->tributacao){
$cliente->tributacao()->delete();
}
$request->merge([
'cliente_id' => $cliente->id
]);
TributacaoCliente::create($request->all());
}
public function fornecedorUpdate(Request $request, $id)
{
$item = Fornecedor::findOrFail($id);
try {
$request->merge([
'ie' => $request->ie ?? '',
'empresa_id' => $item->empresa_id
]);
$item->fill($request->all())->save();
session()->flash("flash_success", "Fornecedor atualizado!");
} catch (\Exception $e) {
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
}
return redirect()->route('contador-empresa.fornecedores');
}
}