This commit is contained in:
2024-04-04 16:39:29 -04:00
parent de448a35d1
commit 5d80acfcea
24 changed files with 298 additions and 28 deletions

View File

@@ -12,6 +12,8 @@ WORKDIR /app
RUN pip3 install -r requirements.txt RUN pip3 install -r requirements.txt
RUN apt-get update && apt-get install -y wkhtmltopdf
EXPOSE 8000 EXPOSE 8000
COPY . /app COPY . /app

Binary file not shown.

0
app/bin/__init__.py Normal file
View File

1
app/bin/print_file.py Normal file
View File

@@ -0,0 +1 @@
adsfasd

View File

@@ -1,13 +0,0 @@
from typing import Annotated
from fastapi import Header, HTTPException
async def get_token_header(x_token: Annotated[str, Header()]):
if x_token != "fake-super-secret-token":
raise HTTPException(status_code=400, detail="X-Token header invalid")
async def get_query_token(token: str):
if token != "jessica":
raise HTTPException(status_code=400, detail="No Jessica token provided")

View File

@@ -1,6 +1,8 @@
from fastapi import FastAPI from fastapi import FastAPI
from app.routers import printstatus, command from app.routers import (cron_print, printstatus,
command,
)
@@ -11,11 +13,12 @@ app = FastAPI()
app.include_router(printstatus.router) app.include_router(printstatus.router)
app.include_router(command.router) app.include_router(command.router)
app.include_router(cron_print.router)
@app.get("/") @app.get("/")
def read_root(): def read_root():
return {"Hello": "World"} return {"Status": "Printer Service is Online"}

Binary file not shown.

View File

@@ -1,5 +1,5 @@
from sqlalchemy import Column, Integer,\ from sqlalchemy import Column, Integer,\
Integer, DECIMAL, Text,\ DECIMAL, Text,\
VARCHAR, TIMESTAMP, Date VARCHAR, TIMESTAMP, Date
from datetime import datetime from datetime import datetime
from app.database import Base from app.database import Base
@@ -48,5 +48,3 @@ class Delivery(Base):
pre_charge_amount = Column(DECIMAL(50, 2)) pre_charge_amount = Column(DECIMAL(50, 2))
total_price = Column(DECIMAL(50, 2)) total_price = Column(DECIMAL(50, 2))
final_price = Column(DECIMAL(50, 2)) final_price = Column(DECIMAL(50, 2))

29
app/models/printer.py Normal file
View File

@@ -0,0 +1,29 @@
from sqlalchemy import Column, Integer,\
DECIMAL, Text,\
VARCHAR, TIMESTAMP, Date
from datetime import datetime
from app.database import Base
class Printer_jobs(Base):
__tablename__ = "printer_jobs"
id = Column(Integer,
primary_key=True,
autoincrement=True,
unique=False)
delivery_id = Column(Integer)
date_added = Column(Date(), default=datetime.utcnow())
date_completed = Column(Date(), default=datetime.utcnow())
employee_id = Column(Integer)
#0 = waiting
#1 = file made..read to print
#2 = printing
#3 = printed
#4 = error
status = Column(Integer)

Binary file not shown.

Binary file not shown.

View File

