diff --git a/app/__init__.py b/app/__init__.py index 8652543..33c8308 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -63,7 +63,7 @@ def register_blueprints(app): from app.controllers.admin_controller import admin_bp from app.controllers.new_requests_controller import upload_new_req_bp from app.controllers.cases_controller import assign - from app.controllers.my_requests import my_req_bp + from app.controllers.my_cases import my_req_bp from app.controllers.role_controller import role_bp app.register_blueprint(user_bp) diff --git a/app/controllers/my_cases.py b/app/controllers/my_cases.py new file mode 100644 index 0000000..76d3e50 --- /dev/null +++ b/app/controllers/my_cases.py @@ -0,0 +1,93 @@ +from datetime import datetime + +from flask import jsonify +from flask import request, Blueprint, render_template +from flask_login import current_user +from flask_wtf import FlaskForm +from wtforms import StringField, IntegerField, SubmitField +from wtforms.fields import DateField + +from app import db +from app.decorators.login_decorator import requires_login +from app.models import Case, User + +my_req_bp = Blueprint('my-cases', __name__) + + +class RequestForm(FlaskForm): + id = IntegerField('ID') + customer_id = StringField('Customer ID') + first_name = StringField('First Name') + last_name = StringField('Last Name') + num_of_children = IntegerField('Number of Children') + outreach_date = DateField('Outreach Date') + packet_return_status = StringField('Packet Return Status') + packet_received_date = DateField('Packet Received Date') + staff_initials = StringField('Staff Initials') + decision = StringField('Decision') + num_children_enrolled = IntegerField('Number of Children Enrolled') + decision_date = DateField('Decision Date') + not_enrolled_reason = StringField('Not Enrolled Reason') + submit = SubmitField('Save Changes') + + +@requires_login +@my_req_bp.route('/my_cases', methods=['GET']) +def view_cases(): + cases = User.query.get(current_user.id).user_cases + return render_template('my_cases.html', cases=cases, user=current_user) + + +@requires_login +@my_req_bp.route('/my_cases/edit/', methods=['POST']) +def edit_case(): + data = request.json + num_children_enrolled = data.get('numChildrenEnrolled') + + print(num_children_enrolled) + decision_date_str = data.get('decisionDate') + packet_received_date_str = data.get('packetReceivedDate') + case_id = data.get('caseId') + case_to_edit = Case.query.filter_by(id=case_id).first() + + if not case_to_edit: + return jsonify({"status": "Error", "message": "Case not found"}), 404 + + outreach_date = case_to_edit.outreach_date + if num_children_enrolled != "": + try: + int(num_children_enrolled) + except: + return jsonify({"status": "Error", "message": "no. of children enrolled must be integer"}), 400 + num_children_enrolled = int( + num_children_enrolled) if num_children_enrolled != "" else 0 + + try: + decision_date = datetime.strptime( + decision_date_str, '%Y-%m-%d') if decision_date_str and decision_date_str.lower() != 'none' else None + packet_received_date = datetime.strptime( + packet_received_date_str, + '%Y-%m-%d') if packet_received_date_str and packet_received_date_str.lower() != 'none' else None + except ValueError as e: + return jsonify({"status": "Error", "message": "Decision/Package dates must be valid dates"}), 400 + print(decision_date, packet_received_date) + # Validate that decision and packet_received_date are not before outreach_date + if decision_date and decision_date.date() < outreach_date: + return jsonify({"status": "Error", "message": "Decision date cannot be before outreach date"}), 400 + + if packet_received_date and packet_received_date.date() < outreach_date: + return jsonify({"status": "Error", "message": "Packet received date cannot be before outreach date"}), 400 + + # Get the case ID from the data + case_to_edit.packet_return_status = data.get('packetReturnStatus') + case_to_edit.packet_received_date = data.get('packetReceivedDate') + case_to_edit.decision = data.get('decision') + case_to_edit.num_children_enrolled = num_children_enrolled + case_to_edit.decision_date = decision_date + case_to_edit.not_enrolled_reason = data.get('notEnrolledReason') + + try: + db.session.commit() + return jsonify({"status": "OK"}), 200 + except Exception as e: + return jsonify({"status": "Error", "message": e}), 400 diff --git a/app/controllers/my_requests.py b/app/controllers/my_requests.py deleted file mode 100644 index bc818f2..0000000 --- a/app/controllers/my_requests.py +++ /dev/null @@ -1,57 +0,0 @@ -from flask import Blueprint, render_template -from flask import redirect, url_for -from flask_login import current_user -from flask_wtf import FlaskForm -from wtforms import StringField, IntegerField, SubmitField -from wtforms.fields import DateField - -from app import db -from app.models import Case - -# from wtforms.ext.sqlalchemy.fields import QuerySelectField - -my_req_bp = Blueprint('my-requests', __name__) - - -class RequestForm(FlaskForm): - id = IntegerField('ID') - customer_id = StringField('Customer ID') - first_name = StringField('First Name') - last_name = StringField('Last Name') - num_of_children = IntegerField('Number of Children') - outreach_date = DateField('Outreach Date') - packet_return_status = StringField('Packet Return Status') - packet_received_date = DateField('Packet Received Date') - staff_initials = StringField('Staff Initials') - decision = StringField('Decision') - num_children_enrolled = IntegerField('Number of Children Enrolled') - decision_date = DateField('Decision Date') - not_enrolled_reason = StringField('Not Enrolled Reason') - submit = SubmitField('Save Changes') - - -@my_req_bp.route('/my-requests', methods=['GET', 'POST']) -def view_requests(): - requests_data = Cases.query.order_by(Cases.id).all() - - forms = [] - - for request_data in requests_data: - form = RequestForm(obj=request_data) - forms.append((request_data.id, form)) - - return render_template('my_requests.html', forms=forms, user=current_user) - - -@my_req_bp.route('/my-requests/', methods=['POST']) -def update_request(request_id): - request_data = Cases.query.get_or_404(request_id) - form = RequestForm(obj=request_data) - - if form.validate_on_submit(): - form.populate_obj(request_data) - db.session.commit() - print(f"Updating request {request_id} with data: {form.data}") - - # Redirect to avoid form resubmission on page refresh - return redirect(url_for('my-requests.view_requests')) diff --git a/app/controllers/new_requests_controller.py b/app/controllers/new_requests_controller.py index 02b6bba..38e1690 100644 --- a/app/controllers/new_requests_controller.py +++ b/app/controllers/new_requests_controller.py @@ -50,7 +50,7 @@ def populateDatabase(upload_file, file_path): except Exception as e: return jsonify({'message': 'Unsupported file format', 'error': str(e)}), 501 - df = df.iloc[:, :5] + #df = df.iloc[:, :5] df.rename(columns={'Outreach_Date': 'outreach_date'}, inplace=True) valid_data, invalid_data = validateData(df) diff --git a/app/seeds/cases.py b/app/seeds/cases.py new file mode 100644 index 0000000..e655389 --- /dev/null +++ b/app/seeds/cases.py @@ -0,0 +1,27 @@ +from app import db +from app.models import Case +import logging + + +def seed(): + my_case_1 = Case(customer_id="1", first_name="Tanmai", last_name="Harish", num_of_children=3, + outreach_date="2023-11-11") + my_case_2 = Case(customer_id="2", first_name="John", last_name="Jonhnson", num_of_children=2, + outreach_date="2023-11-12") + my_case_3 = Case(customer_id="3", first_name="Great", last_name="Khali", num_of_children=1, + outreach_date="2023-11-13") + my_case_4 = Case(customer_id="4", first_name="Daehee", last_name="Han", num_of_children=4, + outreach_date="2023-11-14") + my_case_5 = Case(customer_id="5", first_name="Ravi", last_name="Ashwin", num_of_children=5, + outreach_date="2023-11-15") + my_case_6 = Case(customer_id="6", first_name="Rajesh", last_name="Jadhav", num_of_children=3, + outreach_date="2023-11-16") + db.session.add(my_case_1) + db.session.add(my_case_2) + db.session.add(my_case_3) + db.session.add(my_case_4) + db.session.add(my_case_5) + db.session.add(my_case_6) + db.session.commit() + + logging.info("Cases seeded") diff --git a/app/static/css/cases.css b/app/static/css/cases.css new file mode 100644 index 0000000..de83e4b --- /dev/null +++ b/app/static/css/cases.css @@ -0,0 +1,21 @@ +.hidden { + display: none; +} +.purple-table { + background-color: #662484; + color: white; +} + +.purple-button { + background-color: #662484; + color: white; + border: none; +} + +.purple-button:hover { + background-color: #501c68; +} + +.hidden-assign-button { + display: none; +} \ No newline at end of file diff --git a/app/static/css/homepage.css b/app/static/css/homepage.css index 8de3fdb..b619440 100644 --- a/app/static/css/homepage.css +++ b/app/static/css/homepage.css @@ -132,27 +132,29 @@ tr:nth-child(even) { } /* for popup in my_cases */ .overlay { - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - background: rgba(102, 36, 132, 0.8); - transition: opacity 500ms; - visibility: hidden; - opacity: 0; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + transition: opacity 500ms; + visibility: hidden; + opacity: 0; + z-index:100; } + .overlay:target { visibility: visible; opacity: 1; } .wrapper { - margin: 70px auto; - padding: 20px; - background: #e7e7e7; - border-radius: 5px; - width: 30%; + z-index:101; + margin: 70px auto; + padding: 20px; + background: #e7e7e7; + border-radius: 5px; + width: 30%; height: 100%; position: relative; transition: all 5s ease-in-out; @@ -179,8 +181,42 @@ tr:nth-child(even) { } .popupContent { + z-index:101; margin-bottom: 20px; border-radius: 5px; background-color: #e7e7e7; padding: 20px 0; } + +/* for mycases edit button */ +.wrapper2 { + z-index:101; + margin: 70px auto; + padding: 20px; + background: #e7e7e7; + border-radius: 5px; + width: 100%; + height: 100%; + position: relative; + transition: all 5s ease-in-out; +} +.wrapper2 h2 { + margin-top: 0; +} +.wrapper2 .close { + position: absolute; + top: 20px; + right: 30px; + transition: all 200ms; + font-size: 30px; + font-weight: bold; + text-decoration: none; + color: #662484; +} +.wrapper2 .close:hover { + color: yellow; +} +.wrapper2 .content { + height: 70%; + overflow-y: scroll; +} \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index 8d24ec0..ef03b24 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -15,7 +15,7 @@ - {% block addhead %}{% endblock %} + {% block addhead %}{% endblock %} @@ -35,7 +35,7 @@

