%PDF- %PDF-
| Direktori : /home/opti/public_html/stlc/wp-content/plugins/omnisend/includes/SDK/V1/ |
| Current File : /home/opti/public_html/stlc/wp-content/plugins/omnisend/includes/SDK/V1/class-contact.php |
<?php
/**
* Omnisend Client
*
* @package OmnisendClient
*/
namespace Omnisend\SDK\V1;
use Omnisend\Internal\Utils;
use WP_Error;
defined( 'ABSPATH' ) || die( 'no direct access' );
/**
* Omnisend Contact class. It's should be used with Omnisend Client.
*
*/
class Contact {
private $id = null;
private $first_name = null;
private $last_name = null;
private $email = null;
private $address = null;
private $city = null;
private $state = null;
private $country = null;
private $postal_code = null;
private $phone = null;
private $birthday = null;
private $gender = null;
private $send_welcome_email = null;
private array $tags = array();
private $email_consent = null;
private $phone_consent = null;
private $email_opt_in_source = null;
private $email_status = 'nonSubscribed';
private $phone_opt_in_source = null;
private $phone_status = 'nonSubscribed';
private array $custom_properties = array();
/**
* Validate contact properties.
*
* It ensures that phone or email is set and that they are valid. In addition, other properties are validated if they are expected type and format.
*
* @return WP_Error
*/
public function validate(): WP_Error {
$string_properties = array(
'first_name',
'last_name',
'email',
'address',
'city',
'state',
'country',
'postal_code',
'phone',
'birthday',
'gender',
'email_consent',
'phone_consent',
'email_opt_in_source',
'phone_opt_in_source',
);
$error = new WP_Error();
foreach ( $string_properties as $property ) {
if ( $this->$property != null && ! is_string( $this->$property ) ) {
$error->add( $property, 'Not a string.' );
}
}
if ( $this->email != null && ! is_email( $this->email ) ) {
$error->add( 'email', 'Not a email.' );
}
if ( $this->send_welcome_email != null && ! is_bool( $this->send_welcome_email ) ) {
$error->add( 'send_welcome_email', 'Not a valid boolean.' );
}
if ( $this->phone == null && $this->email == null && $this->id == null ) {
$error->add( 'identifier', 'Phone, email or ID must be set.' );
}
if ( $this->gender != null && ! in_array( $this->gender, array( 'm', 'f' ) ) ) {
$error->add( 'gender', 'Gender must be "f" or "m".' );
}
foreach ( $this->tags as $tag ) {
if ( ! Utils::is_valid_tag( $tag ) ) {
$error->add( 'tags', 'Tag "' . $tag . '" is not valid. Please cleanup it before setting it.' );
}
}
foreach ( $this->custom_properties as $custom_property_name => $custom_property_value ) {
if ( ! Utils::is_valid_custom_property_name( $custom_property_name ) ) {
$error->add( 'custom_properties', 'Custom property "' . $custom_property_name . '" is not valid. Please cleanup it before setting it.' );
}
}
return $error;
}
/**
* Convert contact to array.
*
* If contact is valid it will be transformed to array that can be sent to Omnisend.
*
* @return array
*/
public function to_array(): array {
if ( $this->validate()->has_errors() ) {
return array();
}
$time_now = gmdate( 'c' );
$user_agent = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ?? 'user agent not found' ) );
$ip = sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ?? 'ip not found' ) );
$arr = array(
'identifiers' => array(),
'tags' => array_values( array_unique( $this->tags ) ),
);
if ( $this->email ) {
$email_identifier = array(
'type' => 'email',
'id' => $this->email,
'channels' => array(
'email' => array(
'status' => $this->email_status,
'statusDate' => $time_now,
),
),
);
if ( $this->email_consent ) {
$email_identifier['consent'] = array(
'source' => $this->email_consent,
'createdAt' => $time_now,
'ip' => $ip,
'userAgent' => $user_agent,
);
}
$arr['identifiers'][] = $email_identifier;
}
if ( $this->custom_properties ) {
$arr['customProperties'] = $this->custom_properties;
}
if ( $this->phone ) {
$phone_identifier = array(
'type' => 'phone',
'id' => $this->phone,
'channels' => array(
'sms' => array(
'status' => $this->phone_status,
'statusDate' => $time_now,
),
),
);
if ( $this->phone_consent ) {
$phone_identifier['consent'] = array(
'source' => $this->phone_consent,
'createdAt' => $time_now,
'ip' => $ip,
'userAgent' => $user_agent,
);
}
$arr['identifiers'][] = $phone_identifier;
}
if ( $this->id ) {
$arr['contactID'] = $this->id;
}
if ( $this->first_name ) {
$arr['firstName'] = $this->first_name;
}
if ( $this->last_name ) {
$arr['lastName'] = $this->last_name;
}
if ( $this->address ) {
$arr['address'] = $this->address;
}
if ( $this->city ) {
$arr['city'] = $this->city;
}
if ( $this->state ) {
$arr['state'] = $this->state;
}
if ( $this->country ) {
$arr['country'] = $this->country;
}
if ( $this->postal_code ) {
$arr['postalCode'] = $this->postal_code;
}
if ( $this->birthday ) {
$arr['birthdate'] = $this->birthday;
}
if ( $this->gender ) {
$arr['gender'] = $this->gender;
}
if ( $this->send_welcome_email ) {
$arr['sendWelcomeEmail'] = $this->send_welcome_email;
}
return $arr;
}
/**
* Convert contact to array for events.
*
* If contact is valid it will be transformed to array that can be sent to Omnisend while creating event.
*
* @return array
*/
public function to_array_for_event(): array {
if ( $this->validate()->has_errors() ) {
return array();
}
$time_now = gmdate( 'c' );
$user_agent = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ?? 'user agent not found' ) );
$ip = sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ?? 'ip not found' ) );
$arr = array(
'consents' => array(),
'optIns' => array(),
'tags' => array_values( array_unique( $this->tags ) ),
);
if ( $this->email ) {
$arr['email'] = $this->email;
if ( $this->email_consent ) {
$email_channel_consent = array(
'channel' => 'email',
'source' => $this->email_consent,
'createdAt' => $time_now,
'ip' => $ip,
'userAgent' => $user_agent,
);
$arr['consents'][] = $email_channel_consent;
}
if ( $this->email_opt_in_source ) {
$email_channel_opt_in = array(
'channel' => 'email',
'createdAt' => $time_now,
'source' => $this->email_opt_in_source,
);
$arr['optIns'][] = $email_channel_opt_in;
}
}
if ( $this->custom_properties ) {
$arr['customProperties'] = $this->custom_properties;
}
if ( $this->phone ) {
$arr['phone'] = $this->phone;
if ( $this->phone_consent ) {
$phone_channel_consent = array(
'channel' => 'phone',
'source' => $this->phone_consent,
'createdAt' => $time_now,
'ip' => $ip,
'userAgent' => $user_agent,
);
$arr['consents'][] = $phone_channel_consent;
}
if ( $this->phone_opt_in_source ) {
$phone_channel_opt_in = array(
'channel' => 'phone',
'createdAt' => $time_now,
'source' => $this->phone_opt_in_source,
);
$arr['optIns'][] = $phone_channel_opt_in;
}
}
if ( $this->id ) {
$arr['id'] = $this->id;
}
if ( $this->first_name ) {
$arr['firstName'] = $this->first_name;
}
if ( $this->last_name ) {
$arr['lastName'] = $this->last_name;
}
if ( $this->address ) {
$arr['address'] = $this->address;
}
if ( $this->city ) {
$arr['city'] = $this->city;
}
if ( $this->state ) {
$arr['state'] = $this->state;
}
if ( $this->country ) {
$arr['country'] = $this->country;
}
if ( $this->postal_code ) {
$arr['postalCode'] = $this->postal_code;
}
if ( $this->birthday ) {
$arr['birthdate'] = $this->birthday;
}
if ( $this->gender ) {
$arr['gender'] = $this->gender;
}
return $arr;
}
/**
* Sets contact email.
*
* @param $email
*
* @return void
*/
public function set_email( $email ): void {
if ( $email && is_string( $email ) ) {
$this->email = $email;
}
}
/**
* Gets contact email.
*
* @return string
*/
public function get_email(): string {
return $this->email;
}
/**
* Sets contact id.
*
* @param $id
*
* @return void
*/
public function set_id( $id ): void {
if ( $id && is_string( $id ) ) {
$this->id = $id;
}
}
/**
* Sets contact gender. It can be "m" or "f".
*
* @param $gender
*
* @return void
*/
public function set_gender( $gender ): void {
$this->gender = $gender;
}
/**
* Gets contact gender.
*
* @return string
*/
public function get_gender(): string {
return $this->gender;
}
/**
* Sets contact first_name.
*
* @param $first_name
*
* @return void
*/
public function set_first_name( $first_name ): void {
$this->first_name = $first_name;
}
/**
* Gets contact first_name.
*
* @return string
*/
public function get_first_name(): string {
return $this->first_name;
}
/**
* Sets contact last_name.
*
* @param $last_name
*
* @return void
*/
public function set_last_name( $last_name ): void {
$this->last_name = $last_name;
}
/**
* Gets contact last_name.
*
* @return string
*/
public function get_last_name(): string {
return $this->last_name;
}
/**
* Sets contact address.
*
* It's expected that it will be a street address. Other address parts can be set with other methods.
*
* @param $address
*
* @return void
*/
public function set_address( $address ): void {
$this->address = $address;
}
/**
* Gets contact address.
*
* @return string
*/
public function get_address(): string {
return $this->address;
}
/**
* Sets contact city.
*
*
* @param $city
*
* @return void
*/
public function set_city( $city ): void {
$this->city = $city;
}
/**
* Gets contact city.
*
* @return string
*/
public function get_city(): string {
return $this->city;
}
/**
* Sets contact state.
*
*
* @param $state
*
* @return void
*/
public function set_state( $state ): void {
$this->state = $state;
}
/**
* Gets contact state.
*
* @return string
*/
public function get_state(): string {
return $this->state;
}
/**
* Sets contact country.
*
*
* @param $country
*
* @return void
*/
public function set_country( $country ): void {
$this->country = $country;
}
/**
* Gets contact country.
*
* @return string
*/
public function get_country(): string {
return $this->country;
}
/**
* Sets contact postal_code.
*
* @param $postal_code
*
* @return void
*/
public function set_postal_code( $postal_code ): void {
$this->postal_code = $postal_code;
}
/**
* Gets contact postal_code.
*
* @return string
*/
public function get_postal_code(): string {
return $this->postal_code;
}
/**
* Sets contact set_phone.
*
* @param $phone
* @return void
*/
public function set_phone( $phone ): void {
$this->phone = $phone;
}
/**
* Gets contact phone.
*
* @return string
*/
public function get_phone(): string {
return is_string( $this->phone ) ? $this->phone : '';
}
/**
* Sets contact birthday. It should be in format "YYYY-MM-DD".
*
* @param $birthday
*
* @return void
*/
public function set_birthday( $birthday ): void {
$this->birthday = $birthday;
}
/**
* Gets contact birthday.
*
* @return string
*/
public function get_birthday(): string {
return $this->birthday;
}
/**
* If set to true and Welcome Email automation is enabled, then Omnisend will send welcome email to contact.
*
* You can find more information https://support.omnisend.com/en/articles/1061818-welcome-email-automation
*
* @param $send_welcome_email
* @return void
*/
public function set_welcome_email( $send_welcome_email ): void {
$this->send_welcome_email = $send_welcome_email;
}
/**
* Sets email opt in source and email status. It's used to track where contact opted in to receive emails. It's required to mark contact email as subscribed.
*
* Common format is `form:form_name` or `popup:popup_name`.
*
* @param $opt_in_text
*
* @return void
*/
public function set_email_opt_in( $opt_in_text ): void {
$this->email_opt_in_source = $opt_in_text;
$this->email_status = 'subscribed';
}
/**
* Sets email status as subscribed.
*
* @return void
*/
public function set_email_subscriber(): void {
$this->email_status = 'subscribed';
}
/**
* Sets email status as unsubscribed.
*
* @return void
*/
public function set_email_unsubscriber(): void {
$this->email_status = 'unsubscribed';
}
/**
* Gets contact email_status.
*
* @return string
*/
public function get_email_status(): string {
return $this->email_status;
}
/**
* Sets phone opt in source and phone status. It's used to track where contact opted in to receive emails. It's required to mark contact phone as subscribed.
*
* Common format is `form:form_name` or `popup:popup_name`.
*
* @param $opt_in_text
*
* @return void
*/
public function set_phone_opt_in( $opt_in_text ): void {
$this->phone_opt_in_source = $opt_in_text;
$this->phone_status = 'subscribed';
}
/**
* Sets phone status as subscribed.
*
* @return void
*/
public function set_phone_subscriber(): void {
$this->phone_status = 'subscribed';
}
/**
* Sets phone status as unsubscribed.
*
* @return void
*/
public function set_phone_unsubscriber(): void {
$this->phone_status = 'unsubscribed';
}
/**
* Gets contact phone_status.
*
* @return string
*/
public function get_phone_status(): string {
return $this->phone_status;
}
/**
* Sets email consent status. It's needed for GDPR compliance.
*
* Common format is `form:form_name` or `popup:popup_name`.
*
* @param $consent_text
*
* @return void
*/
public function set_email_consent( $consent_text ): void {
$this->email_consent = $consent_text;
}
/**
* Sets email consent status. It's needed for GDPR compliance.
*
* Common format is `form:form_name` or `popup:popup_name`.
*
* @param $consent_text
*
* @return void
*/
public function set_phone_consent( $consent_text ): void {
$this->phone_consent = $consent_text;
}
/**
* @param $key
* @param $value
* @param bool $clean_up_key clean up key to be compatible with Omnisend
*
* @return void
*/
public function add_custom_property( $key, $value, $clean_up_key = true ): void {
if ( $clean_up_key ) {
$key = Utils::clean_up_custom_property_name( $key );
}
if ( $key == '' ) {
return;
}
$this->custom_properties[ $key ] = $value;
}
/**
* Gets contact custom_properties.
*
* @return array
*/
public function get_custom_properties(): array {
return $this->custom_properties;
}
/**
* @param $tag
* @param bool $clean_up_tag clean up tag to be compatible with Omnisend
*
* @return void
*/
public function add_tag( $tag, $clean_up_tag = true ): void {
if ( $clean_up_tag ) {
$tag = Utils::clean_up_tag( $tag );
}
if ( $tag == '' ) {
return;
}
$this->tags[] = $tag;
}
/**
* Gets contact tags.
*
* @return array
*/
public function get_tags(): array {
return $this->tags;
}
}