Add optional Autotask ID import toggle
This commit is contained in:
parent
1fb99dc6e7
commit
53b028ef78
@ -505,6 +505,7 @@ def customers_export():
|
||||
@roles_required("admin", "operator")
|
||||
def customers_import():
|
||||
file = request.files.get("file")
|
||||
include_autotask_ids = bool(request.form.get("include_autotask_ids"))
|
||||
if not file or not getattr(file, "filename", ""):
|
||||
flash("No file selected.", "warning")
|
||||
return redirect(url_for("main.customers"))
|
||||
@ -541,10 +542,11 @@ def customers_import():
|
||||
# Detect Autotask columns (backwards compatible - these are optional)
|
||||
autotask_id_idx = None
|
||||
autotask_name_idx = None
|
||||
if "autotask_company_id" in header:
|
||||
autotask_id_idx = header.index("autotask_company_id")
|
||||
if "autotask_company_name" in header:
|
||||
autotask_name_idx = header.index("autotask_company_name")
|
||||
if include_autotask_ids:
|
||||
if "autotask_company_id" in header:
|
||||
autotask_id_idx = header.index("autotask_company_id")
|
||||
if "autotask_company_name" in header:
|
||||
autotask_name_idx = header.index("autotask_company_name")
|
||||
|
||||
for r in rows[start_idx:]:
|
||||
if not r:
|
||||
@ -582,7 +584,7 @@ def customers_import():
|
||||
if active_val is not None:
|
||||
existing.active = active_val
|
||||
# Update Autotask mapping if provided in CSV
|
||||
if autotask_company_id is not None:
|
||||
if include_autotask_ids and autotask_company_id is not None:
|
||||
existing.autotask_company_id = autotask_company_id
|
||||
existing.autotask_company_name = autotask_company_name
|
||||
existing.autotask_mapping_status = None # Will be resynced
|
||||
@ -600,7 +602,10 @@ def customers_import():
|
||||
|
||||
try:
|
||||
db.session.commit()
|
||||
flash(f"Import finished. Created: {created}, Updated: {updated}, Skipped: {skipped}.", "success")
|
||||
flash(
|
||||
f"Import finished. Created: {created}, Updated: {updated}, Skipped: {skipped}. Autotask IDs imported: {'yes' if include_autotask_ids else 'no'}.",
|
||||
"success",
|
||||
)
|
||||
|
||||
# Audit logging
|
||||
import json
|
||||
@ -609,6 +614,7 @@ def customers_import():
|
||||
f"Imported customers from CSV",
|
||||
details=json.dumps({
|
||||
"format": "CSV",
|
||||
"include_autotask_ids": include_autotask_ids,
|
||||
"created": created,
|
||||
"updated": updated,
|
||||
"skipped": skipped
|
||||
@ -620,4 +626,3 @@ def customers_import():
|
||||
flash("Failed to import customers.", "danger")
|
||||
|
||||
return redirect(url_for("main.customers"))
|
||||
|
||||
|
||||
@ -585,6 +585,7 @@ def settings_jobs_export():
|
||||
@roles_required("admin")
|
||||
def settings_jobs_import():
|
||||
upload = request.files.get("jobs_file")
|
||||
include_autotask_ids = bool(request.form.get("include_autotask_ids"))
|
||||
if not upload or not upload.filename:
|
||||
flash("No import file was provided.", "danger")
|
||||
return redirect(url_for("main.settings", section="general"))
|
||||
@ -621,14 +622,17 @@ def settings_jobs_import():
|
||||
if not cust_name:
|
||||
continue
|
||||
|
||||
# Read Autotask fields (backwards compatible - optional)
|
||||
autotask_company_id = cust_item.get("autotask_company_id")
|
||||
autotask_company_name = cust_item.get("autotask_company_name")
|
||||
autotask_company_id = None
|
||||
autotask_company_name = None
|
||||
if include_autotask_ids:
|
||||
# Read Autotask fields (backwards compatible - optional)
|
||||
autotask_company_id = cust_item.get("autotask_company_id")
|
||||
autotask_company_name = cust_item.get("autotask_company_name")
|
||||
|
||||
existing_customer = Customer.query.filter_by(name=cust_name).first()
|
||||
if existing_customer:
|
||||
# Update Autotask mapping if provided
|
||||
if autotask_company_id is not None:
|
||||
# Update Autotask mapping only when explicitly allowed by import option.
|
||||
if include_autotask_ids and autotask_company_id is not None:
|
||||
existing_customer.autotask_company_id = autotask_company_id
|
||||
existing_customer.autotask_company_name = autotask_company_name
|
||||
existing_customer.autotask_mapping_status = None # Will be resynced
|
||||
@ -747,7 +751,7 @@ def settings_jobs_import():
|
||||
|
||||
db.session.commit()
|
||||
flash(
|
||||
f"Import completed. Customers created: {created_customers}, updated: {updated_customers}. Jobs created: {created_jobs}, updated: {updated_jobs}.",
|
||||
f"Import completed. Customers created: {created_customers}, updated: {updated_customers}. Jobs created: {created_jobs}, updated: {updated_jobs}. Autotask IDs imported: {'yes' if include_autotask_ids else 'no'}.",
|
||||
"success",
|
||||
)
|
||||
|
||||
@ -758,6 +762,7 @@ def settings_jobs_import():
|
||||
details=json.dumps({
|
||||
"format": "JSON",
|
||||
"schema": payload.get("schema"),
|
||||
"include_autotask_ids": include_autotask_ids,
|
||||
"customers_created": created_customers,
|
||||
"customers_updated": updated_customers,
|
||||
"jobs_created": created_jobs,
|
||||
|
||||
@ -15,6 +15,10 @@
|
||||
|
||||
<form method="post" action="{{ url_for('main.customers_import') }}" enctype="multipart/form-data" class="d-flex align-items-center gap-2 mb-0">
|
||||
<input type="file" name="file" accept=".csv,text/csv" class="form-control form-control-sm" required style="max-width: 420px;" />
|
||||
<div class="form-check mb-0">
|
||||
<input class="form-check-input" type="checkbox" value="1" id="include_autotask_ids_customers" name="include_autotask_ids" />
|
||||
<label class="form-check-label small" for="include_autotask_ids_customers">Include Autotask IDs</label>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-outline-secondary btn-sm" style="white-space: nowrap;">Import CSV</button>
|
||||
</form>
|
||||
|
||||
|
||||
@ -528,8 +528,16 @@
|
||||
<div class="col-md-4 d-flex align-items-end">
|
||||
<button type="submit" class="btn btn-primary w-100">Import jobs</button>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" value="1" id="include_autotask_ids_jobs" name="include_autotask_ids" />
|
||||
<label class="form-check-label" for="include_autotask_ids_jobs">
|
||||
Include Autotask IDs from import file
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<div class="form-text">Use a JSON export created by this application.</div>
|
||||
<div class="form-text">Use a JSON export created by this application. Leave Autotask IDs unchecked for sandbox/development environments with a different Autotask database.</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@ -2,6 +2,17 @@
|
||||
|
||||
This file documents all changes made to this project via Claude Code.
|
||||
|
||||
## [2026-02-19]
|
||||
|
||||
### Added
|
||||
- Added an explicit `Include Autotask IDs` import option to the Approved Jobs JSON import form in Settings → Maintenance
|
||||
- Added an explicit `Include Autotask IDs` import option to the Customers CSV import form
|
||||
|
||||
### Changed
|
||||
- Changed Approved Jobs import behavior to only apply `autotask_company_id` and `autotask_company_name` when the new import option is checked
|
||||
- Changed Customers CSV import behavior to only apply Autotask mapping fields when the new import option is checked
|
||||
- Changed import success/audit output for both jobs and customers imports to include whether Autotask IDs were imported
|
||||
|
||||
## [2026-02-16]
|
||||
|
||||
### Added
|
||||
|
||||
Loading…
Reference in New Issue
Block a user