209 lines
5.2 KiB
PHP
209 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace FluentCrm\App\Modules\AbandonCart;
|
|
|
|
use FluentCrm\App\Modules\AbandonCart\Drivers\DriverManager;
|
|
use FluentCrm\App\Models\Funnel;
|
|
use FluentCrm\App\Models\Model;
|
|
use FluentCrm\App\Models\Subscriber;
|
|
use FluentCrm\App\Services\Funnel\FunnelHelper;
|
|
use FluentCrm\Framework\Support\Arr;
|
|
|
|
class AbandonCartModel extends Model
|
|
{
|
|
protected $table = 'fc_abandoned_carts';
|
|
|
|
protected $fillable = [
|
|
'checkout_key',
|
|
'cart_hash',
|
|
'contact_id',
|
|
'is_optout',
|
|
'full_name',
|
|
'email',
|
|
'provider',
|
|
'user_id',
|
|
'order_id',
|
|
'automation_id',
|
|
'checkout_page_id',
|
|
'status',
|
|
'subtotal',
|
|
'shipping',
|
|
'discounts',
|
|
'fees',
|
|
'tax',
|
|
'total',
|
|
'currency',
|
|
'cart',
|
|
'note',
|
|
'recovered_at',
|
|
'abandoned_at',
|
|
'click_counts'
|
|
];
|
|
|
|
protected $searchable = ['full_name', 'email'];
|
|
|
|
public static function boot()
|
|
{
|
|
parent::boot();
|
|
|
|
static::creating(function ($model) {
|
|
$model->checkout_key = md5(time() . wp_generate_uuid4());
|
|
});
|
|
}
|
|
|
|
public function scopeProvider($query, $provider)
|
|
{
|
|
return $query->where('provider', $provider);
|
|
}
|
|
|
|
public function scopeStatusBy($query, $status)
|
|
{
|
|
if (!$status || $status == 'all') {
|
|
return $query;
|
|
}
|
|
|
|
return $query->where('status', $status);
|
|
}
|
|
|
|
public function scopeSearchBy($query, $search)
|
|
{
|
|
if (!$search) {
|
|
return $query;
|
|
}
|
|
|
|
return $query->where(function ($q) use ($search) {
|
|
$q->where('full_name', 'LIKE', '%' . $search . '%')
|
|
->orWhere('email', 'LIKE', '%' . $search . '%');
|
|
});
|
|
}
|
|
|
|
public function setCartAttribute($data)
|
|
{
|
|
$this->attributes['cart'] = \maybe_serialize($data);
|
|
}
|
|
|
|
public function getCartAttribute($data)
|
|
{
|
|
return \maybe_unserialize($data);
|
|
}
|
|
|
|
public function subscriber()
|
|
{
|
|
return $this->belongsTo(Subscriber::class, 'contact_id');
|
|
}
|
|
|
|
public function automation()
|
|
{
|
|
return $this->belongsTo(Funnel::class, 'automation_id');
|
|
}
|
|
|
|
public function getAddress($type = 'billing')
|
|
{
|
|
$customerData = Arr::get($this->cart, 'customer_data', []);
|
|
|
|
if (Arr::get($customerData, 'differentShipping') != 'yes') {
|
|
$type = 'billingAddress';
|
|
} else {
|
|
$type = 'shippingAddress';
|
|
}
|
|
|
|
return array_filter([
|
|
'address_1' => Arr::get($customerData, $type . '.address_1'),
|
|
'address_2' => Arr::get($customerData, $type . '.address_2'),
|
|
'city' => Arr::get($customerData, $type . '.city'),
|
|
'state' => Arr::get($customerData, $type . '.state'),
|
|
'postcode' => Arr::get($customerData, $type . '.postcode'),
|
|
'country' => Arr::get($customerData, $type . '.country'),
|
|
]);
|
|
}
|
|
|
|
private function getAddressLineByKey($type, $key)
|
|
{
|
|
$address = $this->getAddress($type);
|
|
return Arr::get($address, $key, '');
|
|
}
|
|
|
|
public function getInputProp($key, $default = '')
|
|
{
|
|
$customerData = Arr::get($this->cart, 'customer_data', []);
|
|
|
|
return Arr::get($customerData, $key, $default);
|
|
}
|
|
|
|
public function getAddressProp($key, $addressType = 'billingAddress', $default = '')
|
|
{
|
|
$address = Arr::get($this->cart, 'customer_data.'.$addressType, []);
|
|
|
|
return Arr::get($address, $key, $default);
|
|
}
|
|
|
|
/*
|
|
* Get the cart items as html
|
|
* This function is called by shortcodes/mergecodes/smartcode
|
|
* e.g. {{ab_cart_woo.cart_items_table}}
|
|
*/
|
|
public function getCartItemsHtml()
|
|
{
|
|
$driver = DriverManager::getDriver($this->provider);
|
|
|
|
if ($driver) {
|
|
return $driver->getCartItemsHtml($this);
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
public function getRecoveryUrl()
|
|
{
|
|
$driver = DriverManager::getDriver($this->provider);
|
|
|
|
if ($driver) {
|
|
return $driver->getRecoveryUrl($this);
|
|
}
|
|
|
|
if ($this->status != 'processing') {
|
|
return '';
|
|
}
|
|
|
|
return add_query_arg([
|
|
'fluentcrm' => 1,
|
|
'route' => 'general',
|
|
'handler' => 'fc_cart_' . $this->provider,
|
|
'fc_ab_hash' => $this->checkout_key
|
|
], home_url());
|
|
}
|
|
|
|
public function deleteCart()
|
|
{
|
|
if ($this->automation_id && $this->contact_id) {
|
|
FunnelHelper::removeSubscribersFromFunnel($this->automation_id, [$this->contact_id]);
|
|
}
|
|
|
|
$this->delete();
|
|
}
|
|
|
|
public function optOut()
|
|
{
|
|
if ($this->is_optout) {
|
|
return $this;
|
|
}
|
|
|
|
$originalStatus = $this->status;
|
|
$this->is_optout = 1;
|
|
$this->status = 'opt_out';
|
|
$this->save();
|
|
|
|
if (!$this->contact_id || !$this->automation_id) {
|
|
return $this;
|
|
}
|
|
|
|
if ($originalStatus == 'processing') {
|
|
FunnelHelper::removeSubscribersFromFunnel($this->automation_id, [$this->contact_id]);
|
|
$this->automation_id = null;
|
|
$this->save();
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
}
|