From b97d729ef10c6ca4c09f3741df8a4d66d0c65220 Mon Sep 17 00:00:00 2001 From: Edwin Eames Date: Mon, 28 Jul 2025 12:05:14 -0400 Subject: [PATCH] updated page amount --- Dockerfile.prod | 2 +- app/__init__.py | 4 ++ app/auth/views.py | 2 +- app/classes/service.py | 68 ++++++++++++++++++++++++++ app/customer/views.py | 2 +- app/reports/views.py | 26 +++++++++- app/service/__init__.py | 7 +++ app/service/views.py | 103 ++++++++++++++++++++++++++++++++++++++++ prod_settings.py | 3 +- 9 files changed, 211 insertions(+), 6 deletions(-) create mode 100644 app/classes/service.py create mode 100644 app/service/__init__.py create mode 100644 app/service/views.py diff --git a/Dockerfile.prod b/Dockerfile.prod index 39eaa84..327f737 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -1,4 +1,4 @@ -FROM python:3.12-bullseye +FROM python:3.13.3-bullseye ENV PYTHONFAULTHANDLER=1 diff --git a/app/__init__.py b/app/__init__.py index 47441e7..0929ad0 100755 --- a/app/__init__.py +++ b/app/__init__.py @@ -217,6 +217,10 @@ app.register_blueprint(promo_blueprint, url_prefix='/promo') from .social import social as social_blueprint app.register_blueprint(social_blueprint, url_prefix='/social') +from .service import service as service_blueprint +app.register_blueprint(service_blueprint, url_prefix='/service') + + with app.app_context(): db.configure_mappers() diff --git a/app/auth/views.py b/app/auth/views.py index 70dc57b..a8713c1 100755 --- a/app/auth/views.py +++ b/app/auth/views.py @@ -1,5 +1,5 @@ from flask import request, jsonify -from flask_login import current_user, logout_user, login_user, login_required +from flask_login import current_user, logout_user, login_required from app.auth import auth from app import db, bcrypt from datetime import datetime diff --git a/app/classes/service.py b/app/classes/service.py new file mode 100644 index 0000000..388f7ba --- /dev/null +++ b/app/classes/service.py @@ -0,0 +1,68 @@ + +from app import db, ma +from datetime import datetime + + +class Service_Service(db.Model): + __tablename__ = 'service_service' + __table_args__ = {"schema": "public"} + + id = db.Column(db.Integer, + primary_key=True, + autoincrement=True, + unique=False) + + customer_id = db.Column(db.INTEGER) + customer_name = db.Column(db.VARCHAR(1000)) + customer_address = db.Column(db.VARCHAR(1000)) + customer_town = db.Column(db.VARCHAR(140)) + customer_state = db.Column(db.VARCHAR(140)) + customer_zip = db.Column(db.INTEGER) + + # tune-up = 0 + # no heat = 1 + # fix = 2 + # tank = 3 + # other = 4 + type_service_call = db.Column(db.INTEGER) + + status = db.Column(db.INTEGER) + # complete = 0 + # incomplete = 1 + + when_ordered = db.Column(db.DATE()) + scheduled_date = db.Column(db.DATE()) + time = db.Column(db.INTEGER()) + + description = db.Column(db.TEXT()) + + prime = db.Column(db.INTEGER) + same_day = db.Column(db.INTEGER) + emergency = db.Column(db.INTEGER) + + service_employee_id = db.Column(db.INTEGER) + service_first_name = db.Column(db.VARCHAR(140)) + service_last_name = db.Column(db.VARCHAR(140)) + + # cash = 0 + # credit = 1 + # credit/cash = 2 + # check = 3 + # other = 4 + payment_type = db.Column(db.INTEGER) + payment_card_id = db.Column(db.INTEGER) + cash_recieved = db.Column(db.DECIMAL(6, 2)) + check_number = db.Column(db.VARCHAR(20)) + pre_charge_amount = db.Column(db.DECIMAL(6, 2)) + total_price = db.Column(db.DECIMAL(6, 2)) + final_price = db.Column(db.DECIMAL(6, 2)) + + promo_id = db.Column(db.INTEGER) + promo_money_discount = db.Column(db.DECIMAL(6, 2)) + + +class Service_Service_schema(ma.SQLAlchemyAutoSchema): + class Meta: + model = Service_Service + + diff --git a/app/customer/views.py b/app/customer/views.py index 9c579ca..80c47a5 100755 --- a/app/customer/views.py +++ b/app/customer/views.py @@ -48,7 +48,7 @@ def all_customers(page): pagination all customers """ - per_page_amount = 10 + per_page_amount = 100 if page is None: offset_limit = 0 elif page == 1: diff --git a/app/reports/views.py b/app/reports/views.py index 31b57ff..45f4363 100755 --- a/app/reports/views.py +++ b/app/reports/views.py @@ -20,4 +20,28 @@ def oil_total_gallons(): .group_by(Delivery_Delivery.id)\ .all() - return jsonify({"ok": True }), 200 \ No newline at end of file + return jsonify({"ok": True }), 200 + +@reports.route("/customers/list", methods=["GET"]) +def customer_list(): + """ + Retrieve a list of customers with selected fields for printing. + Returns account number, first name, last name, address, town, and phone number. + Ordered by last name from A to Z. + """ + + customers = db.session.query(Customer_Customer).order_by(Customer_Customer.customer_last_name.asc()).all() + customer_data = [ + { + "account_number": customer.account_number, + "first_name": customer.customer_first_name, + "last_name": customer.customer_last_name, + "address": customer.customer_address, + "town": customer.customer_town, + "phone_number": customer.customer_phone_number + } + for customer in customers + ] + response = jsonify({"ok": True, "customers": customer_data}) + + return response, 200 diff --git a/app/service/__init__.py b/app/service/__init__.py new file mode 100644 index 0000000..800ef82 --- /dev/null +++ b/app/service/__init__.py @@ -0,0 +1,7 @@ +# coding=utf-8 + +from flask import Blueprint + +service = Blueprint('service', __name__) + +from . import views \ No newline at end of file diff --git a/app/service/views.py b/app/service/views.py new file mode 100644 index 0000000..60be2cb --- /dev/null +++ b/app/service/views.py @@ -0,0 +1,103 @@ +from flask import request, jsonify +from flask_login import current_user +from datetime import date, timedelta +from app.service import service +from app import db +from sqlalchemy import or_ + +from app.classes.customer import (Customer_Customer) +from app.classes.service import (Service_Service, + Service_Service_schema + ) +from app.classes.employee import Employee_Employee +from app.classes.cards import Card_Card +from app.classes.pricing import Pricing_Oil_Oil +from app.classes.auth import Auth_User +from app.classes.promo import Promo_Promo + + + +@service.route("/", methods=["GET"]) +def get_service_call(id): + services = Service_Service.query.filter(Service_Service.id==id).first() + service_schema = Service_Service_schema(many=False) + return jsonify(service_schema.dump(services)), 200 + + +@service.route("/create", methods=["POST"]) +def create_service_call(): + data = request.get_json() + if not data: + return jsonify({"error": "No data provided"}), 400 + + new_service = Service_Service( + customer_id=data.get('customer_id'), + customer_name=data.get('customer_name'), + customer_address=data.get('customer_address'), + customer_town=data.get('customer_town'), + customer_state=data.get('customer_state'), + customer_zip=data.get('customer_zip'), + type_service_call=data.get('type_service_call'), + status=data.get('status', 1), # Default to incomplete + when_ordered=data.get('when_ordered', str(date.today())), + scheduled_date=data.get('scheduled_date'), + time=data.get('time'), + description=data.get('description'), + prime=data.get('prime', 0), + same_day=data.get('same_day', 0), + emergency=data.get('emergency', 0), + service_employee_id=data.get('service_employee_id'), + service_first_name=data.get('service_first_name'), + service_last_name=data.get('service_last_name'), + payment_type=data.get('payment_type'), + payment_card_id=data.get('payment_card_id'), + cash_recieved=data.get('cash_recieved', 0.0), + check_number=data.get('check_number'), + pre_charge_amount=data.get('pre_charge_amount', 0.0), + total_price=data.get('total_price', 0.0), + final_price=data.get('final_price', 0.0), + promo_id=data.get('promo_id'), + promo_money_discount=data.get('promo_money_discount', 0.0) + ) + + try: + db.session.add(new_service) + db.session.commit() + return jsonify({"message": "Service created successfully", "id": new_service.id}), 201 + except Exception as e: + db.session.rollback() + return jsonify({"error": str(e)}), 500 + +@service.route("/edit/", methods=["PUT"]) +def update_service_call(id): + service = Service_Service.query.get_or_404(id) + data = request.get_json() + if not data: + return jsonify({"error": "No data provided"}), 400 + + for key, value in data.items(): + if hasattr(service, key): + setattr(service, key, value) + try: + db.session.commit() + return jsonify({"message": "Service updated successfully"}), 200 + except Exception as e: + db.session.rollback() + return jsonify({"error": str(e)}), 500 + +@service.route("/", methods=["DELETE"]) +def delete_service_call(id): + service = Service_Service.query.get_or_404(id) + try: + db.session.delete(service) + db.session.commit() + return jsonify({"message": "Service deleted successfully"}), 200 + except Exception as e: + db.session.rollback() + return jsonify({"error": str(e)}), 500 + +@service.route("/list/all", methods=["GET"]) +def list_service_calls(): + services = Service_Service.query.all() + service_schema = Service_Service_schema(many=True) + return jsonify(service_schema.dump(services)), 200 diff --git a/prod_settings.py b/prod_settings.py index 868b8a9..8e56c0c 100644 --- a/prod_settings.py +++ b/prod_settings.py @@ -32,6 +32,7 @@ class ApplicationConfig: SECRET_KEY = "34dsfkjh43123cxzfvqwer23432dsf233214efdasf2134321" # sessions + SESSION_TYPE = "sqlalchemy" SESSION_COOKIE_NAME = "eamco_session" SESSION_COOKIE_SECURE = False SESSION_COOKIE_HTTPONLY = True @@ -49,5 +50,3 @@ class ApplicationConfig: CORS_ALLOW_HEADERS = "*" CORS_ORIGIN_WHITELIST = ['http://192.168.1.204','http://localhost', 'http://192.168.1.204:9511', "*"] WHITE= ['http://192.168.1.204','http://localhost', "*"] - -