137 lines
10 KiB
HTML
137 lines
10 KiB
HTML
{% extends "ui/templates/base/layout.html" %}
|
|
{% block content %}
|
|
{% set is_dict = consultant is mapping %}
|
|
{% set is_edit = consultant and not is_dict and consultant.id %}
|
|
<div class="mx-auto max-w-4xl space-y-6">
|
|
<div class="flex items-center justify-between gap-3">
|
|
<div>
|
|
<h2 class="text-xl font-semibold text-slate-900">{{ title }}</h2>
|
|
<p class="text-sm text-slate-500">Create or update a consultant portal profile and optionally create the consultant login user from this page.</p>
|
|
</div>
|
|
<a href="/consultants" class="rounded-xl border border-slate-300 px-4 py-2 text-sm font-semibold text-slate-700 hover:bg-slate-50">Back</a>
|
|
</div>
|
|
|
|
{% if errors %}
|
|
<div class="rounded-2xl border border-red-200 bg-red-50 p-4 text-sm text-red-800">
|
|
<ul class="list-disc pl-5">
|
|
{% for error in errors %}<li>{{ error }}</li>{% endfor %}
|
|
</ul>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<form method="post" class="space-y-6 rounded-2xl border border-slate-200 bg-white p-6 shadow-soft">
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
|
|
|
<div class="rounded-2xl border border-brand-100 bg-brand-50 p-4">
|
|
<h3 class="font-semibold text-slate-900">Consultant Login</h3>
|
|
<p class="mt-1 text-sm text-slate-600">Link an existing Consultant-role user or create a new login for this consultant.</p>
|
|
<div class="mt-4 grid gap-4 md:grid-cols-2">
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Existing consultant user</label>
|
|
{% set current_user_id = consultant.user_id if consultant and not is_dict else consultant.get('user_id') if consultant else None %}
|
|
<select name="user_id" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
<option value="">No existing user selected</option>
|
|
{% for u in consultant_users %}
|
|
<option value="{{ u.id }}" {% if current_user_id == u.id %}selected{% endif %}>{{ u.full_name or u.email }} — {{ u.email }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
<p class="mt-1 text-xs text-slate-500">Leave blank if you want to create a new login below.</p>
|
|
</div>
|
|
<div class="space-y-2 rounded-xl bg-white p-3">
|
|
<label class="inline-flex items-center gap-2 text-sm font-medium text-slate-700">
|
|
<input type="checkbox" name="create_login_user" class="h-4 w-4 rounded border-slate-300" {% if consultant and is_dict and consultant.get('create_login_user') %}checked{% endif %}>
|
|
Create / enable consultant login
|
|
</label>
|
|
<label class="inline-flex items-center gap-2 text-sm text-slate-700">
|
|
<input type="checkbox" name="invite_login_user" class="h-4 w-4 rounded border-slate-300" {% if consultant and is_dict and consultant.get('invite_login_user') %}checked{% endif %}>
|
|
Generate invite link instead of using temporary password
|
|
</label>
|
|
</div>
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Login ID / Email</label>
|
|
<input type="email" name="login_email" value="{{ consultant.get('login_email','') if consultant and is_dict else consultant.email if consultant and not is_dict else '' }}" placeholder="consultant@example.com" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
</div>
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Temporary password</label>
|
|
<input type="password" name="temporary_password" placeholder="Minimum 8 characters" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
<p class="mt-1 text-xs text-slate-500">Used only when invite link is not selected. Consultant must change password after login.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="grid gap-4 md:grid-cols-2">
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Consultant type</label>
|
|
{% set current_type = consultant.consultant_type if consultant and not is_dict else consultant.get('consultant_type') if consultant else 'external_consultant' %}
|
|
<select name="consultant_type" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
{% for code,label in consultant_types %}<option value="{{ code }}" {% if current_type == code %}selected{% endif %}>{{ label }}</option>{% endfor %}
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Contact person / Consultant name *</label>
|
|
<input name="contact_person" value="{{ consultant.contact_person if consultant and not is_dict else consultant.get('contact_person','') if consultant else '' }}" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm" required>
|
|
</div>
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Firm name</label>
|
|
<input name="firm_name" value="{{ consultant.firm_name if consultant and not is_dict else consultant.get('firm_name','') if consultant else '' }}" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
</div>
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Email</label>
|
|
<input type="email" name="email" value="{{ consultant.email if consultant and not is_dict else consultant.get('email','') if consultant else '' }}" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
</div>
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Mobile</label>
|
|
<input name="mobile" value="{{ consultant.mobile if consultant and not is_dict else consultant.get('mobile','') if consultant else '' }}" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
</div>
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">PAN</label>
|
|
<input name="pan" value="{{ consultant.pan if consultant and not is_dict else consultant.get('pan','') if consultant else '' }}" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
</div>
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">GSTIN</label>
|
|
<input name="gstin" value="{{ consultant.gstin if consultant and not is_dict else consultant.get('gstin','') if consultant else '' }}" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
</div>
|
|
<div class="md:col-span-2">
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Specialisation</label>
|
|
<input name="specialisation" value="{{ consultant.specialisation if consultant and not is_dict else consultant.get('specialisation','') if consultant else '' }}" placeholder="GST, ROC, Payroll, Accounts, Tax filing" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
</div>
|
|
<div class="md:col-span-2">
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Address</label>
|
|
<textarea name="address" rows="2" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">{{ consultant.address if consultant and not is_dict else consultant.get('address','') if consultant else '' }}</textarea>
|
|
</div>
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Status</label>
|
|
{% set st = consultant.status if consultant and not is_dict else consultant.get('status') if consultant else 'active' %}
|
|
<select name="status" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
{% for code in ['active','inactive','on_hold','suspended'] %}<option value="{{ code }}" {% if st == code %}selected{% endif %}>{{ code.replace('_',' ').title() }}</option>{% endfor %}
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Onboarding status</label>
|
|
{% set os = consultant.onboarding_status if consultant and not is_dict else consultant.get('onboarding_status') if consultant else 'active' %}
|
|
<select name="onboarding_status" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">
|
|
{% for code,label in onboarding_statuses %}<option value="{{ code }}" {% if os == code %}selected{% endif %}>{{ label }}</option>{% endfor %}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="grid gap-3 rounded-2xl bg-slate-50 p-4 text-sm text-slate-700 md:grid-cols-4">
|
|
<label class="inline-flex items-center gap-2"><input type="checkbox" name="is_platform_partner" {% if consultant and ((not is_dict and consultant.is_platform_partner) or (is_dict and consultant.get('is_platform_partner'))) %}checked{% endif %}> Platform partner</label>
|
|
<label class="inline-flex items-center gap-2"><input type="checkbox" name="is_franchise_partner" {% if consultant and ((not is_dict and consultant.is_franchise_partner) or (is_dict and consultant.get('is_franchise_partner'))) %}checked{% endif %}> Franchise partner</label>
|
|
<label class="inline-flex items-center gap-2"><input type="checkbox" name="is_saas_customer" {% if consultant and ((not is_dict and consultant.is_saas_customer) or (is_dict and consultant.get('is_saas_customer'))) %}checked{% endif %}> SaaS customer</label>
|
|
<label class="inline-flex items-center gap-2"><input type="checkbox" name="is_active" {% if not consultant or (consultant and ((not is_dict and consultant.is_active) or (is_dict and consultant.get('is_active', True)))) %}checked{% endif %}> Active</label>
|
|
</div>
|
|
|
|
<div>
|
|
<label class="mb-1 block text-sm font-medium text-slate-700">Remarks</label>
|
|
<textarea name="remarks" rows="3" class="w-full rounded-xl border border-slate-300 px-3 py-2 text-sm">{{ consultant.remarks if consultant and not is_dict else consultant.get('remarks','') if consultant else '' }}</textarea>
|
|
</div>
|
|
|
|
<div class="flex justify-end gap-3">
|
|
<a href="/consultants" class="rounded-xl border border-slate-300 px-4 py-2 text-sm font-semibold text-slate-700 hover:bg-slate-50">Cancel</a>
|
|
<button class="rounded-xl bg-brand-600 px-4 py-2 text-sm font-semibold text-white hover:bg-brand-700">Save Consultant</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
{% endblock %}
|