/** * Accept an enquiry. * * When a client clicks the Book Event button to accept an enquiry * transition the event to the awaiting contract status. * * @since 1.3 * @param arr $data Data for the transition. * @return bool True on succes, otherwise false */ function mdjm_accept_enquiry($data) { global $current_user; $mdjm_event = mdjm_get_event($data['event_id']); if (!$mdjm_event) { return false; } do_action('mdjm_pre_event_accept_enquiry', $mdjm_event->ID, $data); $data['meta'] = array('_mdjm_event_enquiry_accepted' => current_time('mysql'), '_mdjm_event_enquiry_accepted_by' => $current_user->ID); $data['client_notices'] = mdjm_get_option('contract_to_client'); if (!mdjm_update_event_status($mdjm_event->ID, 'mdjm-contract', $mdjm_event->post_status, $data)) { return false; } mdjm_add_journal(array('user' => get_current_user_id(), 'event' => $mdjm_event->ID, 'comment_content' => sprintf(__('%s has accepted their event enquiry', 'mobile-dj-manager'), $current_user->display_name . '<br>')), array('type' => 'update-event', 'visibility' => '2')); $content = '<html>' . "\n" . '<body>' . "\n"; $content .= '<p>' . sprintf(__('Good news... %s has just accepted their %s quotation via %s', 'mobile-dj-manager'), '{client_fullname}', mdjm_get_label_singular(true), '{application_name}') . '</p>'; $content .= '<hr />' . "\n"; $content .= '<h4>' . sprintf(__('<a href="%s">%s ID: %s</a>', 'mobile-dj-manager'), admin_url('post.php?post=' . $mdjm_event->ID . '&action=edit'), mdjm_get_label_singular(), '{contract_id}') . '</h4>' . "\n"; $content .= '<p>' . sprintf(__('Date: %s', 'mobile-dj-manager'), '{event_date}') . '<br />' . "\n"; $content .= __('Type', 'mobile-dj-manager') . ': ' . mdjm_get_event_type($mdjm_event->ID) . '<br />' . "\n"; $content .= __('Status', 'mobile-dj-manager') . ': ' . mdjm_get_event_status($mdjm_event->ID) . '<br />' . "\n"; $content .= __('Client', 'mobile-dj-manager') . ': {client_fullname}<br />' . "\n"; $content .= __('Value', 'mobile-dj-manager') . ': {total_cost}<br />' . "\n"; $content .= __('Deposit', 'mobile-dj-manager') . ': {deposit} ({deposit_status})<br />' . "\n"; $content .= __('Balance Due', 'mobile-dj-manager') . ': {balance}</p>' . "\n"; $content .= '<p>' . sprintf(__('<a href="%s">View %s</a>', 'mobile-dj-manager'), admin_url('post.php?post=' . $mdjm_event->ID . '&action=edit'), mdjm_get_label_singular()) . '</p>' . "\n"; $content .= '</body>' . "\n" . '</html>' . "\n"; $args = array('to_email' => mdjm_get_option('system_email'), 'event_id' => $mdjm_event->ID, 'client_id' => $mdjm_event->client, 'subject' => sprintf(__('%s Quotation Accepted', 'mobile-dj-manager'), mdjm_get_label_singular()), 'message' => $content, 'copy_to' => 'disabled'); mdjm_send_email_content($args); do_action('mdjm_post_event_accept_enquiry', $mdjm_event->ID, $data); return true; }
/** * Format the playlist results for emailing/printing. * * @since 1.3 * @param int $event_id The event ID to retrieve the playlist for. * @param str $orderby Which field to order the playlist entries by. * @param str $order Order ASC or DESC. * @param int $repeat_headers Repeat the table headers after this many rows. * @param bool $hide_empty If displaying by category do we hide empty categories? * @return str $results Output of playlist entries. */ function mdjm_format_playlist_content($event_id, $orderby = 'category', $order = 'ASC', $hide_empty = true, $repeat_headers = 0) { global $current_user; $mdjm_event = mdjm_get_event($event_id); // Obtain results ordered by category if ($orderby == 'category') { $playlist = mdjm_get_playlist_by_category($event_id, array('hide_empty' => $hide_empty)); if ($playlist) { foreach ($playlist as $cat => $entries) { foreach ($entries as $entry) { $entry_data = mdjm_get_playlist_entry_data($entry->ID); $results[] = array('ID' => $entry->ID, 'event' => $event_id, 'artist' => stripslashes($entry_data['artist']), 'song' => stripslashes($entry_data['song']), 'added_by' => stripslashes($entry_data['added_by']), 'category' => $cat, 'notes' => stripslashes($entry_data['djnotes']), 'date' => mdjm_format_short_date($entry->post_date)); } } } } else { $args = array('orderby' => $orderby == 'date' ? 'post_date' : 'meta_value', 'order' => $order, 'meta_key' => $orderby == 'date' ? '' : '_mdjm_playlist_entry_' . $orderby); $entries = mdjm_get_playlist_entries($event_id, $args); if ($entries) { foreach ($entries as $entry) { $entry_data = mdjm_get_playlist_entry_data($entry->ID); $categories = wp_get_object_terms($entry->ID, 'playlist-category'); if (!empty($categories)) { $category = $categories[0]->name; } $results[] = array('ID' => $entry->ID, 'event' => $event_id, 'artist' => stripslashes($entry_data['artist']), 'song' => stripslashes($entry_data['song']), 'added_by' => stripslashes($entry_data['added_by']), 'category' => !empty($category) ? $category : '', 'notes' => stripslashes($entry_data['djnotes']), 'date' => mdjm_format_short_date($entry->post_date)); } } } // Build out the formatted display if (!empty($results)) { $i = 0; $output = '<p>' . sprintf(__('Hey %s', 'mobile-dj-manager'), $current_user->first_name) . '</p>' . "\n"; $output .= '<p>' . __('Here is the playlist you requested...', 'mobile-dj-manager') . '</p>' . "\n"; $output .= '<p>' . __('Client Name', 'mobile-dj-manager') . ': ' . mdjm_get_client_display_name($mdjm_event->client) . '<br />' . "\n" . __('Event Date', 'mobile-dj-manager') . ': ' . mdjm_get_event_long_date($mdjm_event->ID) . '<br />' . "\n" . __('Event Type', 'mobile-dj-manager') . ': ' . mdjm_get_event_type($mdjm_event->ID) . '<br />' . "\n" . __('Songs in Playlist', 'mobile-dj-manager') . ': ' . count($results) . '<br />' . "\n" . '</p>'; $output .= '<hr />' . "\n"; $headers = '<tr style="height: 30px">' . "\n" . '<td style="width: 15%"><strong>' . __('Song', 'mobile-dj-manager') . '</strong></td>' . "\n" . '<td style="width: 15%"><strong>' . __('Artist', 'mobile-dj-manager') . '</strong></td>' . "\n" . '<td style="width: 15%"><strong>' . __('Category', 'mobile-dj-manager') . '</strong></td>' . "\n" . '<td style="width: 40%"><strong>' . __('Notes', 'mobile-dj-manager') . '</strong></td>' . "\n" . '<td style="width: 15%"><strong>' . __('Added By', 'mobile-dj-manager') . '</strong></td>' . "\n" . '</tr>' . "\n"; $output .= '<table width="90%" border="0" cellpadding="0" cellspacing="0">' . "\n"; $output .= $headers; foreach ($results as $result) { if ($repeat_headers > 0 && $i == $repeat_headers) { $output .= '<tr>' . "\n" . '<td colspan="5"> </td>' . "\n" . '</tr>' . "\n" . $headers; $i = 0; } if (is_numeric($result['added_by'])) { $user = get_userdata($result['added_by']); $name = $user->display_name; } else { $name = $result['added_by']; } $output .= '<tr>' . "\n" . '<td>' . stripslashes($result['song']) . '</td>' . "\n" . '<td>' . stripslashes($result['artist']) . '</td>' . "\n" . '<td>' . stripslashes($result['category']) . '</td>' . "\n" . '<td>' . stripslashes($result['notes']) . '</td>' . "\n" . '<td>' . stripslashes($name) . '</td>' . "\n" . '</tr>' . "\n"; $i++; } $output .= '</table>' . "\n"; } else { $output = '<p>' . __('The playlist for this event does not contain any entries!', 'mobile-dj-manager') . '</p>' . "\n"; } return $output; }
/** * Email the manual payment confirmation to the client from a customisable email template. * * @since 1.3 * @param int $event_id The event ID * @return void */ function mdjm_email_manual_payment_confirmation($event_id) { if (!mdjm_get_option('manual_payment_cfm_template')) { return; } $mdjm_event = mdjm_get_event($event_id); $from_name = mdjm_email_set_from_name('manual_payment', $mdjm_event); $from_name = apply_filters('mdjm_email_from_name', $from_name, 'manual_payment', $mdjm_event); $from_email = mdjm_email_set_from_address('manual_payment', $mdjm_event); $from_email = apply_filters('mdjm_email_from_address', $from_email, 'manual_payment', $mdjm_event); $client = get_userdata($mdjm_event->client); $to_email = $client->user_email; $subject = mdjm_email_set_subject(mdjm_get_option('manual_payment_cfm_template', false)); $subject = apply_filters('mdjm_manual_payment_subject', wp_strip_all_tags($subject)); $subject = mdjm_do_content_tags($subject, $event_id, $mdjm_event->client); $attachments = apply_filters('mdjm_manual_payment_attachments', array(), $mdjm_event); $message = mdjm_get_email_template_content(mdjm_get_option('manual_payment_cfm_template', false)); $message = mdjm_do_content_tags($message, $event_id, $mdjm_event->client); $emails = MDJM()->emails; $emails->__set('event_id', $mdjm_event->ID); $emails->__set('from_name', $from_name); $emails->__set('from_address', $from_email); $headers = apply_filters('mdjm_manual_payment_headers', $emails->get_headers(), $event_id, $mdjm_event->client); $emails->__set('headers', $headers); $emails->__set('track', apply_filters('mdjm_track_email_manual_payment', mdjm_get_option('track_client_emails'))); if (mdjm_get_option('bcc_admin_to_client')) { $emails->__set('copy_to', array(mdjm_get_option('system_email'))); } $emails->send($to_email, $subject, $message, $attachments, sprintf(__('Payment received confirmation for %s', 'mobile-dj-manager'), mdjm_get_label_singular())); }
/** * Retrieve a single event by id. * * @since 1.4 * @return void */ public function get_event() { $response = array(); if (!isset($this->request['event_id'])) { $this->missing_params('event_id'); } if (!mdjm_employee_can('read_events', $this->user_id)) { $this->no_permsission(); } do_action('mdjm_before_api_get_event', $this); $mdjm_event = mdjm_get_event($this->request['event_id']); if (!$mdjm_event) { $error = array(); $error['error'] = sprintf(__('%s does not exist.', 'mobile-dj-manager'), mdjm_get_label_singular()); $this->data = $error; $this->output(); } $response['event'] = mdjm_get_event_data($mdjm_event); $response['event'] = array_merge(array('id' => $mdjm_event->ID), $response['event']); $this->data = array_merge($this->data, $response); do_action('mdjm_after_api_get_event', $this); $this->output(); }
/** * Send the playlist via email. * * @since 1.3 * @param arr $data The super global $_POST * @return void */ function mdjm_email_event_playlist_action($data) { if (!wp_verify_nonce($data['mdjm_nonce'], 'email_playlist_entry')) { $message = 'security_failed'; } else { global $current_user; $mdjm_event = mdjm_get_event($data['email_playlist_event_id']); $content = mdjm_format_playlist_content($mdjm_event->ID, $data['email_order_by'], 'ASC', true); $content = apply_filters('mdjm_print_playlist', $content, $data, $mdjm_event); $html_content_start = '<html>' . "\n" . '<body>' . "\n"; $html_content_end = '<p>' . __('Regards', 'mobile-dj-manager') . '</p>' . "\n" . '<p>{company_name}</p>' . "\n"; '<p> </p>' . "\n"; '<p align="center" style="font-size: 9px">Powered by <a style="color:#F90" href="http://mdjm.co.uk" target="_blank">' . MDJM_NAME . '</a> version ' . MDJM_VERSION_NUM . '</p>' . "\n" . '</body>' . "\n" . '</html>'; $args = array('to_email' => $current_user->user_email, 'from_name' => mdjm_get_option('company_name'), 'from_email' => mdjm_get_option('system_email'), 'event_id' => $mdjm_event->ID, 'client_id' => $mdjm_event->client, 'subject' => sprintf(__('Playlist for %s ID {contract_id}', 'mobile-dj-manager'), mdjm_get_label_singular()), 'message' => $html_content_start . $content . $html_content_end); if (mdjm_send_email_content($args)) { $message = 'playlist_emailed'; } else { $message = 'playlist_email_failed'; } } wp_redirect(add_query_arg('mdjm-message', $message)); die; }
/** * MDJM Playlist Shortcode. * * Displays the MDJM playlist management system which will render a client interface for clients * or a guest interface for event guests with the access URL. * * @since 1.3 * * @return string */ function mdjm_shortcode_playlist($atts) { global $mdjm_event; if (isset($_GET['mdjmeventid'])) { $_GET['guest_playlist'] = $_GET['mdjmeventid']; } $visitor = isset($_GET['guest_playlist']) ? 'guest' : 'client'; $output = ''; $event_id = ''; if (!empty($_GET['event_id'])) { $event_id = $_GET['event_id']; } else { $next_event = mdjm_get_clients_next_event(get_current_user_id()); if ($next_event) { $event_id = $next_event[0]->ID; } } if (!isset($event_id) && !isset($_GET['guest_playlist'])) { ob_start(); mdjm_get_template_part('playlist', 'noevent'); $output .= mdjm_do_content_tags(ob_get_contents(), '', get_current_user_id()); } else { $mdjm_event = $visitor == 'client' ? mdjm_get_event($event_id) : mdjm_get_event_by_playlist_code($_GET['guest_playlist']); if ($visitor == 'client') { if (!is_user_logged_in()) { echo mdjm_login_form(add_query_arg('event_id', $event_id, mdjm_get_formatted_url(mdjm_get_option('playlist_page')))); } } ob_start(); if ($mdjm_event) { mdjm_get_template_part('playlist', $visitor); $output .= mdjm_do_content_tags(ob_get_contents(), $mdjm_event->ID, $mdjm_event->client); } else { mdjm_get_template_part('playlist', 'noevent'); $output .= mdjm_do_content_tags(ob_get_contents(), '', get_current_user_id()); } } ob_get_clean(); // Reset global var $mdjm_event = ''; return apply_filters('mdjm_playlist_form', $output); }
/** * Retrieve an event by the guest playlist code. * * @since 1.3 * @param int $access_code The access code for the event playlist. * @return obj $event_query WP_Query object. */ function mdjm_get_event_by_playlist_code($access_code) { global $wpdb; $query = "SELECT `post_id`\n\t\t\t AS `event_id` \n\t\t\t FROM `{$wpdb->postmeta}` \n\t\t\t WHERE `meta_value` = '{$access_code}' \n\t\t\t LIMIT 1"; $result = $wpdb->get_row($query); return $result ? mdjm_get_event($result->event_id) : false; }
/** * Mark event employees salaries as paid. * * @since 1.3 * @param int $event_id The event ID. * @param int $_employee_id User ID of employee to pay. * @param str $amount Amount to pay. * @return mixed Array of 'success' and 'failed' payments or if individual employee, true or false. */ function mdjm_pay_event_employees($event_id, $_employee_id = 0, $amount = 0) { if (!mdjm_get_option('enable_employee_payments')) { return; } $mdjm_event = mdjm_get_event($event_id); if (!$mdjm_event) { return false; } $employees = $mdjm_event->get_all_employees(); if (!$employees) { return false; } do_action('mdjm_pre_pay_event_employees', $event_id, $_employee_id, $mdjm_event); foreach ($employees as $employee_id => $employee_data) { if ($employee_data['payment_status'] == 'paid') { MDJM()->debug->log_it(sprintf('Skipping payment to %s. Employee already paid.', mdjm_get_employee_display_name($employee_id))); } $mdjm_txn = new MDJM_Txn($employee_data['txn_id']); if (!$mdjm_txn) { return false; } MDJM()->debug->log_it(sprintf('Starting payment to %s for %s', mdjm_get_employee_display_name($employee_id), mdjm_currency_filter(mdjm_format_amount($mdjm_txn->price))), true); if (!mdjm_set_employee_paid($employee_id, $event_id, $mdjm_txn->ID)) { MDJM()->debug->log_it(sprintf('Payment to %s failed', mdjm_get_employee_display_name($employee_id))); if (!empty($_employee_id)) { $return = false; } else { $return['failed'] = $employee_id; } } else { MDJM()->debug->log_it(sprintf('%s successfully paid %s', mdjm_get_employee_display_name($employee_id), mdjm_currency_filter(mdjm_format_amount($mdjm_txn->price)))); mdjm_update_txn_meta($mdjm_txn->ID, array('_mdjm_txn_status' => 'Completed')); if (!empty($_employee_id)) { $return = true; } else { $return['success'] = $employee_id; } } } do_action('mdjm_post_pay_event_employees', $event_id, $_employee_id, $mdjm_event, $mdjm_txn->ID); return $return; }