fix(contracts): exposer les fenetres de passage
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
This commit is contained in:
parent
313bc538cb
commit
e49b009354
2 changed files with 3 additions and 1 deletions
|
|
@ -219,6 +219,8 @@ def create_visit(id):
|
||||||
lot_task_id=request.form.get('lot_task_id', type=int) or None,
|
lot_task_id=request.form.get('lot_task_id', type=int) or None,
|
||||||
status='planifiee' if mode != 'open_window' else 'passage_libre',
|
status='planifiee' if mode != 'open_window' else 'passage_libre',
|
||||||
)
|
)
|
||||||
|
if mode == 'open_window' and visit.window_start is None:
|
||||||
|
visit.window_start = scheduled
|
||||||
db.session.add(visit)
|
db.session.add(visit)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash('Passage enregistré.', 'success')
|
flash('Passage enregistré.', 'success')
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@
|
||||||
<div class="card-header d-flex justify-content-between"><span><i class="bi bi-calendar-check"></i> Visites du prestataire</span>
|
<div class="card-header d-flex justify-content-between"><span><i class="bi bi-calendar-check"></i> Visites du prestataire</span>
|
||||||
<form method="post" action="{{ url_for('contracts.generate_visits', id=contract.id) }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button class="btn btn-sm btn-outline-primary">Générer sur 12 mois</button></form>
|
<form method="post" action="{{ url_for('contracts.generate_visits', id=contract.id) }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button class="btn btn-sm btn-outline-primary">Générer sur 12 mois</button></form>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body border-bottom"><form method="post" action="{{ url_for('contracts.create_visit', id=contract.id) }}" class="row g-2 align-items-end"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><div class="col-md-2"><label class="form-label">Date prévue</label><input required type="date" name="scheduled_date" class="form-control"></div><div class="col-md-2"><label class="form-label">Mode</label><select name="passage_mode" class="form-select"><option value="appointment">Sur rendez-vous</option><option value="date_only">Date connue, heure inconnue</option><option value="open_window">Passage libre / sans rendez-vous</option></select></div><div class="col-md-2"><label class="form-label">Début</label><input type="time" name="start_time" class="form-control"></div><div class="col-md-2"><label class="form-label">Fin</label><input type="time" name="end_time" class="form-control"></div><div class="col-md-2"><label class="form-label">Accompagnement</label><select name="accompaniment_mode" class="form-select"><option value="none">Aucun</option><option value="punctual">Ponctuel</option><option value="full">Complet</option></select></div><div class="col-md-2"><label class="form-label">Temps technicien (min)</label><input type="number" min="0" name="accompaniment_minutes" class="form-control"></div><div class="col-12"><button class="btn btn-primary btn-sm">Ajouter un passage</button><a class="btn btn-outline-secondary btn-sm ms-2" href="{{ url_for('contracts.visits_dashboard') }}">Passages & contrôles</a></div></form></div><div class="table-responsive"><table class="table table-sm mb-0"><thead><tr><th>Date / fenêtre</th><th>Mode</th><th>Statut</th><th>Compte rendu</th><th></th></tr></thead><tbody>
|
<div class="card-body border-bottom"><form method="post" action="{{ url_for('contracts.create_visit', id=contract.id) }}" class="row g-2 align-items-end"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><div class="col-md-2"><label class="form-label">Date prévue</label><input required type="date" name="scheduled_date" class="form-control"></div><div class="col-md-2"><label class="form-label">Mode</label><select name="passage_mode" class="form-select"><option value="appointment">Sur rendez-vous</option><option value="date_only">Date connue, heure inconnue</option><option value="open_window">Passage libre / sans rendez-vous</option></select></div><div class="col-md-2"><label class="form-label">Début</label><input type="time" name="start_time" class="form-control"></div><div class="col-md-2"><label class="form-label">Fin</label><input type="time" name="end_time" class="form-control"></div><div class="col-md-2"><label class="form-label">Fin de fenêtre</label><input type="date" name="window_end" class="form-control"></div><div class="col-md-2"><label class="form-label">Accompagnement</label><select name="accompaniment_mode" class="form-select"><option value="none">Aucun</option><option value="punctual">Ponctuel</option><option value="full">Complet</option></select></div><div class="col-md-2"><label class="form-label">Temps technicien (min)</label><input type="number" min="0" name="accompaniment_minutes" class="form-control"></div><div class="col-12"><button class="btn btn-primary btn-sm">Ajouter un passage</button><a class="btn btn-outline-secondary btn-sm ms-2" href="{{ url_for('contracts.visits_dashboard') }}">Passages & contrôles</a></div></form></div><div class="table-responsive"><table class="table table-sm mb-0"><thead><tr><th>Date / fenêtre</th><th>Mode</th><th>Statut</th><th>Compte rendu</th><th></th></tr></thead><tbody>
|
||||||
{% for visit in contract.visits %}<tr><td>{{ visit.scheduled_date.strftime('%d/%m/%Y') }}{% if visit.window_end %} → {{ visit.window_end.strftime('%d/%m/%Y') }}{% endif %}{% if visit.start_time %}<div class="small text-muted">{{ visit.start_time.strftime('%H:%M') }}{% if visit.end_time %}–{{ visit.end_time.strftime('%H:%M') }}{% endif %}</div>{% endif %}</td><td>{{ visit.display_mode }}{% if visit.accompaniment_mode != 'none' %}<div class="small">Accompagnement : {{ visit.accompaniment_minutes or ('toute la durée' if visit.accompaniment_mode == 'full' else 'à définir') }}</div>{% endif %}</td><td><span class="badge bg-{{ 'success' if visit.status == 'realisee' else ('warning text-dark' if visit.status == 'non_venue' else 'primary') }}">{{ visit.status|replace('_',' ') }}</span></td><td>{{ visit.report or '—' }}</td><td>{% if visit.status == 'passage_libre' %}<form method="post" action="{{ url_for('contracts.arrived_visit', id=contract.id, visit_id=visit.id) }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button class="btn btn-sm btn-outline-primary">Entreprise arrivée</button></form>{% elif visit.status not in ('realisee','non_venue') %}<form method="post" action="{{ url_for('contracts.complete_visit', id=contract.id, visit_id=visit.id) }}" class="d-flex gap-1 mb-1"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><input name="report" class="form-control form-control-sm" placeholder="Compte rendu"><button class="btn btn-sm btn-success">Réalisée</button></form><form method="post" action="{{ url_for('contracts.no_show_visit', id=contract.id, visit_id=visit.id) }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button class="btn btn-sm btn-outline-warning">Non venue</button></form>{% endif %}</td></tr>
|
{% for visit in contract.visits %}<tr><td>{{ visit.scheduled_date.strftime('%d/%m/%Y') }}{% if visit.window_end %} → {{ visit.window_end.strftime('%d/%m/%Y') }}{% endif %}{% if visit.start_time %}<div class="small text-muted">{{ visit.start_time.strftime('%H:%M') }}{% if visit.end_time %}–{{ visit.end_time.strftime('%H:%M') }}{% endif %}</div>{% endif %}</td><td>{{ visit.display_mode }}{% if visit.accompaniment_mode != 'none' %}<div class="small">Accompagnement : {{ visit.accompaniment_minutes or ('toute la durée' if visit.accompaniment_mode == 'full' else 'à définir') }}</div>{% endif %}</td><td><span class="badge bg-{{ 'success' if visit.status == 'realisee' else ('warning text-dark' if visit.status == 'non_venue' else 'primary') }}">{{ visit.status|replace('_',' ') }}</span></td><td>{{ visit.report or '—' }}</td><td>{% if visit.status == 'passage_libre' %}<form method="post" action="{{ url_for('contracts.arrived_visit', id=contract.id, visit_id=visit.id) }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button class="btn btn-sm btn-outline-primary">Entreprise arrivée</button></form>{% elif visit.status not in ('realisee','non_venue') %}<form method="post" action="{{ url_for('contracts.complete_visit', id=contract.id, visit_id=visit.id) }}" class="d-flex gap-1 mb-1"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><input name="report" class="form-control form-control-sm" placeholder="Compte rendu"><button class="btn btn-sm btn-success">Réalisée</button></form><form method="post" action="{{ url_for('contracts.no_show_visit', id=contract.id, visit_id=visit.id) }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button class="btn btn-sm btn-outline-warning">Non venue</button></form>{% endif %}</td></tr>
|
||||||
{% else %}<tr><td colspan="4" class="text-center text-muted">Aucune visite générée</td></tr>{% endfor %}
|
{% else %}<tr><td colspan="4" class="text-center text-muted">Aucune visite générée</td></tr>{% endfor %}
|
||||||
</tbody></table></div>
|
</tbody></table></div>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue