Dettaglio @if (appointment) {

{{ appointment.service_type_name }}

{{ getStatusLabel(appointment.apt_status) }}
#{{ appointment.apt_id }}
@if (appointment.apt_confirmed_date) {
Data Confermata {{ formatDate(appointment.apt_confirmed_date) }} alle {{ formatTime(appointment.apt_confirmed_time) }}
} @if (appointment.apt_proposed_date) {
Data Proposta {{ formatDate(appointment.apt_proposed_date) }} alle {{ formatTime(appointment.apt_proposed_time) }}
} @if (appointment.apt_requested_date) {
Data Richiesta {{ formatDate(appointment.apt_requested_date) }} alle {{ formatTime(appointment.apt_requested_time) }}
}
Durata {{ appointment.apt_duration_minutes }} minuti
@if (isGestore) {
Persone
Cliente {{ appointment.client_firstname }} {{ appointment.client_lastname }} @if (appointment.client_email) { {{ appointment.client_email }} } @if (appointment.client_phone) { {{ appointment.client_phone }} }
@if (appointment.operator_firstname) {
Operatore {{ appointment.operator_firstname }} {{ appointment.operator_lastname }}
}
} @if (appointment.apt_client_notes || appointment.apt_operator_notes || appointment.apt_rejection_reason || appointment.apt_cancellation_reason) {
Note
@if (appointment.apt_client_notes) {
Cliente

{{ appointment.apt_client_notes }}

} @if (appointment.apt_operator_notes) {
Operatore

{{ appointment.apt_operator_notes }}

} @if (appointment.apt_rejection_reason) {
Motivo Rifiuto

{{ appointment.apt_rejection_reason }}

} @if (appointment.apt_cancellation_reason) {
Motivo Annullamento

{{ appointment.apt_cancellation_reason }}

}
} @if (appointment.apt_quote_amount != null) {
Preventivo
Importo {{ appointment.apt_quote_amount | number: '1.2-2' }} €
@if (appointment.apt_quote_valid_until) {
Valido fino al {{ formatDate(appointment.apt_quote_valid_until) }}
} @if (appointment.apt_quote_description) {
Dettaglio

{{ appointment.apt_quote_description }}

}
} @if (appointment.apt_programmatic_due_date || canSetProgrammatic) {
Manutenzione ricorrente
@if (appointment.apt_programmatic_due_date) {
Prossima scadenza {{ formatDate(appointment.apt_programmatic_due_date) }}
} @if (canSetProgrammatic) { Prossima scadenza @for (opt of recurrenceOptions; track opt) { {{ opt.label }} }
Salva @if (appointment.apt_programmatic_due_date) { Rimuovi }

Alla scadenza cliente e azienda ricevono un promemoria. Con la ricorrenza la prossima scadenza è calcolata automaticamente.

}
} @if (isGestore && chatEnabled) {
Messaggi @if (!appointment.unread_message_count) { Nessun messaggio non letto } @if (appointment.unread_message_count) { {{ appointment.unread_message_count }} nuovi messaggi }
@if (appointment.unread_message_count) { {{ appointment.unread_message_count }} }
} @if (attachments.length > 0 || isGestore) {
Allegati
@if (attachments.length === 0) {
Nessun allegato
} @if (attachments.length > 0) { @for (att of attachments; track att) {

{{ att.att_filename }}

{{ formatFileSize(att.att_size_bytes) }}

}
}
} @if (appointment.status_history && appointment.status_history.length > 0) {
Storico
@for (change of appointment.status_history; track change; let last = $last) {
@if (!last) {
}
{{ getStatusLabel(change.asc_new_status) }} {{ change.changed_by_firstname }} {{ change.changed_by_lastname }} · {{ formatDateTime(change.asc_changed_at) }} @if (change.asc_notes) { {{ change.asc_notes }} }
}
} @if (appointment.apt_status === 'COMPLETATO' && !isGestore && currentUserId === appointment.apt_client_usr_id) { } @if (canProposeDate() || canConfirmDirect() || canAcceptProposal() || canSendQuote() || canAcceptQuote() || canReject() || canRejectQuote() || canCancel()) {
}
} @if (appointment && (canProposeDate() || canConfirmDirect() || canAcceptProposal() || canSendQuote() || canAcceptQuote() || canReject() || canRejectQuote() || canCancel())) {
@if (canSendQuote()) { Invia Preventivo } @if (canAcceptQuote()) { Accetta Preventivo } @if (canProposeDate()) { Proponi Data/Ora } @if (canConfirmDirect()) { Conferma } @if (canAcceptProposal()) { Accetta Proposta }
@if (canRejectQuote()) { Rifiuta Preventivo } @if (canReject()) { Rifiuta } @if (canCancel()) { Annulla }
} Proponi Data/Ora Chiudi Tutti gli operatori @for (op of operators; track op.em_id) { {{ op.em_lastname }} {{ op.em_firstname }} } @if (slotsLoading) {

Caricamento slot...

} @if (!slotsLoading && slotGroups.length === 0) {

Nessuno slot disponibile nelle prossime 2 settimane

} @if (!slotsLoading && slotGroups.length > 0) {

Giorno

@for (group of slotGroups; track group.date) {
{{ getDayName(group) }} {{ getDayDate(group) }}
}
@if (selectedDateGroup) {

Ora

@if (selectedDateGroup.morningSlots.length > 0 && selectedDateGroup.afternoonSlots.length > 0) {
Mattina
Pomeriggio
}
@if (selectedDateGroup.morningSlots.length > 0) { @for (slot of selectedDateGroup.morningSlots; track slot) {
{{ slot.start_time.substring(0, 5) }}
} } @if (selectedDateGroup.morningSlots.length > 0 && selectedDateGroup.afternoonSlots.length > 0) {
} @if (selectedDateGroup.afternoonSlots.length > 0) { @for (slot of selectedDateGroup.afternoonSlots; track slot) {
{{ slot.start_time.substring(0, 5) }}
} }
} } Invia Proposta
{{ rejectAction === 'ANNULLATO' ? 'Annulla Appuntamento' : (rejectAction === 'PREVENTIVO_RIFIUTATO' ? 'Rifiuta Preventivo' : 'Rifiuta Appuntamento') }} Chiudi {{ rejectAction === 'ANNULLATO' ? 'Annulla' : 'Rifiuta' }} Invia Preventivo Chiudi Valido fino al Invia Preventivo