Repository navigation
Camilo Puerto
Problem 3:
People often have difficulties finding plans or activities in a specific area. The information about places, such as reviews, prices, schedules, and location, is usually spread across different platforms. Also, the options they find do not always match what they want or where they are.
Understand how people search for and choose plans, either with their family or their partner. We want to identify:
- Where they look for information.
- What information is important to them.
- How they make their final decision.
- What difficulties they experience during the process.
Interviewer: Camilo Puerto
Profile: People who make plans with their family and/or partner.
| # | Question | Purpose |
|---|---|---|
| 1 | Could you introduce yourselves? | Get to know the interviewees and establish context. |
| 2 | How old are you? | Understand the basic profile of the interviewees. |
| 3 | Do you usually go out or make plans as a couple or family? | Identify if they have experience related to the problem. |
| 4 | How often do you usually make these plans? | Understand how frequently they face this situation. |
| 5 | When you want to go out, do you already know what to do or do you look for different options? | Understand how the search process starts. |
| 6 | Think about the last time you wanted to go out and did not know what to do. What happened? | Get a real example of the problem. |
| 7 | What information do you need before choosing a plan? | Identify the information that is important for making a decision. |
| 8 | Have you had any difficulties finding this information or choosing what to do? | Identify the main problems and obstacles. |
| 9 | How do you solve these difficulties or decide what plan to make? | Understand their current solutions. |
| 10 | Have you ever found a plan that looked interesting but later decided not to go? Why? | Identify negative experiences and reasons for rejecting a plan. |
Interviewer: Camilo Puerto
Profile: Person who makes plans with their partner.
| # | Question | Purpose |
|---|---|---|
| 1 | Can you introduce yourself and tell me your age? | Understand the interviewee's basic profile. |
| 2 | Do you have a partner? | Confirm that the interviewee matches the selected profile. |
| 3 | Do you usually go out or make plans with your partner? | Identify experience related to the problem. |
| 4 | How often do you usually make these plans? | Understand how frequently they choose plans. |
| 5 | When you want to go out, do you already know what to do or do you look for different options? | Understand how they search for alternatives. |
| 6 | Think about the last time you went out and did not know what to do. What happened? | Get a real example of the decision process. |
| 7 | Where do you usually look for information? | Identify the tools and sources they use. |
| 8 | What is important when deciding whether to go or not? | Identify the main decision factors. |
| 9 | Have you ever rejected a plan that looked interesting? Why? | Identify bad experiences and reasons for rejection. |
| 10 | Is there anything else about your experience that you think is important? | Give the interviewee space to mention additional needs or problems. |
Interviewees: Ferley Puerto and Ana Luisa
Date: August 11, 2026
Ages: 45 and 46
Recording: iPhone – Voice Notes
Interview transcript
Camilo: Hola, mi nombre es Camilo Puerto y estoy realizando una entrevista para una actividad de la universidad. La idea es conocer cómo es la experiencia de ustedes cuando quieren buscar algún plan para hacer en pareja o en familia. Cabe resaltar que no hay respuestas correctas o incorrectas; simplemente quiero conocer su experiencia y cómo lo hacen normalmente. ¿Está bien si grabo el audio de esta entrevista para utilizarlo únicamente en la actividad?
Entrevistados: Sí, está bien.
Camilo: Para comenzar, ¿podrían presentarse?
Entrevistados: Hola me llamo Ferley Puerto, hola me llamo Ana Luisa y somos los padres de Camilo.
Camilo: ¿Cuántos años tienen?
Entrevistado 1: Tengo 45 años.
Entrevistada 2: Tengo 46 años.
Camilo: ¿Ustedes normalmente suelen salir o hacer algún plan en pareja o en familia?
Entrevistados: Sí, en las dos situaciones, tanto en familia como en pareja.
Camilo: ¿Cada cuánto aproximadamente suelen hacer este tipo de planes?
Entrevistado 1: Generalmente lo hacemos los fines de semana, pero podemos salir en cualquier momento de la semana igualmente.
Camilo: Cuando quieren salir, ¿normalmente ya saben qué hacer o tienen que buscar diferentes opciones?
Entrevistada 2: Algunas veces sí sabemos qué hacer y otras veces no. Cuando no sabemos, miro TikTok para buscar diferentes alternativas y encontrar algún sitio o actividad que podamos hacer.
Camilo: Piensa en la última vez que quisiste salir con tu pareja o con la familia y no sabías exactamente qué hacer. ¿Me puedes contar qué pasó?
Entrevistado 1: Se pueden generar diferentes opiniones entre todos los integrantes de la familia. A algunos les puede gustar un plan y a otros no, porque no conocemos exactamente las actividades que se pueden realizar en cada sitio. Por eso, muchas veces terminamos eligiendo un lugar que ya conocemos todos.
Camilo: ¿Qué información buscan o necesitan saber antes de decidirse por un plan?
Entrevistada 2: Primero buscamos saber si el sitio es bueno. También miramos las recomendaciones y comentarios, ya sea sobre la comida o sobre el lugar. Algunas veces hemos ido a sitios que encontramos por TikTok y al llegar nos damos cuenta de que no eran lo que estábamos buscando.
Camilo: ¿Han tenido alguna dificultad encontrando esa información o escogiendo qué hacer?
Entrevistado 1: Sí, claro. Las dificultades se presentan constantemente porque, aunque las redes sociales muestran diferentes lugares, comidas o actividades, no podemos saber con certeza si realmente lo que estamos viendo corresponde con la realidad o si se trata de algún tipo de promoción comercial. Muchas veces hemos ido al sitio y definitivamente no nos gusta la actividad o la comida. Además, las imágenes o los comentarios que muestran no siempre corresponden con lo que realmente encontramos.
Camilo: Teniendo en cuenta esas dificultades, ¿cómo las solucionan o cómo terminan decidiendo qué plan hacer?
Entrevistado 1: No hay una solución definitiva. De alguna manera nos toca ir y probar el sitio. Por eso, muchas veces terminamos regresando a los mismos lugares que ya conocemos. Otras veces hemos tenido suerte y encontramos un sitio que sí corresponde con lo que queríamos. También preferimos recibir la recomendación de alguien que realmente ya haya ido al lugar.
Camilo: ¿Alguna vez encontraron un plan que parecía interesante, pero después terminaron descartándolo? ¿Por qué?
Entrevistada 2: Sí. Estuvimos en un restaurante que había visto anteriormente en redes sociales y la comida no tenía nada que ver con lo que esperábamos. La comida estaba fría y no tuvimos una buena experiencia. Después de eso decidimos que, antes de ir a un sitio, era mejor buscar la recomendación de alguien que ya hubiera ido y pudiera decirnos si realmente era buena la comida o el lugar.
Camilo: Perfecto, eso sería todo. Muchas gracias por su tiempo y por ayudarme con la entrevista.
Entrevistados: A ti, hijo.
Interviewee: Samuel Puerto
Date: August 11, 2026
Age: 16
Recording: iPhone – Voice Notes
Interview transcript
Camilo: Hola, mi nombre es Camilo Puerto y esta es la segunda entrevista que voy a realizar. Esta vez entrevistaré a mi hermano. Por favor, preséntate.
Samuel: Buenas, mi nombre es Samuel.
Camilo: Perfecto. Cuéntame, ¿cuántos años tienes?
Samuel: Tengo 16 años.
Camilo: ¿Tienes pareja?
Samuel: Sí.
Camilo: ¿Sueles salir o hacer planes con tu pareja?
Samuel: Sí, generalmente sí.
Camilo: ¿Cada cuánto aproximadamente suelen hacer este tipo de planes?
Samuel: Aproximadamente cada 15 días.
Camilo: Cuando quieres salir con tu pareja, ¿normalmente ya saben qué hacer o tienen que buscar diferentes opciones?
Samuel: A veces no sabemos qué hacer. Solo buscamos algún sitio y miramos qué podemos hacer.
Camilo: Piensa en la última vez que saliste con tu pareja y no sabías exactamente qué hacer. ¿Me puedes contar qué pasó?
Samuel: Sí. Fuimos al centro comercial La Colina y no sabíamos exactamente qué hacer. Primero fuimos a la zona de comidas y después vimos fuimos al cine. Ya que ella me dio la idea de entrar al cine y pues fuimos.
Camilo: Normalmente, cuando quieres hacer un plan, ¿dónde buscas información?
Samuel: Principalmente busco en Google Maps porque ahí aparecen las fotos de los restaurantes y las reseñas que pone la gente.
Camilo: Cuando encuentras un plan que te interesa, ¿qué cosas son las más importantes para decidir si ir o no?
Samuel: Siempre busco que sea un buen sitio, que esté bien valorado y que sea un lugar chevre para ir y hacer algo en pareja.
Camilo: ¿Alguna vez encontraste un plan que parecía interesante, pero terminaste descartándolo? ¿Por qué?
Samuel: Sí, alguna vez intentamos ir a un restaurante en el que nosotros mismos podíamos cocinar. En este caso era hacer una pizza. Pero las cosas no salieron bien porque el restaurante no cumplía con lo que ponía y terminamos decepcionados.
Camilo: Para cerrar, ¿hay algo más sobre tu experiencia buscando o escogiendo planes que consideres importante y que no te haya preguntado?
Samuel: Sí, siento que es importante preguntarle a la familia o a los amigos para conocer sus recomendaciones.
Camilo: Perfecto. Muchas gracias, hermano por tu tiempo y por ayudarme con la entrevista.
Samuel: De nada hermanito.
The first interview was with Ferley and Ana Luisa, a couple who usually make plans both as a family and as a couple. They normally go out on weekends, but sometimes they also make plans during the week.
When they do not know what to do, they usually look for ideas on TikTok. However, they have had some bad experiences because the places or activities shown on social media are not always the same in real life. They usually look at reviews, recommendations, food, and information about the place before deciding.
One of their main problems is that family members can have different opinions about what plan to choose. Because of this, they often prefer going to places they already know. They also trust recommendations from friends or family because they feel that these recommendations are more reliable than social media.
The second interview was with Samuel, a 16-year-old who usually makes plans with his partner. They go out approximately every two weeks. Sometimes they do not know what to do, so they search for different places and activities.
Samuel mainly uses Google Maps because he can see photos and reviews from other people. When choosing a plan, he looks for a place with good ratings and something fun to do as a couple.
However, he has also had a bad experience with a restaurant that did not offer what was advertised. Because of this, he also considers recommendations from family and friends important when choosing a plan.
What:
The family does not always know what activity or place to choose.
How:
They look for different alternatives, mainly using TikTok.
Why:
They want to find new options that match what the family wants to do.
What:
Family members can have different opinions about which plan to choose.
How:
They compare different options, but sometimes choose a place they already know.
Why:
A familiar place gives them more confidence and reduces the risk of having a bad experience.
What:
The family finds attractive places and activities on social media, but they are not always sure if the information is accurate.
How:
They check comments, recommendations, and pictures.
Why:
They have experienced situations where the content online did not match the real experience.
What:
The family has visited places that did not meet their expectations.
How:
They ask people who have already visited the place or return to places they already know.
Why:
Recommendations from people they trust feel more reliable and reduce the risk of wasting time or money.
What:
Samuel and his partner do not always know what activity to do.
How:
They look for a place and sometimes decide what to do after arriving.
Why:
They do not always have a plan beforehand.
What:
Samuel looks for information before choosing a place.
How:
He mainly uses Google Maps to check pictures and reviews.
Why:
This helps him get an idea of the place before going.
What:
Samuel evaluates a place before deciding to visit it.
How:
He looks at ratings and whether the place seems fun and appropriate for a couple.
Why:
He wants to have a good experience with his partner.
What:
Some plans look interesting but do not match what was advertised.
How:
Samuel had an experience with a restaurant where they were supposed to make their own pizza, but the experience did not meet their expectations.
Why:
The information available before the visit can create expectations that are different from the real experience.
The Factory Pattern was implemented in the Kotlin Admin App to build the data of a found item in a single place, so that the screen and the repository do not need to know how a found item is assembled.
It is used in the found-item registration functionality. FoundItemFactory creates the public found-item data with its default values, such as status available, the current semester, donationEligible false and donationStatus none, and adds photoPath only when the item has a photo. It also creates a separate map that contains only the private ownership detail.
When the administrator saves an item, FoundItemRepository asks FoundItemFactory for both maps and saves them in one Firestore batch: foundItems/{id} and, when a private detail was typed, foundItemPrivate/{id}. The creation time is added by the repository using the server timestamp.
The Factory Pattern was selected so that the creation rules of a found item live in one place instead of being repeated wherever an item is saved. The repository does not assemble the data by hand, so changing a default value or a field only requires changing the factory.
The factory also keeps the private ownership detail out of the public document, which every student can read, and it is easy to test: FoundItemFactoryTest checks the defaults, the optional photoPath and that the private detail never appears in the public map. This is a simple factory and not the Factory Method or Abstract Factory variants, because the application only needs one family of products.
The Kotlin Admin App signs staff in through Firebase Authentication with email and password. The account must belong to the Uniandes domain and have a verified email. After signing in, the app reads users/{uid} and compares the role field with the expected role using the UserRole enum and UserRoleValidator. If the role is not admin, the session is closed and access is denied. The same service validates the student role for the student flow, so an account cannot enter through the other door. The admin role is assigned outside the app, so a user cannot grant it to themselves, and the Firestore security rules also check it on the server.
The found-item form opens the system camera through the TakePicture activity result contract and a FileProvider that stores the photo temporarily in the app cache. The captured photo is shown inside the form. When the item is saved, the photo is uploaded to Firebase Storage as foundItems/{id}.jpg, and the Firestore document stores only the Storage path in the photoPath field, not the image or a URL. Storage rules allow only administrators to upload images smaller than 5 MB.
ConnectivityObserver listens to network changes with Android's ConnectivityManager and exposes whether the device has validated internet access. When there is no connection, the form shows a warning and saves the found item on the device instead of sending it: the data goes to PendingFoundItemStore, stored per user in SharedPreferences, and the photo is copied to the app's private storage. The item id is generated once, before saving. When the connection returns, pending items are sent one by one with that same id, and each one is deleted from the device only after Firestore confirms the write. Because the id never changes, a retry overwrites the same document and never creates a duplicate.
The Admin App reads the lostReports collection and, for each report that already has a foundAt date, calculates the days between reportedAt and foundAt. ReportTimeCalculator groups the reports by category and averages them. The screen shows, for each category, the number of reports considered and the average time in days. Reports that have not been found yet are ignored.
The student's ownership answer is stored in claimPrivate/{claimId} by the student app. The Admin App reads each pending claim together with the private characteristics registered for the item in foundItemPrivate/{foundItemId} and compares them with ClaimMatcher. The matcher lowercases both texts, removes accents and punctuation, keeps words of three or more letters and calculates what fraction of the registered words appears in the answer. A score of 60% or more is shown as Likely match, 30% or more as Partial match, and anything lower as No match. The screen only gives the administrator an indication; the final decision remains with the staff member.
The found-item form includes a Private ownership detail field, for example a serial number or a unique mark. This text is never stored in the public foundItems document, which every student can read. It is saved in foundItemPrivate/{id} in the same Firestore batch as the item, so both documents are created together or not at all, and it is the text that the claim verification compares against.
A Cloud Function (Node.js 20, 2nd generation) is triggered when a document is created in the matches collection and sends an SMS through the Twilio REST API. The Twilio API key and account identifier are stored in Google Secret Manager and injected into the function, so no credential is in the code or in the repository. The sender and recipient numbers are configured as environment variables, and the recipient is a verified test number. The project uses a Twilio trial account, which only sends predefined templates, so the message text is a fixed template. The source code is in functions/send-match-sms in the Kotlin repository.
Business Question Type 3: How does the successful ownership-verification rate differ between reports that include private identifying characteristics and those that do not?
The analysis uses operational data generated by the application from claims. The relevant attributes for this BQ are the student's ownership answer, the private characteristics registered for the found item, and whether the lost report has a private detail.
The Kotlin application communicates with Firebase through the Firebase SDK. Claims are written by the student application and read by the Admin App from Cloud Firestore through Firestore read operations.
The information required by the BQ is stored in Cloud Firestore. Claims are stored in the claims collection, while the answers and the registered characteristics are kept in separate private collections.
This BQ is processed in the Usage and Outcome Analytics stage of the pipeline.
The application retrieves all claims and compares the student's answer with the characteristics registered for the item. A verification is considered successful when at least 60% of the registered words appear in the answer.
The claims are then grouped by whether the lost report has private characteristics, and the success rate of each group is calculated.
Claims → Compare answer with registered characteristics → Successful if match ≥ 60% → Group by private characteristics → Success rate
The computed results are presented through the Verification Visualization stage of the pipeline.
The Verification Rate view displays the success rate of each group as cards, together with the difference between them. This allows administrators to see whether asking students for private identifying details makes ownership verification more reliable.
Repository for Documentation of the Project. Select a Sprint to see the deliverables.
| Sprint | Microsprints | Status |
|---|---|---|
| Sprint 1 | MS1 | MS2 | MS3 | MS4 | Complete |
| Sprint 2 | MS5 | MS6 | MS7 | | In process |
- Sofia Losada - 202221008
- Jhostin Sanchez - 202214064
- Emilio Zea -202221744
- Alex Pérez - 202123321
- Camilo - 202211362
- Daniel Rivera - 202123493