def crearFicha(sitio,id,mail,tipoficha): links=[] text2='' auxPhone=0 #Determinar tipo de informe pro=False interna=False full=False if tipoficha==2: pro=True elif tipoficha==3: interna=True elif tipoficha==4: interna=True pro=True #Chequear que sitio este bien sitio=sitio.lower() if('portal' in sitio): sitio='portal' elif('yapo' in sitio): sitio='yapo' else: text='Sitio ingresado es incorrecto. Favor ingresar portalinmobiliario o yapo.' return(text) #Chequear que mail este bien if ('@' not in mail): text='Email incorrecto. Favor ingresar correo válido.' return(text) if ('.' not in mail): text='Email incorrecto. Favor ingresar correo válido.' return(text) #sacar informacion de bbdd, y chequear que propiedad existe: propiedad=obtenerProp(id,sitio) if len(propiedad)<1: text='¨Propiedad no se encuentra en la base de datos.' return(text) else: propiedad=list(propiedad) nombre=str(propiedad[0]) region=str(propiedad[1]) regionP=region regionY=region if region=='15': regionP='metropolitana' if region=='metropolitana': regionY='15' operacion=str(propiedad[2]) tipo=str(propiedad[3]) precio=float(propiedad[4]) dormitorios=str(propiedad[5]) banos=str(propiedad[6]) metrosmin=str(propiedad[7]) metrosmax=str(propiedad[8]) estacionamientos=str(propiedad[9]) bodegas=str(propiedad[10]) lat=str(propiedad[11]) lon=str(propiedad[12]) link=str(propiedad[13]) if sitio=='portal': if operacion=='venta': comuna=str(link.split('/')[5]) comuna=comuna.replace('-'+str(regionP),'') comuna=comuna.replace('-',' ') comuna=comuna.capitalize() propiedad.append(comuna) else: comuna=str(link.split('/')[6]) comuna=comuna.replace('-metropolitana','') comuna=comuna.replace('-',' ') comuna=comuna.capitalize() propiedad.append(comuna) else: comuna=str(propiedad[14]) #Revisar si existe aun la publicacion if not pubPortalExiste.publicacionExiste(link): text='Propiedad ya no se encuentra disponible en el sitio.' return(text) #sacar informacion de la publicacion #sacar urls fotos portal matrixdescripcion=[] matrixcounter=0 matrixdescripcion.append('') if sitio=='portal': first=True url=[] page = requests.get(link, headers={'User-Agent': agentCreator.generateAgent()}) metatext=page.text metatext=metatext.split(' ') descripcion=[] savedescripcion=False for texto in metatext: if 'propiedad-descr' in texto: savedescripcion=True if '/div' in texto: savedescripcion = False if savedescripcion: descripcion.append(str(texto)) descripcion=descripcion[2:] print(descripcion) if not interna: for desc in descripcion: desc=desc.replace(' ','') desc=desc.replace('<br />',' ') desc=desc.replace('<br/>',' ') desc=desc.replace('<br>',' ') desc=desc.replace('<b/>','') desc=desc.replace('<b>','') desc=desc.replace('</b>','') desc=desc.replace('<br','') desc=desc.replace('/>','') desc=desc.replace('í','í') desc=desc.replace('é','é') desc=desc.replace('ó','ó') desc=desc.replace('á','á') desc=desc.replace('ú','ú') desc=desc.replace('ñ','ñ') desc=desc.replace('Ñ','Ñ') if "+56" in desc: desc="**" if len(desc)>=6: try: desc.replace('\n',"") int(desc) desc="**" except: pass if "@" in desc: desc="***" if ((len(matrixdescripcion[matrixcounter])+len(desc))>=78): matrixcounter+=1 matrixdescripcion.append('') if desc!= '': matrixdescripcion[matrixcounter]=matrixdescripcion[matrixcounter]+str(desc) else: if first: if desc!= '': matrixdescripcion[matrixcounter]=matrixdescripcion[matrixcounter]+str(desc) first=False else: if desc!= '': matrixdescripcion[matrixcounter]=matrixdescripcion[matrixcounter]+' '+str(desc) print(matrixdescripcion) for x,matrix in enumerate(matrixdescripcion): matrix=matrix.replace('<br />','\n') matrix=matrix.replace('<br/>','\n') matrix=matrix.replace('<br>','\n') matrix=matrix.replace('<b/>','') matrix=matrix.replace('<b>','') matrix=matrix.replace('</b>','') matrixdescripcion[x]=matrix descripcion='\n'.join(matrixdescripcion) propiedad.append(descripcion) else: descripcion=' '.join(descripcion) descripcion=descripcion.replace(' ','') descripcion=descripcion.replace('<br />','\n') descripcion=descripcion.replace('<br/>','\n') descripcion=descripcion.replace('<br>','\n') descripcion=descripcion.replace('<b/>','') descripcion=descripcion.replace('<b>','') descripcion=descripcion.replace('</b>','') descripcion=descripcion.replace('<br','') descripcion=descripcion.replace('/>','') descripcion=descripcion.replace('í','í') descripcion=descripcion.replace('é','é') descripcion=descripcion.replace('ó','ó') descripcion=descripcion.replace('á','á') descripcion=descripcion.replace('ú','ú') descripcion=descripcion.replace('ñ','ñ') descripcion=descripcion.replace('Ñ','Ñ') propiedad.append(descripcion) for meta in metatext: if 'https://image.portalinmobiliario.cl/Portal/Propiedades' in meta and '1200' in meta: meta=meta.split('"') url.append(str(meta[1])) #Sacar urls fotos yapo else: url=[] page = requests.get(link, headers={'User-Agent': agentCreator.generateAgent()}) metatext=page.text metatext=metatext.split(' ') descripcion=[] savedescripcion=False saveimg=False og=True for texto in metatext: if '<h4>Descripción</h4>' in texto: savedescripcion=True if og and 'og:image' in texto: saveimg=True og=False if 'img/yapo' in texto: saveimg=False if savedescripcion: descripcion.append(str(texto)) if '</div>' in texto: savedescripcion = False if saveimg and 'img.yapo.cl/images' in texto: texto=texto.replace('content="','') texto.replace('"','') url.append(texto) if 'phone-url' in texto: texto=texto.split('"') texto=texto[1] auxPhone=texto auxPhone='https://www.yapo.cl'+auxPhone descripcion=descripcion[1:] first=True print(descripcion) for desc in descripcion: desc=desc.replace('\n',' ') desc=desc.replace('<br />','\n') desc=desc.replace('</div>','\n') desc=desc.replace('<br>','\n') desc=desc.replace('<br','') desc=desc.replace('/>','') desc=desc.replace('itemprop="description">',"") desc=desc.replace('</p>','\n') desc=desc.replace("\t","") desc=desc.replace('<!','') desc=desc.replace('--','') desc=desc.replace(' ','') desc=desc.replace('\n',' ') if ((len(matrixdescripcion[matrixcounter])+len(desc))>=78): matrixcounter+=1 matrixdescripcion.append('') matrixdescripcion[matrixcounter]=matrixdescripcion[matrixcounter]+str(desc) else: if first: matrixdescripcion[matrixcounter]=matrixdescripcion[matrixcounter]+str(desc) first=False else: matrixdescripcion[matrixcounter]=matrixdescripcion[matrixcounter]+' '+str(desc) print(matrixdescripcion) descripcion='\n'.join(matrixdescripcion) propiedad.append(descripcion) try: print(auxPhone) response = requests.get(auxPhone, headers={'User-Agent': agentCreator.generateAgent()}) auxphone2=auxPhone img = Image.open(BytesIO(response.content)) img=img.convert('L') img=img.convert('1') img.save("auxphone.gif") auxPhone=1 except: pass lenfotos=len(url) if len(url)==0: print("la propiedad no cuenta con fotografias") else: print('total fotos: '+str(len(url))) for x,u in enumerate (url): u=u.replace('"','') response = requests.get(u) img = Image.open(BytesIO(response.content)) img.save(str(x)+" foto.jpg") if not interna: imagenDescripcion = Image.new('RGB', (456, 345), color = (255, 255, 255)) d = ImageDraw.Draw(imagenDescripcion) f= ImageFont.truetype('arial.ttf',12) d.text((0,0), descripcion,font=f, fill=(0,0,0)) imagenDescripcion.save('imagenDescripcion.png') datospro = [] if pro: comunaP = (comuna.replace(' ', '-') + '-'+str(region)).lower() listacomunas=[] listacomunas.append(comuna) propsP = reportes.from_portalinmobiliario(tipo, regionP,listacomunas, True) propsY = reportes.from_yapo(tipo, regionY,listacomunas, True, True) props = propsP + propsY if operacion=='venta': print("la comuna para calcular la rentabilidad promedio es:") print(comunaP) rentaPromedio = reportes.rentaPProm(tipo, float(dormitorios), float(banos), float(estacionamientos), comunaP) print("input tasacion ficha") print(tipo) print(float(lat)) print(float(lon)) print(float(metrosmin)) print(float(metrosmax)) print(float(dormitorios)) print(float(banos)) print(float(estacionamientos)) tasacionVenta = tb2.calcularTasacionData("venta", tipo, float(lat), float(lon), float(metrosmin),float(metrosmax),float(dormitorios), float(banos), float(estacionamientos), props) tasacionArriendo = tb2.calcularTasacionData("arriendo", tipo, float(lat), float(lon), float(metrosmin),float(metrosmax),float(dormitorios), float(banos), float(estacionamientos), props) precioV = tasacionVenta[0] * uf.getUf() precioA = tasacionArriendo[0] print("el precio tasado de venta inicial es: "+str(precioV)) print("el precio tasado de arriendo inicial es: "+str(precioA)) links=tasacionVenta[3] if precioV is None or precioV < 0.1: pro=False try: precioA = tasacionArriendo[0] rentaV = ((precioV - precio) / precio) except: pro=False text2='No se ha podido realizar tasación' print('fail 1') if precioA is None or precioA < 0.01: pro=False try: rentaA = (precioA * 12 / precio) print('succes 2.1') print(precioA) print(precioV) rentaPP = (precioA * 12 / precioV) print('succes 2.2') except: pro=False text2='No se ha podido realizar tasación' print('fail 2') if pro: if rentaA > 0.2: pro=False print('fail 3') if rentaPP < 1.2*rentaPromedio: try: print("[GeneradorReportes] renta pp muy baja, recalculando precio") print("precio anterior:"+str(precioV)) precioV = precioA * 12 / rentaPromedio rentaV = ((precioV - precio) / precio) rentaPP = (precioA * 12 / precioV) print("precio nuevo:"+str(precioV)) except: pro=False text2='No se ha podido realizar tasación' print('fail 4') if rentaPP > 0.15: try: precioV = precioA * 12 / 0.15 rentaV = ((precioV - precio) / precio) except: pro=False text2='No se ha podido realizar tasación' print('fail 52') if rentaA < 0: pro=False if pro: # precio venta tasado datospro.append(precioV) # rentabilidad de venta datospro.append(float(rentaV)) # precio arriendo tasado datospro.append(precioA) # rentabilidad de arriendo datospro.append(float(rentaA)) else: try: tasacionArriendo = tb2.calcularTasacionData("arriendo", tipo, float(lat), float(lon), float(metrosmin),float(metrosmax),float(dormitorios), float(banos), float(estacionamientos), props) except: pro=False text2='No se ha podido realizar tasación' print('fail 6') try: precioA = tasacionArriendo[0] links=tasacionArriendo[3] except: pro=False text2='No se ha podido realizar tasación' print('fail 72') if pro: if precioA is None or precioA < 0.01: pro = False text2='No se ha podido realizar tasación' print('fail 8') if pro: # precio arriendo tasado datospro.append(precioA) # rentabilidad de arriendo datoscontacto = [] if interna: if sitio=='portal': try: email, telefono, dueno = reportes.getDatosDueno(str(id)) except: email = "NN" telefono = "NN" dueno = "NN" else: email = "NN" if auxPhone == 1: telefono=auxphone2 else: telefono = "NN" dueno = 'NN' datoscontacto.append(email) datoscontacto.append(telefono) datoscontacto.append(dueno) #Crear PDF if interna: nombrearchivo="Ficha Propiedad Sitio:"+str(sitio)+" Id:"+str(id)+".pdf" else: nombrearchivo="Ficha Propiedad Sitio:"+str(sitio)+", "+str(operacion)+", "+str(tipo)+", "+str(region)+", "+str(comuna)+".pdf" print(nombrearchivo) pdfCreatorFichas.crearPdfFicha(nombrearchivo,id,propiedad,lenfotos,pro,datospro,interna,datoscontacto,regionP,links) print("pdf generado con exito") #Enviar PDF sendmail.sendMail(mail,"",nombrearchivo) #Eliminar del servidor if len(url)==0: pass else: for x,u in enumerate (url): os.remove(str(x)+" foto.jpg") try: os.remove("auxphone.gif") except: pass if not interna: try: os.remove("imagenDescripcion.png") except: pass os.remove(nombrearchivo) #Retornar exito text = "Ficha creada para la propiedad: "+str(id)+" obtenida del sitio: "+str(sitio)+", enviada con éxito al correo: "+str(mail)+"." if text2!='': text=text2+'. '+text return(text)
comuna5 = i[28] if comuna5 is None: comuna5 = "abcdefghij" comuna6 = i[29] if comuna6 is None: comuna6 = "abcdefghij" propiedades = from_portalinmobiliario_select( past, yesterday, preciomin, preciomax, utilmin, utilmax, totalmin, totalmax, latmin, latmax, lonmin, lonmax, dormitoriosmin, dormitoriosmax, banosmin, banosmax, estacionamientos, tipo, operacion, region, comuna1, comuna2, comuna3, comuna4, comuna5, comuna6) #print(len(propiedades)) estaciones1 = estaciones() for prop in propiedades: if not pubPortalExiste.publicacionExiste(prop[13]): continue estaciones2 = [] for e in estaciones1: subestacion = [] late = e[3] lone = e[4] lat1 = prop[10] long1 = prop[11] r = 6371000 c = pi / 180 distance = 2 * r * asin( sqrt( sin(c * (late - lat1) / 2)**2 + cos(c * lat1) * cos(c * late) * sin(c * (lone - long1) / 2)**2))
def crearPdfFicha(fileName, id, propiedad, lenfotos, pro, datospro, interna, datosinterna, regionP, links): #Propiedad: #DatosPro: Preciov/RentV/PrecioA/RentA, o bien solo PrecioA headerslocalizacion = [] headerspropiedad = [] headersrentabilidad = [] headerscontacto = [] datoslocalizacion = [] datospropiedad = [] datosrentabilidad = [] datoscontacto = [] if pro == "financiera": pro = True financiera = True else: financiera = False uf1 = uf.getUf() for x, p in enumerate(propiedad): if p is None: propiedad[x] = 0 nombre = str(propiedad[0]) region = str(propiedad[1]) comuna = str(propiedad[14]) operacion = str(propiedad[2]) tipo = str(propiedad[3]) headerslocalizacion.append("Operación") headerslocalizacion.append("Tipo de Prop.") headerslocalizacion.append("Región") headerslocalizacion.append("Comuna") datoslocalizacion.append(operacion.capitalize()) datoslocalizacion.append(tipo.capitalize()) datoslocalizacion.append(regionP.capitalize()) datoslocalizacion.append(comuna.capitalize()) precio = int(propiedad[4]) precioreal = precio precioufreal = precio / uf1 preciouf = (int(precio / uf1)) preciouf = str(format(preciouf, ',')) preciouf = preciouf.replace(',', '.') precio = str(format(precio, ',')) precio = precio.replace(',', '.') dormitorios = str(int(propiedad[5])) banos = str(int(propiedad[6])) metrosmin = str(int(propiedad[7])) metrosmax = str(int(propiedad[8])) estacionamientos = str(int(propiedad[9])) bodegas = str(int(propiedad[10])) lat = str(propiedad[11]) lon = str(propiedad[12]) link = str(propiedad[13]) headerspropiedad.append("Precio $") if operacion == 'venta': headerspropiedad.append("Precio UF") headerspropiedad.append("Sup. Util") headerspropiedad.append("Sup. Total") headerspropiedad.append("Dormitorios") headerspropiedad.append("Baños") headerspropiedad.append("Estacionamientos") headerspropiedad.append("Bodegas") datospropiedad.append(precio) if operacion == 'venta': datospropiedad.append(preciouf) datospropiedad.append(metrosmin) datospropiedad.append(metrosmax) datospropiedad.append(dormitorios) datospropiedad.append(banos) datospropiedad.append(estacionamientos) datospropiedad.append(bodegas) descripcion = propiedad[15] if pro: if operacion == 'venta': precioV = datospro[0] precioVreal = precioV precioV = precioV / uf1 precioV = int(precioV) precioV = str(format(precioV, ',')) precioV = precioV.replace(',', '.') precioV = 'UF ' + precioV rentV = float(datospro[1]) rentV = int(rentV * 1000) rentV = float(rentV / 10) rentV = str(rentV) + "%" precioA = datospro[2] precioAreal = 10000 * (int(precioA / 10000)) precioA = int(precioA) precioA = str(format(precioA, ',')) precioA = precioA.replace(',', '.') precioA = '$ ' + precioA rentA = float(datospro[3]) rentA = int(rentA * 1000) rentA = float(rentA / 10) rentA = str(rentA) + "%" headersrentabilidad.append("Tasación Venta") headersrentabilidad.append("Rent. Venta") headersrentabilidad.append("Tasación Arriendo") headersrentabilidad.append("Rent. Arriendo") datosrentabilidad.append(precioV) datosrentabilidad.append(rentV) datosrentabilidad.append(precioA) datosrentabilidad.append(rentA) else: precioA = datospro[0] precioA = int(precioA[0]) precioA = str(format(precioA, ',')) precioA = precioA.replace(',', '.') precioA = '$ ' + precioA headersrentabilidad.append("Tasación Arriendo") datosrentabilidad.append(precioA) if interna: mail = datosinterna[0] headerscontacto.append("Mail") datoscontacto.append(mail) telefono = datosinterna[1] headerscontacto.append("Telefono") if 'yapo' in link and telefono != 'NN': try: image = Image("auxphone.gif") image._restrictSize(1.2 * inch, 1.7 * inch) datoscontacto.append(image) except: datoscontacto.append('NN') else: datoscontacto.append(telefono) dueno = datosinterna[2] headerscontacto.append("Dueño") datoscontacto.append(dueno.capitalize()) styles = getSampleStyleSheet() styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY, leading=16)) doc = SimpleDocTemplate(fileName, pagesize=letter, rightMargin=72, leftMargin=72, topMargin=72, bottomMargin=18) Story = [] tabla = [] tabla.append(headerslocalizacion) tabla.append(datoslocalizacion) t1 = Table(tabla, hAlign='LEFT') t1.setStyle( TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('FONTSIZE', (0, 0), (-1, -1), 9), ('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#34BAAF')), ('TEXTCOLOR', (0, 0), (-1, 0), colors.black), ])) tabla = [] tabla.append(headerspropiedad) tabla.append(datospropiedad) t2 = Table(tabla, hAlign='LEFT') t2.setStyle( TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('FONTSIZE', (0, 0), (-1, -1), 11), ('BACKGROUND', (0, 0), (-1, 0), colors.lightgrey), ('TEXTCOLOR', (0, 0), (-1, 0), colors.black), ])) if pro: tabla = [] tabla.append(headersrentabilidad) tabla.append(datosrentabilidad) t3 = Table(tabla, hAlign='LEFT') t3.setStyle( TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.lightgrey), ('TEXTCOLOR', (0, 0), (-1, 0), colors.black), ('FONTSIZE', (0, 0), (-1, -1), 11), ])) if interna: tabla = [] tabla.append(headerscontacto) tabla.append(datoscontacto) t4 = Table(tabla, hAlign='LEFT') t4.setStyle( TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.lightgrey), ('TEXTCOLOR', (0, 0), (-1, 0), colors.black), ('FONTSIZE', (0, 0), (-1, -1), 11), ])) try: image = Image('bull_logo2.png', hAlign='LEFT') image._restrictSize(2 * inch, 3 * inch) Story.append(image) Story.append(Spacer(1, 16)) except: try: image = Image('bull_logo.jpg', hAlign='LEFT') image._restrictSize(2 * inch, 3 * inch) Story.append(image) Story.append(Spacer(1, 16)) except: pass if interna: ptext = '<font size=11>FICHA PROPIEDAD: ' + str(id) + '</font>' Story.append(Paragraph(ptext, styles["Justify"])) Story.append(Spacer(1, 14)) else: ptext = '<font size=11>FICHA PROPIEDAD</font>' Story.append(Paragraph(ptext, styles["Justify"])) Story.append(Spacer(1, 14)) Story.append(t1) Story.append(Spacer(1, 16)) Story.append(t2) Story.append(Spacer(1, 16)) if pro: Story.append(t3) Story.append(Spacer(1, 16)) if interna: Story.append(t4) Story.append(Spacer(1, 16)) ptext = '<font size=11>Descripción:</font>' Story.append(Paragraph(ptext, styles["Justify"])) Story.append(Spacer(1, 12)) if not interna: imagenDescripcion = Image('imagenDescripcion.png') Story.append(imagenDescripcion) Story.append(PageBreak()) else: ptext = '<font size=11>' + str(descripcion) + '</font>' Story.append(Paragraph(ptext, styles["Justify"])) Story.append(PageBreak()) if len(links) > 0 and interna: print("entro en crear tabla de links") print(links) data = [] n = 0 headers = [ "N°", "UF", "Precio", "UF/mt2", "MtsMin", "MtsMax", "Dorms", "Baños", "Link", "Disponibilidad" ] for l in links: if "portal" in l: d = [] n += 1 d.append(str(n)) avaible = pubPortalExiste.publicacionExiste(l) id = botPropertyConnector.obtenerIdConLink( l, "www.portalinmobiliario.com") id = id[0] prop = reportes.precio_from_portalinmobiliario(id) prop = prop[0] print("Arreglo de propiedad:") print(prop) print("1er dato de propiedad de propiedad:") print(prop[0]) ufn = int(prop[0] / (uf.getUf())) d.append(ufn) d.append(prop[0]) d.append((int(20 * ufn / (prop[1] + prop[2]))) / 10) d.append(int(prop[1])) d.append(int(prop[2])) d.append(prop[5]) d.append(prop[6]) print(d) print("appendeo bien datos") linkHtml = '<link href="' + l + '" color="blue">' + "Link" + '</link>' print(linkHtml) linkHtml = platypus.Paragraph(linkHtml, PS('body')) d.append(linkHtml) if avaible: d.append("Disponible") else: d.append("No disponible") print(str(n) + " intento de agregar prop a data") print(d) data.append(d) else: pass data = [headers] + data #t=Table(data,nrCols*[0.6*inch], nrRows*[0.25*inch]) t = Table(data) t.setStyle( TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('FONTSIZE', (0, 0), (-1, -1), 11), ])) Story.append(t) Story.append(PageBreak()) print("Antes de entrar a datos financieros") if pro and financiera and operacion == 'venta': print("entro datos financieros") tasacion = datospro[0] tasacionUF = (precioVreal / uf1) ftext = '<font size=11>Propuesta de Compra Arriendo y Posterior Venta en un Período de 7 Meses, ofertando 95% Valor propiedad, Revendiendo a 95% del valor de tasación:</font>' Story.append(Paragraph(ftext, styles["Justify"])) Story.append(Spacer(1, 14)) rent = ( 1 + (((0.95 * tasacionUF - ((0.95) * precioufreal)) * 0.81 - ((0.95) * precioufreal) * 0.031) - 25 + precioAreal * 7 / uf1) / ((0.95) * precioufreal * 1.031 + 25) - 0.25 * ((((0.95 * tasacionUF - ((0.95) * precioufreal)) * 0.81 - ((0.95) * precioufreal) * 0.031) - 25 + precioAreal * 7 / uf1) / ((0.95) * precioufreal * 1.031 + 25) - 0.05))**(12 / 7) - 1 data = [ ["Item", "Valor"], [ "Rent. de arriendo(1)", str( int(1000 * (precioAreal * 12 / uf1 / ((0.95) * precioufreal * 1.031 + 14))) / 10) + "%" ], [ "Rent. Capital (2)", str( int(1000 * (((0.95 * tasacionUF - ((0.95) * precioufreal)) * 0.81 - ((0.95) * precioufreal) * 0.031) - 14) / ((0.95) * precioufreal * 1.031 + 14)) / 10) + "%" ], [ "Rent. Total(3)", str( int(1000 * (((0.95 * tasacionUF - ((0.95) * precioufreal)) * 0.81 - ((0.95) * precioufreal) * 0.031) - 14 + precioAreal * 7 / uf1) / ((0.95) * precioufreal * 1.031 + 14)) / 10) + "%" ], [ "Rentabilidad Neta(4)", str(int(1000 * ((1 + rent)**(7 / 12) - 1)) / 10) + "%" ], [ "Rentabilidad Neta UF (5)", str( int(((int((0.95) * precioufreal * 1.031 + 25)) * ((1 + rent)**(7 / 12) - 1)))) + " UF" ], ["Rentabilidad Anual Neta(6)", str(int(1000 * rent) / 10) + "%"], ["Costos Legales(7)", "25 UF"], [ "Costos de Corretaje(8)", str(int(0.02 * 0.95 * precioufreal)) + " UF" ], [ "IVA(9)", str(int((0.95 * tasacionUF - ((0.95) * precioufreal)) * 0.19)) + " UF" ], [ "Total Inversión Inicial(10)", str(int((0.95) * precioufreal * 1.031 + 25)) + " UF" ], [ "Comisión BullEstate(11)", str( int(0.25 * ((((0.95 * tasacionUF - ((0.95) * precioufreal)) * 0.81 - ((0.95) * precioufreal) * 0.031) - 25 + precioAreal * 7 / uf1) - 0.05 * ((0.95) * precioufreal * 1.031 + 25)) + 0.01 * 0.95 * precioufreal)) + " UF" ] ] t = Table(data) table_style = (TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#34BAAF')), ('TEXTCOLOR', (0, 0), (-1, 0), colors.black), ('FONTSIZE', (0, 0), (-1, -1), 9), ])) t.setStyle(table_style) Story.append(t) Story.append(Spacer(1, 14)) ftext = '<font size=6>(1)Rentabilidad calculada como doce veces el valor de arriendo dividido por el total de inversión.</font>' Story.append(Paragraph(ftext, styles["Justify"])) ftext = '<font size=6>(2)Rentabilidad calculada como (valor de reventa - total inversión)/total inversión.</font>' Story.append(Paragraph(ftext, styles["Justify"])) ftext = '<font size=6>(3)Rentabilidad de Arriendo + Rentabilidad de Capital, durante ciclo de inversión.</font>' Story.append(Paragraph(ftext, styles["Justify"])) ftext = '<font size=6>(4)Rentabilidad neta de un ciclo de inversión, descontando gastos.</font>' Story.append(Paragraph(ftext, styles["Justify"])) ftext = '<font size=6>(5)Rentabilidad neta en UF de un ciclo de inversión, descontando gastos.</font>' Story.append(Paragraph(ftext, styles["Justify"])) ftext = '<font size=6>(6)Rentabilidad neta anualizada</font>' Story.append(Paragraph(ftext, styles["Justify"])) ftext = '<font size=6>(7)Estudio de títulos, pago de CBR y notaría.</font>' Story.append(Paragraph(ftext, styles["Justify"])) ftext = '<font size=6>(8)Valor correspondiente al 2% de costos de corretaje, al comprar propiedad</font>' Story.append(Paragraph(ftext, styles["Justify"])) ftext = '<font size=6>(9) Valor correspondiente al 19% de la diferencia entre valor compra y valor re-venta</font>' Story.append(Paragraph(ftext, styles["Justify"])) ftext = '<font size=6>(10) Valor propiedad más corretaje, gastos legales, y comisión Fija de Bullestate</font>' Story.append(Paragraph(ftext, styles["Justify"])) ftext = '<font size=6>(11)Comisión correspondiente al 1% más un 25% de la utilidad obtenida sobre 5% por parte del Cliente.</font>' Story.append(Paragraph(ftext, styles["Justify"])) Story.append(Spacer(1, 14)) Story.append(PageBreak()) reventas = [0.9, 0.925, 0.95, 0.975, 1] for rev in reventas: ftext = '<font size=11>INFO FINANCIERA (Reventa al ' + (str( int(1000 * rev) / 10)).replace('.', ',') + '% - ' + str( format(int(rev * tasacionUF), ',')).replace( ',', '.') + ' UF - $' + str( format(int(rev * tasacion), ',')).replace( ',', '.') + ':</font>' Story.append(Paragraph(ftext, styles["Justify"])) Story.append(Spacer(1, 14)) data = [] headers = ["Valor UF:", "Valor Pesos", "% Oferta"] for i in range(1, 16): headers.append(str(i)) for n in range(0, 9): row = [] row.append( (str(format(int((0.8 + 0.025 * n) * precioufreal), ','))).replace(',', '.')) row.append( (str(format(int((0.8 + 0.025 * n) * precioreal), ','))).replace(',', '.')) row.append(str(80 + 2.5 * n) + "%") for i in range(1, 16): tasacionUF = float(tasacionUF) precioufreal = float(precioufreal) precioAreal = float(precioAreal) uf1 = float(uf1) rev = float(rev) rent = (1 + (((rev * tasacionUF - ((0.8 + 0.025 * n) * precioufreal)) * 0.81 - ((0.8 + 0.025 * n) * precioufreal) * 0.031) - 25 + precioAreal * i / uf1) / ((0.8 + 0.025 * n) * precioufreal * 1.031 + 25) - 0.25 * ((((rev * tasacionUF - ((0.8 + 0.025 * n) * precioufreal)) * 0.81 - ((0.8 + 0.025 * n) * precioufreal) * 0.031) - 25 + precioAreal * i / uf1) / ((0.8 + 0.025 * n) * precioufreal * 1.031 + 25) - 0.05))**(12 / i) - 1 rent = str((int(1000 * rent)) / 10) + "%" row.append(rent) data.append(row) data = [headers] + data #t=Table(data,nrCols*[0.6*inch], nrRows*[0.25*inch]) t = Table(data) table_style = (TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#34BAAF')), ('TEXTCOLOR', (0, 0), (-1, 0), colors.black), ('FONTSIZE', (0, 0), (-1, -1), 6.5), ])) t.setStyle(table_style) for row, values, in enumerate(data): for column, value in enumerate(values): try: print(value) intvalue = float(value[:-1]) print(intvalue) if intvalue < 0: table_style.add('BACKGROUND', (column, row), (column, row), colors.red) if intvalue > 0.2: table_style.add('BACKGROUND', (column, row), (column, row), colors.limegreen) if intvalue > 0.5: table_style.add('BACKGROUND', (column, row), (column, row), colors.darkgreen) except: pass Story.append(t) Story.append(Spacer(1, 14)) Story.append(PageBreak()) for x in range(0, lenfotos): image = Image(str(x) + " foto.jpg", hAlign='LEFT') image._restrictSize(6 * inch, 9 * inch) Story.append(image) Story.append(Spacer(1, 4)) Story = list(Story) doc.build(Story)
def crearPdfFicha(fileName, id, propiedad, lenfotos, pro, datospro, interna, datosinterna, regionP, links): #Propiedad: #DatosPro: Preciov/RentV/PrecioA/RentA, o bien solo PrecioA headerslocalizacion = [] headerspropiedad = [] headersrentabilidad = [] headerscontacto = [] datoslocalizacion = [] datospropiedad = [] datosrentabilidad = [] datoscontacto = [] uf1 = uf.getUf() for x, p in enumerate(propiedad): if p is None: propiedad[x] = 0 nombre = str(propiedad[0]) region = str(propiedad[1]) comuna = str(propiedad[14]) operacion = str(propiedad[2]) tipo = str(propiedad[3]) headerslocalizacion.append("Operación") headerslocalizacion.append("Tipo de Prop.") headerslocalizacion.append("Región") headerslocalizacion.append("Comuna") datoslocalizacion.append(operacion.capitalize()) datoslocalizacion.append(tipo.capitalize()) datoslocalizacion.append(regionP.capitalize()) datoslocalizacion.append(comuna.capitalize()) precio = int(propiedad[4]) preciouf = (int(precio / uf1)) preciouf = str(format(preciouf, ',')) preciouf = preciouf.replace(',', '.') precio = str(format(precio, ',')) precio = precio.replace(',', '.') dormitorios = str(int(propiedad[5])) banos = str(int(propiedad[6])) metrosmin = str(int(propiedad[7])) metrosmax = str(int(propiedad[8])) estacionamientos = str(int(propiedad[9])) bodegas = str(int(propiedad[10])) lat = str(propiedad[11]) lon = str(propiedad[12]) link = str(propiedad[13]) headerspropiedad.append("Precio $") if operacion == 'venta': headerspropiedad.append("Precio UF") headerspropiedad.append("Sup. Util") headerspropiedad.append("Sup. Total") headerspropiedad.append("Dormitorios") headerspropiedad.append("Baños") headerspropiedad.append("Estacionamientos") headerspropiedad.append("Bodegas") datospropiedad.append(precio) if operacion == 'venta': datospropiedad.append(preciouf) datospropiedad.append(metrosmin) datospropiedad.append(metrosmax) datospropiedad.append(dormitorios) datospropiedad.append(banos) datospropiedad.append(estacionamientos) datospropiedad.append(bodegas) descripcion = propiedad[15] if pro: if operacion == 'venta': precioV = datospro[0] precioV = precioV / uf1 precioV = int(precioV) precioV = str(format(precioV, ',')) precioV = precioV.replace(',', '.') precioV = 'UF ' + precioV rentV = float(datospro[1]) rentV = int(rentV * 1000) rentV = float(rentV / 10) rentV = str(rentV) + "%" precioA = datospro[2] precioA = str(format(precioA, ',')) precioA = precioA.replace(',', '.') precioA = '$ ' + precioA rentA = float(datospro[3]) rentA = int(rentA * 1000) rentA = float(rentA / 10) rentA = str(rentA) + "%" headersrentabilidad.append("Tasación Venta") headersrentabilidad.append("Rent. Venta") headersrentabilidad.append("Tasación Arriendo") headersrentabilidad.append("Rent. Arriendo") datosrentabilidad.append(precioV) datosrentabilidad.append(rentV) datosrentabilidad.append(precioA) datosrentabilidad.append(rentA) else: precioA = datospro[0] precioA = str(format(precioA, ',')) precioA = precioA.replace(',', '.') precioA = '$ ' + precioA headersrentabilidad.append("Tasación Arriendo") datosrentabilidad.append(precioA) if interna: mail = datosinterna[0] headerscontacto.append("Mail") datoscontacto.append(mail) telefono = datosinterna[1] headerscontacto.append("Telefono") if 'yapo' in link and telefono != 'NN': try: image = Image("auxphone.gif") image._restrictSize(1.2 * inch, 1.7 * inch) datoscontacto.append(image) except: datoscontacto.append('NN') else: datoscontacto.append(telefono) dueno = datosinterna[2] headerscontacto.append("Dueño") datoscontacto.append(dueno.capitalize()) styles = getSampleStyleSheet() styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY, leading=16)) doc = SimpleDocTemplate(fileName, pagesize=letter, rightMargin=72, leftMargin=72, topMargin=72, bottomMargin=18) Story = [] tabla = [] tabla.append(headerslocalizacion) tabla.append(datoslocalizacion) t1 = Table(tabla, hAlign='LEFT') t1.setStyle( TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('FONTSIZE', (0, 0), (-1, -1), 9), ('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#34BAAF')), ('TEXTCOLOR', (0, 0), (-1, 0), colors.black), ])) tabla = [] tabla.append(headerspropiedad) tabla.append(datospropiedad) t2 = Table(tabla, hAlign='LEFT') t2.setStyle( TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('FONTSIZE', (0, 0), (-1, -1), 11), ('BACKGROUND', (0, 0), (-1, 0), colors.lightgrey), ('TEXTCOLOR', (0, 0), (-1, 0), colors.black), ])) if pro: tabla = [] tabla.append(headersrentabilidad) tabla.append(datosrentabilidad) t3 = Table(tabla, hAlign='LEFT') t3.setStyle( TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.lightgrey), ('TEXTCOLOR', (0, 0), (-1, 0), colors.black), ('FONTSIZE', (0, 0), (-1, -1), 11), ])) if interna: tabla = [] tabla.append(headerscontacto) tabla.append(datoscontacto) t4 = Table(tabla, hAlign='LEFT') t4.setStyle( TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('BACKGROUND', (0, 0), (-1, 0), colors.lightgrey), ('TEXTCOLOR', (0, 0), (-1, 0), colors.black), ('FONTSIZE', (0, 0), (-1, -1), 11), ])) image = Image('bull_logo2.png', hAlign='LEFT') image._restrictSize(2 * inch, 3 * inch) Story.append(image) Story.append(Spacer(1, 16)) if interna: ptext = '<font size=11><b>FICHA PROPIEDAD</b>: ' + str(id) + '</font>' Story.append(Paragraph(ptext, styles["Justify"])) Story.append(Spacer(1, 14)) else: ptext = '<font size=11><b>FICHA PROPIEDAD</b></font>' Story.append(Paragraph(ptext, styles["Justify"])) Story.append(Spacer(1, 14)) Story.append(t1) Story.append(Spacer(1, 16)) Story.append(t2) Story.append(Spacer(1, 16)) if pro: Story.append(t3) Story.append(Spacer(1, 16)) if interna: Story.append(t4) Story.append(Spacer(1, 16)) ptext = '<font size=11><b>Descripción:</b></font>' Story.append(Paragraph(ptext, styles["Justify"])) Story.append(Spacer(1, 12)) if not interna: imagenDescripcion = Image('imagenDescripcion.png') Story.append(imagenDescripcion) Story.append(PageBreak()) else: ptext = '<font size=11>' + str(descripcion) + '</font>' Story.append(Paragraph(ptext, styles["Justify"])) Story.append(PageBreak()) if len(links) > 0 and interna: print("entro en crear tabla de links") print(links) data = [] n = 0 headers = [ "N°", "UF", "Precio", "UF/mt2", "MtsMin", "MtsMax", "Dorms", "Baños", "Link", "Disponibilidad" ] for l in links: if "portal" in l: d = [] n += 1 d.append(str(n)) avaible = pubPortalExiste.publicacionExiste(l) id = botPropertyConnector.obtenerIdConLink( l, "www.portalinmobiliario.com") id = id[0] prop = reportes.precio_from_portalinmobiliario(id) prop = prop[0] print("Arreglo de propiedad:") print(prop) print("1er dato de propiedad de propiedad:") print(prop[0]) ufn = int(prop[0] / (uf.getUf())) d.append(ufn) d.append(prop[0]) d.append((int(20 * ufn / (prop[1] + prop[2]))) / 10) d.append(int(prop[1])) d.append(int(prop[2])) d.append(prop[5]) d.append(prop[6]) print(d) print("appendeo bien datos") linkHtml = '<link href="' + l + '" color="blue">' + "Link" + '</link>' print(linkHtml) linkHtml = platypus.Paragraph(linkHtml, PS('body')) d.append(linkHtml) if avaible: d.append("Disponible") else: d.append("No disponible") print(str(n) + " intento de agregar prop a data") print(d) data.append(d) else: pass data = [headers] + data #t=Table(data,nrCols*[0.6*inch], nrRows*[0.25*inch]) t = Table(data) t.setStyle( TableStyle([ ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black), ('BOX', (0, 0), (-1, -1), 0.25, colors.black), ('FONTSIZE', (0, 0), (-1, -1), 9), ])) Story.append(t) Story.append(PageBreak()) for x in range(0, lenfotos): image = Image(str(x) + " foto.jpg", hAlign='LEFT') image._restrictSize(6 * inch, 9 * inch) Story.append(image) Story.append(Spacer(1, 4)) Story = list(Story) doc.build(Story)
def main(): print("obteniendo propiedades a tasar") mariadb_connection = mysql.connect(user='******', password='******', host='127.0.0.1', database='bullestate') cur = mariadb_connection.cursor() sql ='select id2,fechapublicacion,fechascrap,operacion,tipo,precio,dormitorios,banos,metrosmin,metrosmax,lat,lon,' \ 'estacionamientos,link from duenos inner join portalinmobiliario where ' \ 'duenos.idProp = portalinmobiliario.id2 and ' \ 'duenos.contactado is NULL and ' \ 'duenos.esDueno = "si" and ' \ 'region = "metropolitana" and ' \ 'tipo = "departamento" and ' \ 'fechascrap > "' + str(yesterday) + '"' cur.execute(sql) resultados = cur.fetchall() propsPorTasar = [list(x) for x in resultados] print("creando modelo") clfHV = ensemble.GradientBoostingRegressor(n_estimators=400, max_depth=5, min_samples_split=2, learning_rate=0.1, loss='huber') #id2,fechapublicacion,fechascrap,operacion,tipo,precio,dormitorios,banos,metrosmin,metrosmax,lat,lon,estacionamientos,link listacomunas = [""] print("Obteniendo propiedades para modelo") propsPV = reportes.from_portalinmobiliario("departamento", "metropolitana", listacomunas, "venta", True) propsYV = reportes.from_yapo("departamento", "15", listacomunas, True, "venta", True) propsV = propsPV + propsYV preciosV = [row[5] for row in propsV] trainingV = propsV.copy() for row in trainingV: del row[13] #if client["tipo"].lower()=="comercial": #del row[7] #del row[6] del row[5] del row[4] del row[3] del row[2] del row[1] del row[0] print("Haciendo fit") clfHV.fit(trainingV, preciosV) results = [] print("Recorriendo propiedades") for prop in propsPorTasar: tasacionVenta = int( clfHV.predict([[ int(prop[6]), int(prop[7]), int(prop[8]), int(prop[9]), prop[10], prop[11], int(prop[12]) ]])[0]) precioReal = int(prop[5]) delta = precioReal - tasacionVenta deltaPorc = int((1000 * delta) / precioReal) / 10 if(deltaPorc < -20) and (deltaPorc > -100) \ and pubPortalExiste.publicacionExiste(prop[13]): results.append( str(precioReal) + " vs " + str(tasacionVenta) + " delta%:" + str(deltaPorc) + " " + str(prop[13])) for r in results: print(r)
def tasador(propiedad): regYapoDict={ "metropolitana":"15", "valparaiso":"6", "Valparaíso":"6", "arica":"1", "iquique":"2", "antofagasta":"3", "atacama":"4", "coquimbo":"5", "ohiggins":"7", "maule":"8", "ñuble":"16", "biobio":"9", "araucania":"10", "los Rios":"11", "los Lagos":"12", "aysen":"13", "magallanes":"14", } region=str(propiedad[1]) regionP=region regionY=regYapoDict[region.lower()] operacion=str(propiedad[2]) tipo=str(propiedad[3]) precio=float(propiedad[4]) dormitorios=(propiedad[5]) banos=(propiedad[6]) metrosmin=(propiedad[7]) metrosmax=(propiedad[8]) estacionamientos=(propiedad[9]) bodegas=str(propiedad[10]) lat=(propiedad[11]) lon=(propiedad[12]) link=str(propiedad[13]) id=str(propiedad[14]) if operacion=='venta': comuna=str(link.split('/')[5]) comuna=comuna.replace('-'+str(regionP),'') comuna=comuna.replace('-',' ') comuna=comuna.capitalize() else: comuna=str(link.split('/')[6]) comuna=comuna.replace('-metropolitana','') comuna=comuna.replace('-',' ') comuna=comuna.capitalize() #Revisar si existe aun la publicacion if not pubPortalExiste.publicacionExiste(link): text='Propiedad ya no se encuentra disponible en el sitio.' return(text) propsPV = reportes.from_portalinmobiliario(tipo,region,[comuna],"venta",True) propsYV = reportes.from_yapo(tipo,regionY,[comuna],True,"venta",True) propsV = propsPV + propsYV # aca deberiamos hacer el GB clfHV = ensemble.GradientBoostingRegressor(n_estimators=400, max_depth=5, min_samples_split=2, learning_rate=0.1, loss='huber') #id2,fechapublicacion,fechascrap,operacion,tipo,precio,dormitorios,banos,metrosmin,metrosmax,lat,lon,estacionamientos,link preciosV = [row[5] for row in propsV] trainingV = propsV.copy() for row in trainingV: del row[13] del row[5] del row[4] del row[3] del row[2] del row[1] del row[0] clfHV.fit(trainingV, preciosV) propsPA = reportes.from_portalinmobiliario(tipo,region,[comuna],"arriendo",True) propsYA = reportes.from_yapo(tipo,regionY,[comuna],True,"arriendo",True) propsA = propsPA + propsYA # aca deberiamos hacer el GB clfHA = ensemble.GradientBoostingRegressor(n_estimators=400, max_depth=5, min_samples_split=2, learning_rate=0.1, loss='huber') #id2,fechapublicacion,fechascrap,operacion,tipo,precio,dormitorios,banos,metrosmin,metrosmax,lat,lon,estacionamientos,link preciosA = [row[5] for row in propsA] trainingA = propsA.copy() for row in trainingA: del row[13] del row[5] del row[4] del row[3] del row[2] del row[1] del row[0] clfHA.fit(trainingA, preciosA) tasacionVenta = clfHV.predict([[int(dormitorios),int(banos), int(metrosmin),int(metrosmax), lat,lon, int(estacionamientos)]]) tasacionArriendo = clfHA.predict([[int(dormitorios),int(banos), int(metrosmin),int(metrosmax), lat,lon, int(estacionamientos)]]) precioV = tasacionVenta precioA = tasacionArriendo try: return(precioV,precioA) except Exception as e: return e,e
def crearFicha(sitio, id, mail, tipoficha): links = [] text2 = '' auxPhone = 0 #Determinar tipo de informe pro = False interna = False financiera = False textmail = '' ufn = uf.getUf() if tipoficha > 4: financiera = True tipoficha = tipoficha - 4 if tipoficha == 2: pro = True elif tipoficha == 3: interna = True elif tipoficha == 4: interna = True pro = True #Chequear que sitio este bien sitio = sitio.lower() if ('portal' in sitio): sitio = 'portal' elif ('yapo' in sitio): sitio = 'yapo' else: text = 'Sitio ingresado es incorrecto. Favor ingresar portalinmobiliario o yapo.' return (text) #Chequear que mail este bien if ('@' not in mail): text = 'Email incorrecto. Favor ingresar correo válido.' return (text) if ('.' not in mail): text = 'Email incorrecto. Favor ingresar correo válido.' return (text) #sacar informacion de bbdd, y chequear que propiedad existe: propiedad = obtenerProp(id, sitio) print(propiedad) if len(propiedad) < 1: if sitio == 'portal': link = "https://www.portalinmobiliario.com/" + str(id) else: link = "https://www.yapo.cl/region_metropolitana/" + str(id) if not pubPortalExiste.publicacionExiste( link) and not pubYapoExiste.publicacionExiste(link): text = '¨Propiedad no se encuentra en la base de datos.' return (text) elif sitio == "portal": pass else: if obtainPropFromYapo(link) is not False: propiedad = obtainPropFromYapo(link) else: regYapoDict = { "metropolitana": "15", "valparaiso": "6", "Valparaíso": "6", "arica": "1", "iquique": "2", "antofagasta": "3", "atacama": "4", "coquimbo": "5", "ohiggins": "7", "maule": "8", "ñuble": "16", "biobio": "9", "araucania": "10", "los Rios": "11", "los Lagos": "12", "aysen": "13", "magallanes": "14", } propiedad = list(propiedad) region = str(propiedad[1]) regionP = region regionY = regYapoDict[region.lower()] if region == '15': regionP = 'metropolitana' if region == 'metropolitana': regionY = '15' operacion = str(propiedad[2]) tipo = str(propiedad[3]) precio = float(propiedad[4]) dormitorios = str(propiedad[5]) banos = str(propiedad[6]) metrosmin = str(propiedad[7]) metrosmax = str(propiedad[8]) estacionamientos = str(propiedad[9]) bodegas = str(propiedad[10]) lat = str(propiedad[11]) lon = str(propiedad[12]) link = str(propiedad[13]) if sitio == 'portal': if operacion == 'venta': comuna = str(link.split('/')[5]) comuna = comuna.replace('-' + str(regionP), '') comuna = comuna.replace('-', ' ') comuna = comuna.capitalize() propiedad.append(comuna) else: comuna = str(link.split('/')[6]) comuna = comuna.replace('-metropolitana', '') comuna = comuna.replace('-', ' ') comuna = comuna.capitalize() propiedad.append(comuna) else: comuna = str(propiedad[14]) #Revisar si existe aun la publicacion if not pubPortalExiste.publicacionExiste(link): text = 'Propiedad ya no se encuentra disponible en el sitio.' return (text) #sacar informacion de la publicacion #sacar urls fotos portal matrixdescripcion = [] matrixcounter = 0 matrixdescripcion.append('') if sitio == 'portal': first = True url = [] page = requests.get( link, headers={'User-Agent': agentCreator.generateAgent()}) metatext = page.text metatext = metatext.split(' ') descripcion = [] savedescripcion = False for texto in metatext: if 'item-description__text' in texto: savedescripcion = True if '/div' in texto: if savedescripcion: descripcion.append(str(texto)) savedescripcion = False if savedescripcion: descripcion.append(str(texto)) descripcion2 = descripcion.copy() first = (descripcion2[0]) first = first.split(">") print(first) first = first[2] descripcion[0] = first last = descripcion2[-1] last = last.split("<") last = last[0] descripcion[-1] = last #descripcion=descripcion[2:] print(descripcion) descripcion = list(descripcion) if not interna: for desc in descripcion: desc = desc.replace(' ', '') desc = desc.replace('<br />', ' ') desc = desc.replace('<br/>', ' ') desc = desc.replace('<br>', ' ') desc = desc.replace('<b/>', '') desc = desc.replace('<b>', '') desc = desc.replace('</b>', '') desc = desc.replace('<br', '') desc = desc.replace('/>', '') desc = desc.replace('í', 'í') desc = desc.replace('é', 'é') desc = desc.replace('ó', 'ó') desc = desc.replace('á', 'á') desc = desc.replace('ú', 'ú') desc = desc.replace('ñ', 'ñ') desc = desc.replace('Ñ', 'Ñ') if "+56" in desc: desc = "**" if len(desc) >= 6: try: desc.replace('\n', "") int(desc) desc = "**" except: pass if "@" in desc: desc = "***" if ((len(matrixdescripcion[matrixcounter]) + len(desc)) >= 78): matrixcounter += 1 matrixdescripcion.append('') if desc != '': matrixdescripcion[matrixcounter] = matrixdescripcion[ matrixcounter] + str(desc) else: if first: if desc != '': matrixdescripcion[ matrixcounter] = matrixdescripcion[ matrixcounter] + str(desc) first = False else: if desc != '': matrixdescripcion[ matrixcounter] = matrixdescripcion[ matrixcounter] + ' ' + str(desc) print(matrixdescripcion) for x, matrix in enumerate(matrixdescripcion): matrix = matrix.replace('<br />', '\n') matrix = matrix.replace('<br/>', '\n') matrix = matrix.replace('<br>', '\n') matrix = matrix.replace('<b/>', '') matrix = matrix.replace('<b>', '') matrix = matrix.replace('</b>', '') matrixdescripcion[x] = matrix descripcion = '\n'.join(matrixdescripcion) propiedad.append(descripcion) else: descripcion = ' '.join(descripcion) descripcion = descripcion.replace(' ', '') descripcion = descripcion.replace('<br />', '\n') descripcion = descripcion.replace('<br/>', '\n') descripcion = descripcion.replace('<br>', '\n') descripcion = descripcion.replace('<b/>', '') descripcion = descripcion.replace('<b>', '') descripcion = descripcion.replace('</b>', '') descripcion = descripcion.replace('<br', '') descripcion = descripcion.replace('/>', '') descripcion = descripcion.replace('í', 'í') descripcion = descripcion.replace('é', 'é') descripcion = descripcion.replace('ó', 'ó') descripcion = descripcion.replace('á', 'á') descripcion = descripcion.replace('ú', 'ú') descripcion = descripcion.replace('ñ', 'ñ') descripcion = descripcion.replace('Ñ', 'Ñ') propiedad.append(descripcion) print(propiedad) for meta in metatext: if 'data-full-images' in meta: meta = meta.split(';') for met in meta: if 'mlstatic' in met: met = met.split('&') met = met[0] met = met.replace(".webp", ".jpg") url.append(str(met)) #Sacar urls fotos yapo else: url = [] page = requests.get( link, headers={'User-Agent': agentCreator.generateAgent()}) metatext = page.text metatext = metatext.split(' ') descripcion = [] savedescripcion = False saveimg = False og = True for texto in metatext: if '<h4>Descripción</h4>' in texto: savedescripcion = True if og and 'og:image' in texto: saveimg = True og = False if 'img/yapo' in texto: saveimg = False if savedescripcion: descripcion.append(str(texto)) if '</div>' in texto: savedescripcion = False if saveimg and 'img.yapo.cl/images' in texto: texto = texto.replace('content="', '') texto.replace('"', '') url.append(texto) if 'phone-url' in texto: texto = texto.split('"') texto = texto[1] auxPhone = texto auxPhone = 'https://www.yapo.cl' + auxPhone descripcion = descripcion[1:] first = True print(descripcion) for desc in descripcion: desc = desc.replace('\n', ' ') desc = desc.replace('<br />', '\n') desc = desc.replace('</div>', '\n') desc = desc.replace('<br>', '\n') desc = desc.replace('<br', '') desc = desc.replace('/>', '') desc = desc.replace('itemprop="description">', "") desc = desc.replace('</p>', '\n') desc = desc.replace("\t", "") desc = desc.replace('<!', '') desc = desc.replace('--', '') desc = desc.replace(' ', '') desc = desc.replace('\n', ' ') if ((len(matrixdescripcion[matrixcounter]) + len(desc)) >= 78): matrixcounter += 1 matrixdescripcion.append('') matrixdescripcion[matrixcounter] = matrixdescripcion[ matrixcounter] + str(desc) else: if first: matrixdescripcion[matrixcounter] = matrixdescripcion[ matrixcounter] + str(desc) first = False else: matrixdescripcion[matrixcounter] = matrixdescripcion[ matrixcounter] + ' ' + str(desc) print(matrixdescripcion) descripcion = '\n'.join(matrixdescripcion) propiedad.append(descripcion) try: print(auxPhone) response = requests.get( auxPhone, headers={'User-Agent': agentCreator.generateAgent()}) auxphone2 = auxPhone img = Image.open(BytesIO(response.content)) img = img.convert('L') img = img.convert('1') img.save("auxphone.gif") auxPhone = 1 except: pass lenfotos = len(url) if len(url) == 0: print("la propiedad no cuenta con fotografias") else: print('total fotos: ' + str(len(url))) for x, u in enumerate(url): u = u.replace('"', '') response = requests.get(u) img = Image.open(BytesIO(response.content)) img.save(str(x) + " foto.jpg") if not interna: imagenDescripcion = Image.new('RGB', (456, 345), color=(255, 255, 255)) d = ImageDraw.Draw(imagenDescripcion) f = ImageFont.truetype('arial.ttf', 12) d.text((0, 0), descripcion, font=f, fill=(0, 0, 0)) imagenDescripcion.save('imagenDescripcion.png') datospro = [] if pro: propsPV = reportes.from_portalinmobiliario(tipo, regionP, [comuna], "venta", True) propsYV = reportes.from_yapo(tipo, regionY, [comuna], True, "venta", True) propsV = propsPV + propsYV # aca deberiamos hacer el GB m2 = reportes.m2prom(tipo, comuna, region) m2V = m2[0] m2A = m2[1] clfHV = ensemble.GradientBoostingRegressor(n_estimators=400, max_depth=5, min_samples_split=2, learning_rate=0.1, loss='huber') #id2,fechapublicacion,fechascrap,operacion,tipo,precio,dormitorios,banos,metrosmin,metrosmax,lat,lon,estacionamientos,link preciosV = [row[5] for row in propsV] trainingV = propsV.copy() for row in trainingV: del row[13] if tipo not in ["departamento", "Casa", "Oficina"]: del row[12] del row[7] if tipo != "local": del row[6] del row[5] del row[4] del row[3] del row[2] del row[1] del row[0] x_train, x_test, y_train, y_test = train_test_split(trainingV, preciosV, test_size=0.10, random_state=2) #obtain scores venta: clfHV.fit(x_train, y_train) print("-----------") print("Score Huber:") print(clfHV.score(x_test, y_test)) scoreV = clfHV.score(x_test, y_test) clfHV.fit(trainingV, preciosV) propsPA = reportes.from_portalinmobiliario(tipo, regionP, [comuna], "arriendo", True) propsYA = reportes.from_yapo(tipo, region, [comuna], True, "arriendo", True) propsA = propsPA + propsYA # aca deberiamos hacer el GB clfHA = ensemble.GradientBoostingRegressor(n_estimators=400, max_depth=5, min_samples_split=2, learning_rate=0.1, loss='huber') #id2,fechapublicacion,fechascrap,operacion,tipo,precio,dormitorios,banos,metrosmin,metrosmax,lat,lon,estacionamientos,link preciosA = [row[5] for row in propsA] trainingA = propsA.copy() for row in trainingA: del row[13] if tipo not in ["departamento", "Casa", "Oficina"]: del row[12] del row[7] if tipo != "local": del row[6] del row[5] del row[4] del row[3] del row[2] del row[1] del row[0] x_train, x_test, y_train, y_test = train_test_split(trainingA, preciosA, test_size=0.10, random_state=2) #obtain scores arriendo: clfHA.fit(x_train, y_train) print("-----------") print("Score Huber:") print(clfHA.score(x_test, y_test)) scoreA = clfHA.score(x_test, y_test) clfHA.fit(trainingA, preciosA) textmail += "Resultados comuna " + str( comuna) + ":\n" + "Score Ventas: " + str( (int(10000 * scoreV)) / 100) + "%\nScore Arriendos: " + str( (int(10000 * scoreA)) / 100) + "%\nPrecio m2 Venta: UF." + str( (int(10 * (m2V / ufn))) / 10) + "\nPrecio m2 Arriendo: $" + str( (int(m2A))) + "\n\n" if tipo not in ["departamento", "Casa", "Oficina"]: prop = [banos, metrosmin, metrosmax, lat, lon] if tipo != "local": prop = [metrosmin, metrosmax, lat, lon] else: prop = [ dormitorios, banos, metrosmin, metrosmax, lat, lon, estacionamientos ] tasacionVenta = clfHV.predict([prop]) tasacionArriendo = clfHA.predict([prop]) precioV = tasacionVenta precioA = tasacionArriendo print("el precio tasado de venta inicial es: " + str(precioV)) print("el precio tasado de arriendo inicial es: " + str(precioA)) if operacion == 'venta': if precioV is None or precioV < 0.1: pro = False financiera = False try: rentaV = ((precioV - precio) / precio) except: pro = False financiera = False text2 = 'No se ha podido realizar tasación' print('fail 1') if precioA is None or precioA < 0.01: pro = False financiera = False try: rentaA = (precioA * 12 / precio) except: pro = False financiera = False text2 = 'No se ha podido realizar tasación' print('fail 2') if pro: if rentaA > 0.2: pro = False financiera = False print('fail 3') if rentaA < 0: pro = False financiera = False if pro: # precio venta tasado datospro.append(precioV) # rentabilidad de venta datospro.append(float(rentaV)) # precio arriendo tasado datospro.append(precioA) # rentabilidad de arriendo datospro.append(float(rentaA)) else: try: precioA = tasacionArriendo except: pro = False text2 = 'No se ha podido realizar tasación' print('fail 72') if pro: if precioA is None or precioA < 0.01: pro = False text2 = 'No se ha podido realizar tasación' print('fail 8') if pro: # precio arriendo tasado datospro.append(precioA) # rentabilidad de arriendo datoscontacto = [] if interna: if sitio == 'portal': try: email, telefono, dueno = reportes.getDatosDueno(str(id)) except: email = "NN" telefono = "NN" dueno = "NN" else: email = "NN" if auxPhone == 1: telefono = auxphone2 else: telefono = "NN" dueno = 'NN' datoscontacto.append(email) datoscontacto.append(telefono) datoscontacto.append(dueno) #Crear PDF if interna: nombrearchivo = "Ficha Propiedad Sitio:" + str(sitio) + " Id:" + str( id) + ".pdf" else: nombrearchivo = "Ficha Propiedad Sitio:" + str(sitio) + ", " + str( operacion) + ", " + str(tipo) + ", " + str(region) + ", " + str( comuna) + ".pdf" print(nombrearchivo) links = [] if financiera: pro = "financiera" print("entering pdfCreator") pdfCreatorFichas.crearPdfFicha(nombrearchivo, id, propiedad, lenfotos, pro, datospro, interna, datoscontacto, regionP, links) print("pdf generado con exito") #Enviar PDF sendmail.sendMail(mail, "", nombrearchivo) #Eliminar del servidor if len(url) == 0: pass else: for x, u in enumerate(url): os.remove(str(x) + " foto.jpg") try: os.remove("auxphone.gif") except: pass if not interna: try: os.remove("imagenDescripcion.png") except: pass os.remove(nombrearchivo) #Retornar exito text = "Ficha creada para la propiedad: " + str( id) + " obtenida del sitio: " + str( sitio) + ", enviada con éxito al correo: " + str(mail) + "." if text2 != '': text = text2 + '. ' + text return (text)