193 lines
11 KiB
HTML
193 lines
11 KiB
HTML
{% extends 'base.html' %}
|
|
{% load i18n static widget_tweaks custom_filters %}
|
|
{% block title %}
|
|
{# Check if an 'object' exists in the context #}
|
|
{% if object %}
|
|
{% trans 'Update Opportunity' %}
|
|
{% else %}
|
|
{% trans 'Add New Opportunity' %}
|
|
{% endif %}
|
|
{% endblock %}
|
|
{% block content %}
|
|
<div class="container-fluid">
|
|
<div class="row g-3 mb-4 align-items-center">
|
|
<div class="col">
|
|
<h2 class="mb-0">
|
|
{% if form.instance.pk %}
|
|
{% trans "Edit Opportunity" %}
|
|
{% else %}
|
|
{% trans "Create New Opportunity" %}
|
|
{% endif %}
|
|
</h2>
|
|
</div>
|
|
<div class="col-auto">
|
|
<a href="{% url 'opportunity_list' request.dealer.slug %}"
|
|
class="btn btn-phoenix-secondary">
|
|
<span class="fas fa-arrow-left me-2"></span>{% trans "Back to list" %}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="row g-3">
|
|
<div class="col-lg-8">
|
|
<div class="card">
|
|
<div class="card-body p-4 p-sm-5">
|
|
<form method="post" enctype="multipart/form-data">
|
|
{% csrf_token %}
|
|
{% if form.non_field_errors %}<div class="alert alert-danger">{{ form.non_field_errors }}</div>{% endif %}
|
|
<!-- Lead Field -->
|
|
<div class="mb-4">
|
|
<label class="form-label" for="{{ form.lead.id_for_label }}">
|
|
{{ form.lead.label }}
|
|
<span class="text-danger">*</span>
|
|
</label>
|
|
{{ form.lead|add_class:"form-control" }}
|
|
{% if form.lead.errors %}<div class="invalid-feedback d-block">{{ form.lead.errors }}</div>{% endif %}
|
|
</div>
|
|
<!-- Car Field -->
|
|
<div class="mb-4">
|
|
<label class="form-label" for="{{ form.car.id_for_label }}">
|
|
{{ form.car.label }}
|
|
<span class="text-danger">*</span>
|
|
</label>
|
|
{{ form.car|add_class:"form-control" }}
|
|
{% if form.car.errors %}<div class="invalid-feedback d-block">{{ form.car.errors }}</div>{% endif %}
|
|
</div>
|
|
<!-- Stage Field -->
|
|
<div class="mb-4">
|
|
<label class="form-label" for="{{ form.stage.id_for_label }}">
|
|
{{ form.stage.label }}
|
|
<span class="text-danger">*</span>
|
|
</label>
|
|
{{ form.stage|add_class:"form-control" }}
|
|
{% if form.stage.errors %}<div class="invalid-feedback d-block">{{ form.stage.errors }}</div>{% endif %}
|
|
</div>
|
|
<!-- Amount Field -->
|
|
<div class="mb-4">
|
|
<label class="form-label" for="{{ form.amount.id_for_label }}">
|
|
{{ form.amount.label }}
|
|
<span class="text-danger">*</span>
|
|
</label>
|
|
<div class="input-group">
|
|
<span class="input-group-text"><span class="icon-saudi_riyal"></span></span>
|
|
{{ form.amount|add_class:"form-control" }}
|
|
</div>
|
|
{% if form.amount.errors %}<div class="invalid-feedback d-block">{{ form.amount.errors }}</div>{% endif %}
|
|
</div>
|
|
<!-- Probability Field -->
|
|
<div class="mb-4">
|
|
<label class="form-label" for="{{ form.probability.id_for_label }}">
|
|
{{ form.probability.label }}
|
|
<span class="text-danger">*</span>
|
|
</label>
|
|
<div class="d-flex align-items-center gap-3">
|
|
<input type="range"
|
|
name="{{ form.probability.name }}"
|
|
id="{{ form.probability.id_for_label }}"
|
|
min="0"
|
|
max="100"
|
|
step="1"
|
|
value="{{ form.probability.value|default:'50' }}"
|
|
class="form-control form-range"
|
|
oninput="updateProbabilityValue(this.value)">
|
|
<span id="probability-value"
|
|
class="badge badge-phoenix fs-6 badge-phoenix-primary">
|
|
{{ form.probability.value|default:'50' }}%
|
|
</span>
|
|
</div>
|
|
{% if form.probability.errors %}<div class="invalid-feedback d-block">{{ form.probability.errors }}</div>{% endif %}
|
|
</div>
|
|
<!-- Expected Revenue -->
|
|
<div class="mb-4">
|
|
<label class="form-label" for="{{ form.expected_revenue.id_for_label }}">{{ form.expected_revenue.label }}</label>
|
|
<div class="input-group">
|
|
<span class="input-group-text"><span class="icon-saudi_riyal"></span></span>
|
|
{{ form.expected_revenue|add_class:"form-control" }}
|
|
</div>
|
|
{% if form.expected_revenue.errors %}
|
|
<div class="invalid-feedback d-block">{{ form.expected_revenue.errors }}</div>
|
|
{% endif %}
|
|
</div>
|
|
<!-- Closing Date -->
|
|
<div class="mb-5">
|
|
<label class="form-label" for="{{ form.closing_date.id_for_label }}">{{ form.closing_date.label }}</label>
|
|
<div class="input-group">
|
|
{{ form.expected_close_date|add_class:"form-control" }}
|
|
<span class="input-group-text"><span class="far fa-calendar"></span></span>
|
|
</div>
|
|
{% if form.expected_close_date.errors %}
|
|
<div class="invalid-feedback d-block">{{ form.expected_close_date.errors }}</div>
|
|
{% endif %}
|
|
</div>
|
|
<!-- Form Actions -->
|
|
<div class="d-flex justify-content-end gap-3">
|
|
<button type="reset" class="btn btn-phoenix-danger px-4">
|
|
<span class="fas fa-redo me-1"></span>{% trans "Reset" %}
|
|
</button>
|
|
<button type="submit" class="btn btn-phoenix-primary px-6">
|
|
{% if form.instance.pk %}
|
|
<span class="fas fa-save me-1"></span>{% trans "Update" %}
|
|
{% else %}
|
|
<span class="fas fa-plus me-1"></span>{% trans "Create" %}
|
|
{% endif %}
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-4">
|
|
<div class="card">
|
|
<div class="card-body p-4">
|
|
<h4 class="mb-3">{% trans "Opportunity Guidelines" %}</h4>
|
|
<ul class="nav flex-column gap-2 nav-guide">
|
|
<li class="nav-item">
|
|
<div class="d-flex align-items-center">
|
|
<span class="fas fa-circle text-primary fs-11 me-2"></span>
|
|
<span class="text-body-highlight">{% trans "Probability indicates conversion chance" %}</span>
|
|
</div>
|
|
</li>
|
|
<li class="nav-item">
|
|
<div class="d-flex align-items-center">
|
|
<span class="fas fa-circle text-warning fs-11 me-2"></span>
|
|
<span class="text-body-highlight">{% trans "Update stage as deal progresses" %}</span>
|
|
</div>
|
|
</li>
|
|
<li class="nav-item">
|
|
<div class="d-flex align-items-center">
|
|
<span class="fas fa-circle text-success fs-11 me-2"></span>
|
|
<span class="text-body-highlight">{% trans "Set realistic closing dates" %}</span>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
function updateProbabilityValue(value) {
|
|
const amount = document.getElementById('id_amount');
|
|
const expectedRevenue = document.getElementById('id_expected_revenue');
|
|
expectedRevenue.value = (parseFloat(amount.value) * value / 100).toFixed(2);
|
|
|
|
const badge = document.getElementById('probability-value');
|
|
badge.textContent = value + '%';
|
|
|
|
// Update badge color based on value
|
|
if (value >= 75) {
|
|
badge.className = 'badge badge-phoenix fs-6 badge-phoenix-success';
|
|
} else if (value >= 50) {
|
|
badge.className = 'badge badge-phoenix fs-6 badge-phoenix-warning';
|
|
} else {
|
|
badge.className = 'badge badge-phoenix fs-6 badge-phoenix-danger';
|
|
}
|
|
}
|
|
|
|
// Initialize on load
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
const rangeInput = document.getElementById('{{ form.probability.id_for_label }}');
|
|
updateProbabilityValue(rangeInput.value);
|
|
});
|
|
</script>
|
|
{% endblock %}
|