{% extends 'layoutachat.html.twig' %}
{% block stylesheets2 %}
<link rel="stylesheet" href="{{ asset('css/bootstrap-datepicker.min.css') }}" type="text/css" />
<style type="text/css">
.custom-shadow {
box-shadow: 0 8px 20px rgba(0,0,0,0.15);
border-radius: 10px;
transition: all 0.3s ease;
}
.custom-shadow:hover {
box-shadow: 0 12px 30px rgba(0,0,0,0.25);
transform: translateY(-3px);
}
select {
font-size: 13px;
font-weight: 600;
letter-spacing: 0.3px;
}
.police {
font-size: 13px;
font-weight: 600;
letter-spacing: 0.3px;
}
.modal-dialog {
max-width: 570px; /* ajuste ici */
height: 600px; /* ajuste ici */
}
.modal .form-control {
height: calc(1.5em + .4rem + 2px);
padding: .2rem .4rem;
font-size: 0.85rem;
}
.modal-right {
margin: 0;
margin-left: auto; /* pousse le modal à droite */
margin-right: 10px; /* petit espace du bord */
}
.taille {color:#006666;}
.vert {color:green;}
.rouge {color:red;}
#listecom{
width:550px;
height:400px;
overflow:auto;
}
.cre{
margin-left:0px;
padding-left:0px;
padding-right:0px;
}
.limit{
border:solid 1px #CCCCCC;
height:100px;
margin-right:10px;
background-color:#FFFFFFF;
box-shadow: 1px 1px 1px #656565;
}
.taille2{
font-size: 10px;
}
#parente {
width:1200px;
}
#match3, #match, #match2 {
max-width:400px;
height:100px;
overflow:auto;
}
#li{
color: #FF0000;
}
#bol{
color: #000099;
}
/* ── MODAL GLOBAL ── */
#infos .modal-content {
border: none !important;
border-radius: 16px !important;
box-shadow: 0 25px 60px rgba(0,0,0,.2) !important;
overflow: hidden;
font-family: 'Nunito', sans-serif;
}
/* ── HEADER ── */
#infos .modal-header {
background: linear-gradient(135deg, #0f2942 0%, #1d6fa4 100%) !important;
border-bottom: none !important;
padding: 1.1rem 1.4rem !important;
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
}
.modal-header-left {
display: flex; align-items: center; gap: .75rem;
}
.modal-header-icon {
width: 40px; height: 40px;
background: rgba(255,255,255,.2); border-radius: 10px;
display: flex; align-items: center; justify-content: center;
font-size: 1rem; color: #fff; flex-shrink: 0;
}
#infos .modal-title {
font-size: .95rem !important; font-weight: 800 !important;
color: #fff !important; margin: 0 !important;
}
.modal-subtitle {
font-size: .72rem; color: rgba(255,255,255,.65); margin: 0;
}
.close-btn {
width: 32px; height: 32px; border-radius: 8px;
background: rgba(255,255,255,.15); border: none; color: #fff;
display: flex; align-items: center; justify-content: center;
font-size: .9rem; cursor: pointer; transition: background .15s; flex-shrink: 0;
}
.close-btn:hover { background: rgba(255,255,255,.3); }
/* ── BODY ── */
#infos .modal-body {
padding: 0 !important;
background: #f8fafc;
}
/* ── FORM SECTIONS ── */
.form-section {
background: #fff;
border-radius: 12px;
margin: 1rem 1.25rem;
padding: 1.1rem 1.25rem;
box-shadow: 0 1px 6px rgba(0,0,0,.06);
border: 1px solid #e2e8f0;
}
.form-section-title {
font-size: .75rem; font-weight: 800; text-transform: uppercase;
letter-spacing: .09em; color: #1d6fa4;
display: flex; align-items: center; gap: .4rem;
margin-bottom: 1rem; padding-bottom: .6rem;
border-bottom: 1px solid #e2e8f0;
}
/* ── LABELS & INPUTS ── */
.field-label {
font-size: .79rem; font-weight: 700; color: #374151;
margin-bottom: .3rem; display: block;
}
.required-star { color: #dc2626; font-weight: 800; }
.optional-tag {
font-size: .68rem; font-weight: 600; color: #94a3b8;
background: #f1f5f9; padding: .1rem .4rem; border-radius: 4px; margin-left: .3rem;
}
.da-form .da-input,
.da-form .form-control {
border-radius: 8px !important;
border: 1.5px solid #e2e8f0 !important;
font-family: 'Nunito', sans-serif !important;
font-size: .84rem !important;
color: #1e293b !important;
background: #fff !important;
transition: border-color .2s, box-shadow .2s;
height: calc(1.5em + .75rem + 4px);
}
.da-form .da-input:focus,
.da-form .form-control:focus {
border-color: #1d6fa4 !important;
box-shadow: 0 0 0 3px rgba(29,111,164,.15) !important;
outline: none !important;
}
.da-form textarea.da-input { height: auto !important; }
.da-form select.da-input { cursor: pointer; }
/* Input avec icône */
.input-icon-wrap { position: relative; }
.input-icon {
position: absolute; left: .75rem; top: 50%;
transform: translateY(-50%); color: #94a3b8; font-size: .8rem; z-index: 1;
}
.da-form .with-icon { padding-left: 2.1rem !important; }
/* ── BOUTONS ACTION ── */
.action-buttons {
display: flex; flex-direction: column; gap: .4rem; align-items: stretch;
}
.btn-da {
display: flex; align-items: center; justify-content: center; gap: .35rem;
padding: .5rem .85rem; border-radius: 8px; font-size: .78rem;
font-weight: 700; font-family: 'Nunito', sans-serif;
border: none; cursor: pointer; transition: all .15s; white-space: nowrap;
}
.btn-da-primary {
background: linear-gradient(135deg, #0f2942, #1d6fa4);
color: #fff;
}
.btn-da-primary:hover { filter: brightness(1.1); transform: translateY(-1px); }
.btn-da-secondary {
background: #f1f5f9; color: #64748b;
border: 1.5px solid #e2e8f0 !important;
}
.btn-da-secondary:hover { background: #e2e8f0; color: #334155; }
/* ── RESPONSIVE ── */
@media (max-width: 767px) {
.form-section { margin: .75rem; padding: .85rem; }
#infos .modal-dialog { margin: .5rem; }
.action-buttons { flex-direction: row; }
}
</style>
{% endblock %}
{% block section %}
<div class="container-fluid mt-2">
<div class="card shadow-sm p-2 mb-3">
<div class="d-flex flex-wrap align-items-center justify-content-between">
<div>
<img src="{{ asset('img/demachat.jpg') }}" width="35">
<strong>DEMANDE D'ACHAT</strong>
</div>
<div class="btn-group flex-wrap">
<button data-toggle="modal" href="#infos" class="btn btn-info btn-sm">
➕ Nouveau
</button>
{% if is_granted('ROLE_LOGIS') or is_granted('ROLE_DAPPM') %}
<button data-toggle="modal" href="#inf33" class="btn btn-secondary btn-sm">
📄 DA PPM
</button>
{% endif %}
<button data-toggle="modal" href="#pss" class="btn btn-secondary btn-sm">
📁 DA fichier
</button>
<a href="{{ path('reception_achat') }}" class="btn btn-secondary btn-sm">
📥 Réception
</a>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="card p-3 shadow-sm mb-3">
<!-- FILTRES -->
<div class="row mt-2">
<div class="col-md-4 mb-2">
{{ form_widget(form6.user)}}
<img id="loduse" src="{{ asset('img/loders.gif')}}" width="20">
{{ form_widget(form6.listnum4)}}
</div>
<div class="col-md-4 mb-2">
{{ form_widget(form8.usebaille)}}
<img id="lodbail" src="{{ asset('img/loders.gif')}}" width="20">
{{ form_widget(form8.listnum6)}}
</div>
<div class="col-md-2 mb-2">
{{ form_widget(form110.listnum55) }}
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row text-center">
<div class="col-6 col-md-2 mb-2">
<div class="card p-3 custom-shadow text-center">
<div class=" police" >Mes DAs</div>
<span class=" taille" > <h3>{{ nbmesda }}</h3></span>
<form id="monlistnum9" action="{{ path('mstopes_gestion_demande_achat') }}" method="post">
<div class="mt-2">
{{ form_widget(form9.listnum9) }}
</div>
</form>
</div>
</div>
<div class="col-6 col-md-2 mb-2">
<div class="card p-3 custom-shadow">
<div class=" police">DA à mon niveau</div>
<h3>{{ nbdanivo }}</h3>
<form id="monlistnum2" action="{{ path('mstopes_gestion_demande_achat') }}" method="post">
<div class="mt-2">
{{ form_widget(form4.listnum2) }}
</div>
</form>
</div>
</div>
<div class="col-6 col-md-2 mb-2">
<div class="card p-3 custom-shadow">
<div class=" police">DAs que j'ai Validé</div>
<span class="vert" > <h3>{{ nbdavalid }}</h3> </span >
<form id="monlistnum3" action="{{ path('mstopes_gestion_demande_achat') }}" method="post">
<div class="mt-2">
{{ form_widget(form5.listnum3) }}
</div>
</form>
</div>
</div>
<div class="col-6 col-md-2 mb-2">
<div class="card p-3 custom-shadow">
<div class=" police">DAs que j'ai Rejeté</div>
<span class="rouge" > <h3>{{ nbdarejet }}</h3> </span>
<form id="monlistnum7" action="{{ path('mstopes_gestion_demande_achat') }}" method="post">
<div class="mt-2">
{{ form_widget(form7.listnum7) }}
</div>
</form>
</div>
</div>
{% if is_granted('ROLE_VU_ALL') %}
<div class="col-6 col-md-2 mb-2">
<div class="card p-3 custom-shadow">
<div class=" police">Toute DAs </div>
<span > <h3>{{ nballda }}</h3> </span>
<div class="mt-2">
{{ form_widget(form2.listnum)}}
</div>
</div>
</div>
<div class="col-6 col-md-2 mb-2">
<div class="card p-3 custom-shadow">
<div class=" police">- </div>
<span > <h3>-</h3> </span>
<div class="mt-2">
-
</div>
</div>
</div>
{% endif %}
</div>
</div>
<!-- TABLE / CONTENU -->
<div class=" mt-1" align="center">
<img src="{{ asset('img/load.gif')}}" id="load" />
<div id="liste">
</div>
</div>
{# ── MODAL : Créer une DA ── #}
<div class="modal fade" id="infos" tabindex="-1" role="dialog" aria-labelledby="infosLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable" role="document">
<div class="modal-content">
{# ── HEADER ── #}
<div class="modal-header">
<div class="modal-header-left">
<div class="modal-header-icon">
<i class="fas fa-file-alt"></i>
</div>
<div>
<h5 class="modal-title" id="infosLabel">Créer une Demande d'Achat</h5>
<p class="modal-subtitle">Remplissez les champs obligatoires <span class="required-star">*</span></p>
</div>
</div>
<button type="button" class="close-btn" data-dismiss="modal" aria-label="Close">
<i class="fas fa-times"></i>
</button>
</div>
{# ── BODY ── #}
<div class="modal-body">
{{ form_start(form, {
'action': path('mstopes_gestion_demande_achat'),
'attr': {'id': 'monForms', 'class': 'da-form'}
}) }}
{# ── Section : Informations générales ── #}
<div class="form-section">
<div class="form-section-title">
<i class="fas fa-info-circle"></i> Informations générales
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label class="field-label">
Région <span class="required-star">*</span>
</label>
{{ form_widget(form.region1, {'attr': {'class': 'form-control da-input'}}) }}
</div>
<div class="form-group col-md-6">
<label class="field-label">Objet</label>
{{ form_widget(form.obje, {'attr': {'class': 'form-control da-input'}}) }}
</div>
<div class="form-group col-md-6">
<label class="field-label">
Centre de Coût <span class="required-star">*</span>
</label>
{{ form_widget(form.centreCou, {'attr': {'class': 'form-control da-input'}}) }}
</div>
<div class="form-group col-md-6">
<label class="field-label">
Nom du Projet <span class="required-star">*</span>
</label>
{{ form_widget(form.baille, {'attr': {'class': 'form-control da-input'}}) }}
</div>
</div>
</div>
{# ── Section : Détails de la commande ── #}
<div class="form-section">
<div class="form-section-title">
<i class="fas fa-shopping-cart"></i> Détails de la commande
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label class="field-label">Délais de livraison souhaité</label>
{{ form_widget(form.delais, {'attr': {'class': 'form-control da-input', 'autocomplete': 'off' }}) }}
</div>
<div class="form-group col-md-6">
<label class="field-label">
Quantité demandée <span class="required-star">*</span>
</label>
{{ form_widget(form.quantDemand, {'attr': {'class': 'form-control da-input', 'min': '1'}}) }}
</div>
<div class="form-group col-md-6">
<label class="field-label">
Prix Unitaire <span class="required-star">*</span>
</label>
<div class="input-icon-wrap">
<i class="fas fa-coins input-icon"></i>
{{ form_widget(form.prixUnit, {'attr': {'class': 'form-control da-input with-icon'}}) }}
</div>
</div>
<div class="form-group col-md-6">
<label class="field-label">Description <span class="optional-tag">Optionnel</span></label>
{{ form_widget(form.descript, {'attr': {'class': 'form-control da-input', 'rows': '2'}}) }}
</div>
</div>
</div>
{# ── Section : Désignation ── #}
<div class="form-section">
<div class="form-section-title">
<i class="fas fa-tag"></i> Désignation de l'article
</div>
<div class="form-row align-items-end">
<div class="form-group col-md-9 mb-0">
<label class="field-label">
Désignation <span class="required-star">*</span>
</label>
<div style="position:relative;">
<i class="fas fa-search" style="position:absolute;left:.75rem;top:50%;transform:translateY(-50%);color:#94a3b8;font-size:.8rem;z-index:1;"></i>
{{ form_widget(form.designrech, {
'attr': {
'class': 'form-control da-input',
'style': 'padding-left:2.1rem;',
'autocomplete': 'off',
'placeholder': 'Rechercher une désignation…'
}
}) }}
</div>
<div id="match" class="mt-1"></div>
</div>
<div class="form-group col-md-3 mb-0">
<div class="action-buttons">
<img id="loders" src="{{ asset('img/loders.gif')}}" width="32"
style="display:none; margin-bottom:.4rem;">
<button type="submit" id="but" class="btn-da btn-da-primary">
<i class="fas fa-plus-circle"></i> Ajouter
</button>
<button type="button" id="but2" class="btn-da btn-da-secondary">
<i class="fas fa-plus"></i> Ajouter
</button>
</div>
</div>
</div>
</div>
{{ form_end(form, {'render_rest': false}) }}
</div>{# end modal-body #}
</div>
</div>
</div>
<div class="modal fade" id="inf33" tabindex="-1" role="dialog" aria-labelledby="inf33Label" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable" modal-right" role="document">
<div class="modal-content">
<!-- HEADER -->
<div class="modal-header">
<h5 class="modal-title" id="inf33Label">Ajouter un item</h5>
<button type="button" class="close" data-dismiss="modal">
<span>×</span>
</button>
</div>
<!-- BODY -->
<div class="modal-body">
{{ form_start(form33, {
'action': path('mstopes_gestion_demande_achat'),
'attr': {'id': 'monFormul33', 'class': 'monForm'}
}) }}
<div class="container-fluid">
<div class="form-row">
<div class="form-group col-md-6">
<label>Objet</label>
{{ form_widget(form33.obje2, {'attr': {'class': 'form-control'}}) }}
</div>
<div class="form-group col-md-6">
<label>Nom de Projet</label>
{{ form_widget(form33.baille2, {'attr': {'class': 'form-control'}}) }}
</div>
<div class="form-group col-md-6">
<label>Quantité Demandée</label>
{{ form_widget(form33.quantd2, {'attr': {'class': 'form-control'}}) }}
</div>
<div class="form-group col-md-6">
<label>Prix Unitaire</label>
{{ form_widget(form33.prixUni2, {'attr': {'class': 'form-control'}}) }}
</div>
<div class="form-group col-md-6">
<label>Designation</label>
{{ form_widget(form33.design2, {
'attr': {
'class': 'form-control ui-autocomplete-input',
'autocomplete': 'off'
}
}) }}
<div id="match3" class="mt-1"></div>
</div>
<div class="form-group col-md-6">
<label>Description</label>
{{ form_widget(form33.descrip2, {'attr': {'class': 'form-control'}}) }}
</div>
</div>
</div>
<!-- FOOTER -->
<div class="d-flex justify-content-between align-items-center mt-3">
<img id="loa" src="{{ asset('img/loders.gif')}}" width="50">
<div>
<button type="submit" id="button" class="btn btn-primary">
Ajouter Item
</button>
<button type="button" id="button2" class="btn btn-secondary">
Ajouter Item
</button>
</div>
{{ form_end(form, {'render_rest': false}) }}
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="pss" tabindex="-1" role="dialog" aria-labelledby="pssLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<!-- HEADER -->
<div class="modal-header">
<h5 class="modal-title" id="pssLabel">Importer un fichier</h5>
<!-- Bouton télécharger -->
<a href="{{ path('download_file_DA', {'id_ap': admin.images.id}) }}"
class="btn btn-info btn-sm ml-3">
Télécharger modèle
</a>
<button type="button" class="close ml-auto" data-dismiss="modal">
<span>×</span>
</button>
</div>
<!-- BODY -->
<div class="modal-body">
{{ form_start(form01, {
'action': path('mstopes_gestion_demande_achat'),
'attr': {'id': 'monForms', 'class': 'monForm'}
}) }}
<div class="form-group">
{{ form_widget(form01.fiche, {'attr': {'class': 'form-control-file'}}) }}
</div>
<!-- FOOTER -->
<div class="d-flex justify-content-center">
<button type="submit" class="btn btn-primary">
OK
</button>
</div>
{{ form_end(form, {'render_rest': false}) }}
</div>
</div>
</div>
</div>
<div class="modal fade" id="inf" tabindex="-1" role="dialog" aria-labelledby="infLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable" role="document">
<div class="modal-content">
<!-- HEADER -->
<div class="modal-header">
<h5 class="modal-title" id="infLabel">Modifier / Ajouter</h5>
<button type="button" class="close" data-dismiss="modal">
<span>×</span>
</button>
</div>
<!-- BODY -->
<div class="modal-body">
{{ form_start(form3, {
'action': path('mstopes_gestion_demande_achat'),
'attr': {'id': 'monFormul', 'class': 'monForm'}
}) }}
<div class="container-fluid">
<div class="form-row">
<div class="form-group col-md-6">
<label>Nom de Projet</label>
{{ form_widget(form3.bailleu, {'attr': {'class': 'form-control'}}) }}
</div>
<div class="form-group col-md-6">
<label>Centre Cout</label>
{{ form_widget(form3.centreCo, {'attr': {'class': 'form-control'}}) }}
</div>
<div class="form-group col-md-6">
<label>Quantité Demandée</label>
{{ form_widget(form3.quantd, {'attr': {'class': 'form-control'}}) }}
</div>
<div class="form-group col-md-6">
<label>Prix Unitaire</label>
{{ form_widget(form3.prixUni, {'attr': {'class': 'form-control'}}) }}
</div>
<div class="form-group col-md-6">
<label>Description</label>
{{ form_widget(form3.descrip, {'attr': {'class': 'form-control'}}) }}
</div>
<div class="form-group col-md-10">
<label>Designation</label>
{{ form_widget(form3.design, {
'attr': {
'class': 'form-control ui-autocomplete-input',
'autocomplete': 'off'
}
}) }}
<div id="match2" class="mt-1"></div>
</div>
<div class="form-group col-md-2">
<img id="lodes" src="{{ asset('img/loders.gif')}}" width="50">
<button type="submit" id="buton" class="btn btn-primary"> Valider </button>
</div>
</div>
</div>
<!-- FOOTER -->
<div class="d-flex justify-content-between align-items-center mt-3">
</div>
{{ form_end(form, {'render_rest': false}) }}
</div>
</div>
</div>
</div>
{% endblock %}
{% block js %}
<script type="text/javascript" src="{{ asset('js/bootstrap-datepicker.min.js')}}"></script>
<script type="text/javascript" src="{{ asset('js/da-offline.js') }}"></script>
<script>
DAOffline.init({
routes: {
ajouterTemp : '{{ path("api_da_ajouter_temp") }}',
ajoutDesign : '{{ path("api_da_ajout_design_temp") }}',
daEnvoyer : '{{ path("api_da_envoyer") }}',
importExcel : '{{ path("api_da_import_excel") }}',
}
});
</script>
<script>
/**
* Mise en cache des données de référence pour le mode offline
* (catalogue, centres de coût, bailleurs)
* Exécuté une fois à chaque visite online, stocke dans IndexedDB
*/
(async function cacheReferences() {
if (!navigator.onLine) return;
if (!('indexedDB' in window)) return;
// Ne rafraîchir que toutes les 12h maximum
const lastCache = localStorage.getItem('da_references_cached_at');
if (lastCache) {
const diff = Date.now() - parseInt(lastCache);
if (diff < 12 * 60 * 60 * 1000) return; // moins de 12h → skip
}
try {
const resp = await fetch('{{ path("api_da_references") }}', {
credentials: 'include'
});
if (!resp.ok) return;
const data = await resp.json();
if (!data.success) return;
// Ouvrir IndexedDB (même base que da-shell.html)
const db = await new Promise((resolve, reject) => {
const r = indexedDB.open('erp_da_offline', 2);
r.onsuccess = e => resolve(e.target.result);
r.onerror = () => reject();
r.onupgradeneeded = e => {
const d = e.target.result;
// Stores avec keyPath 'localId' (cohérent avec da-offline.js)
['pending_temp', 'pending_envoi', 'pending_excel', 'brouillons_locaux'].forEach(name => {
if (!d.objectStoreNames.contains(name))
d.createObjectStore(name, { keyPath: 'localId', autoIncrement: true });
});
// Stores avec keyPath 'id' (pour les caches de référence)
['catalogue_cache', 'centrecout_cache', 'bailleur_cache'].forEach(name => {
if (!d.objectStoreNames.contains(name))
d.createObjectStore(name, { keyPath: 'id' });
});
};
});
// Fonction helper pour vider et repeupler un store
async function replaceStore(storeName, items, keyField = 'id') {
return new Promise((resolve, reject) => {
const tx = db.transaction(storeName, 'readwrite');
const store = tx.objectStore(storeName);
store.clear();
items.forEach(item => store.put(item));
tx.oncomplete = resolve;
tx.onerror = reject;
});
}
// Normaliser les clés (Doctrine retourne parfois des indices numériques)
const catalogue = data.catalogue.map(c => ({
id : c.id,
designation : c.designation,
prix : 0, // ← 0 par défaut, sera saisi manuellement
}));
const centres = data.centres.map(c => ({
id : c.id,
libele: c.libele,
}));
const bailleurs = data.bailleurs.map(b => ({
id : b.id,
libele: b.libele,
}));
await Promise.all([
replaceStore('catalogue_cache', catalogue),
replaceStore('centrecout_cache', centres),
replaceStore('bailleur_cache', bailleurs),
]);
localStorage.setItem('da_references_cached_at', Date.now().toString());
console.log('[DA Offline] Références mises en cache :',
catalogue.length, 'articles,',
centres.length, 'centres,',
bailleurs.length, 'bailleurs'
);
} catch (e) {
console.warn('[DA Offline] Impossible de mettre les références en cache:', e);
}
})();
</script>
<script>
$(document).ready(function() {
$('#but').click(function(e)
{ e.preventDefault();
var region = $('#form_region1').val();
// Vérifie si le champ est vide
if (!region.trim()) {
$('#form_region1').focus();
return false;
}
var centreCou = $('#form_centreCou').val();
// Vérifie si le champ est vide
if (!centreCou.trim()) {
$('#form_centreCou').focus();
return false;
}
var baille = $('#form_baille').val();
if (!baille.trim()) {
$('#form_baille').focus();
return false;
}
$("#but").prop("disabled",true);
$("#loders").show();
$.ajax({
type : 'POST',
url : '{{ path('ajouter_achat_temp')}}',
data : 'centreCout=' + $("#form_centreCou").val()+
'&bailleur=' + $("#form_baille").val()+
'&quantDemand=' + $("#form_quantDemand").val()+
'&prixUnit=' + $("#form_prixUnit").val()+
'&obje=' + $("#form_obje").val()+
'&delais=' + $("#form_delais").val()+
'&descrip=' + $("#form_descript").val()+
'®ion=' + $("#form_region1").val()+
'&iddesignrech=' + $("#form_designrech").val(),
success: function(data)
{
alert('ajout effectué avec succes');
$("#loders").hide();
$("#but").hide();
$("#but2").show();
$("#obj").hide();
$("#del").hide();
$("#reg").hide();
$("#form_quantDeman").val("");
$("#form_prixUnit").val("");
$("#form_designrech").val("");
$("#form_descript").val("");
$('#liste').html(data);
}
});
});
});
</script>
<script>
$("#load").hide();
$("#but2").hide();
$("#loders").hide();
$("#lodes").hide();
$("#button2").hide();
$("#loa").hide();
$("#loduse").hide();
$("#lodbail").hide();
</script>
<script>
$("#load2").hide();
</script>
<script>
$("#form_date1_day").hide();
$("#form_date2_day").hide();
</script>
<script>
$(document).ready(function() {
$('#form_listnum').change(function()
{
$("#load").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_liste_demachat')}}',
data : 'listnum=' + $('#form_listnum').val(),
})
.done(function(response)
{
$("#load").hide();
$('#liste').html(response);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
$("#load").hide();
alert('Error : ' + errorThrown);
});
return false;
});
});
</script>
<script>
$('#monFormul').submit(function(e)
{ e.preventDefault();
$("#buton").prop("disabled",true);
$("#lodes").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_ajout_design_achat')}}',
data : 'quantDemand=' + $("#form_quantd").val()+
'&prixUni=' + $("#form_prixUni").val()+
'&listnum=' + $("#form_listnum").val()+
'&listnum2=' + $('#form_listnum2').val()+
'&listnum1=' + $('#form_listnum1').val()+
'&listnum5=' + $('#form_listnum5').val()+
'&listnum4=' + $('#form_listnum4').val()+
'&listnum3=' + $('#form_listnum3').val()+
'&listnum7=' + $('#form_listnum7').val()+
'&listnum9=' + $('#form_listnum9').val()+
'¢reCout=' + $("#form_centreCo").val()+
'&bailleur=' + $("#form_bailleu").val()+
'&descrip=' + $("#form_descrip").val()+
'&designation=' + $("#form_design").val(),
success: function(data)
{
$("#lodes").hide();
$("#buton").prop("disabled",false);
$('#liste').html(data);
$("#form_design").val("");
$("#form_quantd").val("");
$("#form_prixUni").val("");
}
});
});
</script>
<script>
$('#monlistnum2').change(function()
{
$("#load").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_liste_demachat')}}',
data : 'listnum=' + $('#form_listnum2').val(),
})
.done(function(response)
{
$("#load").hide();
$('#liste').html(response);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
$("#load").hide();
alert('Error : ' + errorThrown);
});
return false;
});
</script>
<script>
$('#monlistnum3').change(function()
{
$("#load").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_liste_demachat')}}',
data : 'listnum=' + $('#form_listnum3').val(),
})
.done(function(response)
{
$("#load").hide();
$('#liste').html(response);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
$("#load").hide();
alert('Error : ' + errorThrown);
});
return false;
});
</script>
<script>
$("#form_user").change(function() {
$("#loduse").show();
$.ajax({
type: 'POST',
url: '{{ path('ajax_listnum4') }}',
data: 'id=' + $(this).val(),
success: function(response)
{
$("#loduse").hide();
$('#form_listnum4').find("option").remove();
$.each(response, function(i, item) {
$('#form_listnum4').append(new Option(item, i));
});
}
});
});
</script>
<script>
$('#form_listnum4').change(function()
{
$("#load").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_liste_demachat')}}',
data : 'listnum=' + $(this).val(),
})
.done(function(response)
{
$("#load").hide();
$('#liste').html(response);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
$("#load").hide();
alert('Error : ' + errorThrown);
});
return false;
});
</script>
<script>
$("#form_usebaille").change(function() {
$("#lodbail").show();
$.ajax({
type: 'POST',
url: '{{ path('ajax_listnum6') }}',
data: 'id=' + $(this).val(),
success: function(response)
{
$("#lodbail").hide();
$('#form_listnum6').find("option").remove();
$.each(response, function(i, item) {
$('#form_listnum6').append(new Option(item, i));
});
}
});
});
</script>
<script>
$('#form_listnum6 , #form_listnum55').change(function()
{
$("#load").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_liste_demachat')}}',
data : 'listnum=' + $(this).val(),
})
.done(function(response)
{
$("#load").hide();
$('#liste').html(response);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
$("#load").hide();
alert('Error : ' + errorThrown);
});
return false;
});
</script>
<script>
var loader = "{{ asset('img/loder.gif') }}";
$(document).ready(function(){
$("#form_designrech").on('keyup', function() {
var input = $(this).val();
if (input.length >= 1) {
// ── OFFLINE : chercher dans IndexedDB ────────────────────
if (!navigator.onLine) {
DAOffline.searchCatalogue(input, function(html) {
$('#match').html(html);
$('#matchList li').on('click', function() {
$('#form_designrech').val($(this).text());
$('#match').text('');
});
});
return;
}
// ── ONLINE : comportement AJAX existant ──────────────────
var data = {input: input};
$.ajax({
type : "POST",
url : '{{ path('ajax_autocomplete_design')}}',
data : data,
dataType: 'json',
timeout : 3000,
success : function(response){
$('#match').html(response.countryList);
$('#matchList li').on('click', function() {
$('#form_designrech').val($(this).text());
$('#match').text('');
});
},
error: function() {
$('#match').text('Probleme de connexion internet!');
}
});
} else {
$('#match').text('');
}
});
});
</script>
<script>
var loader = "{{ asset('img/loder.gif') }}";
$(document).ready(function(){
$("#form_design").on('keyup', function() {
var input = $(this).val();
if ( input.length >= 1 ) {
//$('#match2').html('<img src="' + window.loader + '" />');
var data = {input: input};
$.ajax({
type: "POST",
url:'{{ path('ajax_autocomplete_design')}}',
data: data,
dataType: 'json',
timeout: 3000,
success: function(response){
$('#match2').html(response.countryList);
$('#matchList li').on('click', function() {
$('#form_design').val($(this).text());
$('#match2').text('');
});
},
error: function() {
$('#match2').text('Problem de connexion internet!');
}
});
} else {
$('#match2').text('');
}
});
});
</script>
<script>
$('#form_delais').datepicker({
language: 'fr',
format: 'dd/mm/yyyy',
startDate: new Date(), // Empêche la sélection de dates antérieures à aujourd'hui
autoclose: true, // Ferme automatiquement le calendrier après sélection
todayHighlight: true // Met en surbrillance la date du jour
});
</script>
<script>
$(document).ready(function() {
$('#but2').click(function(e)
{ e.preventDefault();
var baille = $('#form_baille').val();
if (!baille.trim()) {
$('#form_baille').focus();
return false;
}
var quant = $('#form_quantDemand').val();
if (!quant.trim()) {
$('#form_quantDemand').focus();
return false;
}
var prix = $('#form_prixUnit').val();
if (!prix.trim()) {
$('#form_prixUnit').focus();
return false;
}
$("#but2").prop("disabled",true);
$("#loders").show();
$.ajax({
type : 'POST',
url : '{{ path('ajout_design_da_temp')}}',
data : 'quantDemand=' + $("#form_quantDemand").val()+
'&bailleur=' + $("#form_baille").val()+
'&prixUnit=' + $("#form_prixUnit").val()+
'&descrip=' + $("#form_descript").val()+
'¢reCout=' + $("#form_centreCou").val()+
'&iddesignrech=' + $("#form_designrech").val(),
success: function(data)
{
alert('ajout effectué avec succes');
$("#loders").hide();
$("#form_quantDemand").val("");
$("#form_prixUnit").val("");
$("#form_designrech").val("");
$("#form_descript").val("");
$("#but2").prop("disabled",false);
$('#liste').html(data);
}
});
});
});
</script>
<script>
$('#monlistnum7').change(function()
{
$("#load").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_liste_demachat')}}',
data : 'listnum=' + $('#form_listnum7').val(),
})
.done(function(response)
{
$("#load").hide();
$('#liste').html(response);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
$("#load").hide();
alert('Error : ' + errorThrown);
});
return false;
});
</script>
<script>
$('#monlistnum9').change(function()
{
$("#load").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_liste_demachat')}}',
data : 'listnum=' + $('#form_listnum9').val(),
})
.done(function(response)
{
$("#load").hide();
$('#liste').html(response);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
$("#load").hide();
alert('Error : ' + errorThrown);
});
return false;
});
</script>
<script>
$('#monlistnum1').change(function()
{
$("#load").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_liste_demachat')}}',
data : 'listnum=' + $('#form_listnum1').val(),
})
.done(function(response)
{
$("#load").hide();
$('#liste').html(response);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
$("#load").hide();
alert('Error : ' + errorThrown);
});
return false;
});
</script>
<script>
$('#monlistnum5').change(function()
{
$("#load").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_liste_demachat')}}',
data : 'listnum=' + $('#form_listnum5').val(),
})
.done(function(response)
{
$("#load").hide();
$('#liste').html(response);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
$("#load").hide();
alert('Error : ' + errorThrown);
});
return false;
});
</script>
<script>
$("#form_usebaille").change(function() {
$.ajax({
type: 'POST',
url: '{{ path('ajax_listnum6') }}',
data: 'id=' + $(this).val(),
success: function(response)
{
$('#form_listnum6').find("option").remove();
$.each(response, function(i, item) {
$('#form_listnum6').append(new Option(item, i));
});
}
});
});
</script>
<script>
$('#form_listnum6').change(function()
{
$("#load").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_liste_demachat')}}',
data : 'listnum=' + $(this).val(),
})
.done(function(response)
{
$("#load").hide();
$('#liste').html(response);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
$("#load").hide();
alert('Error : ' + errorThrown);
});
return false;
});
</script>
<script>
$(document).ready(function() {
$('#button2').click(function(e)
{ e.preventDefault();
$("#button2").prop("disabled",true);
$("#loa").show();
function sendForm() {
$.ajax({
type : 'POST',
url : '{{ path('ajax_ajout_da_temp')}}',
data : 'quantDemand=' + $("#form_quantd2").val()+
'&prixUnit=' + $("#form_prixUni2").val()+
'&obje=' + $("#form_obje2").val()+
'&descrip=' + $("#form_descrip2").val()+
'&baille2=' + $("#form_baille2").val()+
'&iddesignrech=' + $("#form_design2").val(),
success: function(data)
{
alert('ajout effectué avec succes');
$("#loa").hide();
$("#button2").prop("disabled",false);
$("#form_quantDeman2").val("");
$("#form_prixUnit2").val("");
$("#form_design2").val("");
$("#form_descript2").val("");
$('#liste').html(data);
},
error: function(xhr, status, error) {
if (!navigator.onLine) {
// Si la connexion internet est perdue
alert('Connexion perdue. Tentative de réenvoi dans 5 secondes...');
setTimeout(retrySending, 5000); // Réessaye dans 5 secondes
}
}
});
}
// Fonction pour retenter l'envoi
function retrySending() {
if (navigator.onLine) {
sendForm(); // Si la connexion est rétablie, renvoie le formulaire
} else {
setTimeout(retrySending, 5000); // Réessayer jusqu'à ce que la connexion revienne
}
}
// Premier essai d'envoi
sendForm();
});
});
</script>
<script>
$(document).ready(function() {
$('#button').click(function(e) {
e.preventDefault();
$("#button").prop("disabled", true); // Désactiver le bouton
$("#loa").show(); // Afficher le loader
function sendForm() {
$.ajax({
type : 'POST',
url : '{{ path('ajax_da_temp')}}',
data : 'quantDemand=' + $("#form_quantd2").val()+
'&prixUnit=' + $("#form_prixUni2").val()+
'&obje=' + $("#form_obje2").val()+
'&descrip=' + $("#form_descrip2").val()+
'&baille2=' + $("#form_baille2").val()+
'&iddesignrech=' + $("#form_design2").val(),
success: function(data) {
alert('ajout effectué avec succès');
$("#loa").hide(); // Cacher le loader
$("#button").hide();
$("#button2").show();
$("#obje2").hide();
$("#form_quantd2").val("");
$("#form_prixUni2").val("");
$("#form_design2").val("");
$("#form_descrip2").val("");
$('#liste').html(data);
},
error: function(xhr, status, error) {
if (!navigator.onLine) {
// Si la connexion internet est perdue
alert('Connexion perdue. Tentative de réenvoi dans 5 secondes...');
setTimeout(retrySending, 5000); // Réessaye dans 5 secondes
}
}
});
}
// Fonction pour retenter l'envoi
function retrySending() {
if (navigator.onLine) {
sendForm(); // Si la connexion est rétablie, renvoie le formulaire
} else {
setTimeout(retrySending, 5000); // Réessayer jusqu'à ce que la connexion revienne
}
}
// Premier essai d'envoi
sendForm();
});
});
</script>
<script>
var loader = "{{ asset('img/loders.gif') }}";
$(document).ready(function(){
$("#form_design2").on('keyup', function() {
var input = $(this).val();
if ( input.length >= 1 ) {
//$('#match3').html('<img src="' + window.loader + '" />');
var data = {input: input};
$.ajax({
type: "POST",
url:'{{ path('ajax_autocomplete_design')}}',
data: data,
dataType: 'json',
timeout: 3000,
success: function(response){
$('#match3').html(response.countryList);
$('#matchList li').on('click', function() {
$('#form_design2').val($(this).text());
$('#match3').text('');
});
},
error: function() {
$('#match3').text('Problem de connexion internet!');
}
});
} else {
$('#match3').text('');
}
});
});
</script>
<script>
$('#monlistnum55').change(function()
{
$("#load").show();
$.ajax({
type : 'POST',
url : '{{ path('ajax_liste_demachat')}}',
data : 'listnum=' + $('#form_listnum55').val(),
})
.done(function(response)
{
$("#load").hide();
$('#liste').html(response);
})
.fail(function(jqXHR, textStatus, errorThrown)
{
$("#load").hide();
alert('Error : ' + errorThrown);
});
return false;
});
</script>
{% endblock %}