{c.patient}
+ {c.phone &&{c.phone}
} +{c.paquete}
+{c.service}
++ {c.sessions_remaining} restantes +
+| Paquete | +Servicio | +Sesiones | +Precio | +Por sesión | +Ahorro | +Vigencia | +Vendidos | +Estado | ++ |
|---|---|---|---|---|---|---|---|---|---|
|
+ {p.name} + {p.code &&{p.code} } + |
+ {p.service} | +{p.sessions} | +{fmtMoney(p.price)} | +{fmtMoney(p.price_per_session)} | ++ {ahorro > 0 ? ( + −{ahorro}% + ) : ( + — + )} + | ++ {p.validity_days > 0 ? `${p.validity_days} días` : 'Sin límite'} + | +{p.compras_count} | ++ + | ++ + | +
| Compra | +Paciente | +Paquete | +Sesiones | +Vence | +Pagado | +Estado | ++ |
|---|
+ Sale a {fmtMoney(parseFloat(form.price) / parseInt(form.sessions, 10))} por sesión. +
+ )} +Paquete
+{detalle.compra.paquete}
+Servicio
+{detalle.compra.service || '—'}
+Comprado
++ {detalle.compra.date}{detalle.compra.venta ? ` · ${detalle.compra.venta}` : ''} +
+Vence
+{detalle.compra.expiry_date || 'Sin límite'}
++ Quedan {detalle.compra.sessions_remaining} sesiones por agendar. +
+Bitácora de sesiones
+ {detalle.consumos.length === 0 ? ( +Todavía no se ha consumido ninguna sesión.
+ ) : ( ++ {m.cita_fecha || '—'} {m.cita_hora} + {m.doctor ? · {m.doctor} : null} +
++ {m.state === 'cancelled' ? 'Sesión liberada (cita cancelada)' : 'Sesión consumida'} +
++ Corrige el saldo si las sesiones se registraron mal. Se audita en Configuración. +
+