Files
torebki-fabiola.pl/wp-content/plugins/przelewy24/includes/subscription/class-p24-subscription-db.php
2026-03-05 13:07:40 +01:00

372 lines
9.6 KiB
PHP

<?php
/**
* File that define P24_Subscription_Db class.
*
* @package Przelewy24
*/
defined( 'ABSPATH' ) || exit;
/**
* Class P24_Subscription_Db
*/
class P24_Subscription_Db {
/**
* Extend or add subscription.
*
* @param P24_No_Mc_Product_Subscription $subscription Subcription product.
* @param int $quantity Quantity of subscriptions.
* @param WP_User $user Buyer.
* @param WC_Order $order Current order.
*/
public static function extend_subscription( $subscription, $quantity, $user, $order ) {
global $wpdb;
$user_id = (int) $user->ID;
$subscription_id = (int) $subscription->get_id();
/* We need a plain integer for database relations. */
$order_id = (int) $order->get_id();
$data = $wpdb->get_row(
$wpdb->prepare(
"SELECT id, valid_to FROM {$wpdb->prefix}woocommerce_p24_subscription WHERE user_id = %d AND product_id = %d;",
array( $user_id, $subscription_id )
)
); /* db call ok; no cache ok */
$now = new DateTime();
$days = (int) ( $subscription->get_days() * $quantity );
if ( $data ) {
$id = (int) $data->id;
$alt_date = new DateTime( "$days days" );
try {
$date = new DateTime( $data->valid_to );
$date->modify( "$days days" );
/* If the subscription is too old. */
if ( $date < $alt_date ) {
$date = $alt_date;
}
} catch ( Exception $ex ) {
/* The best fall back we can do. */
$date = $alt_date;
}
$wpdb->update(
"{$wpdb->prefix}woocommerce_p24_subscription",
array(
'valid_to' => $date->format( 'Y-m-d H:i:s' ),
'last_order_id' => $order_id,
'last_checked' => $now->format( 'Y-m-d H:i:s' ),
),
array( 'id' => $id ), /* The NULL is not SQL compatible. */
array( '%s', '%d', '%s' ),
array( '%d' )
); /* db call ok; no cache ok */
} else {
$date = new DateTime( "$days days" );
$data = array(
'user_id' => $user_id,
'product_id' => $subscription_id,
'valid_to' => $date->format( 'Y-m-d H:i:s' ),
'extend' => 0,
'last_order_id' => $order_id,
'last_checked' => $now->format( 'Y-m-d H:i:s' ),
);
$formats = array( '%d', '%d', '%s', '%d', '%d', '%s' );
$wpdb->insert( "{$wpdb->prefix}woocommerce_p24_subscription", $data, $formats ); /* db call ok */
}
}
/**
* Add card reference.
*
* @param WC_Order $order Order.
* @param string $card_ref Card reference.
*/
public static function add_card_reference( $order, $card_ref ) {
global $wpdb;
/* We need a plain integer for database relations. */
$last_order_id = (int) $order->get_id();
$now = new DateTime();
$wpdb->update(
"{$wpdb->prefix}woocommerce_p24_subscription",
array(
'extend' => 1,
'card_ref' => $card_ref,
'last_checked' => $now->format( 'Y-m-d H:i:s' ),
),
array( 'last_order_id' => $last_order_id ), /* The NULL is not SQL compatible. */
array( '%d', '%s', '%s' ),
array( '%d' )
); /* db call ok; no cache ok */
}
/**
* Update card reference.
*
* @param int $subcription_id Subcription id.
* @param string $card_ref Card reference.
*/
public static function update_card_reference( $subcription_id, $card_ref ) {
global $wpdb;
$now = new DateTime();
$wpdb->update(
"{$wpdb->prefix}woocommerce_p24_subscription",
array(
'extend' => 1,
'card_ref' => $card_ref,
'last_checked' => $now->format( 'Y-m-d H:i:s' ),
),
array( 'id' => (int) $subcription_id ), /* The NULL is not SQL compatible. */
array( '%d', '%s', '%s' ),
array( '%d' )
); /* db call ok; no cache ok */
}
/**
* Clear card reference.
*
* @param int $subcription_id Subcription id.
*/
public static function clear_card_reference( $subcription_id ) {
global $wpdb;
$wpdb->update(
"{$wpdb->prefix}woocommerce_p24_subscription",
array(
'extend' => 0,
'card_ref' => null,
),
array( 'id' => (int) $subcription_id ), /* The NULL is not SQL compatible. */
array( '%d', '%s' ),
array( '%d' )
); /* db call ok; no cache ok */
}
/**
* End subscription.
*
* @param int $subscription_id Subscription id.
* @return bool True on success.
*/
public static function end_subscription( $subscription_id ) {
global $wpdb;
$yesterday = new DateTime( 'yesterday' );
$ok = $wpdb->update(
"{$wpdb->prefix}woocommerce_p24_subscription",
array(
'extend' => 0,
'card_ref' => null,
'valid_to' => $yesterday->format( 'Y-m-d H:i:s' ),
),
array( 'id' => (int) $subscription_id ), /* The NULL is not SQL compatible. */
array( '%d', '%s', '%s' ),
array( '%d' )
); /* db call ok; no cache ok */
return (bool) $ok;
}
/**
* Get active list.
*
* @return array|object|null
*/
public static function get_active_list() {
global $wpdb;
$now = new DateTime();
$list = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
u.user_nicename,
u.user_email,
s.valid_to,
p.post_title AS subscription_title,
s.id AS record_id
FROM {$wpdb->prefix}woocommerce_p24_subscription AS s
INNER JOIN {$wpdb->prefix}posts AS p ON p.ID = s.product_id
INNER JOIN {$wpdb->prefix}users AS u ON u.ID = s.user_id
WHERE s.valid_to > %s
ORDER BY p.post_title, u.user_email, s.id
;
",
array( $now->format( 'Y-m-d H:i:s' ) )
)
); /* db call ok; no cache ok */
return $list;
}
/**
* Get inactive list.
*
* @return array|object|null
*/
public static function get_inactive_list() {
global $wpdb;
$now = new DateTime();
$list = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
u.user_nicename,
u.user_email,
s.valid_to,
p.post_title AS subscription_title
FROM {$wpdb->prefix}woocommerce_p24_subscription AS s
INNER JOIN {$wpdb->prefix}posts AS p ON p.ID = s.product_id
INNER JOIN {$wpdb->prefix}users AS u ON u.ID = s.user_id
WHERE s.valid_to < %s
ORDER BY p.post_title, u.user_email, s.id
;
",
array( $now->format( 'Y-m-d H:i:s' ) )
)
); /* db call ok; no cache ok */
return $list;
}
/**
* Get active list for user.
*
* @return array|object|null
* @param WP_User $user User of interest.
*/
public static function get_active_list_for_user( $user ) {
global $wpdb;
$user_id = $user->ID;
$now = new DateTime();
$list = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
s.id AS record_id,
s.valid_to,
s.card_ref,
p.ID AS product_id,
p.post_title AS subscription_title
FROM {$wpdb->prefix}woocommerce_p24_subscription AS s
INNER JOIN {$wpdb->prefix}posts AS p ON p.ID = s.product_id
WHERE s.valid_to > %s
AND s.user_id = %d
ORDER BY p.post_title, s.id
;
",
array( $now->format( 'Y-m-d H:i:s' ), $user_id )
)
); /* db call ok; no cache ok */
return $list;
}
/**
* Get inactive list for user.
*
* @return array|object|null
* @param WP_User $user User of interest.
*/
public static function get_inactive_list_for_user( $user ) {
global $wpdb;
$user_id = $user->ID;
$now = new DateTime();
$list = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
s.id AS record_id,
p.ID AS product_id,
p.post_title AS subscription_title
FROM {$wpdb->prefix}woocommerce_p24_subscription AS s
INNER JOIN {$wpdb->prefix}posts AS p ON p.ID = s.product_id
WHERE s.valid_to < %s
AND s.user_id = %d
ORDER BY p.post_title, s.id
;
",
array( $now->format( 'Y-m-d H:i:s' ), $user_id )
)
); /* db call ok; no cache ok */
return $list;
}
/**
* Mark checked.
*
* @param int $id Id of subscription.
*/
public static function mark_checked( $id ) {
global $wpdb;
$id = (int) $id;
$now = new DateTime();
$wpdb->update(
"{$wpdb->prefix}woocommerce_p24_subscription",
array(
'last_checked' => $now->format( 'Y-m-d H:i:s' ),
),
array( 'id' => $id ), /* The NULL is not SQL compatible. */
array( '%s' ),
array( '%d' )
); /* db call ok; no cache ok */
}
/**
* Find_subscription_to_extends.
*
* @param DateTimeInterface $critical_date The date of subscription.
*/
public static function find_subscription_to_extends( $critical_date ) {
global $wpdb;
$critical_date_string = $critical_date->format( 'Y-m-d H:i:s' );
$cool_down = new DateTime( '- 1 hour' );
$cool_down_string = $cool_down->format( 'Y-m-d H:i:s' );
$data = $wpdb->get_results(
$wpdb->prepare(
"
SELECT id, product_id, user_id, last_order_id, card_ref
FROM {$wpdb->prefix}woocommerce_p24_subscription
WHERE valid_to < %s AND extend <> 0 AND card_ref IS NOT NULL AND last_checked < %s
;
",
array( $critical_date_string, $cool_down_string )
)
); /* db call ok; no cache ok */
return $data;
}
/**
* Get extended data for single record.
*
* @param int $subscription_id Subsription id.
* @return array|null
*/
public static function get_extended_data_for_single( $subscription_id ) {
$subscription_id = (int) $subscription_id;
global $wpdb;
$data = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
u.user_nicename,
u.user_email,
p.post_title AS subscription_title
FROM {$wpdb->prefix}woocommerce_p24_subscription AS s
INNER JOIN {$wpdb->prefix}posts AS p ON p.ID = s.product_id
INNER JOIN {$wpdb->prefix}users AS u ON u.ID = s.user_id
WHERE s.id = %d
;
",
array( $subscription_id )
)
); /* db call ok; no cache ok */
if ( $data ) {
return (array) reset( $data );
} else {
return null;
}
}
}