@@ -1,7 +1,9 @@
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter
from datetime import date, timedelta, datetime
from app.database import session from app.database import session
from app.models.delivery import Delivery from app.models.delivery import Delivery
from app.models.printer import Printer_jobs
router = APIRouter( router = APIRouter(
prefix="/command", prefix="/command",
@@ -10,7 +12,103 @@ router = APIRouter(
) )
@router.get("/") @router.get("/printticket/{delivery_id}")
async def read_items(): async def print_specific_ticket(delivery_id):
x = session.query(Delivery).first()
return {"x": x.id} now = datetime.utcnow()
get_ticket = (session.query(Delivery)
.filter(Delivery.id == delivery_id)
.first())
new_job = Printer_jobs(
delivery_id = delivery_id,
date_added = now,
date_completed = None,
employee_id = get_ticket.driver_employee_id,
status = 0,
)
session.add(new_job)
session.commit()
return {"ok": True}
@router.get("/print_waiting")
async def print_waiting_tickets():
tomm = date.today() + timedelta(days=1)
now = datetime.utcnow()
get_deliveries = (session
.query(Delivery)
.filter(Delivery.delivery_status == 0)
.filter(Delivery.expected_delivery_date != tomm)
.filter(Delivery.expected_delivery_date != date.today())
.all())
for f in get_deliveries:
new_job = Printer_jobs(
delivery_id = f.id,
date_added = now,
date_completed = None,
employee_id = f.driver_employee_id,
status = 0,
)
session.add(new_job)
session.commit()
return {"ok": True}
@router.get("/print_today")
async def print_today_tickets():
now = datetime.utcnow()
get_deliveries = (session
.query(Delivery)
.filter(Delivery.expected_delivery_date == date.today())
.all())
for f in get_deliveries:
new_job = Printer_jobs(
delivery_id = f.id,
date_added = now,
date_completed = None,
employee_id = f.driver_employee_id,
status = 0,
)
session.add(new_job)
session.commit()
return {"ok": True}
@router.get("/print_tommorrow")
async def print_tommorrow_tickets():
now = datetime.utcnow()
tomm = date.today() + timedelta(days=1)
get_deliveries = (session
.query(Delivery)
.filter(Delivery.expected_delivery_date == tomm)
.all())
for f in get_deliveries:
new_job = Printer_jobs(
delivery_id = f.id,
date_added = now,
date_completed = None,
employee_id = f.driver_employee_id,
status = 0,
)
session.add(new_job)
session.commit()
return {"ok": True}

78
app/routers/cron_print.py Normal file
View File

@@ -0,0 +1,78 @@
from fastapi import APIRouter, BackgroundTasks
from app.database import session
from app.models.printer import Printer_jobs
import subprocess
import shutil
import pdfkit
location_tickets = '/home/amnesia/gitbox/tickets/'
printer_url_service = 'http://172.18.0.1:5173/ticket/'
router = APIRouter(
prefix="/cron",
tags=["cron"],
responses={404: {"description": "Not found"}},
)
@router.get("/waiting")
async def make_waiting():
"""
Cron job - Gets waiting tickets in database and makes pdf files
Updates values in database for next step
"""
get_tickets_to_print = (session.query(Printer_jobs)
.filter(Printer_jobs.status == 0)
.all())
count = 0
for f in get_tickets_to_print:
# get the pdf name
filename_out = str(f.id) + '.pdf'
# read website for the html in
web_url = printer_url_service + str(f.id)
pdfkit.from_url(web_url, filename_out, verbose=True)
#set location and name to move the ticket too
renamed_file = location_tickets + filename_out
# perform command to move command
shutil.move(filename_out, renamed_file)
# update count
newcount = count + 1
count = newcount
f.status = 1
session.add(f)
session.commit()
return {'ok': True,
'count': count,
}
@router.get("/print/waiting")
async def print_waiting(background_tasks: BackgroundTasks):
"""
Checks if pdfs are made by query
Prints tickets using linux command on background tasks
"""
get_tickets_to_print = (session.query(Printer_jobs)
.filter(Printer_jobs.status == 1)
.all())
if get_tickets_to_print is not None:
for f in get_tickets_to_print:
background_tasks.add_task(print_ticket, id=f.id)
f.status = 3
session.add(f)
session.commit()
return {'ok': True }
def print_ticket(id: int):
location = location_tickets + id + '.pdf'
p = (subprocess.run(["lp", location], capture_output=True))
for line in p.stdout.readlines():
print(line)

View File

@@ -1,10 +1,40 @@
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter
from fastapi.responses import JSONResponse
from fastapi.encoders import jsonable_encoder
from app.database import session
from app.models.delivery import Delivery
from app.models.printer import Printer_jobs
router = APIRouter( router = APIRouter(
prefix="/status", prefix="/status",
tags=["status"], tags=["status"],
responses={404: {"description": "Not found"}}, responses={404: {"description": "Not found"}},
) )
@router.get("/")
@router.get("/waiting")
async def read_items(): async def read_items():
return {"Hello": "World"} all_jobs = session.query(Printer_jobs).filter(Printer_jobs.status == 0).all()
return JSONResponse(content=jsonable_encoder(all_jobs), status_code=200)
@router.get("/ready")
async def read_items():
all_jobs = session.query(Printer_jobs).filter(Printer_jobs.status == 1).all()
return JSONResponse(content=jsonable_encoder(all_jobs), status_code=200)
@router.get("/printing")
async def read_items():
all_jobs = session.query(Printer_jobs).filter(Printer_jobs.status == 2).all()
return JSONResponse(content=jsonable_encoder(all_jobs), status_code=200)
@router.get("/printed")
async def read_items():
all_jobs = session.query(Printer_jobs).filter(Printer_jobs.status == 3).all()
return JSONResponse(content=jsonable_encoder(all_jobs), status_code=200)
@router.get("/error")
async def read_items():
all_jobs = session.query(Printer_jobs).filter(Printer_jobs.status == 4).all()
return JSONResponse(content=jsonable_encoder(all_jobs), status_code=200)

0
app/schema/__init__.py Normal file
View File

39
app/schema/delivery.py Normal file
View File

@@ -0,0 +1,39 @@
from pydantic import BaseModel, Field
from datetime import datetime, timezone
from uuid import UUID, uuid4
def datetime_now() -> datetime:
return datetime.now(timezone.utc)
class Delivery(BaseModel):
customer_id: int
customer_name: str
customer_address: str
customer_town: str
customer_state: int
customer_zip: int
gallons_ordered: float
customer_asked_for_fill: int
gallons_delivered: float
customer_filled: int
delivery_status: int
when_ordered: datetime = Field(default_factory=datetime_now)
when_delivered: datetime = Field(default_factory=datetime_now)
expected_delivery_date: datetime = Field(default_factory=datetime_now)
automatic: int
oil_id: int
supplier_price: float
customer_price: float
customer_temperature: float
dispatcher_notes: str
prime: int
same_day: int
payment_type: int
payment_card_id: int
cash_recieved: float
driver_employee_id: int
driver_first_name: str
driver_last_name: str
pre_charge_amount: float
total_price: float
final_price: float

View File

@@ -1,4 +1,9 @@
fastapi fastapi
uvicorn[standard] uvicorn[standard]
psycopg2-binary psycopg2-binary
sqlalchemy sqlalchemy
python-multipart
pdfkit
requests
beautifulsoup4
lxml

BIN
tickets/1.pdf Normal file

Binary file not shown.