diff --git a/Projetos Python/CopilotStudio_Tutorial.md b/Projetos Python/CopilotStudio_Tutorial.md new file mode 100644 index 000000000..78c78617c --- /dev/null +++ b/Projetos Python/CopilotStudio_Tutorial.md @@ -0,0 +1,84 @@ +# 🚀 Guia Rápido: Criando um Agente no Copilot Studio + +Se você acabou de começar a explorar o **Microsoft Copilot Studio**, este guia é para você! Aqui você vai aprender como criar um agente (chatbot) de duas formas: + +1. Usando um prompt (modelo pré-definido) +2. Criando um agente do zero + +--- + +## 📌 O que é o Copilot Studio? + +O **Copilot Studio** é uma plataforma da Microsoft que permite criar **agentes de conversação (chatbots)** inteligentes usando IA. Ele é parte do ecossistema Power Platform e permite criar soluções com **fluxos de conversa, lógica personalizada e integração com APIs**. + +--- + +## 🧠 1. Criando um agente usando prompt (modelo pré-definido) + +### Passos: + +1. **Acesse** o portal: [https://copilotstudio.microsoft.com](https://copilotstudio.microsoft.com) +2. Clique em **“Criar agente”** +3. Escolha a opção **"Descrever o que o agente deve fazer"** +4. No campo de prompt, **digite uma descrição do que você quer**, por exemplo: + + Quero um agente que ajude clientes a acompanhar pedidos online. + +6. O Copilot irá **gerar um agente base automaticamente**, com fluxos e intenções pré-configurados. +7. Revise e ajuste os tópicos/conversas criadas, se necessário. +8. Clique em **Publicar** para disponibilizar seu agente. + +✅ **Vantagem**: Rápido e fácil para começar, mesmo sem experiência. + +--- + +## 🛠️ 2. Criando um agente do zero + +### Passos: + +1. **Acesse** o portal: [https://copilotstudio.microsoft.com](https://copilotstudio.microsoft.com) +2. Clique em **“Criar agente”** +3. Escolha a opção **“Começar do zero”** +4. Dê um nome ao seu agente (ex: `AgenteAjudaTech`) +5. Escolha o idioma principal do agente +6. Depois de criado, vá até a seção **“Tópicos”** para começar a construir: + +- Clique em **“Novo tópico”** +- Defina **gatilhos** (palavras-chave ou frases que iniciam o tópico) +- Crie o **fluxo da conversa** com blocos de texto, perguntas e ações + +7. Use a aba **“Ações”** para conectar com APIs, fluxos do Power Automate, etc. +8. Teste seu agente no painel lateral. +9. Quando estiver pronto, clique em **Publicar**. + +✅ **Vantagem**: Total controle sobre o comportamento do agente. + +--- + +## 💡 Dicas para começar bem + +- Use linguagem simples nos prompts +- Teste sempre que fizer alterações +- Aproveite os **modelos prontos** para aprender com exemplos +- Você pode importar dados ou usar plugins e fluxos externos para deixar seu agente mais inteligente + +--- + +## 📎 Recursos úteis + +- [Documentação oficial do Copilot Studio](https://learn.microsoft.com/pt-br/microsoft-copilot-studio/) +- [Exemplos no Power Platform](https://powerusers.microsoft.com/) +- [Templates da comunidade](https://learn.microsoft.com/pt-br/microsoft-copilot-studio/samples/) + +--- + +## 🧪 Exemplo de prompt para criar um agente automático: + +Crie um agente que ajude funcionários a abrir chamados de TI e acompanhar o status. + +--- + +Feito por Lucas Siqueira + + + diff --git a/Projetos Python/SistemabancoPOO.py b/Projetos Python/SistemabancoPOO.py new file mode 100644 index 000000000..0409a7218 --- /dev/null +++ b/Projetos Python/SistemabancoPOO.py @@ -0,0 +1,311 @@ +import textwrap +from abc import ABC, abstractmethod +from datetime import datetime + + +class Usuario: + def __init__(self, endereco): + self.endereco = endereco + self.contas = [] + + def executar_transacao(self, conta, operacao): + operacao.processar(conta) + + def vincular_conta(self, conta): + self.contas.append(conta) + + +class Pessoa(Usuario): + def __init__(self, nome, nascimento, cpf, endereco): + super().__init__(endereco) + self.nome = nome + self.nascimento = nascimento + self.cpf = cpf + + +class ContaBancaria: + def __init__(self, numero, usuario): + self._numero = numero + self._usuario = usuario + self._agencia = "0001" + self._saldo = 0.0 + self._historico = RegistroOperacoes() + + @classmethod + def criar_conta(cls, usuario, numero): + return cls(numero, usuario) + + @property + def saldo(self): + return self._saldo + + @property + def numero(self): + return self._numero + + @property + def agencia(self): + return self._agencia + + @property + def cliente(self): + return self._usuario + + @property + def historico(self): + return self._historico + + def sacar(self, quantia): + if quantia <= 0: + print("\n@@@ Valor inválido para saque. @@@") + return False + + if quantia > self._saldo: + print("\n@@@ Saldo insuficiente. @@@") + return False + + self._saldo -= quantia + print("\n=== Saque realizado com sucesso! ===") + return True + + def depositar(self, quantia): + if quantia <= 0: + print("\n@@@ Valor inválido para depósito. @@@") + return False + + self._saldo += quantia + print("\n=== Depósito realizado com sucesso! ===") + return True + + +class ContaCorrente(ContaBancaria): + def __init__(self, numero, usuario, limite=500, saques_disponiveis=3): + super().__init__(numero, usuario) + self._limite = limite + self._saques_disponiveis = saques_disponiveis + + def sacar(self, quantia): + saques_realizados = len( + [op for op in self.historico.transacoes if op["tipo"] == Saque.__name__] + ) + + if quantia > self._limite: + print("\n@@@ Limite de saque excedido. @@@") + return False + + if saques_realizados >= self._saques_disponiveis: + print("\n@@@ Limite de saques atingido. @@@") + return False + + return super().sacar(quantia) + + def __str__(self): + return f"""\ + Agência:\t{self.agencia} + Conta:\t\t{self.numero} + Cliente:\t{self.cliente.nome} + """ + + +class RegistroOperacoes: + def __init__(self): + self._eventos = [] + + @property + def transacoes(self): + return self._eventos + + def registrar(self, operacao): + self._eventos.append({ + "tipo": operacao.__class__.__name__, + "valor": operacao.valor, + "data": datetime.now().strftime("%d-%m-%Y %H:%M:%S") + }) + + +class Operacao(ABC): + @property + @abstractmethod + def valor(self): + pass + + @abstractmethod + def processar(self, conta): + pass + + +class Saque(Operacao): + def __init__(self, valor): + self._valor = valor + + @property + def valor(self): + return self._valor + + def processar(self, conta): + if conta.sacar(self.valor): + conta.historico.registrar(self) + + +class Deposito(Operacao): + def __init__(self, valor): + self._valor = valor + + @property + def valor(self): + return self._valor + + def processar(self, conta): + if conta.depositar(self.valor): + conta.historico.registrar(self) + + +# Funções auxiliares +def menu(): + opcoes = """\n + ======== MENU PRINCIPAL ======== + [d] Depositar + [s] Sacar + [e] Extrato + [nu] Novo Usuário + [nc] Nova Conta + [lc] Listar Contas + [q] Sair + => """ + return input(textwrap.dedent(opcoes)) + + +def localizar_cliente(cpf, lista_clientes): + return next((c for c in lista_clientes if c.cpf == cpf), None) + + +def selecionar_conta(cliente): + if not cliente.contas: + print("\n@@@ Cliente ainda não possui conta bancária. @@@") + return None + return cliente.contas[0] # pode ser adaptado para permitir escolha + + +def criar_usuario(lista_usuarios): + cpf = input("CPF: ") + if localizar_cliente(cpf, lista_usuarios): + print("\n@@@ CPF já cadastrado. @@@") + return + + nome = input("Nome completo: ") + nascimento = input("Data de nascimento (dd-mm-aaaa): ") + endereco = input("Endereço (rua, número - bairro - cidade/UF): ") + + novo_usuario = Pessoa(nome, nascimento, cpf, endereco) + lista_usuarios.append(novo_usuario) + print("\n=== Usuário criado com sucesso! ===") + + +def abrir_conta(num_conta, lista_usuarios, lista_contas): + cpf = input("CPF do usuário: ") + usuario = localizar_cliente(cpf, lista_usuarios) + + if not usuario: + print("\n@@@ Usuário não encontrado. @@@") + return + + conta = ContaCorrente.criar_conta(usuario, num_conta) + lista_contas.append(conta) + usuario.vincular_conta(conta) + + print("\n=== Conta aberta com sucesso! ===") + + +def mostrar_contas(lista_contas): + for conta in lista_contas: + print("=" * 80) + print(str(conta)) + + +def executar_deposito(lista_usuarios): + cpf = input("CPF do cliente: ") + usuario = localizar_cliente(cpf, lista_usuarios) + + if not usuario: + print("\n@@@ Cliente não encontrado. @@@") + return + + conta = selecionar_conta(usuario) + if not conta: + return + + valor = float(input("Valor do depósito: ")) + op = Deposito(valor) + usuario.executar_transacao(conta, op) + + +def executar_saque(lista_usuarios): + cpf = input("CPF do cliente: ") + usuario = localizar_cliente(cpf, lista_usuarios) + + if not usuario: + print("\n@@@ Cliente não encontrado. @@@") + return + + conta = selecionar_conta(usuario) + if not conta: + return + + valor = float(input("Valor do saque: ")) + op = Saque(valor) + usuario.executar_transacao(conta, op) + + +def ver_extrato(lista_usuarios): + cpf = input("CPF do cliente: ") + usuario = localizar_cliente(cpf, lista_usuarios) + + if not usuario: + print("\n@@@ Cliente não encontrado. @@@") + return + + conta = selecionar_conta(usuario) + if not conta: + return + + print("\n========== EXTRATO ==========") + historico = conta.historico.transacoes + + if not historico: + print("Nenhuma movimentação realizada.") + else: + for item in historico: + print(f"{item['tipo']}:\tR$ {item['valor']:.2f} ({item['data']})") + + print(f"\nSaldo disponível:\tR$ {conta.saldo:.2f}") + print("=============================") + + +# Execução principal +def main(): + usuarios = [] + contas = [] + + while True: + escolha = menu() + + if escolha == "d": + executar_deposito(usuarios) + elif escolha == "s": + executar_saque(usuarios) + elif escolha == "e": + ver_extrato(usuarios) + elif escolha == "nu": + criar_usuario(usuarios) + elif escolha == "nc": + abrir_conta(len(contas) + 1, usuarios, contas) + elif escolha == "lc": + mostrar_contas(contas) + elif escolha == "q": + print("\n=== Encerrando o sistema. ===") + break + else: + print("\n@@@ Opção inválida. Tente novamente. @@@") + +# Iniciar sistema +main() diff --git a/Projetos Python/Sistemabancov1.py b/Projetos Python/Sistemabancov1.py new file mode 100644 index 000000000..00afd2cd1 --- /dev/null +++ b/Projetos Python/Sistemabancov1.py @@ -0,0 +1,74 @@ +# Menu +menu_inicial = """ + + [0] Depositar + [1] Sacar + [2] Extrato + [3] Sair + +==> """ + +# Variaveis iniciais +saldo = 0 +limite_p_saque = 500 +historico = "" +numero_saques = 0 +LIMITE_SAQUES = 3 + +while True: + + opcao = input(menu_inicial) + + # Depositar + if opcao == "0": + valor = float(input("Informe o valor do depósito: ")) + + if valor > 0: + saldo += valor + historico += f"Depósito: R$ {valor:.2f}\n" + + else: + print("A operação falhou! O valor informado é inválido.") + + # Sacar + elif opcao == "1": + valor = float(input("Informe o valor do saque: ")) + + excedeu_saldo = valor > saldo + + excedeu_limite = valor > limite_p_saque + + excedeu_saques = numero_saques >= LIMITE_SAQUES + + if excedeu_saldo: + print("A operação falhou! Você não tem saldo suficiente para realizar esta operação.") + + elif excedeu_limite: + print("A operação falhou! O valor do saque excede o limite máximo de R$ 500,00.") + + elif excedeu_saques: + print("A operação falhou! Número máximo de 3 saques foi excedido.") + + elif valor > 0: + saldo -= valor + historico += f"Saque: R$ {valor:.2f}\n" + numero_saques += 1 + + else: + print("A operação falhou! O valor informado é inválido.") + + # Extrato + elif opcao == "2": + print("\n================ EXTRATO ================") + print("Não há movimentações." if not historico else historico) + print(f"\nSaldo: R$ {saldo:.2f}") + print("==========================================") + + # Sair + elif opcao == "3": + break + + # Opção inválida + else: + print("A operação falhou, por favor selecione novamente a operação desejada.") + # Retorna ao menu novamente diff --git a/Projetos Python/Sistemabancov2.py b/Projetos Python/Sistemabancov2.py new file mode 100644 index 000000000..f38f18148 --- /dev/null +++ b/Projetos Python/Sistemabancov2.py @@ -0,0 +1,347 @@ +import textwrap +from datetime import datetime +from abc import ABC, abstractmethod + +# ==== CLASSES DO SISTEMA ==== + +# Representa o cliente do banco +class Usuario: + def __init__(self, endereco): + self.endereco = endereco # Onde o cliente mora + self.contas = [] # Lista de contas bancárias que ele possui + + # Serve para registrar uma operação (como saque ou depósito) + def registrar_movimento(self, conta, operacao): + if len(conta.atividades.transacoes_do_dia()) >= 2: + print("\n!!! Limite de transações diárias atingido !!!") + return + operacao.aplicar(conta) + + # Adiciona uma nova conta para o cliente + def vincular_conta(self, nova_conta): + self.contas.append(nova_conta) + +# Cliente com nome, data de nascimento e CPF +class Pessoa(Usuario): + def __init__(self, nome_completo, nascimento, doc_id, endereco): + super().__init__(endereco) + self.nome = nome_completo + self.data_nasc = nascimento + self.cpf = doc_id + + +# Conta básica do banco (modelo genérico) +class ContaBancaria: + def __init__(self, codigo, dono): + self._disponivel = 0 # Saldo da conta + self._codigo = codigo # Número da conta + self._ag = "0001" # Agência fixa + self._titular = dono # Quem é o dono da conta + self._atividades = Registro() # Histórico de transações + + @classmethod + def criar(cls, dono, codigo): + return cls(codigo, dono) + + # Abaixo estão os "atalhos" (propriedades) para acessar os dados + @property + def saldo(self): + return self._disponivel + + @property + def codigo(self): + return self._codigo + + @property + def agencia(self): + return self._ag + + @property + def titular(self): + return self._titular + + @property + def atividades(self): + return self._atividades + + # Método para fazer saque + def retirar(self, quantia): + if quantia > self.saldo: + print("\n!!! Saldo insuficiente !!!") + elif quantia <= 0: + print("\n!!! Valor inválido para saque !!!") + else: + self._disponivel -= quantia + print("\n>>> Saque efetuado com sucesso!") + return True + return False + + # Método para fazer depósito + def adicionar(self, quantia): + if quantia > 0: + self._disponivel += quantia + print("\n>>> Depósito realizado com sucesso!") + return True + else: + print("\n!!! Valor de depósito inválido !!!") + return False + + +# Conta com regras específicas, como limite e número máximo de saques +class ContaCorrente(ContaBancaria): + def __init__(self, codigo, dono, maximo=500, limite_operacoes=3): + super().__init__(codigo, dono) + self._limite = maximo # Valor máximo por saque + self._max_operacoes = limite_operacoes # Número máximo de saques + + @classmethod + def criar(cls, dono, codigo, maximo, limite_operacoes): + return cls(codigo, dono, maximo, limite_operacoes) + + # Reescrevendo o método de saque para aplicar as regras da conta corrente + def retirar(self, quantia): + total_saques = len([ + mov for mov in self.atividades.transacoes + if mov["tipo"] == Retirada.__name__ + ]) + + if quantia > self._limite: + print("\n!!! Saque excede limite permitido por operação !!!") + elif total_saques >= self._max_operacoes: + print("\n!!! Número de saques excedido para hoje !!!") + else: + return super().retirar(quantia) + + return False + + # Como o objeto aparece quando você imprime ele + def __str__(self): + return f"""\ + Agência: {self.agencia} + Conta: {self.codigo} + Cliente: {self.titular.nome} + """ + + +# Guarda todas as transações feitas na conta +class Registro: + def __init__(self): + self._transacoes = [] + + @property + def transacoes(self): + return self._transacoes + + # Adiciona uma transação no histórico + def gravar(self, movimento): + self._transacoes.append({ + "tipo": movimento.__class__.__name__, + "valor": movimento.valor, + "momento": datetime.datetime.now().strftime("%d-%m-%Y %H:%M:%S"), + }) + + # Gera uma lista com todas ou algumas transações (filtradas) + def gerar_extrato(self, tipo=None): + for item in self._transacoes: + if tipo is None or item["tipo"].lower() == tipo.lower(): + yield item + + # Retorna só as transações feitas no dia atual + def transacoes_do_dia(self): + hoje = datetime.datetime.now().date() + return [ + mov for mov in self._transacoes + if datetime.strptime(mov["momento"], "%d-%m-%Y %H:%M:%S").date() == hoje + ] + + +# ==== CLASSES DE TRANSAÇÕES (Saque / Depósito) ==== + +class Movimento(ABC): + @property + @abstractmethod + def valor(self): + pass + + @abstractmethod + def aplicar(self, conta): + pass + +# Classe para saque +class Retirada(Movimento): + def __init__(self, valor): + self._valor = valor + + @property + def valor(self): + return self._valor + + def aplicar(self, conta): + sucesso = conta.retirar(self.valor) + if sucesso: + conta.atividades.gravar(self) + +# Classe para depósito +class Aporte(Movimento): + def __init__(self, valor): + self._valor = valor + + @property + def valor(self): + return self._valor + + def aplicar(self, conta): + sucesso = conta.adicionar(self.valor) + if sucesso: + conta.atividades.gravar(self) + + +# ==== FUNÇÕES AUXILIARES ==== # + +def menu(): + opcoes = """\n + ======= OPÇÕES DISPONÍVEIS ======== + [1] Depositar + [2] Sacar + [3] Extrato + [4] Novo cliente + [5] Nova conta + [6] Contas cadastradas + [0] Encerrar + => """ + return input(textwrap.dedent(opcoes)) + +# Procura um cliente pelo CPF +def localizar_usuario(doc_id, usuarios): + filtrados = [u for u in usuarios if u.cpf == doc_id] + return filtrados[0] if filtrados else None + +# Pega a primeira conta de um cliente +def acessar_conta(usuario): + if not usuario.contas: + print("\n!!! Cliente não possui conta cadastrada !!!") + return None + return usuario.contas[0] + +# Faz um depósito +def fazer_deposito(clientes): + cpf = input("Informe o CPF do cliente: ") + cliente = localizar_usuario(cpf, clientes) + + if not cliente: + print("\n!!! CPF não encontrado !!!") + return + + valor = float(input("Valor a depositar: ")) + transacao = Aporte(valor) + conta = acessar_conta(cliente) + + if conta: + cliente.registrar_movimento(conta, transacao) + +# Faz um saque +def fazer_saque(clientes): + cpf = input("Informe o CPF do cliente: ") + cliente = localizar_usuario(cpf, clientes) + + if not cliente: + print("\n!!! CPF não encontrado !!!") + return + + valor = float(input("Valor a sacar: ")) + transacao = Retirada(valor) + conta = acessar_conta(cliente) + + if conta: + cliente.registrar_movimento(conta, transacao) + +# Mostra o extrato da conta +def mostrar_extrato(clientes): + cpf = input("CPF do cliente: ") + cliente = localizar_usuario(cpf, clientes) + + if not cliente: + print("\n!!! CPF não encontrado !!!") + return + + conta = acessar_conta(cliente) + + if not conta: + return + + print("\n======== EXTRATO ==========") + transacoes = list(conta.atividades.gerar_extrato()) + if not transacoes: + print("Sem movimentações registradas.") + else: + for t in transacoes: + print(f"{t['momento']} | {t['tipo']}: R$ {t['valor']:.2f}") + print(f"\nSaldo atual: R$ {conta.saldo:.2f}") + print("============================") + +# Cadastra um novo cliente +def criar_usuario(clientes): + cpf = input("CPF (apenas números): ") + if localizar_usuario(cpf, clientes): + print("\n!!! Cliente já cadastrado com este CPF !!!") + return + + nome = input("Nome completo: ") + nascimento = input("Data de nascimento (dd-mm-aaaa): ") + endereco = input("Endereço (rua, número - bairro - cidade/UF): ") + + novo = Pessoa(nome_completo=nome, nascimento=nascimento, doc_id=cpf, endereco=endereco) + clientes.append(novo) + print("\n>>> Novo cliente registrado com sucesso!") + +# Cria uma nova conta para um cliente existente +def criar_nova_conta(numero, clientes, contas): + cpf = input("CPF do titular: ") + cliente = localizar_usuario(cpf, clientes) + + if not cliente: + print("\n!!! CPF não encontrado. Conta não criada. !!!") + return + + conta = ContaCorrente.criar(cliente, numero, maximo=500, limite_operacoes=3) + contas.append(conta) + cliente.vincular_conta(conta) + print("\n>>> Conta aberta com sucesso!") + +# Lista todas as contas criadas +def listar_todas(contas): + for conta in contas: + print("=" * 40) + print(str(conta)) + + +# ==== FUNÇÃO PRINCIPAL (MENU) ==== +def main(): + clientes = [] + contas = [] + + while True: + opcao = menu() + + if opcao == "1": + fazer_deposito(clientes) + elif opcao == "2": + fazer_saque(clientes) + elif opcao == "3": + mostrar_extrato(clientes) + elif opcao == "4": + criar_usuario(clientes) + elif opcao == "5": + numero = len(contas) + 1 + criar_nova_conta(numero, clientes, contas) + elif opcao == "6": + listar_todas(contas) + elif opcao == "0": + print("\n>>> Sistema encerrado. Até logo!") + break + else: + print("\n!!! Opção inválida, tente novamente !!!") + + +# Inicia o programa +main() diff --git a/README.md b/README.md index 0831f58c9..bd4d76252 100644 --- a/README.md +++ b/README.md @@ -1 +1,12 @@ -# Trilha Python DIO +# 🐍 Curso de Python - DIO + +Este repositório contém os materiais, códigos e exercícios desenvolvidos durante o curso de Python oferecido pela [DIO](https://www.dio.me/). O objetivo é consolidar os conceitos fundamentais da linguagem e aplicar na prática com projetos simples e didáticos. + +## 📚 Conteúdo abordado +- Sintaxe básica e tipos de dados +- Estruturas de controle +- Funções e módulos +- Manipulação de arquivos +- Programação orientada a objetos +- Projetos práticos com Python +