AlkantarClanX12
Your IP : 216.73.217.24
<?php
/**
* Alerts Utility
*
* @package PopupMaker
* @copyright Copyright (c) 2024, Code Atlantic LLC
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class PUM_Utils_Alerts
*/
class PUM_Utils_Alerts {
/**
* Initialize the alerts system by setting up hooks and filters.
*
* @return void
*/
public static function init() {
add_action( 'admin_init', [ __CLASS__, 'hooks' ] );
add_action( 'admin_init', [ __CLASS__, 'php_handler' ] );
add_action( 'wp_ajax_pum_alerts_action', [ __CLASS__, 'ajax_handler' ] );
add_filter( 'pum_alert_list', [ __CLASS__, 'translation_request' ], 10 );
add_action( 'admin_menu', [ __CLASS__, 'append_alert_count' ], 999 );
}
/**
* Gets a count of current alerts.
*
* Panel-eligible alerts are excluded — they render in the React
* notifications panel instead of the legacy admin notice.
*
* @return int
*/
public static function alert_count() {
$alerts = array_filter(
self::get_alerts(),
static function ( $alert ) {
return ! self::is_panel_eligible( $alert );
}
);
return count( $alerts );
}
/**
* Whether an alert belongs in the React notifications panel rather
* than the legacy `admin_notices` block.
*
* Blocking alerts (`type: error|warning`) and `global` alerts stay
* in the legacy renderer because they need to interrupt the user
* inline. Everything else is considered panel content.
*
* @param array<string,mixed> $alert Alert definition.
* @return bool
*/
public static function is_panel_eligible( $alert ) {
if ( ! is_array( $alert ) ) {
return false;
}
$type = isset( $alert['type'] ) ? (string) $alert['type'] : 'info';
if ( in_array( $type, [ 'error', 'warning' ], true ) ) {
return false;
}
if ( ! empty( $alert['global'] ) ) {
return false;
}
return true;
}
/**
* Append alert count to Popup Maker menu item.
*
* @return void
*/
public static function append_alert_count() {
global $menu;
$count = self::alert_count();
foreach ( $menu as $key => $item ) {
if ( 'edit.php?post_type=popup' === $item[2] ) {
// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$menu[ $key ][0] .= $count ? ' <span class="update-plugins count-' . $count . '"><span class="plugin-count pum-alert-count" aria-hidden="true">' . $count . '</span></span>' : '';
}
}
}
/**
* Add translation request alert based on user's browser language preferences.
*
* @param array $alerts {
* @type string $code Alert code.
* @type string $message Alert message.
* @type string $type Alert type.
* @type string $html Optional. Alert HTML.
* @type int $priority Optional. Alert priority.
* @type mixed $dismissible Optional. Dismissible setting.
* @type bool $global Optional. Global alert.
* @type array $actions Optional. Alert actions.
* }
*
* @return array<int, array{
* code: string,
* message: string,
* type: string,
* html?: string,
* priority?: int,
* dismissible?: bool|string|int,
* global?: bool,
* actions?: array<int, array{
* text: string,
* type: string,
* action: string,
* href?: string,
* primary?: bool
* }>
* }>
*/
public static function translation_request( $alerts = [] ) {
$version = explode( '.', Popup_Maker::$VER );
// Get only the major.minor version exclude the point releases.
$version = $version[0] . '.' . $version[1];
$code = 'translation_request_' . $version;
// Bail Early if they have already dismissed.
if ( self::has_dismissed_alert( $code ) ) {
return $alerts;
}
// Get locales based on the HTTP accept language header.
$locales_from_header = PUM_Utils_I10n::get_http_locales();
// Abort early if no locales in header.
if ( empty( $locales_from_header ) ) {
return $alerts;
}
// Get acceptable non EN WordPress locales based on the HTTP accept language header.
// Used when the current locale is EN only I believe.
$non_en_locales_from_header = PUM_Utils_I10n::get_non_en_accepted_wp_locales_from_header();
// If no additional languages are supported abort
if ( empty( $non_en_locales_from_header ) ) {
return $alerts;
}
/**
* Assume all at this point are possible polyglots.
*
* Viewing in English!
* -- Translation available in one additional language!
* ---- Show notice that there other language is available and we need help translating.
* -- Translation available in more than one language!
* ---- Show notice that their other languages are available and need help translating.
* -- Translation not available!
* ---- Show notice that plugin is not translated and we need help.
* Else If translation for their language(s) exists, but isn't up to date!
* -- Show notice that their language is available, but out of date and need help translating.
* Else If translations for their language doesn't exist!
* -- Show notice that plugin is not translated and we need help.
*/
$current_locale = function_exists( 'get_user_locale' ) ? get_user_locale() : get_locale();
// Get the active language packs of the plugin.
$translation_status = PUM_Utils_I10n::translation_status();
// Retrieve all the WordPress locales in which the plugin is translated.
$locales_with_translations = wp_list_pluck( $translation_status, 'language' );
$locale_translation_versions = wp_list_pluck( $translation_status, 'version' );
// Suggests existing langpacks
$suggested_locales_with_langpack = array_values( array_intersect( $non_en_locales_from_header, $locales_with_translations ) );
$current_locale_is_suggested = in_array( $current_locale, $suggested_locales_with_langpack, true );
$current_locale_is_translated = in_array( $current_locale, $locales_with_translations, true );
// Last chance to abort early before querying all available languages.
// We abort here if the user is already using a translated language that is up to date!
if ( $current_locale_is_suggested && $current_locale_is_translated && version_compare( $locale_translation_versions[ $current_locale ], Popup_Maker::$VER, '>=' ) ) {
return $alerts;
}
// Retrieve all the WordPress locales.
$locales_supported_by_wordpress = PUM_Utils_I10n::available_locales();
// Get the native language names of the locales.
$suggest_translated_locale_names = [];
foreach ( $suggested_locales_with_langpack as $locale ) {
$suggest_translated_locale_names[ $locale ] = $locales_supported_by_wordpress[ $locale ]['native_name'];
}
$suggest_string = '';
// If we get this far, they clearly have multiple language available
// If current locale is english but they have others available, they are likely polyglots.
$currently_in_english = strpos( $current_locale, 'en' ) === 0;
// Currently in English.
if ( $currently_in_english ) {
// Only one locale suggestion.
if ( 1 === count( $suggest_translated_locale_names ) ) {
$language = current( $suggest_translated_locale_names );
$suggest_string = sprintf( /* translators: %s: native language name. */
__( 'This plugin is also available in %1$s. <a href="%2$s" target="_blank">Help improve the translation!</a>', 'popup-maker' ),
$language,
esc_url( 'https://translate.wordpress.org/projects/wp-plugins/popup-maker' )
);
// Multiple locale suggestions.
} elseif ( ! empty( $suggest_translated_locale_names ) ) {
$primary_language = current( $suggest_translated_locale_names );
array_shift( $suggest_translated_locale_names );
$other_suggest = '';
foreach ( $suggest_translated_locale_names as $language ) {
$other_suggest .= $language . ', ';
}
$suggest_string = sprintf( /* translators: 1: native language name, 2: other native language names, comma separated */
__( 'This plugin is also available in %1$s (also: %2$s). <a href="%3$s" target="_blank">Help improve the translation!</a>', 'popup-maker' ),
$primary_language,
trim( $other_suggest, ' ,' ),
esc_url( 'https://translate.wordpress.org/projects/wp-plugins/popup-maker' )
);
// Non-English locale in header, no translations.
} elseif ( count( $non_en_locales_from_header ) ) {
if ( 1 === count( $non_en_locales_from_header ) ) {
$locale = reset( $non_en_locales_from_header );
$suggest_string = sprintf( /* translators: 1: native language name, 2: URL to translate.wordpress.org */
__( 'This plugin is not translated into %1$s yet. <a href="%2$s" target="_blank">Help translate it!</a>', 'popup-maker' ),
$locales_supported_by_wordpress[ $locale ]['native_name'],
esc_url( 'https://translate.wordpress.org/projects/wp-plugins/popup-maker' )
);
} else {
$primary_locale = reset( $non_en_locales_from_header );
$primary_language = $locales_supported_by_wordpress[ $primary_locale ]['native_name'];
array_shift( $non_en_locales_from_header );
$other_suggest = '';
foreach ( $non_en_locales_from_header as $locale ) {
$other_suggest .= $locales_supported_by_wordpress[ $locale ]['native_name'] . ', ';
}
$suggest_string = sprintf( /* translators: 1: native language name, 2: other native language names, comma separated */
__( 'This plugin is also available in %1$s (also: %2$s). <a href="%3$s" target="_blank">Help improve the translation!</a>', 'popup-maker' ),
$primary_language,
trim( $other_suggest, ' ,' ),
esc_url( 'https://translate.wordpress.org/projects/wp-plugins/popup-maker' )
);
}
}
// The plugin has no translation for the current locale.
} elseif ( ! $current_locale_is_suggested && ! $current_locale_is_translated ) {
$suggest_string = sprintf(
/* translators: 1. Native language name, 2. URL to translation. */
__( 'This plugin is not translated into %1$s yet. <a href="%2$s" target="_blank">Help translate it!</a>', 'popup-maker' ),
$locales_supported_by_wordpress[ $current_locale ]['native_name'],
esc_url( 'https://translate.wordpress.org/projects/wp-plugins/popup-maker' )
);
// The plugin has translations for current locale, but they are out of date.
} elseif ( $current_locale_is_suggested && $current_locale_is_translated && version_compare( $locale_translation_versions[ $current_locale ], Popup_Maker::$VER, '<' ) ) {
$suggest_string = sprintf( /* translators: %s: native language name. */
__( 'This plugin\'s translation for %1$s is out of date. <a href="%2$s" target="_blank">Help improve the translation!</a>', 'popup-maker' ),
$locales_supported_by_wordpress[ $current_locale ]['native_name'],
esc_url( 'https://translate.wordpress.org/projects/wp-plugins/popup-maker' )
);
}
if ( ! empty( $suggest_string ) ) {
$alerts[] = [
'code' => $code,
'title' => '🌍 ' . __( 'Help translate Popup Maker', 'popup-maker' ),
'message' => $suggest_string,
'type' => 'info',
'category' => 'recommendation',
];
}
return $alerts;
}
/**
* Hook into relevant WP actions for displaying admin notices.
*
* @return void
*/
public static function hooks() {
if ( is_admin() && current_user_can( 'edit_posts' ) ) {
add_action( 'admin_notices', [ __CLASS__, 'admin_notices' ] );
add_action( 'network_admin_notices', [ __CLASS__, 'admin_notices' ] );
add_action( 'user_admin_notices', [ __CLASS__, 'admin_notices' ] );
}
}
/**
* @return bool
*/
public static function should_show_alerts() {
return in_array(
true,
[
pum_is_admin_page(),
count( self::get_global_alerts() ) > 0,
],
true
);
}
/**
* Allow additional style properties for notice alerts.
*
* @param string[] $styles Array of allowed style properties.
* @return string[]
*/
public static function allow_inline_styles( $styles ) {
$styles[] = 'display';
$styles[] = 'list-style';
$styles[] = 'margin';
$styles[] = 'padding';
$styles[] = 'margin-left';
$styles[] = 'margin-right';
$styles[] = 'margin-top';
$styles[] = 'margin-bottom';
return $styles;
}
/**
* Return array of allowed html tags for wp_kses.
*
* @return array<string, array<string, bool>>
*/
public static function allowed_tags() {
return array_merge_recursive(
wp_kses_allowed_html( 'post' ),
// Allow script tags with type="" attribute.
[
'script' => [ 'type' => true ],
'progress' => [
'class' => true,
'max' => true,
'min' => true,
],
'input' => [
'type' => true,
'class' => true,
'id' => true,
'name' => true,
'value' => true,
'checked' => true,
],
'button' => [
'type' => true,
'class' => true,
'id' => true,
'name' => true,
'value' => true,
],
'fieldset' => [
'class' => true,
'id' => true,
'name' => true,
],
'legend' => [
'class' => true,
'id' => true,
'name' => true,
],
'div' => [
'class' => true,
'id' => true,
'name' => true,
],
'span' => [
'class' => true,
'id' => true,
'name' => true,
],
'ul' => [
'class' => true,
'id' => true,
'name' => true,
],
'li' => [
'class' => true,
'id' => true,
'name' => true,
],
'label' => [
'class' => true,
'id' => true,
'name' => true,
'for' => true,
],
'select' => [
'class' => true,
'id' => true,
'name' => true,
'for' => true,
],
'option' => [
'class' => true,
'id' => true,
'name' => true,
'for' => true,
],
'form' => [
'action' => true,
'method' => true,
'id' => true,
'class' => true,
'style' => true,
'data-*' => true,
],
'img' => [
'class' => true,
'id' => true,
'name' => true,
'src' => true,
'alt' => true,
'width' => true,
'height' => true,
],
]
);
}
/**
* Render admin alerts if available.
*
* @return void
*/
public static function admin_notices() {
if ( ! self::should_show_alerts() ) {
return;
}
$global_only = ! pum_is_admin_page();
$alerts = $global_only ? self::get_global_alerts() : self::get_alerts();
// Drop alerts that are now surfaced in the React notifications
// panel so they don't double-render here.
$alerts = array_values(
array_filter(
$alerts,
static function ( $alert ) {
return ! self::is_panel_eligible( $alert );
}
)
);
$count = count( $alerts );
if ( ! $count ) {
return;
}
wp_enqueue_script( 'pum-admin-general' );
wp_enqueue_style( 'pum-admin-general' );
$nonce = wp_create_nonce( 'pum_alerts_action' );
?>
<script type="text/javascript">
window.pum_alerts_nonce = '<?php echo esc_attr( $nonce ); ?>';
</script>
<div class="pum-alerts">
<h3>
<img alt="" class="logo" src="<?php echo esc_attr( Popup_Maker::$URL ); ?>assets/images/mark.png" /> <?php printf( '%s%s (%s)', ( $global_only ? esc_html__( 'Popup Maker', 'popup-maker' ) . ' ' : '' ), esc_html__( 'Notifications', 'popup-maker' ), '<span class="pum-alert-count">' . esc_html( (string) $count ) . '</span>' ); ?>
</h3>
<p><?php __( 'Check out the following notifications from Popup Maker.', 'popup-maker' ); ?></p>
<?php
add_filter( 'safe_style_css', [ __CLASS__, 'allow_inline_styles' ] );
foreach ( $alerts as $alert ) {
$expires = 1 === $alert['dismissible'] ? '' : (string) $alert['dismissible'];
$dismiss_url = add_query_arg(
[
'nonce' => $nonce,
'code' => $alert['code'],
'pum_dismiss_alert' => 'dismiss',
'expires' => $expires,
]
);
?>
<div class="pum-alert-holder" data-code="<?php echo esc_attr( $alert['code'] ); ?>" class="<?php echo $alert['dismissible'] ? 'is-dismissible' : ''; ?>" data-dismissible="<?php echo esc_attr( (string) $alert['dismissible'] ); ?>">
<div class="pum-alert <?php echo '' !== $alert['type'] ? 'pum-alert__' . esc_attr( $alert['type'] ) : ''; ?>">
<?php if ( ! empty( $alert['message'] ) ) : ?>
<p><?php echo wp_kses_post( $alert['message'] ); ?></p>
<?php endif; ?>
<?php if ( ! empty( $alert['html'] ) ) : ?>
<?php
echo wp_kses(
function_exists( 'wp_encode_emoji' ) ? wp_encode_emoji( $alert['html'] ) : $alert['html'],
self::allowed_tags()
);
?>
<?php endif; ?>
<?php if ( ! empty( $alert['actions'] ) && is_array( $alert['actions'] ) ) : ?>
<ul>
<?php
foreach ( $alert['actions'] as $action ) {
$link_text = ! empty( $action['primary'] ) && true === $action['primary'] ? '<strong>' . esc_html( $action['text'] ) . '</strong>' : esc_html( $action['text'] );
if ( 'link' === $action['type'] ) {
$url = $action['href'] ?? '#';
$attributes = 'target="_blank" rel="noreferrer noopener"';
} else {
$url = add_query_arg(
[
'nonce' => $nonce,
'code' => $alert['code'],
'pum_dismiss_alert' => $action['action'],
'expires' => $expires,
]
);
$attributes = 'class="pum-dismiss"';
}
?>
<li><a data-action="<?php echo esc_attr( $action['action'] ); ?>" href="<?php echo esc_url( $url ); ?>" <?php echo esc_attr( $attributes ); ?> >
<?php
// Ignored because this breaks the HTML and link is escaped above.
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo wp_kses_post( $link_text );
?>
</a></li>
<?php } ?>
</ul>
<?php endif; ?>
</div>
<?php if ( $alert['dismissible'] ) : ?>
<a href="<?php echo esc_url( $dismiss_url ); ?>" data-action="dismiss" class="button dismiss pum-dismiss">
<span class="screen-reader-text"><?php esc_html_e( 'Dismiss this item.', 'popup-maker' ); ?></span> <span class="dashicons dashicons-no-alt"></span>
</a>
<?php endif; ?>
</div>
<?php } ?>
</div>
<?php
remove_filter( 'safe_style_css', [ __CLASS__, 'allow_inline_styles' ] );
}
/**
* Get only alerts marked as global.
*
* @return array<int, array{
* code: string,
* message: string,
* type: string,
* html: string,
* priority: int,
* dismissible: bool|string|int,
* global: bool,
* actions?: array<int, array{
* text: string,
* type: string,
* action: string,
* href?: string,
* primary?: bool
* }>
* }>
*/
public static function get_global_alerts() {
$alerts = self::get_alerts();
$global_alerts = [];
foreach ( $alerts as $alert ) {
if ( $alert['global'] ) {
$global_alerts[] = $alert;
}
}
return $global_alerts;
}
/**
* Get all alerts with defaults applied and filtered by dismissal status.
*
* @return array<int, array{
* code: string,
* message: string,
* type: string,
* html: string,
* priority: int,
* dismissible: bool|string|int,
* global: bool,
* actions?: array<int, array{
* text: string,
* type: string,
* action: string,
* href?: string,
* primary?: bool
* }>
* }>
*/
public static function get_alerts() {
static $alert_list;
if ( ! isset( $alert_list ) ) {
$alert_list = apply_filters( 'pum_alert_list', [] );
}
$alerts = [];
foreach ( $alert_list as $alert ) {
// Ignore dismissed alerts.
if ( self::has_dismissed_alert( $alert['code'] ) ) {
continue;
}
$alerts[] = wp_parse_args(
$alert,
[
'code' => 'default',
'priority' => 10,
'message' => '',
'type' => 'info',
'html' => '',
'dismissible' => true,
'global' => false,
'category' => 'announcement',
]
);
}
// Sort alerts by priority, highest to lowest.
$alerts = PUM_Utils_Array::sort( $alerts, 'priority', true );
return $alerts;
}
/**
* Handles alert dismissal via AJAX.
*
* @return void
*/
public static function ajax_handler() {
if ( ! isset( $_REQUEST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_REQUEST['nonce'] ) ), 'pum_alerts_action' ) ) {
wp_send_json_error();
}
// Capability check. Alerts are only shown to edit_posts users; require the
// same capability to dismiss them.
if ( ! current_user_can( 'edit_posts' ) ) {
wp_send_json_error();
}
$args = wp_parse_args(
$_REQUEST,
[
'code' => '',
'expires' => '',
'pum_dismiss_alert' => '',
]
);
$results = self::action_handler( $args['code'], $args['pum_dismiss_alert'], $args['expires'] );
if ( true === $results ) {
wp_send_json_success();
} else {
wp_send_json_error();
}
}
/**
* Handles alert dismissal by page reload instead of AJAX.
*
* @since 1.11.0
* @return void
*/
public static function php_handler() {
if ( ! isset( $_REQUEST['pum_dismiss_alert'] ) ) {
return;
}
if ( ! isset( $_REQUEST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_REQUEST['nonce'] ) ), 'pum_alerts_action' ) ) {
return;
}
// Capability check. Alerts are only shown to edit_posts users; require the
// same capability to dismiss them.
if ( ! current_user_can( 'edit_posts' ) ) {
return;
}
$args = wp_parse_args(
$_REQUEST,
[
'code' => '',
'expires' => '',
'pum_dismiss_alert' => '',
]
);
self::action_handler( $args['code'], $args['pum_dismiss_alert'], $args['expires'] );
}
/**
* Handles the action taken on the alert.
*
* @param string $code The specific alert.
* @param string $action Which action was taken
* @param string $expires When the dismissal expires, if any.
*
* @return bool
* @uses PUM_Utils_Logging::instance
* @uses PUM_Utils_Logging::log
* @since 1.11.0
*/
public static function action_handler( $code, $action, $expires ) {
if ( empty( $action ) || 'dismiss' === $action ) {
try {
$dismissed_alerts = self::dismissed_alerts();
$dismissed_alerts[ $code ] = ! empty( $expires ) ? strtotime( '+' . $expires ) : true;
$user_id = get_current_user_id();
update_user_meta( $user_id, '_pum_dismissed_alerts', $dismissed_alerts );
return true;
} catch ( Exception $e ) {
pum_log_message( 'Error dismissing alert. Exception: ' . $e->getMessage() );
return false;
}
}
do_action( 'pum_alert_dismissed', $code, $action );
return true;
}
/**
* @param string $code
*
* @return bool
*/
public static function has_dismissed_alert( $code = '' ) {
$dimissed_alerts = self::dismissed_alerts();
$alert_dismissed = array_key_exists( $code, $dimissed_alerts );
// If the alert was dismissed and has a non true type value, it is an expiry time.
if ( $alert_dismissed && true !== $dimissed_alerts[ $code ] ) {
return strtotime( 'now' ) < $dimissed_alerts[ $code ];
}
return $alert_dismissed;
}
/**
* Returns an array of dismissed alert groups.
*
* @return array<string, bool|int>
*/
public static function dismissed_alerts() {
$user_id = get_current_user_id();
$dismissed_alerts = get_user_meta( $user_id, '_pum_dismissed_alerts', true );
if ( ! is_array( $dismissed_alerts ) ) {
$dismissed_alerts = [];
update_user_meta( $user_id, '_pum_dismissed_alerts', $dismissed_alerts );
}
return $dismissed_alerts;
}
}
Home - Capital GMC Buick Regina
Skip to content
{{ $t(category) }}
Error
{{vehicle.modelData.year}} {{vehicle.modelData.make}} {{vehicle.modelData.model}}
Starting from {{vehicle.modelData.startingPrice | moneyFormat(lang)}}
Welcome to Capital GMC BUICK – REGINA
Thank you for choosing Capital GMC Buick | Regina, your premier certified Buick and GMC dealership proudly serving drivers in Regina and the surrounding communities. Whether you’re searching for a brand-new Buick or GMC vehicle or a meticulously inspected pre-owned model, we have a diverse selection to match your needs and lifestyle.
Beyond our impressive inventory, we offer a seamless and stress-free financing experience through our well-connected finance centre, where our team of experts is dedicated to securing the best loan or lease options for you, quickly, transparently, and hassle-free.
But our commitment to you doesn’t stop at the sale. Our state-of-the-art service centre is staffed with skilled Buick and GMC technicians who use the latest equipment and genuine OEM parts to keep your vehicle running at its best. From routine maintenance to complex repairs, we’ve got you covered.
Experience top-tier customer service, quality vehicles, and expert care, all in one place. Visit Capital GMC Buick | Regina today or call us at 306-205-8072 with any questions. We’re here to help!
Ask a Question
Capital GMC Buick – Regina
Contact Us
Have a question or need assistance? Fill out the form and we will reach out to you as soon as possible.
Notice: JavaScript is required for this content.
CLOSE
Schedule a Visit
Let us know when you are coming and how we can assist you. We can ensure someone will be on hand to help you out at the desired date and time.
Notice: JavaScript is required for this content.
CLOSE
Find a Career
Have a look at our list of available positions and apply online today to join our team!
×
Opportunities to Grow
The auto industry is constantly changing and we want to continue to grow. We offer growth, leadership & mentorship programs to allow our staff to grow with us.
×
Competitive Salary
We have a significant earning potential with incentive-based pay in most roles. We also offer an employee referral bonus with paid bonuses.
×
Health & Dental
We offer a comprehensive benefits package including extended health, dental, and vision care. We also include paramedical, life insurance, paid sick leave, short & long-term disability coverages.
×
Vacation
We value our employees and want everyone to take their vacation time. We offer a minimum of 2 weeks vacation each year.
×
Training & Development
We have many opportunities for paid education and training in-house as well as training from the Manufacturer.
×
$10,000 Cash Giveaway – Terms & Conditions
All October long, stop by Capital GMC Buick Cadillac, to enter for your chance to win $10,000 cash. No purchase is required, but entries must be made in-store.
The contest is open to residents of Saskatchewan who are 18+. Dealership employees and their households are not eligible. Entries will be accepted from October 1 to October 31, 2025. A random draw will take place on November 1, 2025.
The prize is one $10,000 award, paid by cheque, and must be accepted as awarded. Winner will be contacted by phone or email and must respond within 7 days or another entry may be drawn. Odds of winning depend on the number of entries received.By entering, you agree that Capital Automotive Group may use your name and photo for winner announcements. The contest is governed by the laws of Saskatchewan.
Notice: JavaScript is required for this content.
CLOSE