Componentes: Gustavo R. B. Franco, Heitor L. da Rocha, Rafael Gneipel e Ricardo Hermes.
Objetivos: Um programa para registrar ordens de compra e serviço, contendo data, placa do veículo, produtos ou serviços e seus valores, e ao final gerar um relatório para conferência e fechamento dos valores, auxiliando fornecedor/oficina na emissão da nota fiscal. Funcionalidades: Registrar ordens, visualizar ordens salvas, excluir ordens se necessário, gerar um relatório com valor total para fechamento.
Metodologia de desenvolvimento: O sistema foi desenvolvido a partir dos conteúdos trabalhados em sala de aula sobre programação orientada a objetos em Python, usando na prática conceitos como classes, herança, polimorfismo e encapsulamento. Durante o processo, foi utilizado o apoio de uma inteligência artificial para ajudar a identificar e corrigir erros lógicos no código, além de sugerir melhorias na organização e na escrita do programa, deixando a solução mais clara e robusta sem fugir do que foi ensinado pelo professor.
# -*- coding: utf-8 -*-
"""Trabalho_IPOO
Automatically generated by Colab.
Original file is located at
https://colab.research.google.com/drive/1t0-JAl6dB6H2brti3hos8iQkXLk1The8
"""
from datetime import datetime
import re
#(regex) para realizar buscas de padrões, substituir texto e dividir strings de forma complexa
class Veiculo:
def __init__(self, placa):
self.__placa = placa
class Item:
def __init__(self, descricao, quantidade, preco_unitario):
self.__descricao = descricao
self.__quantidade = quantidade
self.__preco_unitario = preco_unitario
def calcular_total(self):
return self.__quantidade * self.__preco_unitario
def tipo_item(self):
return "Item"
class Servico(Item):
def __init__(self, descricao, preco_unitario):
super().__init__(descricao, 1, preco_unitario)
def tipo_item(self):
return "Serviço"
class Produto(Item):
def __init__(self, descricao, quantidade, preco_unitario):
super().__init__(descricao, quantidade, preco_unitario)
def tipo_item(self):
return "Produto"
class Ordem:
__contador = 0
def __init__(self, veiculo, data):
Ordem.__contador += 1
self.__numero = Ordem.__contador
self.__veiculo = veiculo
self.__data = data
self.__itens = []
def adicionar_item(self, item):
self.__itens.append(item)
def calcular_total(self):
total = 0
for item in self.__itens:
total += item.calcular_total()
return total
def mostrar_detalhes(self):
print(f"\n{'='*95}\n{'ORDEM Nº '+str(self.__numero):^95}\n{'='*95}\nData: {self.__data}\nPlaca: {self.__veiculo._Veiculo__placa}\n{'-'*95}\n{'TIPO':<15} {'DESCRIÇÃO':<35} {'QTD':<8} {'PREÇO UNIT.':<17} {'SUBTOTAL':<17}\n{'-'*95}")
for item in self.__itens:
print(f"{item.tipo_item():<15} {item._Item__descricao:<35} {item._Item__quantidade:<8.1f} R$ {item._Item__preco_unitario:<15.2f} R$ {item.calcular_total():<15.2f}")
print(f"{'-'*95}\n{'TOTAL:':<77} R$ {self.calcular_total():>13.2f}\n{'='*95}")
def obter_servicos(self):
servicos = []
for item in self.__itens:
if item.tipo_item() == 'Serviço': servicos.append(item._Item__descricao)
return ', '.join(servicos) if servicos else '-'
def obter_produtos(self):
produtos = []
for item in self.__itens:
if item.tipo_item() == 'Produto': produtos.append(item._Item__descricao)
return ', '.join(produtos) if produtos else '-'
class SistemaOrdens:
def __init__(self):
self.__ordens = []
def menu(self):
sair = False
while not sair:
print(f"\n{'='*40}\n{'ORDENS DE SERVIÇO':^40}\n{'='*40}\n1. Adicionar\n2. Ver Ordens\n3. Excluir\n4. Sair\n{'='*40}")
opcao = input("\nOpção: ")
if opcao == '1': self.adicionar_ordem()
elif opcao == '2': self.ver_ordem()
elif opcao == '3': self.excluir_ordem()
elif opcao == '4':
print("\nEncerrando...")
sair = True
else: print("\nInválido!")
def adicionar_ordem(self):
print("\nNOVA ORDEM")
data = self.validar_data()
placa = self.validar_placa()
ordem = Ordem(Veiculo(placa), data)
continuar = True
while continuar:
print(f"\nOrdem {ordem._Ordem__numero} - Total: R$ {ordem.calcular_total():.2f}")
tipo = input("Adicionar [S]erviço, [P]roduto ou [F]inalizar: ").upper()
if tipo == 'F':
continuar = False
elif tipo == 'S':
descricao = input("Descrição: ")
preco = self.validar_numero("Valor: R$ ")
ordem.adicionar_item(Servico(descricao, preco))
print(f"Adicionado! Subtotal: R$ {ordem._Ordem__itens[-1].calcular_total():.2f}")
elif tipo == 'P':
descricao = input("Descrição: ")
qtd = self.validar_numero("Qtd: ")
preco = self.validar_numero("Preço: R$ ")
ordem.adicionar_item(Produto(descricao, qtd, preco))
print(f"Adicionado! Subtotal: R$ {ordem._Ordem__itens[-1].calcular_total():.2f}")
else:
print("Inválido!")
self.__ordens.append(ordem)
print(f"\nOrdem {ordem._Ordem__numero} finalizada!")
def ver_ordem(self):
if not self.__ordens:
print("\nNenhuma ordem.")
return
continuar = True
while continuar:
print(f"\n{'='*115}\n{'ORDENS':^115}\n{'='*115}\n{'Nº':<5} {'Data':<12} {'Placa':<12} {'Serviços':<35} {'Produtos':<35} {'Total':>13}\n{'-'*115}")
total_geral = 0
for ordem in self.__ordens:
valor = ordem.calcular_total()
total_geral += valor
servicos = self.quebrar_texto(ordem.obter_servicos(), 35)
produtos = self.quebrar_texto(ordem.obter_produtos(), 35)
max_linhas = max(len(servicos), len(produtos))
for i in range(max_linhas):
if i == 0:
serv = servicos[i] if i < len(servicos) else ''
prod = produtos[i] if i < len(produtos) else ''
print(f"{ordem._Ordem__numero:<5} {ordem._Ordem__data:<12} {ordem._Ordem__veiculo._Veiculo__placa:<12} {serv:<35} {prod:<35} R$ {valor:>11.2f}")
else:
serv = servicos[i] if i < len(servicos) else ''
prod = produtos[i] if i < len(produtos) else ''
print(f"{'':<5} {'':<12} {'':<12} {serv:<35} {prod:<35} {'':<16}")
print(f"{'-'*115}\n{'TOTAL GERAL:':<100} R$ {total_geral:>11.2f}\n{'='*115}")
numero = input("\nDigite o numero da ordem para ver detalhes (Enter p/ Voltar): ")
if numero == '':
continuar = False
elif numero.isdigit():
num = int(numero)
for ordem in self.__ordens:
if ordem._Ordem__numero == num:
ordem.mostrar_detalhes()
continuar = False
else:
print("Número inválido!")
def excluir_ordem(self):
if not self.__ordens:
print("\nNenhuma ordem.")
return
print(f"\n{'='*115}\n{'ORDENS':^115}\n{'='*115}\n{'Nº':<5} {'Data':<12} {'Placa':<12} {'Serviços':<35} {'Produtos':<35} {'Total':>13}\n{'-'*115}")
for ordem in self.__ordens:
servicos = self.quebrar_texto(ordem.obter_servicos(), 35)
produtos = self.quebrar_texto(ordem.obter_produtos(), 35)
max_linhas = max(len(servicos), len(produtos))
for i in range(max_linhas):
if i == 0:
serv = servicos[i] if i < len(servicos) else ''
prod = produtos[i] if i < len(produtos) else ''
print(f"{ordem._Ordem__numero:<5} {ordem._Ordem__data:<12} {ordem._Ordem__veiculo._Veiculo__placa:<12} {serv:<35} {prod:<35} R$ {ordem.calcular_total():>11.2f}")
else:
serv = servicos[i] if i < len(servicos) else ''
prod = produtos[i] if i < len(produtos) else ''
print(f"{'':<5} {'':<12} {'':<12} {serv:<35} {prod:<35} {'':<16}")
print('='*115)
numero = input("\nDigite o numero da ordem para excluir: ")
if numero.isdigit():
num = int(numero)
for i, ordem in enumerate(self.__ordens):
if ordem._Ordem__numero == num:
self.__ordens.pop(i)
print(f"Ordem {num} excluída!")
return
print("Ordem não encontrada!")
else:
print("Número inválido!")
def validar_data(self):
valido = False
while not valido:
data = input("Data: ")
if len(data) == 10 and data[2] == '/' and data[5] == '/':
valido = True
else:
print("Formato inválido!")
return data
def validar_placa(self):
valido = False
while not valido:
placa = input("Placa: ").upper()
if len(placa) == 8 and placa[3] == '-':
valido = True
else:
print("Formato inválido!")
return placa
def validar_numero(self, msg):
valido = False
valor = 0.0
while not valido:
entrada = input(msg)
if entrada.replace('.', '', 1).replace(',', '', 1).isdigit():
valor = float(entrada.replace(',', '.'))
if valor > 0:
valido = True
else:
print("Deve ser > 0!")
else:
print("Inválido!")
return valor
def quebrar_texto(self, texto, largura):
if len(texto) <= largura:
return [texto]
linhas = []
while len(texto) > largura:
quebra = texto.rfind(',', 0, largura)
if quebra == -1:
quebra = largura
else:
quebra += 1
linhas.append(texto[:quebra].strip())
texto = texto[quebra:].strip()
if texto:
linhas.append(texto)
return linhas
sistema = SistemaOrdens()
sistema.menu()