SHOW:
|
|
- or go back to the newest paste.
| 1 | # -*- coding: utf-8 -*- | |
| 2 | ||
| 3 | import webbrowser | |
| 4 | ||
| 5 | from string import Template | |
| 6 | from constantes import * | |
| 7 | ||
| 8 | from helpers import leer_archivo, mostrar_texto | |
| 9 | ||
| 10 | ||
| 11 | class ModeloDePresupuesto: | |
| 12 | ||
| 13 | # Datos comerciales | |
| 14 | titulo = "PRESUPUESTO" | |
| 15 | encabezado_nombre = "Eugenia Bahit" | |
| 16 | encabezado_web = "www.eugeniabahit.com.ar" | |
| 17 | encabezado_email = "[email protected]" | |
| 18 | fecha = FECHA_ACTUAL | |
| 19 | vencimiento = FECHA_CADUCIDAD | |
| 20 | ||
| 21 | # Datos impositivos | |
| 22 | ALICUOTA_IVA = 21 | |
| 23 | ||
| 24 | # Propiedades relativas al formato | |
| 25 | html = TEMPLATE_HTML | |
| 26 | txt = TEMPLATE_TXT | |
| 27 | ||
| 28 | # Planes y servicios - Capítulo 3 | |
| 29 | planes = ('corporativo', 'personal', 'mantenimiento')
| |
| 30 | corporativo = ['Diseño Sitio Web corporativo', 7200] | |
| 31 | personal = ['Diseño Sitio Web básico', 4500] | |
| 32 | mantenimiento = ['Mantenimiento sitio Web (mensual)', 500] | |
| 33 | lista_precios = {'corporativo':corporativo,
| |
| 34 | 'personal':personal, | |
| 35 | 'mantenimiento':mantenimiento} | |
| 36 | ||
| 37 | # Setear los datos del cliente | |
| 38 | def set_cliente(self): | |
| 39 | self.empresa = raw_input(EMPRESA) | |
| 40 | self.cliente = raw_input(NOMBRE_CLIENTE) | |
| 41 | ||
| 42 | # Seleccionar tipo de plan | |
| 43 | def seleccionar_plan(self): | |
| 44 | texto_a_mostrar = ELEGIR_PLAN | |
| 45 | codigo_plan = 0 | |
| 46 | ||
| 47 | for plan in self.planes: | |
| 48 | texto_a_mostrar += '(%d)%s ' % (codigo_plan, plan) | |
| 49 | - | codigo_plan = codigo_plan+1 |
| 49 | + | codigo_plan = codigo_plan + 1 |
| 50 | ||
| 51 | texto_a_mostrar += ": " | |
| 52 | elegir_plan = raw_input(texto_a_mostrar) | |
| 53 | ||
| 54 | # Capturando excepciones (Capítulo 5) | |
| 55 | try: | |
| 56 | elegir_plan = int(elegir_plan) | |
| 57 | self.plan = self.planes[elegir_plan] | |
| 58 | except (ValueError, IndexError): | |
| 59 | mostrar_texto(DATO_INCORRECTO) | |
| 60 | self.seleccionar_plan() | |
| 61 | else: | |
| 62 | datos_servicio = self.lista_precios[self.planes[elegir_plan]] | |
| 63 | self.servicio = datos_servicio[0] | |
| 64 | importe = datos_servicio[1] | |
| 65 | self.importe = float(importe) | |
| 66 | ||
| 67 | # Calcular IVA | |
| 68 | def calcular_iva(self): | |
| 69 | self.monto_iva = self.importe * self.ALICUOTA_IVA / 100 | |
| 70 | ||
| 71 | # Calcula el monto total del presupuesto | |
| 72 | def calcular_neto(self): | |
| 73 | self.neto = self.importe + self.monto_iva | |
| 74 | ||
| 75 | # Armar numero de presupuesto | |
| 76 | def armar_numero_presupuesto(self): | |
| 77 | contador = open('contador.txt', 'r+')
| |
| 78 | ultimo_num = int(contador.read()) | |
| 79 | - | nuevo = ultimo_num+1 |
| 79 | + | nuevo = ultimo_num + 1 |
| 80 | contador.seek(0) | |
| 81 | nuevo = str(nuevo) | |
| 82 | contador.write(nuevo) | |
| 83 | contador.close() | |
| 84 | self.numero_presupuesto = nuevo | |
| 85 | ||
| 86 | # Guardar presupuesto en archivo | |
| 87 | def guardar_presupuesto(self, txt, html): | |
| 88 | respuesta = raw_input(GUARDAR_ARCHIVO) | |
| 89 | # Si el usuario indica "n" | |
| 90 | if respuesta.lower() == 'n': | |
| 91 | mostrar_texto(txt) | |
| 92 | # Si en cambio el usuario indica "s" | |
| 93 | elif respuesta.lower() == 's': | |
| 94 | filename = 'presupuestos/' + self.numero_presupuesto + '.html' | |
| 95 | presupuesto = open(filename, 'w') | |
| 96 | presupuesto.write(html) | |
| 97 | presupuesto.close() | |
| 98 | mostrar_texto(CONFIRM_ARCHIVO_GUARDADO) | |
| 99 | self.mostrar_presupuesto(filename) | |
| 100 | # Sino | |
| 101 | else: | |
| 102 | mostrar_texto(OPCION_INCORRECTA) | |
| 103 | self.guardar_presupuesto(txt, html) | |
| 104 | ||
| 105 | # Mostrar presupuesto en navegador | |
| 106 | def mostrar_presupuesto(self, archivo): | |
| 107 | respuesta = raw_input(MOSTRAR_PRESUPUESTO) | |
| 108 | if respuesta.lower() == 's': | |
| 109 | webbrowser.open(BASE_DIR + "/" + archivo) | |
| 110 | ||
| 111 | # Armar el presupuesto | |
| 112 | def armar_presupuesto(self): | |
| 113 | """Esta función se encarga de armar todo el presupuesto""" | |
| 114 | self.armar_numero_presupuesto() | |
| 115 | txt = leer_archivo(self.txt) | |
| 116 | html = leer_archivo(self.html) | |
| 117 | ||
| 118 | # Armo un diccionario con todos los datos que utilizo en el template | |
| 119 | diccionario = dict(nombre=self.encabezado_nombre, | |
| 120 | web=self.encabezado_web, | |
| 121 | email=self.encabezado_email, | |
| 122 | titulo=self.titulo, | |
| 123 | numero=self.numero_presupuesto, | |
| 124 | fecha=self.fecha, | |
| 125 | empresa=self.empresa, | |
| 126 | cliente=self.cliente, | |
| 127 | plan=self.plan, | |
| 128 | servicio=self.servicio, | |
| 129 | precio=self.importe, | |
| 130 | iva=self.monto_iva, | |
| 131 | total=self.neto, | |
| 132 | limite=self.vencimiento) | |
| 133 | ||
| 134 | txt = Template(txt).safe_substitute(diccionario) | |
| 135 | html = Template(html).safe_substitute(diccionario) | |
| 136 | self.guardar_presupuesto(txt, html) | |
| 137 | ||
| 138 | # Método constructor | |
| 139 | def __init__(self): | |
| 140 | mostrar_texto(ENCABEZADO_MODULO) | |
| 141 | self.set_cliente() | |
| 142 | self.seleccionar_plan() | |
| 143 | self.calcular_iva() | |
| 144 | self.calcular_neto() | |
| 145 | self.armar_presupuesto() | |
| 146 | ||
| 147 | ||
| 148 | # Instanciar clase | |
| 149 | presupuesto = ModeloDePresupuesto() |