July 4 - Update Vendor Work-Order Workflow
This commit is contained in:
+47
-2
@@ -15,7 +15,7 @@ from app.models.notification import (
|
||||
EVENT_CUSTOMER_ISSUE_UPDATED,
|
||||
)
|
||||
from app.utils.forms import IssueForm, IssueUpdateForm
|
||||
from app.utils.decorators import supervisor_required
|
||||
from app.utils.decorators import supervisor_required, project_manager_required
|
||||
from app.utils.notifications import notify, notify_customers_for_facility, notify_by_matrix
|
||||
from app.utils.audit import log_action, ACTION_CREATE, ACTION_UPDATE, ACTION_DELETE, ACTION_EXPORT
|
||||
from app.tenancy.gates import quota_soft_check
|
||||
@@ -1080,4 +1080,49 @@ def export_pdf(issue_id):
|
||||
resp = make_response(pdf_bytes)
|
||||
resp.headers['Content-Type'] = 'application/pdf'
|
||||
resp.headers['Content-Disposition'] = f'attachment; filename="issue_{issue.id}.pdf"'
|
||||
return resp
|
||||
return resp
|
||||
|
||||
|
||||
# ── Vendor work order dispatch (phase36) ─────────────────────────────────────
|
||||
|
||||
@bp.route('/<int:issue_id>/work-order', methods=['POST'])
|
||||
@login_required
|
||||
@project_manager_required
|
||||
def dispatch_work_order(issue_id):
|
||||
"""Send this issue to an external contractor as a tokenized work order."""
|
||||
import re as _re
|
||||
from app.models.work_order import IssueWorkOrder
|
||||
from app.routes.work_orders import send_work_order_email
|
||||
|
||||
issue = db.session.get(Issue, issue_id)
|
||||
if issue is None:
|
||||
abort(404)
|
||||
|
||||
vendor_name = (request.form.get('vendor_name', '') or '').strip()
|
||||
vendor_email = (request.form.get('vendor_email', '') or '').strip()
|
||||
message = (request.form.get('message', '') or '').strip() or None
|
||||
|
||||
if not vendor_name or not _re.match(r'^[^@\s]+@[^@\s]+\.[^@\s]+$', vendor_email):
|
||||
flash('A contractor name and a valid email are required to send a work order.',
|
||||
'warning')
|
||||
return redirect(url_for('issues.view', issue_id=issue.id))
|
||||
|
||||
wo = IssueWorkOrder(
|
||||
issue_id=issue.id, vendor_name=vendor_name, vendor_email=vendor_email,
|
||||
token=IssueWorkOrder.new_token(), status='sent', message=message,
|
||||
sent_at=now_eastern(), created_by=current_user.id, created_at=now_eastern(),
|
||||
)
|
||||
# Keep the issue's free-text vendor fields in sync when they're still blank.
|
||||
if not issue.vendor_name:
|
||||
issue.vendor_name = vendor_name
|
||||
if not issue.vendor_contact:
|
||||
issue.vendor_contact = vendor_email
|
||||
if issue.status == 'open':
|
||||
issue.status = 'in_progress'
|
||||
db.session.add(wo)
|
||||
db.session.commit()
|
||||
log_action(ACTION_UPDATE, 'Issue', issue.id, f'Issue #{issue.id}',
|
||||
f'dispatched work order to {vendor_name} <{vendor_email}>')
|
||||
send_work_order_email(wo, issue, request.host_url)
|
||||
flash(f'Work order sent to {vendor_name}.', 'success')
|
||||
return redirect(url_for('issues.view', issue_id=issue.id))
|
||||
Reference in New Issue
Block a user