id, (int) $deliveries['address_id'], 1);
}
if (! empty($deliveries['zipcode']) && ! empty($deliveries['city'])) {
$payload = $deliveries;
unset($payload['address_id']);
$payload['customer_id'] = $customer->id;
$payload['type'] = 1;
$newAddress = self::store($payload);
self::setDefault($customer->id, $newAddress->id, 1);
}
}
$invoices = $data['invoices'] ?? false;
if ($invoices) {
if (! empty($invoices['address_id'])) {
self::setDefault($customer->id, (int) $invoices['address_id'], 2);
}
if (! empty($invoices['zipcode']) && ! empty($invoices['city'])) {
$payload = $invoices;
unset($payload['address_id']);
$payload['customer_id'] = $customer->id;
$payload['type'] = 2;
$newAddress = self::store($payload);
self::setDefault($customer->id, $newAddress->id, 2);
}
}
}
public static function createByCustomer($customerId, $data)
{
self::addDeliveryAddress($customerId, $data);
self::addInvoiceAddress($customerId, $data);
}
public static function addDeliveryAddress($customerId, $data)
{
$delivery = $data['use_for_delivery'] ?? false;
$data = array_merge($data, [
'address' => $delivery ? $data['delivery_address'] ?? $data['address'] : $data['address'],
'address2' => $delivery ? $data['delivery_address2'] ?? $data['address2'] : $data['address2'],
'zipcode' => $delivery ? $data['delivery_zipcode'] ?? $data['zipcode'] : $data['zipcode'],
'city' => $delivery ? $data['delivery_city'] ?? $data['city'] : $data['city'],
]);
return self::addAddress($customerId, $data, 2);
}
public static function addInvoiceAddress($customerId, $data)
{
return self::addAddress($customerId, $data, 1);
}
public static function addAddress($customerId, $data, $type)
{
$name = $data['company'] ? $data['company'] : $data['first_name'].' '.$data['last_name'];
$data = [
'customer_id' => $customerId,
'type' => $type,
'name' => $name,
'address' => $data['address'],
'address2' => $data['address2'],
'zipcode' => $data['zipcode'],
'city' => $data['city'],
];
return self::store($data);
}
public static function getInvoiceAddress($customerId)
{
$address = CustomerAddress::byCustomer($customerId)
->byInvoicing()
->orderByDesc('priority')
->orderBy('id')
->first();
return $address ?? self::getByCustomer($customerId);
}
public static function getDeliveryAddress($customerId)
{
$address = CustomerAddress::byCustomer($customerId)
->byDelivery()
->orderByDesc('priority')
->orderBy('id')
->first();
return $address ?? self::getByCustomer($customerId);
}
public static function getByCustomer($customerId = false)
{
$customer = Customers::get($customerId);
return $customer ? $customer->only(['address', 'adress2', 'zipcode', 'city']) : false;
}
public static function getIconByType($type)
{
return ((int) $type === 1) ? '' : '';
}
public static function setDefault($customerId, $addressId, $type)
{
if (! $addressId) {
return;
}
$address = self::get($addressId);
if (! $address || (int) $address->customer_id !== (int) $customerId || (int) $address->type !== (int) $type) {
return;
}
self::getModel()->byCustomer($customerId)->byType($type)->update(['priority' => null]);
$address->priority = 1;
$address->save();
}
public static function ensureDefault($customerId, $type)
{
$hasDefault = self::getModel()->byCustomer($customerId)->byType($type)->where('priority', 1)->exists();
if ($hasDefault) {
return;
}
$address = self::getModel()->byCustomer($customerId)->byType($type)->orderBy('id')->first();
if ($address) {
$address->priority = 1;
$address->save();
}
}
public static function toggleActive($id, $active)
{
return self::update(['active' => $active], $id);
}
public static function getModel()
{
return CustomerAddress::query();
}
}