{% block header %} {% endblock %}

- > + {% block script %}{% endblock %} diff --git a/app/templates/cases.html b/app/templates/cases.html index 292bde9..f512b66 100644 --- a/app/templates/cases.html +++ b/app/templates/cases.html @@ -1,69 +1,35 @@ - - - - Home Page - - - - - - - - - - - - - -
- {% include 'include/_navbar.html' %} -
-
-

ChildCare Enrollment Management System

-
- -

Cases

+{% block content %}


- +
- - + +
- +
- +
- - + +
- +
@@ -138,34 +104,34 @@

Cases

-
- - + return daysDifference; + } + }); + +{% endblock %} \ No newline at end of file diff --git a/app/templates/include/_navbar.html b/app/templates/include/_navbar.html index 5f15412..512cb62 100644 --- a/app/templates/include/_navbar.html +++ b/app/templates/include/_navbar.html @@ -27,7 +27,7 @@ {% endif %} -
  • +
  • My Cases diff --git a/app/templates/my_cases.html b/app/templates/my_cases.html index cf6a233..3a393d7 100644 --- a/app/templates/my_cases.html +++ b/app/templates/my_cases.html @@ -1,107 +1,378 @@ -{% extends 'base.html' %} - -{% block header %} -

    {% block title %}My Cases{% endblock %}

    -{% endblock %} - - -{% block content %} - - - - - - - - {% request_id, form in forms %} - - - - - - - -
    -
    -

    Edit Case Information

    -

    Case Number: {{ request_id }}

    - - × - - -
    -
    -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - - - -
    -
    -
    -
    - {% endfor %} -
    IDFirst NameLast NameAction
    {{ form.customer_id }}{{ form.first_name }}{{ form.last_name }} - Edit -
    -{% endblock %} \ No newline at end of file +{% extends 'base.html' %} +{% block addhead %} + + +{% endblock %} + +{% block header %} +

    {% block title %}My Cases{% endblock %}

    +{% endblock %} + +{% block content %} +
    + + + + + + + + + + + + + + + + + + + + {% for case in cases %} + + + + + + + + + + + + + + + +
    +
    +

    Detailed Case Information

    +

    Case Number: {{ case.customer_id }}

    + + × + + +
    +
    + +
    + {{ case.first_name }} {{ case.last_name }} +
    + +
    + {{ case.num_of_children }} +
    + +
    + {{ case.num_children_enrolled }} +
    + +
    + {{ case.outreach_date }} +
    + +
    + {{ case.packet_received_date }} +
    + +
    + {{ case.packet_return_status }} +
    + +
    + {{ case.decision_date }} +
    + +
    + {{ case.not_enrolled_reason }} +
    +
    +
    +
    + {% endfor %} + +
    IDFirst NameLast NameNo.of ChildrenOutreach DateActions
    {{ case.customer_id }}{{ case.first_name }}{{ case.last_name }}{{ case.num_of_children }}{{ case.outreach_date }} + + Detail +
    + + +
    +{% endblock %} +{% block script %} + +{% endblock %} + diff --git a/app/templates/my_requests.html b/app/templates/my_requests.html deleted file mode 100644 index 760b547..0000000 --- a/app/templates/my_requests.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - My Requests - - - - -
    -
    - {% for request_id, form in forms %} -
    -
    -
    -
    -
    Request ID: {{ request_id }}
    -

    {{ form.customer_id.label }}: {{ form.customer_id() }}

    -

    {{ form.first_name.label }}: {{ form.first_name() }}

    -

    {{ form.last_name.label }}: {{ form.last_name() }}

    -

    {{ form.num_of_children.label }}: {{ form.num_of_children() }}

    - {{ form.csrf_token }} - {{ form.hidden_tag() }} - -
    -
    -
    -
    - {% if loop.index % 3 == 0 %} -
    - {% endif %} - {% endfor %} -
    -
    - - - - - - - - - - - - - diff --git a/seed.py b/seed.py index fb444ca..9def8ed 100644 --- a/seed.py +++ b/seed.py @@ -1,11 +1,12 @@ import logging from app import create_app -from app.seeds import roles, users +from app.seeds import roles, users, cases app = create_app() with app.app_context(): roles.seed() users.seed() + cases.seed() logging.info("Database is seeded!") diff --git a/testfiles/valid_csv.csv b/testfiles/valid_csv.csv index f891db2..84cfb18 100644 --- a/testfiles/valid_csv.csv +++ b/testfiles/valid_csv.csv @@ -1,3 +1,9 @@ -customer_id,first_name,last_name,num_of_children,outreach_date -12159122,Emily,Johnson,5,2023-05-03 -35286967631,Ethan,Smith,2,2023-05-11 \ No newline at end of file +customer_id,first_name,last_name,num_of_children,outreach_date,packet_return_status,assigned_to_user +121159122,Emily,Johnson,5,2023-11-03,RETURNED,1 +3526967631,Ethan,Smith,2,2023-11-11,RETURNED,1 +4526967631,Ethan,Smith,2,2023-11-12,RETURNED,2 +6526967631,Ethan,Smith,2,2023-11-13,RETURNED,2 +526967631,Ethan,Smith,2,2023-11-14,RETURNED,2 +326967631,Ethan,Smith,2,2023-11-15,RETURNED,2 +5967631,Ethan,Smith,2,2023-11-16,RETURNED,2 +526631,Ethan,Smith,2,2023-11-10,RETURNED,2