{% extends 'base.html.twig' %}
{% block title %}Nouveau Contrat pour {{ entreprise.raisonSociale }}{% endblock %}
{% block stylesheets %}
{{ parent() }}
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
{% endblock %}
{% block body %}
{{ include('_header.html.twig') }}
<div class="container mt-4">
<div class="row">
<div class="col-md-8 offset-md-2">
<div class="card">
<div class="card-header">
<h1 class="h3 mb-0">Créer un nouveau contrat pour {{ entreprise.raisonSociale }}</h1>
</div>
<div class="card-body">
{{ form_start(form, {'attr': {'class': 'needs-validation', 'novalidate': 'novalidate', 'id': 'contrat-form'}}) }}
<div class="form-fields-container">
{{ form_row(form.entreprise, {
'label': 'Entreprise',
'label_attr': {'class': 'form-label'},
'attr': {'class': 'form-control', 'readonly': 'readonly'}
}) }}
{{ form_row(form.duree, {
'label': 'Durée (en mois)',
'label_attr': {'class': 'form-label'},
'attr': {'class': 'form-control', 'id': 'duree-input'}
}) }}
{{ form_row(form.valeur, {
'label': 'Valeur',
'label_attr': {'class': 'form-label'},
'attr': {'class': 'form-control', 'id': 'valeur-input'}
}) }}
{{ form_row(form.pdl, {
'label': 'Point de Livraison (PDL)',
'label_attr': {'class': 'form-label'},
'attr': {'class': 'form-control select2', 'placeholder': 'Sélectionnez le PDL'}
}) }}
{{ form_row(form.car, {
'label': 'Consommation Annuelle de Référence (CAR)',
'label_attr': {'class': 'form-label'},
'attr': {'class': 'form-control', 'placeholder': 'Entrez la CAR', 'id': 'car-input'}
}) }}
{{ form_row(form.prix_moyen, {
'label': 'Prix moyen',
'label_attr': {'class': 'form-label'},
'attr': {'class': 'form-control', 'placeholder': 'Entrez le prix moyen'}
}) }}
{{ form_row(form.fournisseur, {
'label': 'Fournisseur',
'label_attr': {'class': 'form-label'},
'attr': {'class': 'form-control', 'placeholder': 'Entrez le fournisseur'}
}) }}
{{ form_row(form.date_debut, {
'label': 'Date de début',
'label_attr': {'class': 'form-label'},
'attr': {'class': 'form-control', 'id': 'date-debut-input'}
}) }}
{{ form_row(form.date_fin, {
'label': 'Date de fin',
'label_attr': {'class': 'form-label'},
'attr': {'class': 'form-control', 'id': 'date-fin-input'}
}) }}
</div>
<div class="d-grid gap-2 mt-3">
<button type="submit" class="btn btn-primary">Créer le contrat</button>
</div>
{{ form_end(form) }}
</div>
</div>
<div class="mt-3">
<a href="{{ path('app_entreprise_details', {'id': entreprise.id}) }}" class="btn btn-secondary">Retour aux détails de l'entreprise</a>
</div>
</div>
</div>
</div>
{{ include('_footer.html.twig') }}
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
$(document).ready(function() {
$('.select2').select2();
// Handle form submission
$('#contrat-form').on('submit', function(e) {
e.preventDefault();
// Submit form via AJAX
$.ajax({
url: $(this).attr('action'),
method: 'POST',
data: $(this).serialize(),
success: function(response) {
if (response.success) {
// Show confirmation popup for invoice creation
Swal.fire({
title: 'Contrat créé avec succès',
text: 'Voulez-vous créer une facture associée à ce contrat ?',
icon: 'success',
showCancelButton: true,
confirmButtonText: 'Oui, créer une facture',
cancelButtonText: 'Non, plus tard'
}).then((result) => {
// Always redirect to enterprise details first
window.location.href = '{{ path('app_entreprise_details', {'id': entreprise.id}) }}';
// If user wants to create invoice, open it in a new tab
if (result.isConfirmed) {
window.open('{{ path('app_compta_facture_new_from_contract', {'id': 'CONTRACT_ID'}) }}'.replace('CONTRACT_ID', response.contractId), '_blank');
}
});
}
}
});
});
// Function to calculate duration in months
function calculateDuration() {
var dateDebut = $('#date-debut-input').val();
var dateFin = $('#date-fin-input').val();
if (dateDebut && dateFin) {
var start = new Date(dateDebut);
var end = new Date(dateFin);
var months = (end.getFullYear() - start.getFullYear()) * 12;
months -= start.getMonth();
months += end.getMonth();
// Add 1 if day of month in end date is greater
if (end.getDate() > start.getDate()) {
months++;
}
return months <= 0 ? 0 : months;
}
return null;
}
// Function to format date with time component
function formatDateWithTime(date) {
return date.getFullYear() + '-' +
String(date.getMonth() + 1).padStart(2, '0') + '-' +
String(date.getDate()).padStart(2, '0') + ' ' +
'00:00:00';
}
// Function to calculate contract value and duration
function calculateContractValues() {
var car = parseFloat($('#car-input').val());
var dateDebut = $('#date-debut-input').val();
var dateFin = $('#date-fin-input').val();
var pdl = $('#contrat_pdl').val();
var currentValue = parseFloat($('#valeur-input').val());
// Only calculate if there's no value or value is 0
if (car && dateDebut && dateFin && (!currentValue || currentValue === 0)) {
// Format dates with time component
var startDate = new Date(dateDebut);
var endDate = new Date(dateFin);
var formattedStartDate = formatDateWithTime(startDate);
var formattedEndDate = formatDateWithTime(endDate);
// Calculate and set duration first
var duration = calculateDuration();
if (duration !== null) {
$('#duree-input').val(duration);
}
// Make AJAX call to get pricing and calculate value
console.log('Calculating value...', {
car: car,
dateDebut: formattedStartDate,
dateFin: formattedEndDate,
pdl: pdl
});
$.ajax({
url: '{{ path('app_entreprise_calculate_value') }}',
method: 'POST',
headers: {
'X-CSRF-Token': '{{ csrf_token('calculate-value') }}'
},
data: {
car: car,
dateDebut: formattedStartDate,
dateFin: formattedEndDate,
pdl: pdl
},
success: function(response) {
console.log('Response:', response);
if (response.value !== undefined) {
$('#valeur-input').val(response.value);
} else if (response.error) {
console.error('Error:', response.error);
}
},
error: function(xhr, status, error) {
console.error('Error calculating value:', error);
console.error('Status:', status);
console.error('Response:', xhr.responseText);
}
});
}
}
// Trigger calculation when CAR or dates change
$('#car-input, #date-debut-input, #date-fin-input').change(function() {
calculateContractValues();
});
// Calculate initial values if all required fields are filled
if ($('#car-input').val() && $('#date-debut-input').val() && $('#date-fin-input').val()) {
calculateContractValues();
}
// Also trigger calculation when PDL changes (in case it auto-fills other fields)
$('#contrat_pdl').change(function() {
// Wait a bit for other fields to be populated
setTimeout(function() {
if ($('#car-input').val() && $('#date-debut-input').val() && $('#date-fin-input').val()) {
calculateContractValues();
}
}, 500);
});
});
</script>
{% endblock %}