Check In/Out Status

Viewing 15 posts - 1 through 15 (of 15 total)
  • Author
    Posts
  • #1606114
    Michael Sturgill
    Participant

    Is it possible to have a status like “Check In” or “Check Out” to use when a customer arrives and leaves?

    #1612640
    J. Davis
    Keymaster

    Hi Michael,
    Thanks for your question. There is no such an option but I may create a request for this feature if you can describe how exactly it should work. I’d appreciate it if you could create screenshots/illustrations of this option, whether it is applied automatically or manually, and specify the section of the dashboard where it can be used and how it should look. Thanks.

    #1617452
    Michael Sturgill
    Participant

    For our campground I think this could be accomplished with statuses labeled “Check-In” and “Check-Out” in the admin backend. It would not be seen by customers. Our goal is to be able to track when a customer actually arrives on site (“Check-In” status) and when they have left (“Check-Out” status). This would let us track who is actually in our campground as well as track no-shows so that those camper spots could be sold on busy weekends.

    #1618212
    Abraham K
    Participant

    I think there should be a Ready-to-check-in status (when payment is cleared) and a checked-in status (when the guest actually arrives) and then checked-out, i think this would be really helpful, and would solve many issues brought-up by users.

    #1618213
    Michael Sturgill
    Participant

    Yes, that’s exactly what I had in mind. You explained it better than I did lol.

    #1618216
    Abraham K
    Participant
    This reply has been marked as private.
    #1621969
    J. Davis
    Keymaster

    Hi, do you mean you would like to add new statuses here https://prnt.sc/uYYNUlt6IpW4 and they should be changed automatically depending on the payment check-in and check-out dates?

    #1621977
    Michael Sturgill
    Participant

    Yes, but the status would not be an automatic update based on the payment. We would like to use it manually only, for example:

    Customer A arrives at the campground and checks in at our front desk. We would change the status for Customer A’s reservation to “Checked In” so that we know they are in the park. When Customer A checks out at our front desk to leave, we would change the reservation status to “Checked Out” so that we know Customer A has left and that spot is available if we need to assign it to someone else.

    Another scenario would be Customer B has a reservation but chose to pay when they arrive. It is past the check-in time and Customer B has not arrived. Customer C arrives and does not have a reservation but would like to purchase an RV spot. Since we know Customer B does not have a “Checked In” status, we can assign that spot to Customer C.

    #1621996
    Rory Deck
    Participant

    I’ve also been trying to implement a Checked in status. I can do it by updating the plugin code directly but I don’t want to do that since I will constantly have to redo it on plugin updates so I’ve tried to build a secondary plugin that hooks into your classes but have not had any success so far. The idea is basically just to change the “confirmed” status to “checked in”, and then have the color on the booking calendar change. This way the users can visually see that their customers have checked in/out on the calendar view. I wont pretend to know why that is important, but I have been asked for this feature by every client I’ve used this plugin for so I started looking into building something myself. Would be great if you could implement it though, I was able to do it with your code in about 20 minutes while blindly looking through code files so it should be a very quick implementation on your end.

    #1622029
    Rory Deck
    Participant

    Just for reference,

    <?php

    namespace MPHB\PostTypes\BookingCPT;

    use \MPHB\PostTypes\AbstractCPT;

    class Statuses extends AbstractCPT\Statuses {

    const STATUS_CONFIRMED = ‘confirmed’;
    const STATUS_PENDING = ‘pending’;
    const STATUS_PENDING_USER = ‘pending-user’;
    const STATUS_PENDING_PAYMENT = ‘pending-payment’;
    const STATUS_CANCELLED = ‘cancelled’;
    const STATUS_ABANDONED = ‘abandoned’;
    const STATUS_AUTO_DRAFT = ‘auto-draft’;
    const STATUS_CHECKED_IN = ‘checked-in’; // New status

    public function __construct( $postType ) {
    parent::__construct( $postType );
    add_action( ‘transition_post_status’, array( $this, ‘transitionStatus’ ), 10, 3 );
    }

    protected function initStatuses() {
    $this->statuses[ self::STATUS_PENDING_USER ] = array(
    ‘lock_room’ => true,
    );

    $this->statuses[ self::STATUS_PENDING_PAYMENT ] = array(
    ‘lock_room’ => true,
    );

    $this->statuses[ self::STATUS_PENDING ] = array(
    ‘lock_room’ => true,
    );

    $this->statuses[ self::STATUS_ABANDONED ] = array(
    ‘lock_room’ => false,
    );

    $this->statuses[ self::STATUS_CONFIRMED ] = array(
    ‘lock_room’ => true,
    );

    $this->statuses[ self::STATUS_CANCELLED ] = array(
    ‘lock_room’ => false,
    );

    $this->statuses[ self::STATUS_CHECKED_IN ] = array( // New status
    ‘lock_room’ => true,
    );
    }

    public function getStatusArgs( $statusName ) {
    $args = array();

    switch ( $statusName ) {
    case self::STATUS_PENDING_USER:
    $args = array(
    ‘label’ => _x( ‘Pending User Confirmation’, ‘Booking status’, ‘motopress-hotel-booking’ ),
    ‘public’ => true,
    ‘exclude_from_search’ => false,
    ‘show_in_admin_all_list’ => true,
    ‘show_in_admin_status_list’ => true,
    ‘label_count’ => _n_noop( ‘Pending User Confirmation <span class=”count”>(%s)</span>’, ‘Pending User Confirmation <span class=”count”>(%s)</span>’, ‘motopress-hotel-booking’ ),
    );
    break;

    case self::STATUS_PENDING_PAYMENT:
    $args = array(
    ‘label’ => _x( ‘Pending Payment’, ‘Booking status’, ‘motopress-hotel-booking’ ),
    ‘public’ => true,
    ‘exclude_from_search’ => false,
    ‘show_in_admin_all_list’ => true,
    ‘show_in_admin_status_list’ => true,
    ‘label_count’ => _n_noop( ‘Pending Payment <span class=”count”>(%s)</span>’, ‘Pending Payment <span class=”count”>(%s)</span>’, ‘motopress-hotel-booking’ ),
    );
    break;

    case self::STATUS_PENDING:
    $args = array(
    ‘label’ => _x( ‘Pending Admin’, ‘Booking status’, ‘motopress-hotel-booking’ ),
    ‘public’ => true,
    ‘exclude_from_search’ => false,
    ‘show_in_admin_all_list’ => true,
    ‘show_in_admin_status_list’ => true,
    ‘label_count’ => _n_noop( ‘Pending Admin <span class=”count”>(%s)</span>’, ‘Pending Admin <span class=”count”>(%s)</span>’, ‘motopress-hotel-booking’ ),
    );
    break;

    case self::STATUS_ABANDONED:
    $args = array(
    ‘label’ => _x( ‘Abandoned’, ‘Booking status’, ‘motopress-hotel-booking’ ),
    ‘public’ => true,
    ‘exclude_from_search’ => false,
    ‘show_in_admin_all_list’ => true,
    ‘show_in_admin_status_list’ => true,
    ‘label_count’ => _n_noop( ‘Abandoned <span class=”count”>(%s)</span>’, ‘Abandoned <span class=”count”>(%s)</span>’, ‘motopress-hotel-booking’ ),
    );
    break;

    case self::STATUS_CONFIRMED:
    $args = array(
    ‘label’ => _x( ‘Confirmed’, ‘Booking status’, ‘motopress-hotel-booking’ ),
    ‘public’ => true,
    ‘exclude_from_search’ => false,
    ‘show_in_admin_all_list’ => true,
    ‘show_in_admin_status_list’ => true,
    ‘label_count’ => _n_noop( ‘Confirmed <span class=”count”>(%s)</span>’, ‘Confirmed <span class=”count”>(%s)</span>’, ‘motopress-hotel-booking’ ),
    );
    break;

    case self::STATUS_CANCELLED:
    $args = array(
    ‘label’ => _x( ‘Cancelled’, ‘Booking status’, ‘motopress-hotel-booking’ ),
    ‘public’ => true,
    ‘exclude_from_search’ => false,
    ‘show_in_admin_all_list’ => true,
    ‘show_in_admin_status_list’ => true,
    ‘label_count’ => _n_noop( ‘Cancelled <span class=”count”>(%s)</span>’, ‘Cancelled <span class=”count”>(%s)</span>’, ‘motopress-hotel-booking’ ),
    );
    break;

    case self::STATUS_CHECKED_IN: // New status
    $args = array(
    ‘label’ => _x( ‘Checked In’, ‘Booking status’, ‘motopress-hotel-booking’ ),
    ‘public’ => true,
    ‘exclude_from_search’ => false,
    ‘show_in_admin_all_list’ => true,
    ‘show_in_admin_status_list’ => true,
    ‘label_count’ => _n_noop( ‘Checked In <span class=”count”>(%s)</span>’, ‘Checked In <span class=”count”>(%s)</span>’, ‘motopress-hotel-booking’ ),
    );
    break;
    }
    return $args;
    }

    public function transitionStatus( $newStatus, $oldStatus, $post ) {
    if ( $post->post_type !== $this->postType ) {
    return;
    }

    if ( $newStatus === $oldStatus ) {
    return;
    }

    if ( apply_filters( ‘mphb_prevent_handle_booking_status_transition’, false ) ) {
    return;
    }

    $booking = MPHB()->getBookingRepository()->findById( $post->ID, true );

    if ( $oldStatus == ‘new’ ) {
    $booking->generateKey();
    }

    if ( $newStatus === self::STATUS_PENDING_USER ) {
    $booking->updateExpiration( ‘user’, time() + MPHB()->settings()->main()->getUserApprovalTime() * MINUTE_IN_SECONDS );
    MPHB()->cronManager()->getCron( ‘abandon_booking_pending_user’ )->schedule();
    }

    if ( $oldStatus === self::STATUS_PENDING_USER ) {
    $booking->deleteExpiration( ‘user’ );
    }

    if ( $newStatus === self::STATUS_PENDING_PAYMENT ) {
    $booking->updateExpiration( ‘payment’, time() + MPHB()->settings()->payment()->getPendingTime() * MINUTE_IN_SECONDS );
    MPHB()->cronManager()->getCron( ‘abandon_booking_pending_payment’ )->schedule();
    }

    if ( $oldStatus === self::STATUS_PENDING_PAYMENT ) {
    $booking->deleteExpiration( ‘payment’ );
    }

    $booking->addLog( sprintf( __( ‘Status changed from %s to %s.’, ‘motopress-hotel-booking’ ), mphb_get_status_label( $oldStatus ), mphb_get_status_label( $newStatus ) ) );

    do_action( ‘mphb_booking_status_changed’, $booking, $oldStatus );

    $customerId = get_post_meta( $booking->getId(), ‘mphb_customer_id’, true );

    if ( $customerId ) {
    MPHB()->customers()->updateBookings( $customerId );
    }

    if ( $newStatus === self::STATUS_CONFIRMED ) {
    do_action( ‘mphb_booking_confirmed’, $booking, $oldStatus );
    }

    if ( $newStatus === self::STATUS_CANCELLED ) {
    do_action( ‘mphb_booking_cancelled’, $booking, $oldStatus );
    }

    if ( $newStatus === self::STATUS_CHECKED_IN ) { // New status
    do_action( ‘mphb_booking_checked_in’, $booking, $oldStatus );
    }
    }

    public function getLockedRoomStatuses() {
    return array_keys(
    array_filter(
    $this->statuses,
    function( $status ) {
    return isset( $status[‘lock_room’] ) && $status[‘lock_room’];
    }
    )
    );
    }

    public function getBookedRoomStatuses() {
    return array( self::STATUS_CONFIRMED, self::STATUS_CHECKED_IN ); // Include new status
    }

    public function getPendingRoomStatuses() {
    return array(
    self::STATUS_PENDING,
    self::STATUS_PENDING_USER,
    self::STATUS_PENDING_PAYMENT,
    );
    }

    public function getFailedStatuses() {
    return array(
    self::STATUS_CANCELLED,
    self::STATUS_ABANDONED,
    );
    }

    public function getAvailableRoomStatuses() {
    return array_merge( ‘trash’, array_diff( array_keys( $this->statuses ), $this->getLockedRoomStatuses() ) );
    }

    public function getDefaultNewBookingStatus() {
    $confirmationMode = MPHB()->settings()->main()->getConfirmationMode();

    switch ( $confirmationMode ) {
    case ‘manual’:
    $defaultStatus = self::STATUS_PENDING;
    break;
    case ‘payment’:
    $defaultStatus = self::STATUS_PENDING_PAYMENT;
    break;
    case ‘auto’:
    default:
    $defaultStatus = self::STATUS_PENDING_USER;
    break;
    }

    return $defaultStatus;
    }
    }

    Although I could not find where to change the color in the booking calendar code. But just something simple like that

    #1622197
    Abraham K
    Participant

    As i wrote before having an option Ready-to-check-in, this should happen automatically when its fully paid (unless they choose to pay at the premises), and then another status checked-in, this should be done manually when the guest shows up and the same with checked-out

    #1622540
    J. Davis
    Keymaster

    Thanks for your feedback. I will add this request to our list of features.

    As for the ‘Ready For Check In’ or ‘Paid’ status – what if the owner charges the guest on arrival fully or partially (when the deposit payment is enabled). How can the plugin know when the booking is ready for check-in to assign this status? Thanks

    #1622542
    Rory Deck
    Participant
    This reply has been marked as private.
    #1623369
    Abraham K
    Participant

    Im not using that option, but i believe the user should be able to set when the guests status should be Ready-to-check-in, like fully paid, partially paid, or even nothing paid.

    #1623666
    J. Davis
    Keymaster

    Hi Rory,
    You may add the new status to the legend in the following file:
    \wp-content\plugins\motopress-hotel-booking\includes\bookings-calendar.php

Viewing 15 posts - 1 through 15 (of 15 total)
  • You must be logged in to reply to this topic.