diff --git a/prolog/src/Controller/Locadora.pl b/prolog/src/Controller/Locadora.pl index 7e1e080..e819603 100644 --- a/prolog/src/Controller/Locadora.pl +++ b/prolog/src/Controller/Locadora.pl @@ -1,19 +1,315 @@ -:- module(Locadora, [menuLocadora/0]). +:- module(locadora, [menuLocadora/0, opcaoMenu/1, cadastrarCarro/0, confirmaCadastro/1, registrarDevolucao/0, printAluguel/4, menuDashboard/0, menuOpcao/1, calcularReceitaTotal/2, +contarAlugueis/2, contarCarros/2, listarCarrosMaisDefeituosos/2, listarAlugueisPorCategoria/2, exibirReceitaTotal/1, +exibirNumeroDeAlugueis/1, exibirTotalDeCarros/1, +exibirCarrosMaisDefeituosos/1, exibirAlugueisPorCategoria/1, removerCarro/0]). :- use_module(library(odbc)). -:- use_module(util). -:- use_module(dbop). +:- use_module(library(readutil)). +:- use_module(library(date_time)). +:- use_module('./localdb/dbop'). +:- use_module('./localdb/user_operations'). +:- use_module('./localdb/connectiondb'). +:- use_module('./localdb/util'). menuLocadora :- writeln(''), - writeln('Menu:'), - writeln('1. Cadastrar carro'), - writeln('2. Remover Carro'), - writeln('3. Registrar Devolução'), - writeln('4. Registro de Aluguéis por pessoa'), - writeln('5. Dashboard'), - writeln('0. Sair'), + writeln('|-----------------------------------|'), + writeln('| MENU |'), + writeln('|-----------------------------------|'), + writeln('|1. Cadastrar carro |'), + writeln('|2. Remover Carro |'), + writeln('|3. Registrar Devolução |'), + writeln('|4. Registro de Aluguéis por pessoa |'), + writeln('|5. Dashboard |'), + writeln('|0. Sair |'), + writeln(''), writeln('Escolha uma opção:'), + read_line_to_string(user_input, Opcao), + writeln(''), + (Opcao = "1" -> cadastrarCarro, menuLocadora; + Opcao = "2" -> removerCarro, menuLocadora; + Opcao = "3" -> registrarDevolucao; + Opcao = "4" -> listarAlugueisPorPessoa, menuLocadora; + Opcao = "5" -> menuDashboard, menuLocadora; + Opcao = "0" -> writeln('Saindo...'), writeln(''), halt; + writeln('Opção inválida. Por favor, escolha novamente.'), menuLocadora). + + +%CADASTRAR_CARRO +cadastrarCarro :- + connectiondb:iniciandoDatabase(Connection), + writeln(''), + writeln('|--------------------------------|'), + writeln('| Digite as informações do carro |'), + writeln('|--------------------------------|'), + write('|Marca: '), + read_line_to_string(user_input, Marca), + write('|Modelo: '), + read_line_to_string(user_input, Modelo), + write('|Ano: '), + read_line_to_string(user_input, A), + atom_number(A, Ano), + write('|Placa: '), + read_line_to_string(user_input, Placa), + write('|Categoria: '), + read_line_to_string(user_input, Categoria), + write('|Diária: '), + read_line_to_string(user_input, D), + atom_number(D, Diaria), + write('|Descrição: '), + read_line_to_string(user_input, Descricao), + writeln(''), + confirmaCadastro(Confirm), + ( + (Marca = "" ; Modelo = "" ; Ano = "" ; Placa = ""; Categoria = "" ; Diaria = "" ; Descricao = "") -> + writeln('Nenhum campo pode estar vazio. Por favor, tente novamente.'), + writeln(''), + cadastrarCarro + ; + ( + Confirm = "2" -> writeln('Esse cadastro foi cancelado!') + ; + Confirm = "1" -> + user_operations:createCar(Connection, Marca, Modelo, Ano, Placa, Categoria, Diaria, Descricao) + ) + ), + connectiondb:encerrandoDatabase(Connection), + menuLocadora. + +confirmaCadastro(Confirm) :- + writeln('Tem certeza que deseja cadastrar esse carro? \n 1. Sim \n 2. Não'), + read_line_to_string(user_input, C), + ((C \= "1" , C \= "2") -> writeln('Opção inválida, tente novamente.\n'), confirmaCadastro(Confirm) ; + Confirm = C). + + +%REGISTRAR_DEVOLUCAO +registrarDevolucao :- + writeln('Digite o número do contrato/Id do aluguel a ser encerrado:'), + read_line_to_string(user_input, InputString), + writeln(''), + atom_number(InputString, NumContrato), + Contrato = [row(DataInicio, DataDevolucao, IDCarro, ValorTotal)], + buscarAluguel(NumContrato, Contrato), + (length(Contrato, 0) -> + writeln('Aluguel não encontrado.'), + writeln('1. Para digitar novamente'), + writeln('2. Para voltar ao menu inicial'), + read_line_to_string(user_input, Opcao), + (Opcao = "1" -> registrarDevolucao; + Opcao = "2" -> menuLocadora; + writeln('Opção inválida. Você será direcionado(a) ao menu inicial.'), menuLocadora) + ; + printAluguel( DataInicio, DataDevolucao, IDCarro), + verificaDevolucao(DataDevolucao, Devolucao), + (Devolucao = "Devolução dentro do prazo" -> + writeln('|DEVOLUÇÃO NO PRAZO'), + printDevolucao(ValorTotal, IDCarro); + Devolucao = "Devolução adiantada" -> + writeln('|DEVOLUÇÃO ADIANTADA \n|Motivo da devolução adiantada:'), + writeln('|1. Problema no carro'), + writeln('|2. Outro motivo'), + read_line_to_string(user_input, Motivo), + (Motivo = "1" -> enviaParaMecanico(IDCarro), menuLocadora; + Motivo = "2" -> calculaValor( DataInicio, DataDevolucao, IDCarro, Valor), + printDevolucao(Valor, IDCarro), menuLocadora; + writeln('Opção inválida. Você será direcionado(a) ao menu inicial.'), menuLocadora); + writeln("|DEVOLUÇÃO ATRASADA"), + calculaValor(DataInicio, DataDevolucao, IDCarro, Valor), + printDevolucao(Valor, IDCarro), menuLocadora + ) + ). + +buscarAluguel(NumContrato, Contrato) :- + connectiondb:iniciandoDatabase(Connection), + dbop:db_parameterized_query(Connection, "SELECT data_inicio, data_devolucao, id_carro, valor_total FROM Alugueis WHERE id_aluguel = '%w'", [NumContrato], Contrato), + connectiondb:encerrandoDatabase(Connection). + +buscarCarro(IDCarro) :- + connectiondb:iniciandoDatabase(Connection), + format("|-----------Detalhes do aluguel com ID ~w:-------------| \n", [IDCarro]), + Resultado = [row(Marca,Modelo,Ano)], + dbop:db_parameterized_query(Connection, "SELECT marca, modelo, ano FROM Carros WHERE id_carro = '%w'", [IDCarro], Resultado), + connectiondb:encerrandoDatabase(Connection), + ( + Resultado = null -> + writeln("Carro com ID " + IDCarro + " não encontrado."); + format("|Marca:~t ~w ~t~22+ Modelo:~t ~w ~t~21+ Ano: ~w|\n", [Marca,Modelo,Ano]) + ). + +printAluguel(DataInicio, DataDevolucao, IDCarro) :- + buscarCarro(IDCarro), + DataInicio = date(YI,MI,DI), + DataDevolucao = date(YD,MD,DD), + calculaValor(DataInicio, DataDevolucao, IDCarro, Valor), + format("|Data de início do aluguel: ~w/~w/~w~n", [DI,MI,YI]), + format("|Data de devolução: ~w/~w/~w~n", [DD,MD,YD]), + format("|Valor total do aluguel: R$ ~w~n", [Valor]), + writeln(''). + +calculaValor(DataInicio, DataDevolucao, IDCarro, Valor) :- + date_get(today, DataAtual), + date_interval(DataInicio, DataAtual, QtdDiasAlugados days), + retornaDiaria(IDCarro, Diaria), + Valor is -1 * QtdDiasAlugados * Diaria. + +retornaDiaria(IDCarro, Diaria) :- + connectiondb:iniciandoDatabase(Connection), + dbop:db_parameterized_query(Connection, "SELECT diaria_carro FROM Carros WHERE id_carro = '%w'", [IDCarro], [row(Diaria)]), + connectiondb:encerrandoDatabase(Connection). + +verificaDevolucao(DataDevolucao, Resultado) :- + date_get(today, CurrentDay), + date_interval(CurrentDay, DataDevolucao, QtdDias days), + ( + QtdDias == 0 -> + Resultado = "Devolução dentro do prazo"; + QtdDias < 0 -> + Resultado = "Devolução adiantada"; + Resultado = "Devolução atrasada" + ). + +printDevolucao(Valor, IDCarro) :- + format("|Realizar pagamento do aluguel! \n|Valor total: R$ ~w\n\n", [Valor]), + write("|1. Confirmar pagamento\n|2. Cancelar\n|:"), + read_line_to_string(user_input, ConfirmaPagamento), + processarPagamento(ConfirmaPagamento, IDCarro, Valor). + +processarPagamento("1", IDCarro, ValorTotal) :- + connectiondb:iniciandoDatabase(Connection), + writeln("Pagamento realizado com sucesso!"), + writeln("Aluguel finalizado."), + dbop:db_parameterized_query_no_return(Connection, "UPDATE Alugueis SET status_aluguel = 'Concluído' WHERE id_carro = %w AND status_aluguel = 'ativo'", [IDCarro]), + dbop:db_parameterized_query_no_return(Connection, "UPDATE Carros SET status = 'D' WHERE id_carro = %w", [IDCarro]), + dbop:db_parameterized_query_no_return(Connection, "UPDATE Alugueis SET valor_total = %w WHERE id_carro = %w", [ValorTotal, IDCarro]), + connectiondb:encerrandoDatabase(Connection), + menuLocadora. +processarPagamento("2", _) :- + writeln("Operação cancelada!"), menuLocadora. +processarPagamento(_, _) :- + writeln("Opção inválida. Você será direcionado(a) ao menu inicial."), menuLocadora. + +enviaParaMecanico(IDCarro) :- + connectiondb:iniciandoDatabase(Connection), + db_parameterized_query_no_return(Connection, "UPDATE Carros SET status = 'R' WHERE id_carro = '%w'", [ID_Carro]), + connectiondb:encerrandoDatabase(Connection). + + +%DASHBOARD +menuDashboard :- + connectiondb:iniciandoDatabase(Connection), + + writeln(''), + writeln('|---------------------------|'), + writeln('|---------DASHBOARD---------|'), + writeln('|---------------------------|'), + writeln('|1. Receita total |'), + writeln('|2. Número de aluguéis |'), + writeln('|3. Total de carros |'), + writeln('|4. Carros mais defeituosos |'), + writeln('|5. Aluguéis por categoria |'), + writeln('Escolha uma opção (ou digite qualquer outra coisa para voltar ao menu principal):'), read_line_to_string(user_input, Opcao), + writeln(''), + (Opcao = "1" -> exibirReceitaTotal(Connection) ; + Opcao = "2" -> exibirNumeroDeAlugueis(Connection) ; + Opcao = "3" -> exibirTotalDeCarros(Connection) ; + Opcao = "4" -> exibirCarrosMaisDefeituosos(Connection) ; + Opcao = "5" -> exibirAlugueisPorCategoria(Connection) ; + writeln('Dígito inválido. Voltando ao menu principal.'), menuLocadora), + connectiondb:encerrandoDatabase(Connection). + + +mostraCarrosDefeituosos([]). +mostraCarrosDefeituosos([row( Marca,Modelo,) | Outros]) :- + format('|Marca:~t ~w ~t~22+ Modelo:~t ~w ~t~21+~n',[Marca, Modelo]), + mostraCarros(Outros). + +mostraAlugueisPorCategoria([]). +mostraAlugueisPorCategoria([row(Categoria, Qtd)|Outros]) :- + format('|~t ~w: ~t~15+ ~t ~w ~t~5+~n',[Categoria, Qtd]), + mostraAlugueisPorCategoria(Outros). + +calcularReceitaTotal(Connection, Total) :- + db_query(Connection, 'SELECT SUM(valor_total) FROM Alugueis', [row(Total)]). + +contarAlugueis(Connection, Count) :- + db_query(Connection, 'SELECT COUNT(*) FROM Alugueis', [row(Count)]). + +contarCarros(Connection, Count) :- + db_query(Connection, 'SELECT COUNT(*) FROM Carros', [row(Count)]). + +listarCarrosMaisDefeituosos(Connection, Carros) :- + db_query(Connection, "SELECT marca, modelo FROM Carros WHERE status = 'R'", [rows(Carros)]). + +listarAlugueisPorCategoria(Connection, Alugueis) :- + db_query(Connection, 'SELECT categoria, COUNT(*) FROM Alugueis JOIN Carros ON Alugueis.id_carro = Carros.id_carro GROUP BY categoria', [rows(Alugueis)]). + +exibirReceitaTotal(Connection) :- + calcularReceitaTotal(Connection, Total), + format('| Receita Total: ~w~n', [Total]), + menuDashboard. + +exibirNumeroDeAlugueis(Connection) :- + contarAlugueis(Connection, Count), + format('| Número de Aluguéis: ~w~n', [Count]), + menuDashboard. +exibirTotalDeCarros(Connection) :- + contarCarros(Connection, Count), + format('| Total de Carros: ~w~n', [Count]), + menuDashboard. + +exibirCarrosMaisDefeituosos(Connection) :- + listarCarrosMaisDefeituosos(Connection, Carros), + writeln('| Carros mais defeituosos:/n'), + mostraCarrosDefeituosos(Carros), + menuDashboard. + +exibirAlugueisPorCategoria(Connection) :- + listarAlugueisPorCategoria(Connection, Alugueis), + writeln('| Aluguéis por Categoria: /n'), + mostraAlugueisPorCategoria(Alugueis), + menuDashboard. + + +%REGISTRO_ALUGUEL_PESSOA +listarAlugueisPorPessoa :- + writeln('Digite o ID do cliente para listar os registros de aluguéis:'), + util:get_input('', ClienteIDStr), + writeln(''), + + (util:isANumber(ClienteID, ClienteIDStr) -> + connectiondb:iniciandoDatabase(Connection), + (clienteExiste(Connection, ClienteID) -> + user_operations:getAlugueisPorPessoa(Connection, ClienteID, Alugueis), + (length(Alugueis, NumRegistros), NumRegistros > 0 -> + writeln('|REGISTRO DE ALUGUEIS\n'), + mostrarRegistrosDeAlugueis(Connection, Alugueis) + ; + writeln('Não há registros de aluguéis para este cliente.') + ), + connectiondb:encerrandoDatabase(Connection) + ; + writeln('Cliente não encontrado na base de dados.') + ) + ; + writeln('ID de cliente inválido. Tente novamente.') + ). + +mostrarRegistrosDeAlugueis(_, []). +mostrarRegistrosDeAlugueis(Connection, [Registro | RegistrosRestantes]) :- + mostrarRegistroDeAluguel(Connection, Registro), + mostrarRegistrosDeAlugueis(Connection, RegistrosRestantes). + +mostrarRegistroDeAluguel(Connection, row(IDCarro, Marca, Ano, Modelo, DataInicio, DataDevolucao, Valor, Status)) :- + DataInicio = date(YI,MI,DI), + DataDevolucao = date(YD,MD,DD), + format('|Marca:~t ~w ~t~22+ Modelo:~t ~w ~t~21+ Ano: ~w~n', [Marca,Modelo,Ano]), + format('|Início: ~w/~w/~w Devolução: ~w/~w/~w~n', [DI,MI,YI,DD,MD,YD]), + format('|Valor: R$ ~w~n', [Valor]), + format('|Status: ~w~n', [Status]), writeln(''). + + + diff --git a/prolog/src/Controller/Mecanica.pl b/prolog/src/Controller/Mecanica.pl index c5b2bbf..62e7a4a 100644 --- a/prolog/src/Controller/Mecanica.pl +++ b/prolog/src/Controller/Mecanica.pl @@ -1,16 +1,82 @@ -:- module(Mecanica, [menuMecanica/0]). +:- module(Mecanica, [menuMecanica/0, carrosPraReparo/0, mostraCarros/1, carrosPraReparo/0, mostraCarros/1, + finalizarReparo/0, listarCarrosReparo/2]). :- use_module(library(odbc)). :- use_module(util). -:- use_module(dbop). +:- use_module('./localdb/connectiondb'). +:- use_module('./localdb/dbop'). +:- use_module('./localdb/user_operations'). menuMecanica :- writeln(''), - writeln('Menu:'), - writeln('1. Carros aguardando reparo'), - writeln('2. Marcar reparo como finalizado'), - writeln('0. Sair'), - writeln('Escolha uma opção:'), + writeln('|---------------------------------|'), + writeln('| MENU |'), + writeln('|---------------------------------|'), + writeln('|1. Carros aguardando reparo |'), + writeln('|2. Marcar reparo como finalizado |'), + writeln('|0. Sair |'), + writeln(''), + writeln('Escolha uma opção: '), read_line_to_string(user_input, Opcao), - writeln(''). + writeln(''), + + ( + Opcao = "1" -> carrosPraReparo, menuMecanica; + Opcao = "2" -> finalizarReparo, menuMecanica; + Opcao = "0" -> writeln('Saindo...\n'), halt; + writeln('Opção inválida. Por favor, escolha novamente.'), menuMecanica + ). + +carrosPraReparo :- + writeln("|------------------------------------------------------------------------------|"), + writeln("| CARROS COM DEFEITO |"), + writeln("|------------------------------------------------------------------------------|"), + connectiondb:iniciandoDatabase(Connection), + user_operations:consultarCarrosPraReparo(Connection,ListaCarros), + mostraCarros(ListaCarros), + writeln("|------------------------------------------------------------------------------|\n\n\n"), + connectiondb:encerrandoDatabase(Connection). + +mostraCarros([]). +mostraCarros([row(Id, Marca, Modelo, Ano, Placa) | Outros]) :- + format('|Id:~t ~w ~t~7+ Marca:~t ~w ~t~22+ Modelo:~t ~w ~t~21+ Ano: ~w Placa: ~w|~n',[ Id, Marca, Modelo, Ano, Placa]), + mostraCarros(Outros). + +finalizarReparo :- + connectiondb:iniciandoDatabase(Connection), + user_operations:consultarCarrosPraReparo(Connection, Carros) , + + (Carros = [] -> + writeln('Não há carros em reparo para finalizar.'); + carrosPraReparo, % Função para listar os carros em reparo + writeln('Informe o ID do carro a ser finalizado o reparo:'), + read_line_to_string(user_input, CarroIdStr), + atom_number(CarroIdStr, CarroId), + ( + user_operations:carroPraReparo(Connection, CarroId) -> + writeln('Há algum valor a ser pago para o reparo? (0 para nenhum valor):'), + read_line_to_string(user_input, ValorReparoStr), + atom_number(ValorReparoStr, ValorReparo), + + dbop:db_parameterized_query(Connection, "SELECT id_aluguel FROM Alugueis WHERE id_carro = %w AND status_aluguel = 'ativo'", [CarroId], [row(AluguelId)]), + dbop:db_parameterized_query_no_return(Connection, "UPDATE Alugueis SET valor_total = valor_total + %d WHERE id_aluguel = %d", [ValorReparo,AluguelId]), + dbop:db_parameterized_query_no_return(Connection, "UPDATE Alugueis SET status_aluguel = 'Concluído' WHERE id_carro = %w AND status_aluguel = 'ativo'", [CarroId]), + dbop:db_parameterized_query_no_return(Connection, "UPDATE Carros SET status = 'D' WHERE id_carro = %w", [CarroId]), + + (ValorReparo > 0 -> + writeln('Valor do reparo computado.'); + writeln('Reparo finalizado com sucesso!') + ); + writeln('O carro selecionado não está em reparo.') + ) + ), + + + connectiondb:encerrandoDatabase(Connection). + +<<<<<<< HEAD +======= + +>>>>>>> 48d18d67d1f789464bd8aebf63961b491138373b + diff --git a/prolog/src/Controller/User.pl b/prolog/src/Controller/User.pl index 14c359e..6300949 100644 --- a/prolog/src/Controller/User.pl +++ b/prolog/src/Controller/User.pl @@ -1,4 +1,5 @@ -:- module(usuarios, [solicitarCadastro/0, login/0, menu/0, usuario/4, menuCliente/0]). +:- module(usuarios, [solicitarCadastro/0, login/0, menu/0, usuario/4, menuCliente/0, + listarCarrosPorCategoria/1, printCarros/1]). :- use_module(library(odbc)). :- use_module('./localdb/connectiondb'). :- use_module('./localdb/dbop'). @@ -10,10 +11,13 @@ menu :- writeln(''), - writeln('Menu:'), - writeln('1. Logar'), - writeln('2. Cadastrar'), - writeln('0. Sair'), + writeln('|------------------|'), + writeln('| MENU |'), + writeln('|------------------|'), + writeln('|1. Logar |'), + writeln('|2. Cadastrar |'), + writeln('|0. Sair |'), + writeln(''), writeln('Escolha uma opção:'), read_line_to_string(user_input, Opcao), escolherOpcao(Opcao). @@ -52,7 +56,8 @@ ) ; writeln(''), - writeln('E-mail ou senha inválidos!') + writeln('E-mail ou senha inválidos!'), + menu ). authenticate(Connection, NomeUsuario, Email, Senha, TipoUsuario, UserID, Autenticado) :- @@ -67,26 +72,6 @@ TipoUsuario = none ). -menuCliente :- - writeln(''), - writeln('Menu do Cliente:'), - writeln('1. Listar carros por categoria'), - writeln('2. Realizar aluguel'), - writeln('3. Cancelar aluguel'), - writeln('4. Ranking de Carros Mais Alugados'), - writeln('Escolha uma opção:'), - - read_line_to_string(user_input, Opcao), - - (Opcao = "1" -> listarCarrosPorCategoria, menuCliente; - Opcao = "2" -> - realizarAluguel(Connection), - menuCliente; - Opcao = "3" -> - cancelarAluguel(Connection), - menuCliente; - Opcao = "4" -> rankingCarrosMaisAlugados, menuCliente; - writeln('Opção inválida. Por favor, escolha novamente.'), menuCliente). solicitarCadastro :- writeln(''), @@ -155,8 +140,81 @@ connectiondb:encerrandoDatabase(Connection). + +menuCliente :- + writeln(''), + writeln('|------------------------------------|'), + writeln('| MENU CLIENTE |'), + writeln('|------------------------------------|'), + writeln('|1. Listar carros por categoria |'), + writeln('|2. Realizar aluguel |'), + writeln('|3. Cancelar aluguel |'), + writeln('|4. Ranking de Carros Mais Alugados |'), + writeln('|0. Sair |'), + writeln(''), + writeln('Escolha uma opção:'), + + read_line_to_string(user_input, Opcao), + writeln(''), + + (Opcao = "1" -> listarCarrosPorCategoria(Connection), menuCliente; + Opcao = "2" -> realizarAluguel(Connection), menuCliente; + Opcao = "3" -> cancelarAluguel, menuCliente; + Opcao = "4" -> rankingCarrosMaisAlugados, menuCliente; + Opcao = "0" -> writeln('Saindo...\n'), halt; + writeln('Opção inválida. Por favor, escolha novamente.'), menuCliente). + +%LISTAR_CARROS +listarCarrosPorCategoria(Connection) :- + writeln("|---Opções de Categoria:---|"), + writeln("|1. Econômico--------------|"), + writeln("|2. Intermediário----------|"), + writeln("|3. SUV--------------------|"), + writeln("|4. Luxo-------------------|"), + writeln("|5. Minivan----------------|"), + writeln("|6. Sedan------------------|"), + writeln("|7. Conversível------------|"), + writeln("|8. Esportivo--------------|"), + writeln("|9. Pickup-----------------|"), + writeln("|10. Elétrico--------------|"), + writeln(""), + write("|Escolha a categoria de carro desejada (Exemplo: 3): \n|:"), + + read_line_to_string(user_input, Categoria), + writeln(''), + buscarCarrosPorCategoria(Connection, Categoria). + +buscarCarrosPorCategoria(Connection, Categoria) :- + (Categoria = "1" -> CategoriaEscolhida = "Econômico"; + Categoria = "2" -> CategoriaEscolhida = "Intermediário"; + Categoria = "3" -> CategoriaEscolhida = "SUV"; + Categoria = "4" -> CategoriaEscolhida = "Luxo"; + Categoria = "5" -> CategoriaEscolhida = "Minivan"; + Categoria = "6" -> CategoriaEscolhida = "Sedan"; + Categoria = "7" -> CategoriaEscolhida = "Conversível"; + Categoria = "8" -> CategoriaEscolhida = "Esportivo"; + Categoria = "9" -> CategoriaEscolhida = "Pickup"; + Categoria = "10" -> CategoriaEscolhida = "Elétrico"; + writeln('Opção inválida. Por favor, escolha novamente.\n'), listarCarrosPorCategoria(Connection)), + + consultarCarrosPorCategoria(Connection, CategoriaEscolhida, Carros), + + writeln('|------------------------------------------------------------|'), + format('|------------ Carros disponíveis na categoria ~t~w ~t~2|-------------|\n',[Categoria]), + writeln('|------------------------------------------------------------|'), + + printCarros(Carros), + menuCliente. + +printCarros([]). +printCarros([row(ID_Carro, Marca, Modelo, Ano) | RestoCarros]) :- + format('|Id:~t ~w ~t~8+ Marca:~t ~w ~t~22+ Modelo:~t ~w ~t~21+ Ano: ~w|',[ ID_Carro, Marca, Modelo, Ano]), + nl, + printCarros(RestoCarros). + + authenticateCar(Connection, CarroID, DiariaCarro, Autenticado) :- - getCarro(Connection, CarroID, CarroInfo), + user_operations:getCarro(Connection, CarroID, CarroInfo), (CarroInfo = [row(_, _, _, _, _, _, _, _, DiariaCarro, _)] -> Autenticado = 1 ; @@ -190,7 +248,7 @@ (ConfirmaChar = '1' -> writeln(''), - alugar(Connection, UserID, CarroID, DiasAluguel, ValorTotal), + user_operations:alugar(Connection, UserID, CarroID, DiasAluguel, ValorTotal), writeln('Aluguel realizado com sucesso!') ; writeln(''), @@ -201,48 +259,3 @@ writeln('Carro não encontrado.') ). - - -cancelarAluguel(Connection) :- - current_user_id(UserID), - iniciandoDatabase(Connection), - buscarAlugueisPorUsuario(Connection, UserID, Alugueis), - writeln(''), - ( Alugueis = [] - -> writeln('Nenhum aluguel encontrado para este usuário.'), - menuCliente - ; writeln('ID do Aluguel | ID do Carro | Valor Total'), - writeln('--------------------------------------------'), - maplist(printAluguelInfo, Alugueis), - writeln('Digite o ID do aluguel que deseja cancelar:'), - read_line_to_string(user_input, AluguelIDStr), - atom_number(AluguelIDStr, AluguelId), - writeln(''), - verificaTempoAluguel(Connection, AluguelId, Tempo), - ( Tempo =:= 0 - -> writeln('Aluguel possível de ser cancelado.'), - writeln(''), - writeln('Deseja confirmar o cancelamento desse aluguel?'), - writeln('1. Sim'), - writeln('2. Não'), - read_line_to_string(user_input, ConfirmaComNL), - atom_chars(ConfirmaComNL, [ConfirmaChar|_]), - ( ConfirmaChar = '1' - -> Q1 = "UPDATE Alugueis SET status_aluguel = 'cancelado' WHERE id_aluguel = '%w'", - db_parameterized_query_no_return(Connection, Q1, [AluguelId]), - Q2 = "UPDATE carros SET status = 'D' WHERE id_carro = (SELECT id_carro FROM Alugueis WHERE id_aluguel = '%w')", - db_parameterized_query_no_return(Connection, Q2, [AluguelId]), - writeln(''), - writeln('Aluguel cancelado com sucesso!'), - writeln(''), - menuCliente - ; ConfirmaChar = '2' - -> menuCliente - ; writeln('Opção inválida. Por favor, escolha novamente.'), - menuCliente - ) - ; writeln('Aluguel não é possível ser cancelado, pois faz mais de um dia que o aluguel foi iniciado.') - ), - menuCliente - ). - diff --git a/prolog/src/LocalDB/user_operations.pl b/prolog/src/LocalDB/user_operations.pl index 39e2211..b43d77e 100644 --- a/prolog/src/LocalDB/user_operations.pl +++ b/prolog/src/LocalDB/user_operations.pl @@ -1,4 +1,4 @@ -:- module(user_operations, [createUser/6, getUserByEmail/3, getTipoByEmail/3, getUser/4, userAlreadyExists/3, getusuariosByEmail/4, alugar/5, getCarro/3, buscarAlugueisPorUsuario/3, printAluguelInfo/1, verificaTempoAluguel/3]). + :- use_module(library(odbc)). :- use_module('./util.pl'). :- use_module('./dbop.pl'). @@ -19,31 +19,41 @@ getUserByEmail(Connection, Email, User), length(User, Confirmacao). +clienteExiste(Connection, ClienteID) :- + Q = "SELECT COUNT(*) FROM usuarios WHERE id_usuario = %w", + db_parameterized_query(Connection, Q, [ClienteID], [row(CountRow)]), + + % Verificar se a contagem é maior que zero + (CountRow > 0). -getusuariosByEmail(Connection, [ Email | T ], usuariosTemp, usuarios):- +getusuariosByEmail(Connection, [Email | T], usuariosTemp, usuarios) :- length(T, L), (L > 0 -> getUserByEmail(Connection, Email, User), - getusuariosByEmail(Connection, T, [ User | usuariosTemp ], usuarios) ; - getUserByEmail(Connection, Email, User), - reverse([ User | usuariosTemp ], usuarios) + getusuariosByEmail(Connection, T, [User | usuariosTemp], usuarios); + getUserByEmail(Connection, Email, User), + reverse([User | usuariosTemp], usuarios) ). -createUser(Connection, Email, Senha, Nome, Sobrenome, Confirmacao):- + +createUser(Connection, Email, Senha, Nome, Sobrenome, Confirmacao) :- userAlreadyExists(Connection, Email, Fstconf), - ( Fstconf =:= 0 -> + (Fstconf =:= 0 -> db_parameterized_query_no_return( Connection, "INSERT INTO usuarios (nome, sobrenome, email, senha) values ('%w','%w','%w','%w');", - [ Nome, Sobrenome, Email, Senha]), + [Nome, Sobrenome, Email, Senha] + ), Confirmacao is 1; - Confirmacao is 0). + Confirmacao is 0 + ). + alugar(Connection, UserID, CarroID, DiasAluguel, ValorTotal) :- db_parameterized_query_no_return( Connection, - "INSERT INTO Alugueis (id_carro, id_usuario, data_inicio, data_devolucao, valor_total, status_aluguel) VALUES (%w, %w, CURRENT_DATE, CURRENT_DATE + interval '%w day', %w, 'ativo');", + "INSERT INTO alugueis (id_carro, id_usuario, data_inicio, data_devolucao, valor_total, status_aluguel) VALUES (%w, %w, current_date, current_date + interval '%w day', %w, 'ativo');", [CarroID, UserID, DiasAluguel, ValorTotal] ), - % Atualizar o status do carro para 'O' (ou o status apropriado) na tabela "carros" + % Atualizar o status do carro para 'O' (ou o status apropriado) na tabela "Carros" db_parameterized_query_no_return( Connection, "UPDATE carros SET status = 'O' WHERE id_carro = %w;", @@ -51,8 +61,6 @@ ). getCarro(Connection, CarroID, CarroInfo) :- - Q = "SELECT * FROM carros WHERE id_carro = '%w'", - db_parameterized_query(Connection, Q, [CarroID], CarroInfo). % buscarAlugueisPorUsuario/3 buscarAlugueisPorUsuario(Connection, UserID, Alugueis) :- @@ -67,3 +75,4 @@ verificaTempoAluguel(Connection, AluguelId, Tempo) :- Q = "SELECT verificaTempoAluguel('%w')", db_parameterized_query(Connection, Q, [AluguelId], [row(Tempo)]). +