63 lines
2.4 KiB
PHP
63 lines
2.4 KiB
PHP
<?php
|
|||
|
|
|
||
|
|
namespace Modules\Core\Privacy\Providers;
|
||
|
|
|
||
|
|
use Lunar\Models\Cart;
|
||
|
|
use Lunar\Models\CartAddress;
|
||
|
|
use Modules\Core\Privacy\Contracts\PersonalDataProvider;
|
||
|
|
use Modules\Core\Privacy\CustomerSubject;
|
||
|
|
use Modules\Core\Privacy\ErasureOutcome;
|
||
|
|
use Modules\Core\Privacy\ProviderErasureResult;
|
||
|
|
use Modules\Core\Privacy\ProviderExportResult;
|
||
|
|
use Modules\Core\Privacy\UserSubject;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Carts and cart addresses (lunar_carts, lunar_cart_addresses) belong to the
|
||
|
|
* Customer (business account) via customer_id, not to an individual User, so this
|
||
|
|
* is Customer-scope only. Unlike Order/OrderAddress, an abandoned cart has no
|
||
|
|
* legal retention requirement, so its addresses are freely deleted. The Cart row
|
||
|
|
* itself is left alone (any completed order it produced is handled separately by
|
||
|
|
* OrderDataProvider, which is what retention law actually cares about) — only its
|
||
|
|
* address PII is removed.
|
||
|
|
*/
|
||
|
|
class CartDataProvider implements PersonalDataProvider
|
||
|
|
{
|
||
|
|
public function name(): string
|
||
|
|
{
|
||
|
|
return 'carts';
|
||
|
|
}
|
||
|
|
|
||
|
|
public function exportForCustomer(CustomerSubject $subject): ProviderExportResult
|
||
|
|
{
|
||
|
|
$addresses = CartAddress::whereIn('cart_id', Cart::where('customer_id', $subject->customerId)->pluck('id'))->get();
|
||
|
|
|
||
|
|
return new ProviderExportResult('carts', $addresses->map(fn (CartAddress $address) => [
|
||
|
|
'type' => $address->type,
|
||
|
|
'first_name' => $address->first_name,
|
||
|
|
'last_name' => $address->last_name,
|
||
|
|
'line_one' => $address->line_one,
|
||
|
|
'city' => $address->city,
|
||
|
|
'postcode' => $address->postcode,
|
||
|
|
'contact_email' => $address->contact_email,
|
||
|
|
'contact_phone' => $address->contact_phone,
|
||
|
|
])->all());
|
||
|
|
}
|
||
|
|
|
||
|
|
public function exportForUser(UserSubject $subject): ProviderExportResult
|
||
|
|
{
|
||
|
|
return new ProviderExportResult('carts', []);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function eraseForCustomer(CustomerSubject $subject): ProviderErasureResult
|
||
|
|
{
|
||
|
|
CartAddress::whereIn('cart_id', Cart::where('customer_id', $subject->customerId)->pluck('id'))->delete();
|
||
|
|
|
||
|
|
return new ProviderErasureResult('carts', ErasureOutcome::Erased);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function eraseForUser(UserSubject $subject): ProviderErasureResult
|
||
|
|
{
|
||
|
|
return new ProviderErasureResult('carts', ErasureOutcome::Skipped, 'Carts belong to Customer accounts, not individual users.');
|
||
|
|
}
|
||
|
|
}
|