Require review partner for bulk assurance engagements

This commit is contained in:
A R R R Associates
2026-08-04 19:15:57 +05:30
parent efc73e1f83
commit 1b5f90700a
2 changed files with 37 additions and 11 deletions
@@ -60,13 +60,16 @@
</select>
</div>
<div id="review-partner-field" class="hidden">
<label class="mb-2 block text-sm font-medium text-slate-700">Review Partner</label>
<div id="review-partner-field">
<label class="mb-2 flex items-center gap-2 text-sm font-medium text-slate-700">
<span>Review Partner</span>
<span id="review-partner-requirement" class="rounded-full bg-slate-100 px-2 py-0.5 text-xs font-semibold text-slate-600">Optional</span>
</label>
<select name="review_partner_user_id" id="bulk-review-partner" class="w-full rounded-xl border border-slate-300 px-4 py-2 text-sm">
<option value="">Use client default / Not assigned</option>
<option value="">Not assigned</option>
{% for u in review_partners %}<option value="{{ u.id }}" data-branch="{{ u.branch_id }}">{{ u.full_name or u.email }}</option>{% endfor %}
</select>
<p class="mt-1 text-xs text-slate-500">Used only when the selected service is an assurance engagement and the firm setup requires a review partner.</p>
<p id="review-partner-help" class="mt-1 text-xs text-slate-500">Optional for non-assurance engagements. A selected Review Partner is saved for every engagement created in this batch.</p>
</div>
<div class="md:col-span-2 xl:col-span-3">
@@ -133,7 +136,9 @@
const form = document.getElementById('bulk-engagement-form');
const service = document.getElementById('bulk-service');
const info = document.getElementById('service-derived-info');
const reviewField = document.getElementById('review-partner-field');
const reviewPartner = document.getElementById('bulk-review-partner');
const reviewRequirement = document.getElementById('review-partner-requirement');
const reviewHelp = document.getElementById('review-partner-help');
const search = document.getElementById('client-search');
const clear = document.getElementById('clear-client-search');
const selectAll = document.getElementById('select-all-visible');
@@ -145,8 +150,16 @@
const option = service.options[service.selectedIndex];
const type = option ? (option.dataset.type || '') : '';
const recurrence = option ? (option.dataset.recurrence || '') : '';
const assurance = type.toLowerCase() === 'assurance';
reviewField.classList.toggle('hidden', !assurance);
const normalizedType = type.trim().toLowerCase().replaceAll('-', '_').replaceAll(' ', '_');
const assurance = normalizedType === 'assurance';
reviewPartner.required = assurance;
reviewRequirement.textContent = assurance ? 'Mandatory' : 'Optional';
reviewRequirement.className = assurance
? 'rounded-full bg-rose-100 px-2 py-0.5 text-xs font-semibold text-rose-700'
: 'rounded-full bg-slate-100 px-2 py-0.5 text-xs font-semibold text-slate-600';
reviewHelp.textContent = assurance
? 'Mandatory because the selected enabled firm service is an assurance engagement.'
: 'Optional for non-assurance engagements. A selected Review Partner is saved for every engagement created in this batch.';
info.textContent = option && option.value
? `Type: ${assurance ? 'Assurance' : 'Non-Assurance'}${recurrence ? ' · Recurrence: ' + recurrence.replaceAll('_', ' ') : ''} · Due-date rule and workflow are taken from the service setup.`
: 'Due-date rules, recurrence, assurance type, and task workflow are taken from the selected service setup.';