169 lines
5.4 KiB
PHP
169 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace App;
|
|
|
|
use DB;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
class BusinessLocation extends Model
|
|
{
|
|
/**
|
|
* The attributes that aren't mass assignable.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $guarded = ['id'];
|
|
|
|
/**
|
|
* The attributes that should be cast to native types.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $casts = [
|
|
'featured_products' => 'array',
|
|
];
|
|
|
|
/**
|
|
* Return list of locations for a business
|
|
*
|
|
* @param int $business_id
|
|
* @param bool $show_all = false
|
|
* @param array $receipt_printer_type_attribute =
|
|
* @return array
|
|
*/
|
|
public static function forDropdown($business_id, $show_all = false, $receipt_printer_type_attribute = false, $append_id = true, $check_permission = true)
|
|
{
|
|
$query = BusinessLocation::where('business_id', $business_id)->Active();
|
|
|
|
if ($check_permission) {
|
|
$permitted_locations = auth()->user()->permitted_locations();
|
|
if ($permitted_locations != 'all') {
|
|
$query->whereIn('id', $permitted_locations);
|
|
}
|
|
}
|
|
|
|
if ($append_id) {
|
|
$query->select(
|
|
DB::raw("IF(location_id IS NULL OR location_id='', name, CONCAT(name, ' (', location_id, ')')) AS name"),
|
|
'id',
|
|
'receipt_printer_type',
|
|
'selling_price_group_id',
|
|
'default_payment_accounts',
|
|
'invoice_scheme_id',
|
|
'invoice_layout_id',
|
|
'sale_invoice_scheme_id'
|
|
);
|
|
}
|
|
|
|
$result = $query->get();
|
|
|
|
$locations = $result->pluck('name', 'id');
|
|
|
|
$price_groups = SellingPriceGroup::forDropdown($business_id);
|
|
|
|
if ($show_all) {
|
|
$locations->prepend(__('report.all_locations'), '');
|
|
}
|
|
|
|
if ($receipt_printer_type_attribute) {
|
|
$attributes = collect($result)->mapWithKeys(function ($item) use ($price_groups) {
|
|
$default_payment_accounts = json_decode($item->default_payment_accounts, true);
|
|
$default_payment_accounts['advance'] = [
|
|
'is_enabled' => 1,
|
|
'account' => null,
|
|
];
|
|
|
|
return [$item->id => [
|
|
'data-receipt_printer_type' => $item->receipt_printer_type,
|
|
'data-default_price_group' => ! empty($item->selling_price_group_id) && array_key_exists($item->selling_price_group_id, $price_groups) ? $item->selling_price_group_id : null,
|
|
'data-default_payment_accounts' => json_encode($default_payment_accounts),
|
|
'data-default_sale_invoice_scheme_id' => $item->sale_invoice_scheme_id,
|
|
'data-default_invoice_scheme_id' => $item->invoice_scheme_id,
|
|
'data-default_invoice_layout_id' => $item->invoice_layout_id,
|
|
],
|
|
];
|
|
})->all();
|
|
|
|
return ['locations' => $locations, 'attributes' => $attributes];
|
|
} else {
|
|
return $locations;
|
|
}
|
|
}
|
|
|
|
public function price_group()
|
|
{
|
|
return $this->belongsTo(\App\SellingPriceGroup::class, 'selling_price_group_id');
|
|
}
|
|
|
|
/**
|
|
* Scope a query to only include active location.
|
|
*
|
|
* @param \Illuminate\Database\Eloquent\Builder $query
|
|
* @return \Illuminate\Database\Eloquent\Builder
|
|
*/
|
|
public function scopeActive($query)
|
|
{
|
|
return $query->where('is_active', 1);
|
|
}
|
|
|
|
/**
|
|
* Get the featured products.
|
|
*
|
|
* @return array/object
|
|
*/
|
|
public function getFeaturedProducts($is_array = false, $check_location = true)
|
|
{
|
|
if (empty($this->featured_products)) {
|
|
return [];
|
|
}
|
|
$query = Variation::whereIn('variations.id', $this->featured_products)
|
|
->join('product_locations as pl', 'pl.product_id', '=', 'variations.product_id')
|
|
->join('products as p', 'p.id', '=', 'variations.product_id')
|
|
->where('p.not_for_selling', 0)
|
|
->with(['product_variation', 'product', 'media'])
|
|
->select('variations.*');
|
|
|
|
if ($check_location) {
|
|
$query->where('pl.location_id', $this->id);
|
|
}
|
|
$featured_products = $query->get();
|
|
if ($is_array) {
|
|
$array = [];
|
|
foreach ($featured_products as $featured_product) {
|
|
$array[$featured_product->id] = $featured_product->full_name;
|
|
}
|
|
|
|
return $array;
|
|
}
|
|
|
|
return $featured_products;
|
|
}
|
|
|
|
public function getLocationAddressAttribute()
|
|
{
|
|
$location = $this;
|
|
$address_line_1 = [];
|
|
if (! empty($location->landmark)) {
|
|
$address_line_1[] = $location->landmark;
|
|
}
|
|
if (! empty($location->city)) {
|
|
$address_line_1[] = $location->city;
|
|
}
|
|
if (! empty($location->state)) {
|
|
$address_line_1[] = $location->state;
|
|
}
|
|
if (! empty($location->zip_code)) {
|
|
$address_line_1[] = $location->zip_code;
|
|
}
|
|
$address = implode(', ', $address_line_1);
|
|
$address_line_2 = [];
|
|
if (! empty($location->country)) {
|
|
$address_line_2[] = $location->country;
|
|
}
|
|
$address .= '<br>';
|
|
$address .= implode(', ', $address_line_2);
|
|
|
|
return $address;
|
|
}
|
|
}
|