{"id":7459,"date":"2025-11-14T17:25:32","date_gmt":"2025-11-14T16:25:32","guid":{"rendered":"https:\/\/javiercachon.com\/?p=7459"},"modified":"2025-12-17T19:25:49","modified_gmt":"2025-12-17T18:25:49","slug":"mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion","status":"publish","type":"post","link":"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/","title":{"rendered":"Mi proyecto en Python del Curso de Adecco para desempleados de larga duraci\u00f3n."},"content":{"rendered":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine-1024x576.jpg\" alt=\"\" class=\"wp-image-7460\" style=\"width:1200px;height:auto\" srcset=\"https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine-1024x576.jpg 1024w, https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine-300x169.jpg 300w, https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine-768x432.jpg 768w, https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine-1536x864.jpg 1536w, https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine.jpg 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>El proyecto <strong>Cartelera de Cine en Python<\/strong> es una <strong>aplicaci\u00f3n web full stack profesional<\/strong>, desarrollada como un sistema modular y escalable dise\u00f1ado para la <strong>gesti\u00f3n integral de la operaci\u00f3n diaria de un cine<\/strong>. Est\u00e1 orientado tanto al <strong>uso comercial real<\/strong> como a demostrar mis competencias como <strong>desarrollador full stack<\/strong> especializado en ecosistemas <strong>Python, FastAPI, SQLAlchemy, Jinja2 y bases de datos SQLite\/SQL<\/strong> sobre entornos GNU\/Linux.<\/p>\n\n\n\n<p>La soluci\u00f3n representa un producto de <strong>Software Libre<\/strong> <strong>vendible a cualquier empresa del sector ocio y cinematogr\u00e1fico<\/strong>, especialmente cines independientes, asociaciones culturales, salas alternativas o cadenas locales que necesitan una plataforma moderna, segura y eficiente.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-light-blue ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Tabla de contenidos del articulo.<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#1_Objetivo_del_Proyecto\" >1. Objetivo del Proyecto<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#11_Objetivo_Tecnico_para_empresas_de_desarrollo_empleo\" >1.1. Objetivo T\u00e9cnico (para empresas de desarrollo \/ empleo)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#12_Objetivo_Comercial_para_vender_el_software_a_un_cliente_real\" >1.2. Objetivo Comercial (para vender el software a un cliente real)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#2_Descripcion_General_del_Sistema\" >2. Descripci\u00f3n General del Sistema<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#3_Enfoque_Tecnico_%E2%80%93_Lo_que_un_tecnico_de_RRHH_vera_en_tu_CV\" >3. Enfoque T\u00e9cnico \u2013 Lo que un t\u00e9cnico de RRHH ver\u00e1 en tu CV<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#Backend\" >Backend<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#Frontend\" >Frontend<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#DevOps_y_despliegue\" >DevOps y despliegue<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#Buenas_practicas\" >Buenas pr\u00e1cticas<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#4_Enfoque_Comercial_%E2%80%93_Lo_que_vera_un_cliente_que_quiera_comprar_el_software\" >4. Enfoque Comercial \u2013 Lo que ver\u00e1 un cliente que quiera comprar el software<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#41_Control_total_del_negocio\" >4.1. Control total del negocio<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#42_Ahorro_de_costes\" >4.2. Ahorro de costes<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#43_Facilidad_de_uso\" >4.3. Facilidad de uso<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#5_%C2%BFQue_aporta_este_proyecto_a_una_empresa_de_Asturias\" >5. \u00bfQu\u00e9 aporta este proyecto a una empresa de Asturias?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#6_Propuesta_de_texto_tipo_presentacion_comercial_para_un_cliente\" >6. Propuesta de texto tipo presentaci\u00f3n comercial (para un cliente)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#7_Documentacion_Tecnica\" >7. Documentaci\u00f3n T\u00e9cnica<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%8E%AF_Finalidad_del_Proyecto\" >\ud83c\udfaf Finalidad del Proyecto<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%91%A5_Equipo_de_Desarrollo\" >\ud83d\udc65 Equipo de Desarrollo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%9B%A0%EF%B8%8F_Tecnologias_utilizadas\" >\ud83d\udee0\ufe0f Tecnolog\u00edas utilizadas<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%8F%9B%EF%B8%8F_Arquitectura_del_Sistema\" >\ud83c\udfdb\ufe0f Arquitectura del Sistema<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%93%81_Estructura_del_Proyecto\" >\ud83d\udcc1 Estructura del Proyecto<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%8E%AC_Entidades_del_Sistema\" >\ud83c\udfac Entidades del Sistema<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%8E%9E%EF%B8%8F_Pelicula\" >\ud83c\udf9e\ufe0f Pelicula<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%8F%9F%EF%B8%8F_Sala\" >\ud83c\udfdf\ufe0f Sala<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%95%92_Horario\" >\ud83d\udd52 Horario<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%92%B3_Venta\" >\ud83d\udcb3 Venta<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%8F%B7%EF%B8%8F_Genero\" >\ud83c\udff7\ufe0f G\u00e9nero<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%94%90_Login_Autenticacion\" >\ud83d\udd10 Login \/ Autenticaci\u00f3n<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%91%A5_Socio_Fidelizacion\" >\ud83d\udc65 Socio \/ Fidelizaci\u00f3n<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%94%97_Modelo_de_Datos_y_Relaciones_Cardinalidad\" >\ud83d\udd17 Modelo de Datos y Relaciones (Cardinalidad)<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#21_Pelicula_%E2%86%94_Genero\" >2.1. Pelicula \u2194 G\u00e9nero<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#22_Horario_%E2%86%94_Pelicula\" >2.2. Horario \u2194 Pelicula<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#23_Horario_%E2%86%94_Sala\" >2.3. Horario \u2194 Sala<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-34\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#24_Venta_%E2%86%94_Horario\" >2.4. Venta \u2194 Horario<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-35\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#25_Socio_%E2%86%94_Login\" >2.5. Socio \u2194 Login<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-36\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#26_Venta_%E2%86%94_Socio_futuro\" >2.6. Venta \u2194 Socio (futuro)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-37\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#Resumen_visual_simplificado\" >Resumen visual simplificado<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-38\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%93%A6_Instalacion_de_dependencias\" >\ud83d\udce6 Instalaci\u00f3n de dependencias<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-39\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#1_Clonar_el_repositorio\" >1. Clonar el repositorio<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-40\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#2_Crear_y_activar_entorno_virtual_opcional_pero_recomendado\" >2. Crear y activar entorno virtual (opcional, pero recomendado)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-41\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#3_Instalar_dependencias_del_proyecto\" >3. Instalar dependencias del proyecto<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-42\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%E2%96%B6%EF%B8%8F_Ejecucion_paso_a_paso\" >\u25b6\ufe0f Ejecuci\u00f3n paso a paso<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-43\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#1_Comprobar_variables_de_entorno_opcional\" >1. Comprobar variables de entorno (opcional)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-44\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#2_Ejecutar_el_servidor_de_desarrollo\" >2. Ejecutar el servidor de desarrollo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-45\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#3_Ejecucion_desde_runpy_alternativa\" >3. Ejecuci\u00f3n desde&nbsp;run.py&nbsp;(alternativa)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-46\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%97%84%EF%B8%8F_Scripts_de_inicializacion_de_la_base_de_datos\" >\ud83d\uddc4\ufe0f Scripts de inicializaci\u00f3n de la base de datos<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-47\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#1_Modulos_de_base_de_datos\" >1. M\u00f3dulos de base de datos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-48\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#2_Crear_o_recrear_la_base_de_datos\" >2. Crear o recrear la base de datos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-49\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#3_Regenerar_la_base_de_datos_entornos_de_desarrollo\" >3. Regenerar la base de datos (entornos de desarrollo)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-50\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%8C%90_Definicion_de_endpoints_con_FastAPI\" >\ud83c\udf10 Definici\u00f3n de endpoints con FastAPI<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-51\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#1_Punto_de_entrada_de_la_API_appmainpy\" >1. Punto de entrada de la API:&nbsp;app\/main.py<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-52\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#2_Ejemplo_de_endpoints_approutespeliculaspy\" >2. Ejemplo de endpoints:&nbsp;app\/routes\/peliculas.py<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-53\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#3_Endpoints_habituales_por_modulo\" >3. Endpoints habituales por m\u00f3dulo<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-54\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%9A%80_Futuras_Mejoras_del_Proyecto\" >\ud83d\ude80 Futuras Mejoras del Proyecto<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-55\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#%F0%9F%93%A6_Proximas_actualizaciones\" >\ud83d\udce6 Pr\u00f3ximas actualizaciones<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-56\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#Compartiendo_el_codigo_abierto_del_proyecto\" >Compartiendo el codigo abierto del proyecto<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_Objetivo_del_Proyecto\"><\/span>1. Objetivo del Proyecto<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>El objetivo es doble:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"11_Objetivo_Tecnico_para_empresas_de_desarrollo_empleo\"><\/span>1.1. Objetivo T\u00e9cnico (para empresas de desarrollo \/ empleo)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Demostrar experiencia s\u00f3lida en:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Desarrollo <strong>full stack<\/strong> con Python.<\/li>\n\n\n\n<li>Construcci\u00f3n de APIs REST con <strong>FastAPI<\/strong>.<\/li>\n\n\n\n<li>Dise\u00f1o de <strong>bases de datos relacionales<\/strong> (ORM SQLAlchemy).<\/li>\n\n\n\n<li>Programaci\u00f3n orientada a objetos.<\/li>\n\n\n\n<li>Construcci\u00f3n de interfaces web con <strong>Bootstrap, HTML5, CSS y JS<\/strong>.<\/li>\n\n\n\n<li>Arquitectura modular mantenible y orientada a negocio real.<\/li>\n\n\n\n<li>Trabajo con est\u00e1ndares profesionales (entidades, controladores, servicios, rutas, seguridad).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"12_Objetivo_Comercial_para_vender_el_software_a_un_cliente_real\"><\/span>1.2. Objetivo Comercial (para vender el software a un cliente real)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Crear un sistema listo para:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Implementarse en un cine real de Asturias.<\/li>\n\n\n\n<li>Adaptarse a cualquier negocio relacionado (teatros, auditorios, centros culturales).<\/li>\n\n\n\n<li>Gestionar <strong>pel\u00edculas, horarios, salas, usuarios, ventas y socios<\/strong>.<\/li>\n\n\n\n<li>Integrarse con un futuro <strong>sistema de venta de entradas<\/strong>, TPV o pasarelas de pago.<\/li>\n\n\n\n<li>Servir como <strong>producto llave en mano<\/strong> para empresas peque\u00f1as sin software propio.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_Descripcion_General_del_Sistema\"><\/span>2. Descripci\u00f3n General del Sistema<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>La plataforma permite gestionar completamente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cartelera y cat\u00e1logo de pel\u00edculas.<\/li>\n\n\n\n<li>Horarios y sesiones.<\/li>\n\n\n\n<li>Salas y capacidades.<\/li>\n\n\n\n<li>Ventas de entradas y recaudaci\u00f3n.<\/li>\n\n\n\n<li>Usuarios, roles y autenticaci\u00f3n.<\/li>\n\n\n\n<li>Programa de socios y fidelizaci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<p>Todo ello sobre una <strong>arquitectura limpia, robusta y escalable<\/strong>, adecuada tanto para entorno acad\u00e9mico como industrial.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Enfoque_Tecnico_%E2%80%93_Lo_que_un_tecnico_de_RRHH_vera_en_tu_CV\"><\/span>3. Enfoque T\u00e9cnico \u2013 Lo que un t\u00e9cnico de RRHH ver\u00e1 en tu CV<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>El proyecto demuestra competencia real en:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Backend\"><\/span>Backend<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Python 3<\/strong><\/li>\n\n\n\n<li><strong>FastAPI<\/strong> para API REST de alto rendimiento<\/li>\n\n\n\n<li><strong>SQLAlchemy ORM<\/strong><\/li>\n\n\n\n<li><strong>Pydantic<\/strong> para validaci\u00f3n de datos<\/li>\n\n\n\n<li>Arquitectura en capas:\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">models\/<\/code> (entidades)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">routes\/<\/code> (endpoints)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">services\/<\/code> (l\u00f3gica de negocio)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">database\/<\/code> (motor y esquema) <\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">schemas\/<\/code> (Capa de Serializaci\u00f3n\/Validaci\u00f3n)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Frontend\"><\/span>Frontend<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Plantillas <strong>Jinja2<\/strong><\/li>\n\n\n\n<li><strong>Bootstrap 4\/5<\/strong><\/li>\n\n\n\n<li>HTML5 + CSS3 + JavaScript<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"DevOps_y_despliegue\"><\/span>DevOps y despliegue<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Proyecto preparado para producci\u00f3n (Uvicorn\/Gunicorn)<\/li>\n\n\n\n<li>Entornos virtuales y <code class=\"\" data-line=\"\">requirements.txt<\/code><\/li>\n\n\n\n<li>Arquitectura documentada para despliegue en Linux (Debian)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Buenas_practicas\"><\/span>Buenas pr\u00e1cticas<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00f3digo modular y mantenible<\/li>\n\n\n\n<li>Entidades bien definidas<\/li>\n\n\n\n<li>Relaciones ORM correctas<\/li>\n\n\n\n<li>Servicios independientes y desacoplados<\/li>\n\n\n\n<li>Documentaci\u00f3n profesional (<code class=\"\" data-line=\"\">README.html<\/code> completo)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_Enfoque_Comercial_%E2%80%93_Lo_que_vera_un_cliente_que_quiera_comprar_el_software\"><\/span>4. Enfoque Comercial \u2013 Lo que ver\u00e1 un cliente que quiera comprar el software<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>El sistema le aporta:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"41_Control_total_del_negocio\"><\/span>4.1. Control total del negocio<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gesti\u00f3n de salas, precios, horarios y sesiones.<\/li>\n\n\n\n<li>Gesti\u00f3n de cat\u00e1logo de pel\u00edculas.<\/li>\n\n\n\n<li>An\u00e1lisis de ventas y recaudaci\u00f3n.<\/li>\n\n\n\n<li>Control de aforo por sala y sesi\u00f3n.<\/li>\n\n\n\n<li>Gesti\u00f3n de clientes y socios.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"42_Ahorro_de_costes\"><\/span>4.2. Ahorro de costes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Soluci\u00f3n completa sin depender de software privativo.<\/li>\n\n\n\n<li>C\u00f3digo abierto y adaptable.<\/li>\n\n\n\n<li>Mantenimiento sencillo.<\/li>\n\n\n\n<li>Disponible para instalar en servidores locales o cloud.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"43_Facilidad_de_uso\"><\/span>4.3. Facilidad de uso<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Interfaz clara.<\/li>\n\n\n\n<li>Gesti\u00f3n centralizada.<\/li>\n\n\n\n<li>API REST que permite generar apps m\u00f3viles o paneles adicionales.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_%C2%BFQue_aporta_este_proyecto_a_una_empresa_de_Asturias\"><\/span>5. \u00bfQu\u00e9 aporta este proyecto a una empresa de Asturias?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ideal para empresas tecnol\u00f3gicas, consultoras, pymes o startups del Principado que busquen un perfil t\u00e9cnico completo. Demuestras:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Capacidad para crear un <strong>producto real end-to-end<\/strong>.<\/li>\n\n\n\n<li>Madurez arquitect\u00f3nica.<\/li>\n\n\n\n<li>Documentaci\u00f3n profesional.<\/li>\n\n\n\n<li>Conocimiento profundo de Python y del software libre.<\/li>\n\n\n\n<li>Orientaci\u00f3n a resultados y mentalidad de producto.<\/li>\n\n\n\n<li>Competencias para integrarte en un departamento de desarrollo full stack.<\/li>\n<\/ul>\n\n\n\n<p>Herramientas que dominas gracias a este proyecto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Python moderno<\/li>\n\n\n\n<li>FastAPI (framework ampliamente usado en Espa\u00f1a)<\/li>\n\n\n\n<li>SQL (competencia clave en analistas y full stack)<\/li>\n\n\n\n<li>Bootstrap (est\u00e1ndar corporativo)<\/li>\n\n\n\n<li>Arquitectura limpia (Clean-like)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"6_Propuesta_de_texto_tipo_presentacion_comercial_para_un_cliente\"><\/span>6. Propuesta de texto tipo presentaci\u00f3n comercial (para un cliente)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><strong>Software de Gesti\u00f3n para Cines \u2013 Cartelera y Ventas<\/strong><br>Plataforma profesional para la gesti\u00f3n integral de un cine: cat\u00e1logo de pel\u00edculas, horarios, salas, ventas de entradas, clientes y socios. Desarrollado en Python y optimizado para negocios peque\u00f1os y medianos del sector ocio. Puede instalarse en servidor local o en la nube, con panel de administraci\u00f3n, API propia y arquitectura escalable. Soluci\u00f3n moderna, eficiente y adaptable a cualquier cine de Asturias.<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Proyecto de Cartelera Cine Beta en javiercachon.com\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/7XtvMkOBKKc?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">Proyecto Cartelera de Cine en fase beta.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"7_Documentacion_Tecnica\"><\/span>7. Documentaci\u00f3n T\u00e9cnica<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Bienvenido al repositorio oficial de&nbsp;<strong>Cartelera de Cine<\/strong>, una aplicaci\u00f3n desarrollada en&nbsp;<strong>Python<\/strong>&nbsp;cuyo objetivo es gestionar de forma eficiente la cartelera digital de un cine. Este proyecto forma parte del aprendizaje del curso&nbsp;<strong>Python<\/strong> combinando conceptos de programaci\u00f3n estructurada, POO, bases de datos, APIs y arquitectura web moderna.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"finalidad-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%8E%AF_Finalidad_del_Proyecto\"><\/span>\ud83c\udfaf Finalidad del Proyecto<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>El prop\u00f3sito de este proyecto es dise\u00f1ar un sistema backend capaz de:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udccc Mostrar informaci\u00f3n de&nbsp;<strong>pel\u00edculas<\/strong>&nbsp;disponibles en cartelera.<\/li>\n\n\n\n<li>\ud83d\udd52 Gestionar&nbsp;<strong>horarios<\/strong>&nbsp;y&nbsp;<strong>salas<\/strong>.<\/li>\n\n\n\n<li>\ud83c\udfab Administrar&nbsp;<strong>ventas de entradas<\/strong>&nbsp;y&nbsp;<strong>precios<\/strong>.<\/li>\n\n\n\n<li>\ud83c\udfad Organizar&nbsp;<strong>g\u00e9neros<\/strong>&nbsp;y&nbsp;<strong>clasificaciones<\/strong>.<\/li>\n\n\n\n<li>\ud83d\udc65 Gestionar&nbsp;<strong>usuarios, autenticaci\u00f3n<\/strong>&nbsp;y&nbsp;<strong>socios<\/strong>.<\/li>\n\n\n\n<li>\ud83d\udcda Aplicar&nbsp;<strong>POO<\/strong>, estructuras de datos y buenas pr\u00e1cticas de desarrollo.<\/li>\n\n\n\n<li>\ud83d\ude80 Integrar tecnolog\u00edas modernas como&nbsp;<strong>FastAPI<\/strong>&nbsp;y&nbsp;<strong>SQLAlchemy<\/strong>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"equipo-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%91%A5_Equipo_de_Desarrollo\"><\/span>\ud83d\udc65 Equipo de Desarrollo<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>El proyecto ha sido dise\u00f1ado y desarrollado por el siguiente equipo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Javier Cach\u00f3n Garrido<\/strong><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"tecnologias-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%9B%A0%EF%B8%8F_Tecnologias_utilizadas\"><\/span>\ud83d\udee0\ufe0f Tecnolog\u00edas utilizadas<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Python 3&nbsp;SQLAlchemy (ORM)&nbsp;SQLite&nbsp;Programaci\u00f3n Orientada a Objetos&nbsp;FastAPI&nbsp;Jinja2&nbsp;Bootstrap 4\/5&nbsp;HTML5&nbsp;CSS3&nbsp;JavaScript&nbsp;SQL&nbsp;Visual Studio Code<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"arquitectura-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%8F%9B%EF%B8%8F_Arquitectura_del_Sistema\"><\/span>\ud83c\udfdb\ufe0f Arquitectura del Sistema<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>El proyecto est\u00e1 basado en una arquitectura modular que separa claramente las&nbsp;<strong>entidades de dominio<\/strong>, la&nbsp;<strong>l\u00f3gica de negocio<\/strong>&nbsp;y los&nbsp;<strong>servicios<\/strong>&nbsp;(endpoints, vistas, etc.).<\/p>\n\n\n\n<p>A continuaci\u00f3n se detallan todas las entidades con sus campos, sus responsabilidades dentro del sistema y las&nbsp;<strong>relaciones entre ellas<\/strong>, as\u00ed como c\u00f3mo se pueden modelar en la base de datos y, cuando procede, en el ORM.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"estructura-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%93%81_Estructura_del_Proyecto\"><\/span>\ud83d\udcc1 Estructura del Proyecto<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>A continuaci\u00f3n se detalla la estructura recomendada del proyecto Cartelera de Cine en Python:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u251c\u2500\u2500 app\/\n\u2502   \u251c\u2500\u2500 main.py\n\u2502   \u251c\u2500\u2500 models\/              # Capa de Persistencia: Definiciones de Tablas (SQLAlchemy ORM)\n\u2502   \u2502   \u251c\u2500\u2500 pelicula.py      # Entidad Pelicula\n\u2502   \u2502   \u251c\u2500\u2500 genero.py        # Entidad Genero\n\u2502   \u2502   \u251c\u2500\u2500 sala.py          # Entidad Sala\n\u2502   \u2502   \u251c\u2500\u2500 horario.py       # Entidad Horario\n\u2502   \u2502   \u251c\u2500\u2500 venta.py         # Entidad Venta\n\u2502   \u2502   \u251c\u2500\u2500 socio.py         # Entidad Socio\n\u2502   \u2502   \u2514\u2500\u2500 login.py         # Entidad Login \/ Usuario\n\u2502   \u251c\u2500\u2500 schemas\/             # Capa de Serializaci\u00f3n\/Validaci\u00f3n (Pydantic, Marshmallow, etc.)\n\u2502   \u2502   \u251c\u2500\u2500 pelicula.py      # Esquemas de entrada y salida para Peliculas\n\u2502   \u2502   \u251c\u2500\u2500 genero.py        # Esquemas de entrada y salida para Generos\n\u2502   \u2502   \u251c\u2500\u2500 sala.py          # Esquemas de entrada y salida para Salas\n\u2502   \u2502   \u251c\u2500\u2500 horario.py       # Esquemas de entrada y salida para Horarios\n\u2502   \u2502   \u251c\u2500\u2500 venta.py         # Esquemas de entrada y salida para Ventas\n\u2502   \u2502   \u251c\u2500\u2500 socio.py         # Esquemas de entrada y salida para Socios\n\u2502   \u2502   \u2514\u2500\u2500 auth.py          # Esquemas para Login\/Registro\/Tokens\n\u2502   \u251c\u2500\u2500 services\/            # Capa de L\u00f3gica de Negocio (El 'cerebro' de la aplicaci\u00f3n)\n\u2502   \u2502   \u251c\u2500\u2500 pelicula.py      # Funciones CRUD y validaciones de negocio para Pelicula\n\u2502   \u2502   \u251c\u2500\u2500 genero.py        # Funciones CRUD y validaciones de negocio para Genero\n\u2502   \u2502   \u251c\u2500\u2500 sala.py          # Funciones CRUD y validaciones de negocio para Sala\n\u2502   \u2502   \u251c\u2500\u2500 horario.py       # Funciones CRUD y validaciones de negocio para Horario\n\u2502   \u2502   \u251c\u2500\u2500 venta.py         # Funciones CRUD y validaciones de negocio para Venta\n\u2502   \u2502   \u251c\u2500\u2500 socio.py         # Funciones CRUD y validaciones de negocio para Socio\n\u2502   \u2502   \u2514\u2500\u2500 auth.py          # L\u00f3gica para manejo de usuarios, *hashing* de contrase\u00f1as y tokens\n\u2502   \u251c\u2500\u2500 routes\/              # Capa de Controladores: Manejo de Peticiones HTTP\n\u2502   \u2502   \u251c\u2500\u2500 peliculas.py     # Rutas CRUD Peliculas (Llama a `services\/pelicula.py`)\n\u2502   \u2502   \u251c\u2500\u2500 generos.py       # Rutas CRUD Generos\n\u2502   \u2502   \u251c\u2500\u2500 salas.py         # Rutas CRUD Salas\n\u2502   \u2502   \u251c\u2500\u2500 horarios.py      # Rutas CRUD Horarios\n\u2502   \u2502   \u251c\u2500\u2500 ventas.py        # Rutas CRUD Ventas\n\u2502   \u2502   \u251c\u2500\u2500 socios.py        # Rutas CRUD Socios\n\u2502   \u2502   \u2514\u2500\u2500 login.py         # Rutas de autenticaci\u00f3n \/ login (Llama a `services\/auth.py`)\n\u2502   \u251c\u2500\u2500 database\/\n\u2502   \u2502   \u251c\u2500\u2500 db.py            # Motor de conexi\u00f3n SQLAlchemy y sesi\u00f3n (dependencia inyectada)\n\u2502   \u2502   \u251c\u2500\u2500 db.sql           # Schema y seed de la base de datos (Script SQL)\n\u2502   \u2502   \u2514\u2500\u2500 db.db\t     # Base de datos SQLite\n\u2502   \u251c\u2500\u2500 templates\/           # Vistas (Jinja2, etc.)\n\u2502   \u2502   \u251c\u2500\u2500 base.html        # Layout com\u00fan\n\u2502   \u2502   \u251c\u2500\u2500 peliculas\/       # Vistas HTML de peliculas\n\u2502   \u2502   \u251c\u2500\u2500 generos\/         # Vistas HTML de generos\n\u2502   \u2502   \u251c\u2500\u2500 salas\/           # Vistas HTML de salas\n\u2502   \u2502   \u251c\u2500\u2500 horarios\/        # Vistas HTML de horarios\n\u2502   \u2502   \u251c\u2500\u2500 ventas\/          # Vistas HTML de ventas\n\u2502   \u2502   \u251c\u2500\u2500 socios\/          # Vistas HTML de socios\n\u2502   \u2502   \u2514\u2500\u2500 login\/           # Vistas HTML de login\/autenticaci\u00f3n\n\u2502   \u2514\u2500\u2500 static\/ \n\u2502       \u251c\u2500\u2500 Bootstrap\/       # Hojas de estilo y JS de Bootstrap\n\u2502       \u2502   \u251c\u2500\u2500 css\/         # Archivos CSS de Bootstrap (bootstrap.min.css)\n\u2502       \u2502   \u2514\u2500\u2500 js\/          # Archivos JavaScript de Bootstrap (bootstrap.bundle.min.js)           \n\u2502       \u251c\u2500\u2500 css\/             # Hojas de estilo (CSS3\/Bootstrap)\n\u2502       \u251c\u2500\u2500 js\/              # Archivos JavaScript\n\u2502       \u2514\u2500\u2500 img\/             # Im\u00e1genes y assets\n\u251c\u2500\u2500 requirements.txt         # Dependencias del proyecto (Framework, ORM, Pydantic, etc.)\n\u251c\u2500\u2500 README.html              # Documentaci\u00f3n inicial y gu\u00eda de instalaci\u00f3n\n\u2514\u2500\u2500 run.py                   # Script de inicio del servidor<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"entidades-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%8E%AC_Entidades_del_Sistema\"><\/span>\ud83c\udfac Entidades del Sistema<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pelicula-h3\"><span class=\"ez-toc-section\" id=\"%F0%9F%8E%9E%EF%B8%8F_Pelicula\"><\/span>\ud83c\udf9e\ufe0f Pelicula<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Responsable: JAVIER CACH\u00d3N<\/p>\n\n\n\n<p>Representa una pel\u00edcula disponible (o no) en la cartelera.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Campos<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">id<\/code>: int \u2014&nbsp;<strong>PK<\/strong>&nbsp;(clave primaria)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">titulo<\/code>: string<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">genero_id<\/code>: int \u2014&nbsp;<strong>FK \u2192 generos.id<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">duracion<\/code>: int<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">director<\/code>: string<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">descripcion<\/code>: string<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">trailer<\/code>: string (URL)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">productora<\/code>: string<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">idioma<\/code>: string<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">VOSE<\/code>: boolean<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">actores<\/code>: lista (strings)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">disponible<\/code>: boolean<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Relaciones (modelo y ORM)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pelicula \u2194 G\u00e9nero<\/strong><br>A nivel de base de datos:<ul><li>La FK est\u00e1 en&nbsp;<code class=\"\" data-line=\"\">peliculas.genero_id<\/code>&nbsp;apuntando a&nbsp;<code class=\"\" data-line=\"\">generos.id<\/code>.<\/li><\/ul>A nivel l\u00f3gico\/ORM:<ul><li>Cada&nbsp;<strong>Pelicula<\/strong>&nbsp;est\u00e1 asociada a un \u00fanico&nbsp;<strong>Genero<\/strong>&nbsp;(lado N:1).<\/li><li>Cada&nbsp;<strong>Genero<\/strong>&nbsp;puede exponer una colecci\u00f3n de&nbsp;<strong>peliculas<\/strong>&nbsp;(lado 1:N).<\/li><\/ul>Navegaci\u00f3n t\u00edpica en ORM:\n<ul class=\"wp-block-list\">\n<li>Desde una pel\u00edcula:&nbsp;<code class=\"\" data-line=\"\">pelicula.genero<\/code><\/li>\n\n\n\n<li>Desde un g\u00e9nero (si se implementa la colecci\u00f3n):&nbsp;<code class=\"\" data-line=\"\">genero.peliculas<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Pelicula \u2194 Horario<\/strong><br>A nivel de base de datos (modelo relacional):<ul><li>La FK est\u00e1 en&nbsp;<code class=\"\" data-line=\"\">horarios.pelicula_id<\/code>&nbsp;apuntando a&nbsp;<code class=\"\" data-line=\"\">peliculas.id<\/code>.<\/li><li>Conceptualmente: una&nbsp;<strong>Pelicula<\/strong>&nbsp;puede tener muchos&nbsp;<strong>Horarios<\/strong>&nbsp;(1:N).<\/li><\/ul>Navegaci\u00f3n ORM implementada:<ul><li>Se navega desde&nbsp;<strong>Horario<\/strong>&nbsp;hacia&nbsp;<strong>Pelicula<\/strong>&nbsp;mediante&nbsp;<code class=\"\" data-line=\"\">horario.pelicula<\/code>.<\/li><li><strong>No<\/strong>&nbsp;se implementa en el ORM la colecci\u00f3n&nbsp;<code class=\"\" data-line=\"\">pelicula.horarios<\/code>&nbsp;(no hay atributo en la entidad Pelicula).<\/li><\/ul>Es decir, la relaci\u00f3n es 1:N en la base de datos, pero la navegaci\u00f3n en c\u00f3digo se ha definido solo en el sentido&nbsp;<strong>Horario \u2192 Pelicula<\/strong>.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Servicios \u2014 Pel\u00edculas \ud83c\udfac<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A\u00f1adir pel\u00edcula<\/li>\n\n\n\n<li>Ver pel\u00edculas disponibles<\/li>\n\n\n\n<li>Ver detalle de una pel\u00edcula<\/li>\n\n\n\n<li>Editar pel\u00edcula<\/li>\n\n\n\n<li>Eliminar o desactivar pel\u00edcula<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Extra (futuro)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Filtrar por g\u00e9nero, duraci\u00f3n, clasificaci\u00f3n, etc.<\/li>\n\n\n\n<li>B\u00fasquedas avanzadas (t\u00edtulo, director, actor, etc.)<\/li>\n\n\n\n<li>Exportar cat\u00e1logo a CSV\/JSON<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sala-h3\"><span class=\"ez-toc-section\" id=\"%F0%9F%8F%9F%EF%B8%8F_Sala\"><\/span>\ud83c\udfdf\ufe0f Sala<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Representa una sala f\u00edsica del cine.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Campos<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">id<\/code>: int \u2014&nbsp;<strong>PK<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">numero<\/code>: int<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">capacidad<\/code>: int (n\u00famero de butacas)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">tipo<\/code>: enum (normal, 3D, IMAX, premium)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">precio_base<\/code>: float<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Relaciones (modelo y ORM)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sala \u2194 Horario<\/strong><br>A nivel de base de datos:<ul><li>La FK est\u00e1 en&nbsp;<code class=\"\" data-line=\"\">horarios.sala_id<\/code>&nbsp;apuntando a&nbsp;<code class=\"\" data-line=\"\">salas.id<\/code>.<\/li><\/ul>A nivel l\u00f3gico\/ORM:<ul><li>Una&nbsp;<strong>Sala<\/strong>&nbsp;puede tener muchos&nbsp;<strong>Horarios<\/strong>&nbsp;(1:N).<\/li><li>Un&nbsp;<strong>Horario<\/strong>&nbsp;se proyecta en una sola&nbsp;<strong>Sala<\/strong>&nbsp;(N:1).<\/li><\/ul>Dependiendo de la configuraci\u00f3n del ORM se puede navegar:\n<ul class=\"wp-block-list\">\n<li>Desde el horario:&nbsp;<code class=\"\" data-line=\"\">horario.sala<\/code><\/li>\n\n\n\n<li>Desde la sala (si se define colecci\u00f3n):&nbsp;<code class=\"\" data-line=\"\">sala.horarios<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Servicios \u2014 Salas \ud83c\udfdf\ufe0f<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A\u00f1adir sala<\/li>\n\n\n\n<li>Listar salas<\/li>\n\n\n\n<li>Editar sala (capacidad, tipo, precio_base)<\/li>\n\n\n\n<li>Activar\/desactivar sala (si se implementa este campo)<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Extra (futuro)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gesti\u00f3n de mantenimiento (salas fuera de servicio)<\/li>\n\n\n\n<li>Suplementos por tipo de sala (3D, IMAX, etc.)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"horario-h3\"><span class=\"ez-toc-section\" id=\"%F0%9F%95%92_Horario\"><\/span>\ud83d\udd52 Horario<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Representa una sesi\u00f3n concreta de una pel\u00edcula en una sala y hora determinada.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Campos<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">id<\/code>: int \u2014&nbsp;<strong>PK<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">pelicula_id<\/code>: int \u2014&nbsp;<strong>FK \u2192 peliculas.id<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">sala_id<\/code>: int \u2014&nbsp;<strong>FK \u2192 salas.id<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">hora<\/code>: datetime\/string<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">disponible<\/code>: boolean<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Relaciones (modelo y ORM)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Horario \u2194 Pelicula<\/strong><br>Modelo relacional:<ul><li>Cada&nbsp;<strong>Horario<\/strong>&nbsp;referencia una \u00fanica&nbsp;<strong>Pelicula<\/strong>&nbsp;mediante&nbsp;<code class=\"\" data-line=\"\">pelicula_id<\/code>.<\/li><li>Una&nbsp;<strong>Pelicula<\/strong>&nbsp;puede tener muchos&nbsp;<strong>Horarios<\/strong>&nbsp;asociados (1:N, a nivel de tabla).<\/li><\/ul>Navegaci\u00f3n ORM implementada:\n<ul class=\"wp-block-list\">\n<li>Desde&nbsp;<strong>Horario<\/strong>&nbsp;hacia&nbsp;<strong>Pelicula<\/strong>:&nbsp;<code class=\"\" data-line=\"\">horario.pelicula<\/code>.<\/li>\n\n\n\n<li>No se ha definido en el ORM la colecci\u00f3n inversa&nbsp;<code class=\"\" data-line=\"\">pelicula.horarios<\/code>; la navegaci\u00f3n se mantiene intencionadamente unidireccional.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Horario \u2194 Sala<\/strong>\n<ul class=\"wp-block-list\">\n<li>Cada&nbsp;<strong>Horario<\/strong>&nbsp;referencia una \u00fanica&nbsp;<strong>Sala<\/strong>&nbsp;mediante&nbsp;<code class=\"\" data-line=\"\">sala_id<\/code>.<\/li>\n\n\n\n<li>Una&nbsp;<strong>Sala<\/strong>&nbsp;puede tener m\u00faltiples&nbsp;<strong>Horarios<\/strong>&nbsp;(1:N, a nivel de modelo l\u00f3gico).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Horario \u2194 Venta<\/strong><br>A nivel de base de datos:<ul><li>La FK est\u00e1 en&nbsp;<code class=\"\" data-line=\"\">ventas.horario_id<\/code>&nbsp;apuntando a&nbsp;<code class=\"\" data-line=\"\">horarios.id<\/code>.<\/li><\/ul>A nivel l\u00f3gico\/ORM:\n<ul class=\"wp-block-list\">\n<li>Un&nbsp;<strong>Horario<\/strong>&nbsp;puede tener muchas&nbsp;<strong>Ventas<\/strong>&nbsp;(1:N).<\/li>\n\n\n\n<li>Cada&nbsp;<strong>Venta<\/strong>&nbsp;corresponde a un \u00fanico&nbsp;<strong>Horario<\/strong>&nbsp;(N:1).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Servicios \u2014 Horarios<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Crear horario para una pel\u00edcula en una sala<\/li>\n\n\n\n<li>Listar horarios por pel\u00edcula<\/li>\n\n\n\n<li>Listar horarios por fecha<\/li>\n\n\n\n<li>Listar horarios por sala<\/li>\n\n\n\n<li>Editar horario (cambiar hora, sala, pel\u00edcula)<\/li>\n\n\n\n<li>Cancelar horario (marcar como no disponible)<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Extra (futuro)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Comprobar solapamientos de horarios en la misma sala<\/li>\n\n\n\n<li>Mostrar solo sesiones futuras<\/li>\n\n\n\n<li>Control de aforo basado en ventas<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"venta-h3\"><span class=\"ez-toc-section\" id=\"%F0%9F%92%B3_Venta\"><\/span>\ud83d\udcb3 Venta<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Representa la compra de entradas para un determinado horario.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Campos<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">id<\/code>: int \u2014&nbsp;<strong>PK<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">horario_id<\/code>: int \u2014&nbsp;<strong>FK \u2192 horarios.id<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">precio_total<\/code>: float<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">cantidad<\/code>: int (n\u00famero de entradas)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">metodo_pago<\/code>: enum (efectivo, tarjeta, cripto\u2026)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">socio_id<\/code>: int (opcional) \u2014&nbsp;<strong>FK \u2192 socios.id<\/strong><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Relaciones (modelo y ORM)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Venta \u2194 Horario<\/strong>\n<ul class=\"wp-block-list\">\n<li>Cada&nbsp;<strong>Venta<\/strong>&nbsp;est\u00e1 asociada a un \u00fanico&nbsp;<strong>Horario<\/strong>&nbsp;mediante&nbsp;<code class=\"\" data-line=\"\">horario_id<\/code>.<\/li>\n\n\n\n<li>Un&nbsp;<strong>Horario<\/strong>&nbsp;puede tener m\u00faltiples&nbsp;<strong>Ventas<\/strong>&nbsp;asociadas.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Venta \u2194 Socio<\/strong>&nbsp;(opcional \/ futuro)\n<ul class=\"wp-block-list\">\n<li>Cada&nbsp;<strong>Venta<\/strong>&nbsp;puede opcionalmente estar asociada a un&nbsp;<strong>Socio<\/strong>&nbsp;mediante&nbsp;<code class=\"\" data-line=\"\">socio_id<\/code>.<\/li>\n\n\n\n<li>Un&nbsp;<strong>Socio<\/strong>&nbsp;puede acumular muchas&nbsp;<strong>Ventas<\/strong>&nbsp;a su nombre.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Servicios \u2014 Ventas \ud83d\udcb3<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Registrar venta<\/li>\n\n\n\n<li>Calcular precio total<\/li>\n\n\n\n<li>Listar ventas (por d\u00eda, pel\u00edcula, horario\u2026)<\/li>\n\n\n\n<li>Consultar recaudaci\u00f3n en un rango de fechas<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Extra (futuro)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cupones de descuento<\/li>\n\n\n\n<li>Asignar venta a&nbsp;<code class=\"\" data-line=\"\">usuario<\/code>&nbsp;o&nbsp;<code class=\"\" data-line=\"\">socio<\/code><\/li>\n\n\n\n<li>Generar ticket (PDF \/ c\u00f3digo QR)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"genero-h3\"><span class=\"ez-toc-section\" id=\"%F0%9F%8F%B7%EF%B8%8F_Genero\"><\/span>\ud83c\udff7\ufe0f G\u00e9nero<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Cat\u00e1logo de g\u00e9neros cinematogr\u00e1ficos asociados a las pel\u00edculas.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Campos<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">id<\/code>: int \u2014&nbsp;<strong>PK<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">nombre<\/code>: string<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">descripcion<\/code>: string<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Relaciones (modelo y ORM)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>G\u00e9nero \u2194 Pelicula<\/strong>\n<ul class=\"wp-block-list\">\n<li>Cada&nbsp;<strong>Pelicula<\/strong>&nbsp;referencia un&nbsp;<strong>Genero<\/strong>&nbsp;mediante&nbsp;<code class=\"\" data-line=\"\">genero_id<\/code>.<\/li>\n\n\n\n<li>Cada&nbsp;<strong>Genero<\/strong>&nbsp;puede agrupar muchas&nbsp;<strong>Peliculas<\/strong>&nbsp;asociadas.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Servicios \u2014 G\u00e9neros \ud83c\udff7\ufe0f<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Crear g\u00e9nero<\/li>\n\n\n\n<li>Listar g\u00e9neros<\/li>\n\n\n\n<li>Editar g\u00e9nero<\/li>\n\n\n\n<li>Eliminar g\u00e9nero (seg\u00fan pol\u00edtica de negocio)<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Extra (futuro)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Permitir m\u00faltiples g\u00e9neros por pel\u00edcula (tabla intermedia)<\/li>\n\n\n\n<li>Estad\u00edsticas por g\u00e9nero (pel\u00edculas, ventas, horarios, etc.)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"login-h3\"><span class=\"ez-toc-section\" id=\"%F0%9F%94%90_Login_Autenticacion\"><\/span>\ud83d\udd10 Login \/ Autenticaci\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Responsable: JAVIER CACH\u00d3N<\/p>\n\n\n\n<p>Sistema central de autenticaci\u00f3n y autorizaci\u00f3n de usuarios (clientes y administradores).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Campos<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">id<\/code>: int \u2014&nbsp;<strong>PK<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">username<\/code>: string (\u00fanico)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">email<\/code>: string (\u00fanico)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">password_hash<\/code>: string<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">rol<\/code>: enum (usuario, administrador)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">activo<\/code>: boolean<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">bloqueado<\/code>: boolean<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">creado_en<\/code>: datetime<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">actualizado_en<\/code>: datetime<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Relaciones (modelo y ORM)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Login \u2194 Socio<\/strong><br>Relaci\u00f3n modelada t\u00edpicamente como&nbsp;<strong>Optional One-to-One<\/strong>: la FK opcional reside en la tabla&nbsp;<code class=\"\" data-line=\"\">socios<\/code>.<ul><li>Un&nbsp;<strong>Socio<\/strong>&nbsp;puede vincularse a un \u00fanico&nbsp;<strong>Login<\/strong>&nbsp;mediante&nbsp;<code class=\"\" data-line=\"\">login_id<\/code>.<\/li><li>Un&nbsp;<strong>Login<\/strong>&nbsp;puede estar vinculado, como m\u00e1ximo, a un&nbsp;<strong>Socio<\/strong>.<\/li><\/ul>Esta relaci\u00f3n permite: socios sin login (alta en taquilla) y logins sin socio (usuario registrado sin programa de puntos).<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Servicios \u2014 Login \ud83d\udd10<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Registrar usuario<\/li>\n\n\n\n<li>Iniciar sesi\u00f3n<\/li>\n\n\n\n<li>Cerrar sesi\u00f3n<\/li>\n\n\n\n<li>Cambiar contrase\u00f1a<\/li>\n\n\n\n<li>Recuperar contrase\u00f1a<\/li>\n\n\n\n<li>Bloquear \/ desbloquear cuenta<\/li>\n\n\n\n<li>Editar email o username<\/li>\n\n\n\n<li>Listar logins activos \/ bloqueados<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Extra (futuro)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Doble factor de autenticaci\u00f3n (2FA)<\/li>\n\n\n\n<li>Historial de accesos (IP, fecha, dispositivo)<\/li>\n\n\n\n<li>Expiraci\u00f3n peri\u00f3dica de contrase\u00f1a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"socio-h3\"><span class=\"ez-toc-section\" id=\"%F0%9F%91%A5_Socio_Fidelizacion\"><\/span>\ud83d\udc65 Socio \/ Fidelizaci\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Responsable: JAVIER CACH\u00d3N<\/p>\n\n\n\n<p>Sistema de clientes registrados con ventajas y programa de puntos.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Campos<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">id<\/code>: int \u2014&nbsp;<strong>PK<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">numero_socio<\/code>: string<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">login_id<\/code>: int \u2014 (opcional)&nbsp;<strong>FK \u2192 logins.id<\/strong><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">email<\/code>: string (\u00fanico)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">nivel<\/code>: enum (Basic, Silver, Gold, VIP)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">puntos<\/code>: int<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">fecha_alta<\/code>: datetime<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">activo<\/code>: boolean<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Relaciones (modelo y ORM)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Socio \u2194 Login<\/strong>\n<ul class=\"wp-block-list\">\n<li>Cada&nbsp;<strong>Socio<\/strong>&nbsp;puede estar vinculado a un \u00fanico&nbsp;<strong>Login<\/strong>&nbsp;(cuenta de acceso web).<\/li>\n\n\n\n<li>Cada&nbsp;<strong>Login<\/strong>&nbsp;puede vincularse, como m\u00e1ximo, a un&nbsp;<strong>Socio<\/strong>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Socio \u2194 Venta<\/strong>&nbsp;(opcional \/ futuro)\n<ul class=\"wp-block-list\">\n<li>Un&nbsp;<strong>Socio<\/strong>&nbsp;puede tener asociadas m\u00faltiples&nbsp;<strong>Ventas<\/strong>&nbsp;(historial de compras).<\/li>\n\n\n\n<li>Cada&nbsp;<strong>Venta<\/strong>&nbsp;puede referenciar al&nbsp;<strong>Socio<\/strong>&nbsp;que la realiz\u00f3.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Servicios \u2014 Socios \ud83d\udc65<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alta de socio<\/li>\n\n\n\n<li>Vincular socio con login<\/li>\n\n\n\n<li>Consultar perfil de socio<\/li>\n\n\n\n<li>Consultar puntos<\/li>\n\n\n\n<li>Upgrade\/downgrade de nivel<\/li>\n\n\n\n<li>Sumar puntos (compras, promociones)<\/li>\n\n\n\n<li>Restar puntos (canjes, devoluciones)<\/li>\n\n\n\n<li>Baja de socio (marcar como inactivo)<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Extra (futuro)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Historial de puntos<\/li>\n\n\n\n<li>Ventajas por nivel (descuentos, preestrenos, etc.)<\/li>\n\n\n\n<li>Env\u00edo de promociones por email<\/li>\n\n\n\n<li>Tarjeta digital QR<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"relaciones-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%94%97_Modelo_de_Datos_y_Relaciones_Cardinalidad\"><\/span>\ud83d\udd17 Modelo de Datos y Relaciones (Cardinalidad)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>A continuaci\u00f3n se resumen las relaciones entre las entidades, indicando claves for\u00e1neas, direcci\u00f3n, cardinalidad y, cuando aplica, c\u00f3mo se navega en el ORM.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"21_Pelicula_%E2%86%94_Genero\"><\/span>2.1. Pelicula \u2194 G\u00e9nero<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>FK:<\/strong>&nbsp;<code class=\"\" data-line=\"\">peliculas.genero_id \u2192 generos.id<\/code><\/li>\n\n\n\n<li><strong>Cardinalidad (modelo l\u00f3gico):<\/strong>\n<ul class=\"wp-block-list\">\n<li>Una&nbsp;<strong>Pelicula<\/strong>&nbsp;pertenece a un \u00fanico&nbsp;<strong>Genero<\/strong>.<\/li>\n\n\n\n<li>Un&nbsp;<strong>Genero<\/strong>&nbsp;puede tener muchas&nbsp;<strong>Peliculas<\/strong>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Tipo:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Pelicula \u2192 Genero:&nbsp;<strong>ManyToOne (N:1)<\/strong><\/li>\n\n\n\n<li>Genero \u2192 Pelicula:&nbsp;<strong>OneToMany (1:N)<\/strong><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Navegaci\u00f3n ORM t\u00edpica:<\/strong>&nbsp;<code class=\"\" data-line=\"\">pelicula.genero<\/code>&nbsp;y, si se define,&nbsp;<code class=\"\" data-line=\"\">genero.peliculas<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"22_Horario_%E2%86%94_Pelicula\"><\/span>2.2. Horario \u2194 Pelicula<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>FK:<\/strong>&nbsp;<code class=\"\" data-line=\"\">horarios.pelicula_id \u2192 peliculas.id<\/code><\/li>\n\n\n\n<li><strong>Cardinalidad (modelo l\u00f3gico):<\/strong>\n<ul class=\"wp-block-list\">\n<li>Un&nbsp;<strong>Horario<\/strong>&nbsp;corresponde a una&nbsp;<strong>Pelicula<\/strong>&nbsp;concreta.<\/li>\n\n\n\n<li>Una&nbsp;<strong>Pelicula<\/strong>&nbsp;puede tener muchos&nbsp;<strong>Horarios<\/strong>&nbsp;(1:N).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Tipo:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Horario \u2192 Pelicula:&nbsp;<strong>ManyToOne (N:1)<\/strong><\/li>\n\n\n\n<li>Pelicula \u2192 Horario:&nbsp;<strong>OneToMany (1:N)<\/strong>&nbsp;(a nivel de dise\u00f1o de datos)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Navegaci\u00f3n ORM implementada:<\/strong>&nbsp;solo&nbsp;<code class=\"\" data-line=\"\">horario.pelicula<\/code>&nbsp;(no se implementa&nbsp;<code class=\"\" data-line=\"\">pelicula.horarios<\/code>&nbsp;en el modelo actual).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"23_Horario_%E2%86%94_Sala\"><\/span>2.3. Horario \u2194 Sala<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>FK:<\/strong>&nbsp;<code class=\"\" data-line=\"\">horarios.sala_id \u2192 salas.id<\/code><\/li>\n\n\n\n<li><strong>Cardinalidad:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Un&nbsp;<strong>Horario<\/strong>&nbsp;se proyecta en una sola&nbsp;<strong>Sala<\/strong>.<\/li>\n\n\n\n<li>Una&nbsp;<strong>Sala<\/strong>&nbsp;puede tener muchos&nbsp;<strong>Horarios<\/strong>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Tipo:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Horario \u2192 Sala:&nbsp;<strong>ManyToOne (N:1)<\/strong><\/li>\n\n\n\n<li>Sala \u2192 Horario:&nbsp;<strong>OneToMany (1:N)<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"24_Venta_%E2%86%94_Horario\"><\/span>2.4. Venta \u2194 Horario<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>FK:<\/strong>&nbsp;<code class=\"\" data-line=\"\">ventas.horario_id \u2192 horarios.id<\/code><\/li>\n\n\n\n<li><strong>Cardinalidad:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Una&nbsp;<strong>Venta<\/strong>&nbsp;est\u00e1 asociada a un solo&nbsp;<strong>Horario<\/strong>.<\/li>\n\n\n\n<li>Un&nbsp;<strong>Horario<\/strong>&nbsp;puede tener muchas&nbsp;<strong>Ventas<\/strong>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Tipo:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Venta \u2192 Horario:&nbsp;<strong>ManyToOne (N:1)<\/strong><\/li>\n\n\n\n<li>Horario \u2192 Venta:&nbsp;<strong>OneToMany (1:N)<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"25_Socio_%E2%86%94_Login\"><\/span>2.5. Socio \u2194 Login<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>FK:<\/strong>&nbsp;<code class=\"\" data-line=\"\">socios.login_id \u2192 logins.id<\/code>&nbsp;(opcional)<\/li>\n\n\n\n<li><strong>Cardinalidad:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Un&nbsp;<strong>Socio<\/strong>&nbsp;puede estar vinculado a un solo&nbsp;<strong>Login<\/strong>.<\/li>\n\n\n\n<li>Un&nbsp;<strong>Login<\/strong>&nbsp;puede estar vinculado, como m\u00e1ximo, a un&nbsp;<strong>Socio<\/strong>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Tipo:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Socio \u2192 Login:&nbsp;<strong>Optional OneToOne (0..1 : 1)<\/strong><\/li>\n\n\n\n<li>Login \u2192 Socio:&nbsp;<strong>Optional OneToOne (1 : 0..1)<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"26_Venta_%E2%86%94_Socio_futuro\"><\/span>2.6. Venta \u2194 Socio (futuro)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>(Opcional, si se implementa en el modelo)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>FK:<\/strong>&nbsp;<code class=\"\" data-line=\"\">ventas.socio_id \u2192 socios.id<\/code><\/li>\n\n\n\n<li><strong>Cardinalidad:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Una&nbsp;<strong>Venta<\/strong>&nbsp;puede estar asociada a un&nbsp;<strong>Socio<\/strong>.<\/li>\n\n\n\n<li>Un&nbsp;<strong>Socio<\/strong>&nbsp;puede tener muchas&nbsp;<strong>Ventas<\/strong>&nbsp;a lo largo del tiempo.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Tipo:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Venta \u2192 Socio:&nbsp;<strong>ManyToOne (N:1)<\/strong><\/li>\n\n\n\n<li>Socio \u2192 Venta:&nbsp;<strong>OneToMany (1:N)<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Resumen_visual_simplificado\"><\/span>Resumen visual simplificado<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">generos (1) \u2500\u2500\u2500\u2500&lt; (N) peliculas\n\npeliculas (1) \u2500\u2500\u2500\u2500&lt; (N) horarios >\u2500\u2500\u2500\u2500 (1) salas\n\nhorarios (1) \u2500\u2500\u2500\u2500&lt; (N) ventas\n\nlogins (1) \u2500\u2500\u2500\u2500(0..1) socios\n\nsocios (1) \u2500\u2500\u2500\u2500&lt; (N) ventas    [opcional si se a\u00f1ade ventas.socio_id]\n        <\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"instalacion-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%93%A6_Instalacion_de_dependencias\"><\/span>\ud83d\udce6 Instalaci\u00f3n de dependencias<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Antes de ejecutar el proyecto se recomienda utilizar un entorno virtual de Python y cargar todas las dependencias desde&nbsp;<code class=\"\" data-line=\"\">requirements.txt<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_Clonar_el_repositorio\"><\/span>1. Clonar el repositorio<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git clone https:\/\/github.com\/ojosdegato\/Cartelera-de-cine-en-Python.git\ncd Cartelera-de-cine-en-Python.git\n        <\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_Crear_y_activar_entorno_virtual_opcional_pero_recomendado\"><\/span>2. Crear y activar entorno virtual (opcional, pero recomendado)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Linux y MacOS\npython3 -m venv .venv\nsource .venv\/bin\/activate\n\n# Windows (PowerShell)\npython -m venv .venv\n.venv\\Scripts\\Activate.ps1\n        <\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Instalar_dependencias_del_proyecto\"><\/span>3. Instalar dependencias del proyecto<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Con el entorno virtual activado:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install -r requirements.txt\n        <\/pre>\n\n\n\n<p>Entre las dependencias t\u00edpicas se incluyen paquetes como&nbsp;<code class=\"\" data-line=\"\">fastapi<\/code>,&nbsp;<code class=\"\" data-line=\"\">uvicorn<\/code>,&nbsp;<code class=\"\" data-line=\"\">sqlalchemy<\/code>,&nbsp;<code class=\"\" data-line=\"\">pydantic<\/code>&nbsp;<code class=\"\" data-line=\"\">jinja2<\/code>&nbsp;y el driver de&nbsp;<code class=\"\" data-line=\"\">sqlite<\/code>&nbsp;ya incorporado en la librer\u00eda est\u00e1ndar de Python.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ejecucion-heading\"><span class=\"ez-toc-section\" id=\"%E2%96%B6%EF%B8%8F_Ejecucion_paso_a_paso\"><\/span>\u25b6\ufe0f Ejecuci\u00f3n paso a paso<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Una vez instaladas las dependencias y creada la base de datos, la ejecuci\u00f3n del proyecto se realiza normalmente a trav\u00e9s de&nbsp;<strong>FastAPI<\/strong>&nbsp;y un servidor ASGI como&nbsp;<strong>Uvicorn<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_Comprobar_variables_de_entorno_opcional\"><\/span>1. Comprobar variables de entorno (opcional)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Si se utilizan variables de entorno (por ejemplo, para el modo debug o la URL de la base de datos), config\u00faralas antes de lanzar la aplicaci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_Ejecutar_el_servidor_de_desarrollo\"><\/span>2. Ejecutar el servidor de desarrollo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Desde la ra\u00edz del proyecto\nuvicorn app.main:app --reload\n        <\/pre>\n\n\n\n<p>Por defecto, la API estar\u00e1 disponible en:&nbsp;<code class=\"\" data-line=\"\">http:\/\/127.0.0.1:8000<\/code>&nbsp;y la documentaci\u00f3n interactiva en:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">http:\/\/127.0.0.1:8000\/docs<\/code>&nbsp;(Swagger UI)<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">http:\/\/127.0.0.1:8000\/redoc<\/code>&nbsp;(ReDoc)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Ejecucion_desde_runpy_alternativa\"><\/span>3. Ejecuci\u00f3n desde&nbsp;<code class=\"\" data-line=\"\">run.py<\/code>&nbsp;(alternativa)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python run.py\n        <\/pre>\n\n\n\n<p>Este script puede actuar como punto de entrada unificado para entornos de desarrollo o despliegue.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"scripts-bd-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%97%84%EF%B8%8F_Scripts_de_inicializacion_de_la_base_de_datos\"><\/span>\ud83d\uddc4\ufe0f Scripts de inicializaci\u00f3n de la base de datos<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>La base de datos principal del proyecto es un fichero&nbsp;<strong>SQLite<\/strong>&nbsp;llamado&nbsp;<code class=\"\" data-line=\"\">db.db<\/code>, ubicado en&nbsp;<code class=\"\" data-line=\"\">app\/database\/<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_Modulos_de_base_de_datos\"><\/span>1. M\u00f3dulos de base de datos<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">app\/database\/db.py<\/code>&nbsp;\u2014 configuraci\u00f3n de la conexi\u00f3n SQLAlchemy.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">app\/database\/db.py<\/code>&nbsp;\u2014 creaci\u00f3n de tablas y carga inicial de datos (seed).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_Crear_o_recrear_la_base_de_datos\"><\/span>2. Crear o recrear la base de datos<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Desde la ra\u00edz del proyecto:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python -m app.db.db\n        <\/pre>\n\n\n\n<p>Este script se encarga de:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Crear el fichero&nbsp;<code class=\"\" data-line=\"\">db.db<\/code>&nbsp;si no existe.<\/li>\n\n\n\n<li>Generar las tablas correspondientes a las entidades:&nbsp;<code class=\"\" data-line=\"\">peliculas<\/code>,&nbsp;<code class=\"\" data-line=\"\">generos<\/code>,&nbsp;<code class=\"\" data-line=\"\">salas<\/code>,&nbsp;<code class=\"\" data-line=\"\">horarios<\/code>,&nbsp;<code class=\"\" data-line=\"\">ventas<\/code>,&nbsp;<code class=\"\" data-line=\"\">logins<\/code>&nbsp;y&nbsp;<code class=\"\" data-line=\"\">socios<\/code>.<\/li>\n\n\n\n<li>Cargar datos de ejemplo (pel\u00edculas, horarios, etc.) para pruebas.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Regenerar_la_base_de_datos_entornos_de_desarrollo\"><\/span>3. Regenerar la base de datos (entornos de desarrollo)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>En desarrollo es habitual borrar el fichero&nbsp;<code class=\"\" data-line=\"\">db.db<\/code>&nbsp;y volver a ejecutar&nbsp;<code class=\"\" data-line=\"\">python -m app.db.db<\/code>&nbsp;para partir de un estado limpio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fastapi-endpoints-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%8C%90_Definicion_de_endpoints_con_FastAPI\"><\/span>\ud83c\udf10 Definici\u00f3n de endpoints con FastAPI<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>La API se estructura en m\u00f3dulos de rutas dentro del paquete&nbsp;<code class=\"\" data-line=\"\">app\/routes\/<\/code>, separando por dominio funcional (pel\u00edculas, g\u00e9neros, salas, horarios, ventas, socios y login).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_Punto_de_entrada_de_la_API_appmainpy\"><\/span>1. Punto de entrada de la API:&nbsp;<code class=\"\" data-line=\"\">app\/main.py<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from fastapi import FastAPI\nfrom app.routes import peliculas, generos, salas, horarios, ventas, socios, login\n\napp = FastAPI(title=\"Cartelera de Cine en Python\")\n\napp.include_router(peliculas.router, prefix=\"\/peliculas\", tags=[\"Pel\u00edculas\"])\napp.include_router(generos.router,   prefix=\"\/generos\",   tags=[\"G\u00e9neros\"])\napp.include_router(salas.router,     prefix=\"\/salas\",     tags=[\"Salas\"])\napp.include_router(horarios.router,  prefix=\"\/horarios\",  tags=[\"Horarios\"])\napp.include_router(ventas.router,    prefix=\"\/ventas\",    tags=[\"Ventas\"])\napp.include_router(socios.router,    prefix=\"\/socios\",    tags=[\"Socios\"])\napp.include_router(login.router,     prefix=\"\/auth\",      tags=[\"Login\"])\n        <\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_Ejemplo_de_endpoints_approutespeliculaspy\"><\/span>2. Ejemplo de endpoints:&nbsp;<code class=\"\" data-line=\"\">app\/routes\/peliculas.py<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from fastapi import APIRouter, HTTPException\nfrom typing import List\nfrom app.schemas.pelicula import PeliculaCreate, PeliculaRead\nfrom app.services.peliculas import PeliculaService\n\nrouter = APIRouter()\n\n@router.get(\"\/\", response_model=List[PeliculaRead])\ndef listar_peliculas():\n    return PeliculaService.listar()\n\n@router.get(\"\/{pelicula_id}\", response_model=PeliculaRead)\ndef obtener_pelicula(pelicula_id: int):\n    pelicula = PeliculaService.obtener(pelicula_id)\n    if not pelicula:\n        raise HTTPException(status_code=404, detail=\"Pel\u00edcula no encontrada\")\n    return pelicula\n\n@router.post(\"\/\", response_model=PeliculaRead, status_code=201)\ndef crear_pelicula(datos: PeliculaCreate):\n    return PeliculaService.crear(datos)\n\n@router.delete(\"\/{pelicula_id}\", status_code=204)\ndef eliminar_pelicula(pelicula_id: int):\n    PeliculaService.eliminar(pelicula_id)\n        <\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Endpoints_habituales_por_modulo\"><\/span>3. Endpoints habituales por m\u00f3dulo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\/peliculas<\/strong>: CRUD de pel\u00edculas y filtros por g\u00e9nero, disponibilidad, etc.<\/li>\n\n\n\n<li><strong>\/generos<\/strong>: mantenimiento del cat\u00e1logo de g\u00e9neros.<\/li>\n\n\n\n<li><strong>\/salas<\/strong>: gesti\u00f3n de salas y capacidades.<\/li>\n\n\n\n<li><strong>\/horarios<\/strong>: gesti\u00f3n de sesiones (pel\u00edcula + sala + hora).<\/li>\n\n\n\n<li><strong>\/ventas<\/strong>: registro de ventas y consultas de recaudaci\u00f3n.<\/li>\n\n\n\n<li><strong>\/socios<\/strong>: alta, baja y gesti\u00f3n de datos de socios.<\/li>\n\n\n\n<li><strong>\/auth<\/strong>: registro, login, logout y gesti\u00f3n de credenciales.<\/li>\n<\/ul>\n\n\n\n<p>Esta organizaci\u00f3n facilita el mantenimiento, la escalabilidad del proyecto y la integraci\u00f3n posterior con un frontend (por ejemplo, una SPA o plantillas Jinja2).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"futuras-mejoras-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%9A%80_Futuras_Mejoras_del_Proyecto\"><\/span>\ud83d\ude80 Futuras Mejoras del Proyecto<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sistema completo de compra de entradas (frontend + backend).<\/li>\n\n\n\n<li>Dise\u00f1o gr\u00e1fico tipo cine (UI\/UX m\u00e1s cinematogr\u00e1fica).<\/li>\n\n\n\n<li>Panel de administraci\u00f3n web (gesti\u00f3n de contenidos y usuarios).<\/li>\n\n\n\n<li>Estad\u00edsticas avanzadas (ventas, ocupaci\u00f3n, popularidad de pel\u00edculas).<\/li>\n\n\n\n<li>Machine Learning para recomendaciones personalizadas de pel\u00edculas.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"actualizaciones-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%93%A6_Proximas_actualizaciones\"><\/span>\ud83d\udce6 Pr\u00f3ximas actualizaciones<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Se incorporar\u00e1 documentaci\u00f3n detallada y ejemplos adicionales sobre:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Estructura de carpetas del proyecto.<\/li>\n\n\n\n<li>Instalaci\u00f3n de dependencias en distintos entornos.<\/li>\n\n\n\n<li>Ejecuci\u00f3n paso a paso con distintos perfiles (desarrollo \/ producci\u00f3n).<\/li>\n\n\n\n<li>Scripts de inicializaci\u00f3n y migraciones de la base de datos.<\/li>\n\n\n\n<li>Definici\u00f3n avanzada de endpoints y seguridad en FastAPI.<\/li>\n<\/ul>\n\n\n\n<p>\u2728 Proyecto en constante evoluci\u00f3n. Cada aportaci\u00f3n suma. Este repositorio seguir\u00e1 creciendo con nuevas funcionalidades, mejoras y buenas pr\u00e1cticas de programaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Compartiendo_el_codigo_abierto_del_proyecto\"><\/span>Compartiendo el codigo abierto del proyecto<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>El 19 de diciembre 2025 terminamos la presentaci\u00f3n del proyecto a empresas y finalizamos curso. Compartire el c\u00f3digo fuente licencia GPL3 en navidades. \u00a1Espero terminar las navidades y empezar un prospero a\u00f1o 2026 con empleo de programador junior!<\/p>\n<div style='text-align:center' class='yasr-auto-insert-overall'><\/div><div style='text-align:center' class='yasr-auto-insert-visitor'><\/div>","protected":false},"excerpt":{"rendered":"<p>El proyecto Cartelera de Cine en Python es una aplicaci\u00f3n web full stack profesional, desarrollada como un sistema modular y escalable dise\u00f1ado para la gesti\u00f3n integral de la operaci\u00f3n diaria de un cine. Est\u00e1 orientado tanto al uso comercial real como a demostrar mis competencias como desarrollador full stack especializado en ecosistemas Python, FastAPI, SQLAlchemy, Jinja2 y bases de datos SQLite\/SQL sobre entornos GNU\/Linux.<\/p>","protected":false},"author":1,"featured_media":7460,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"yasr_overall_rating":0,"yasr_post_is_review":"","yasr_auto_insert_disabled":"","yasr_review_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[282,5,176,2],"tags":[6,7,297,298],"class_list":["post-7459","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-comercial","category-desarrollo","category-desarrollo-web","category-informatica","tag-apps","tag-debian-linux","tag-python3","tag-software-libre"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Mi proyecto en Python del Curso de Adecco para desempleados de larga duraci\u00f3n. | javiercachon.com<\/title>\n<meta name=\"description\" content=\"El proyecto Cartelera de Cine en Python es una aplicaci\u00f3n web full stack profesional, desarrollada como un sistema modular y escalable dise\u00f1ado para la gesti\u00f3n integral de la operaci\u00f3n diaria de un cine.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mi proyecto en Python del Curso de Adecco para desempleados de larga duraci\u00f3n. | javiercachon.com\" \/>\n<meta property=\"og:description\" content=\"El proyecto Cartelera de Cine en Python es una aplicaci\u00f3n web full stack profesional, desarrollada como un sistema modular y escalable dise\u00f1ado para la gesti\u00f3n integral de la operaci\u00f3n diaria de un cine.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/\" \/>\n<meta property=\"og:site_name\" content=\"javiercachon.com\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javiercachon82\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/javiercachon82\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-14T16:25:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-17T18:25:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine-1024x576.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Javier Cach\u00f3n Garrido\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/x.com\/udegeek\" \/>\n<meta name=\"twitter:site\" content=\"@udegeek\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Javier Cach\u00f3n Garrido\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/\"},\"author\":{\"name\":\"Javier Cach\u00f3n Garrido\",\"@id\":\"https:\\\/\\\/javiercachon.com\\\/es\\\/#\\\/schema\\\/person\\\/56ea56e1350676921cc43a3bcfd6c997\"},\"headline\":\"Mi proyecto en Python del Curso de Adecco para desempleados de larga duraci\u00f3n.\",\"datePublished\":\"2025-11-14T16:25:32+00:00\",\"dateModified\":\"2025-12-17T18:25:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/\"},\"wordCount\":3149,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/javiercachon.com\\\/es\\\/#\\\/schema\\\/person\\\/56ea56e1350676921cc43a3bcfd6c997\"},\"image\":{\"@id\":\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/javiercachon.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/Cartelera_Cine.jpg\",\"keywords\":[\"Apps\",\"Debian Linux\",\"Python3\",\"Software Libre\"],\"articleSection\":[\"Comercial\",\"Desarrollo\",\"Desarrollo Web\",\"Inform\u00e1tica\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/\",\"url\":\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/\",\"name\":\"Mi proyecto en Python del Curso de Adecco para desempleados de larga duraci\u00f3n. | javiercachon.com\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/javiercachon.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/javiercachon.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/Cartelera_Cine.jpg\",\"datePublished\":\"2025-11-14T16:25:32+00:00\",\"dateModified\":\"2025-12-17T18:25:49+00:00\",\"description\":\"El proyecto Cartelera de Cine en Python es una aplicaci\u00f3n web full stack profesional, desarrollada como un sistema modular y escalable dise\u00f1ado para la gesti\u00f3n integral de la operaci\u00f3n diaria de un cine.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/#primaryimage\",\"url\":\"https:\\\/\\\/javiercachon.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/Cartelera_Cine.jpg\",\"contentUrl\":\"https:\\\/\\\/javiercachon.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/Cartelera_Cine.jpg\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/javiercachon.com\\\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"inicio\",\"item\":\"https:\\\/\\\/javiercachon.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mi proyecto en Python del Curso de Adecco para desempleados de larga duraci\u00f3n.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/javiercachon.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/javiercachon.com\\\/es\\\/\",\"name\":\"javiercachon.com\",\"description\":\"es una plataforma educativa revolucionaria que busca democratizar el acceso al conocimiento en inform\u00e1tica.\",\"publisher\":{\"@id\":\"https:\\\/\\\/javiercachon.com\\\/es\\\/#\\\/schema\\\/person\\\/56ea56e1350676921cc43a3bcfd6c997\"},\"alternateName\":\"javiercachon.com\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/javiercachon.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/javiercachon.com\\\/es\\\/#\\\/schema\\\/person\\\/56ea56e1350676921cc43a3bcfd6c997\",\"name\":\"Javier Cach\u00f3n Garrido\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/javiercachon.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Montanas-JC-logo-azul.jpg\",\"url\":\"https:\\\/\\\/javiercachon.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Montanas-JC-logo-azul.jpg\",\"contentUrl\":\"https:\\\/\\\/javiercachon.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Montanas-JC-logo-azul.jpg\",\"width\":250,\"height\":34,\"caption\":\"Javier Cach\u00f3n Garrido\"},\"logo\":{\"@id\":\"https:\\\/\\\/javiercachon.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Montanas-JC-logo-azul.jpg\"},\"description\":\"Javier Cach\u00f3n Garrido es un experto en inform\u00e1tica, apasionado por el c\u00f3digo abierto y la educaci\u00f3n tecnol\u00f3gica. Como fundador de JavierCachon.com, impulsa la formaci\u00f3n en GNU\\\/Linux y software libre, promoviendo el aprendizaje accesible y colaborativo. Su misi\u00f3n es democratizar el conocimiento en TI, ofreciendo recursos gratuitos y de calidad para profesionales y entusiastas del sector. Es un profeta y predicador que evangeliza la tecnolog\u00eda, la inform\u00e1tica y telecomunicaciones, acomp\u00e1\u00f1ale en su aventura y pasi\u00f3n por los sistemas operativos abiertos GNU\\\/Linux.\",\"sameAs\":[\"https:\\\/\\\/javiercachon.com\\\/\",\"https:\\\/\\\/www.facebook.com\\\/javiercachon82\",\"https:\\\/\\\/www.instagram.com\\\/edugeek\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/javiercachongarrido\\\/\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/x.com\\\/udegeek\",\"https:\\\/\\\/www.youtube.com\\\/@edugeek\",\"https:\\\/\\\/wiki.javiercachon.com\\\/wiki\\\/index.php\\\/Usuario:Ojosdegato\"],\"url\":\"https:\\\/\\\/javiercachon.com\\\/en\\\/author\\\/ojosdegato\\\/\"},false]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Mi proyecto en Python del Curso de Adecco para desempleados de larga duraci\u00f3n. | javiercachon.com","description":"El proyecto Cartelera de Cine en Python es una aplicaci\u00f3n web full stack profesional, desarrollada como un sistema modular y escalable dise\u00f1ado para la gesti\u00f3n integral de la operaci\u00f3n diaria de un cine.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/","og_locale":"en_US","og_type":"article","og_title":"Mi proyecto en Python del Curso de Adecco para desempleados de larga duraci\u00f3n. | javiercachon.com","og_description":"El proyecto Cartelera de Cine en Python es una aplicaci\u00f3n web full stack profesional, desarrollada como un sistema modular y escalable dise\u00f1ado para la gesti\u00f3n integral de la operaci\u00f3n diaria de un cine.","og_url":"https:\/\/javiercachon.com\/en\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/","og_site_name":"javiercachon.com","article_publisher":"https:\/\/www.facebook.com\/javiercachon82","article_author":"https:\/\/www.facebook.com\/javiercachon82","article_published_time":"2025-11-14T16:25:32+00:00","article_modified_time":"2025-12-17T18:25:49+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine-1024x576.jpg","type":"image\/jpeg"}],"author":"Javier Cach\u00f3n Garrido","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/x.com\/udegeek","twitter_site":"@udegeek","twitter_misc":{"Written by":"Javier Cach\u00f3n Garrido","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#article","isPartOf":{"@id":"https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/"},"author":{"name":"Javier Cach\u00f3n Garrido","@id":"https:\/\/javiercachon.com\/es\/#\/schema\/person\/56ea56e1350676921cc43a3bcfd6c997"},"headline":"Mi proyecto en Python del Curso de Adecco para desempleados de larga duraci\u00f3n.","datePublished":"2025-11-14T16:25:32+00:00","dateModified":"2025-12-17T18:25:49+00:00","mainEntityOfPage":{"@id":"https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/"},"wordCount":3149,"commentCount":0,"publisher":{"@id":"https:\/\/javiercachon.com\/es\/#\/schema\/person\/56ea56e1350676921cc43a3bcfd6c997"},"image":{"@id":"https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#primaryimage"},"thumbnailUrl":"https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine.jpg","keywords":["Apps","Debian Linux","Python3","Software Libre"],"articleSection":["Comercial","Desarrollo","Desarrollo Web","Inform\u00e1tica"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/","url":"https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/","name":"Mi proyecto en Python del Curso de Adecco para desempleados de larga duraci\u00f3n. | javiercachon.com","isPartOf":{"@id":"https:\/\/javiercachon.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#primaryimage"},"image":{"@id":"https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#primaryimage"},"thumbnailUrl":"https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine.jpg","datePublished":"2025-11-14T16:25:32+00:00","dateModified":"2025-12-17T18:25:49+00:00","description":"El proyecto Cartelera de Cine en Python es una aplicaci\u00f3n web full stack profesional, desarrollada como un sistema modular y escalable dise\u00f1ado para la gesti\u00f3n integral de la operaci\u00f3n diaria de un cine.","breadcrumb":{"@id":"https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#primaryimage","url":"https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine.jpg","contentUrl":"https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine.jpg","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/javiercachon.com\/mi-proyecto-en-python-del-curso-de-adecco-para-desempleados-de-langa-duracion\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"inicio","item":"https:\/\/javiercachon.com\/"},{"@type":"ListItem","position":2,"name":"Mi proyecto en Python del Curso de Adecco para desempleados de larga duraci\u00f3n."}]},{"@type":"WebSite","@id":"https:\/\/javiercachon.com\/es\/#website","url":"https:\/\/javiercachon.com\/es\/","name":"javiercachon.com","description":"It is a revolutionary educational platform that seeks to democratize access to computer science knowledge.","publisher":{"@id":"https:\/\/javiercachon.com\/es\/#\/schema\/person\/56ea56e1350676921cc43a3bcfd6c997"},"alternateName":"javiercachon.com","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/javiercachon.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/javiercachon.com\/es\/#\/schema\/person\/56ea56e1350676921cc43a3bcfd6c997","name":"Javier Cach\u00f3n Garrido","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/javiercachon.com\/wp-content\/uploads\/2024\/11\/Montanas-JC-logo-azul.jpg","url":"https:\/\/javiercachon.com\/wp-content\/uploads\/2024\/11\/Montanas-JC-logo-azul.jpg","contentUrl":"https:\/\/javiercachon.com\/wp-content\/uploads\/2024\/11\/Montanas-JC-logo-azul.jpg","width":250,"height":34,"caption":"Javier Cach\u00f3n Garrido"},"logo":{"@id":"https:\/\/javiercachon.com\/wp-content\/uploads\/2024\/11\/Montanas-JC-logo-azul.jpg"},"description":"Javier Cach\u00f3n Garrido es un experto en inform\u00e1tica, apasionado por el c\u00f3digo abierto y la educaci\u00f3n tecnol\u00f3gica. Como fundador de JavierCachon.com, impulsa la formaci\u00f3n en GNU\/Linux y software libre, promoviendo el aprendizaje accesible y colaborativo. Su misi\u00f3n es democratizar el conocimiento en TI, ofreciendo recursos gratuitos y de calidad para profesionales y entusiastas del sector. Es un profeta y predicador que evangeliza la tecnolog\u00eda, la inform\u00e1tica y telecomunicaciones, acomp\u00e1\u00f1ale en su aventura y pasi\u00f3n por los sistemas operativos abiertos GNU\/Linux.","sameAs":["https:\/\/javiercachon.com\/","https:\/\/www.facebook.com\/javiercachon82","https:\/\/www.instagram.com\/edugeek\/","https:\/\/www.linkedin.com\/in\/javiercachongarrido\/","https:\/\/x.com\/https:\/\/x.com\/udegeek","https:\/\/www.youtube.com\/@edugeek","https:\/\/wiki.javiercachon.com\/wiki\/index.php\/Usuario:Ojosdegato"],"url":"https:\/\/javiercachon.com\/en\/author\/ojosdegato\/"},false]}},"yasr_visitor_votes":{"stars_attributes":{"read_only":false,"span_bottom":false},"number_of_votes":0,"sum_votes":0},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/javiercachon.com\/wp-content\/uploads\/2025\/11\/Cartelera_Cine.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/javiercachon.com\/en\/wp-json\/wp\/v2\/posts\/7459","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/javiercachon.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/javiercachon.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/javiercachon.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/javiercachon.com\/en\/wp-json\/wp\/v2\/comments?post=7459"}],"version-history":[{"count":13,"href":"https:\/\/javiercachon.com\/en\/wp-json\/wp\/v2\/posts\/7459\/revisions"}],"predecessor-version":[{"id":7519,"href":"https:\/\/javiercachon.com\/en\/wp-json\/wp\/v2\/posts\/7459\/revisions\/7519"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/javiercachon.com\/en\/wp-json\/wp\/v2\/media\/7460"}],"wp:attachment":[{"href":"https:\/\/javiercachon.com\/en\/wp-json\/wp\/v2\/media?parent=7459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/javiercachon.com\/en\/wp-json\/wp\/v2\/categories?post=7459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/javiercachon.com\/en\/wp-json\/wp\/v2\/tags?post=7459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}