예제 #1
0
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('&#237;','í')
                desc=desc.replace('&#233;','é')
                desc=desc.replace('&#243;','ó')
                desc=desc.replace('&#225;','á')
                desc=desc.replace('&#250;','ú')
                desc=desc.replace('&#241;','ñ')
                desc=desc.replace('&#209;','Ñ')

                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('&#237;','í')
            descripcion=descripcion.replace('&#233;','é')
            descripcion=descripcion.replace('&#243;','ó')
            descripcion=descripcion.replace('&#225;','á')
            descripcion=descripcion.replace('&#250;','ú')
            descripcion=descripcion.replace('&#241;','ñ')
            descripcion=descripcion.replace('&#209;','Ñ')



            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)
예제 #5
0
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)
예제 #6
0
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
예제 #7
0
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('&#237;', 'í')
                desc = desc.replace('&#233;', 'é')
                desc = desc.replace('&#243;', 'ó')
                desc = desc.replace('&#225;', 'á')
                desc = desc.replace('&#250;', 'ú')
                desc = desc.replace('&#241;', 'ñ')
                desc = desc.replace('&#209;', 'Ñ')

                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('&#237;', 'í')
            descripcion = descripcion.replace('&#233;', 'é')
            descripcion = descripcion.replace('&#243;', 'ó')
            descripcion = descripcion.replace('&#225;', 'á')
            descripcion = descripcion.replace('&#250;', 'ú')
            descripcion = descripcion.replace('&#241;', 'ñ')
            descripcion = descripcion.replace('&#209;', 'Ñ')

            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)