Add method to get offers by articles with siblings, enhance display

This commit is contained in:
Ludovic CANDELLIER
2022-01-30 22:48:04 +01:00
parent 88d87ceaab
commit b325a44ee2
11 changed files with 129 additions and 60 deletions

View File

@@ -53,13 +53,13 @@ var jsCoreInclude = [
'build/js/include/form/upload.js', 'build/js/include/form/upload.js',
'build/js/include/form/validator.js', 'build/js/include/form/validator.js',
'build/js/include/layout/animate.js', 'build/js/include/layout/animate.js',
'build/js/include/layout/message.js', // 'build/js/include/layout/message.js',
// 'build/js/include/layout/modal.js', // 'build/js/include/layout/modal.js',
'build/js/include/layout/scroll.js', 'build/js/include/layout/scroll.js',
'build/js/include/layout/tooltip.js', 'build/js/include/layout/tooltip.js',
// 'build/js/include/datatable.js', // 'build/js/include/datatable.js',
'build/js/include/file.js', // 'build/js/include/file.js',
'build/js/include/uploader.js', // 'build/js/include/uploader.js',
] ]
var jsBundle = [ var jsBundle = [

View File

@@ -13,9 +13,9 @@ class ArticleController extends Controller
public function show($id) public function show($id)
{ {
$data = self::init(); $data = self::init();
$data['article'] = Articles::getArticle($id); $data['article'] = Articles::getArticleToSell($id);
// dump($data); dump($data);
// exit; exit;
return view('Shop.Articles.show', $data); return view('Shop.Articles.show', $data);
} }
} }

View File

@@ -50,6 +50,11 @@ class Article extends Model implements HasMedia
return $this->morphTo(); return $this->morphTo();
} }
public function siblings()
{
return $this->hasMany(Article::class, 'name', 'name');
}
public function tags() public function tags()
{ {
return $this->morphToMany(Tag::class, 'taggable'); return $this->morphToMany(Tag::class, 'taggable');

View File

@@ -4,11 +4,12 @@ namespace App\Models\Shop;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Znck\Eloquent\Traits\BelongsToThrough;
use App\Traits\Model\HasComments; use App\Traits\Model\HasComments;
class Offer extends Model class Offer extends Model
{ {
use HasComments; use BelongsToThrough, HasComments;
protected $guarded = ['id']; protected $guarded = ['id'];
protected $table = 'shop_offers'; protected $table = 'shop_offers';
@@ -18,6 +19,14 @@ class Offer extends Model
return $this->belongsTo(Article::class); return $this->belongsTo(Article::class);
} }
public function article_nature()
{
return $this->belongsToThrough(ArticleNature::class, Article::class, null, '', [
'App\Models\Shop\Article' => 'article_id',
'App\Models\Shop\ArticleNature' => 'article_nature_id',
]);
}
public function tariff() public function tariff()
{ {
return $this->belongsTo(Tariff::class); return $this->belongsTo(Tariff::class);
@@ -63,6 +72,11 @@ class Offer extends Model
return $query->where($this->table . '.article_id', $id); return $query->where($this->table . '.article_id', $id);
} }
public function scopeByArticles($query, $ids)
{
return $query->whereIn($this->table . '.article_id', $ids);
}
public function scopeByOffer($query, $id) public function scopeByOffer($query, $id)
{ {
return $query->where($this->table . '.id', $id); return $query->where($this->table . '.id', $id);

View File

@@ -27,6 +27,35 @@ class Articles
return $export; return $export;
} }
public static function getOffersGroupedByNature($id)
{
$article_ids = self::getSiblingsIds($id);
$offers = Offers::getOffersByArticles($article_ids);
dump($offers->toArray());
foreach ($offers as $offer) {
$data[$offer->article_nature->name][] = [
'name' => $offer->variation->name,
'tariff' => $offer->tariff,
];
}
return $data;
}
public static function getSiblingsIDs($id)
{
return self::getSiblings($id)->pluck('id')->toArray();
}
public static function getSiblings($id)
{
return Article::with('siblings')->find($id)->siblings;
}
public static function getOffersById($id)
{
return Offers::getOffersByArticle($id);
}
public static function getOptions() public static function getOptions()
{ {
return Article::orderBy('name', 'asc')->pluck('name', 'id')->toArray(); return Article::orderBy('name', 'asc')->pluck('name', 'id')->toArray();
@@ -47,6 +76,20 @@ class Articles
return Article::orderBy('name', 'asc')->get(); return Article::orderBy('name', 'asc')->get();
} }
public static function getArticleToSell($id)
{
$article = self::get($id);
$data = $article->toArray();
$data['description'] = (!empty($article->description)) ? $article->description : $article->product->description;
$data['image'] = self::getPreview($article->image);
$data['image_big'] = self::getImage($article->image);
$data['inherited'] = self::getInherited($id);
$data['categories'] = self::getCategoriesNameByArticle($article);
$data['tags'] = self::getTagsSlugByArticle($article);
$data['offers'] = self::getOffersById($id)->toArray();
return $data;
}
public static function getArticle($id) public static function getArticle($id)
{ {
$article = self::get($id); $article = self::get($id);

View File

@@ -7,6 +7,16 @@ use App\Models\Shop\Offer;
class Offers class Offers
{ {
public static function getOffersByArticles($articles_id)
{
return Offer::active()->with(['article_nature', 'tariff.price_lists.price_list_values', 'variation'])->byArticles($articles_id)->get();
}
public static function getOffersByArticle($article_id)
{
return Offer::active()->with('variation')->byArticle($article_id)->get();
}
public static function getThumbSrcById($id) public static function getThumbSrcById($id)
{ {
return self::getThumbSrc(self::get($id)); return self::getThumbSrc(self::get($id));

View File

@@ -12,6 +12,7 @@
"alexisgeneau/mailvalidate": "dev-master", "alexisgeneau/mailvalidate": "dev-master",
"arcanedev/log-viewer": "^8.1", "arcanedev/log-viewer": "^8.1",
"arrilot/laravel-widgets": "^3.13", "arrilot/laravel-widgets": "^3.13",
"awobaz/compoships": "^2.1",
"barryvdh/laravel-dompdf": "^0.9", "barryvdh/laravel-dompdf": "^0.9",
"barryvdh/laravel-snappy": "^0.4.7", "barryvdh/laravel-snappy": "^0.4.7",
"bencoderus/min-auth": "^1.0", "bencoderus/min-auth": "^1.0",

View File

@@ -54,5 +54,7 @@
"cancel": "Annuler", "cancel": "Annuler",
"save": "Sauver", "save": "Sauver",
"comments": "Notes internes", "comments": "Notes internes",
"comment_add": "Ajout de Note interne" "comment_add": "Ajout de Note interne",
"apply": "Appliquer",
"close": "Fermer"
} }

View File

@@ -8,7 +8,7 @@
<div class="card-body"> <div class="card-body">
<div class="row card-title"> <div class="row card-title">
<div class="col-10" style="font-weight: bold; color: green;"> <div class="col-10" style="font-weight: bold; color: green;">
<h2 style="font-size: 1.4em;">{{ $article['parent_name'] }}</h2> <h2 style="font-size: 1.3em;">{{ $article['parent_name'] }}</h2>
{{ $article['product_name'] }} {{ $article['product_name'] }}
</div> </div>
<div class="col-2 p-0 text-right" style="font-size: 2em; color: red;"> <div class="col-2 p-0 text-right" style="font-size: 2em; color: red;">

View File

@@ -1,33 +1,31 @@
<a href="{{ route('Shop.Articles.show', ['id' => $article['semences']['article_id'] ?? false ]) }}"> <div class="row pb-3" style="background-color: #CCC;">
<div class="row pb-3">
<div class="col-12">
<div class="card-title" style="font-weight: bold; color: green;">{{ $product_name }}</div>
</div>
<div class="col-12">
<div class="row">
<div class="col-8"> <div class="col-8">
<div class="row"> <div class="row pt-2">
<div class="col-2"> <div class="col-10">
<div class="row"> <a href="{{ route('Shop.Articles.show', ['id' => $article['semences']['article_id'] ?? false ]) }}" class="text-decoration-none">
<div class="col-9"> <div style="font-weight: bold; color: green; font-size: 1.5em;">{{ $product_name }}</div>
<img src="{{ App\Repositories\Shop\Articles::getPreviewSrc($article['image'] ?? false) }}" class="card-img-top" alt="..."> </a>
</div> </div>
<div class="col-3 text-center"> <div class="col-2 text-right">
<span style="font-size: 2em; color: red;"> <span style="font-size: 2em; color: red;">
<i class="fa fa-heart"></i> <i class="fa fa-heart"></i>
</span> </span>
</div> </div>
</div> </div>
<a href="{{ route('Shop.Articles.show', ['id' => $article['semences']['article_id'] ?? false ]) }}" class="text-decoration-none">
<div class="row">
<div class="col-2">
<img src="{{ App\Repositories\Shop\Articles::getPreviewSrc($article['image'] ?? false) }}" class="card-img-top" alt="...">
</div> </div>
<div class="col-10"> <div class="col-10">
{!! $article['description'] !!} {!! $article['description'] !!}
</div> </div>
</div> </div>
</a>
</div> </div>
<div class="col-4"> <div class="col-4">
<p class="card-text"> <div class="row h-100" style="color: green; display: flex;">
<div class="row" style="color: green;"> <div class="col-6 text-center" style="background-color: rgba(0,128,0,0.3); margin: auto;">
<div class="col-6 text-center">
@if ($article['semences'] ?? false) @if ($article['semences'] ?? false)
<span style="font-size: 1.4em; font-weight: bold;">{{ $article['semences']['price'] ?? null }}</span> <br> <span style="font-size: 1.4em; font-weight: bold;">{{ $article['semences']['price'] ?? null }}</span> <br>
{{ $article['semences']['variation'] }} {{ $article['semences']['variation'] }}
@@ -47,9 +45,5 @@
@endif @endif
</div> </div>
</div> </div>
</p>
</div> </div>
</div> </div>
</div>
</div>
</a>

View File

@@ -1,13 +1,13 @@
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
<button type="button" class="btn btn-success"> <button type="button" class="btn btn-success">
<i class="fa fa-2x fa-seedling"></i> <i class="fa fa-3x fa-seedling float-left"></i>
Ajouter au panier la liste des <strong>semences</strong> Ajouter au panier la liste des <strong>semences</strong>
</button> </button>
</div> </div>
<div class="col-6"> <div class="col-6">
<button type="button" class="btn btn-warning"> <button type="button" class="btn btn-warning">
<i class="fab fa-2x fa-pagelines"></i> <i class="fab fa-3x fa-pagelines float-left"></i>
Ajouter au panier la liste des <strong>plants</strong> Ajouter au panier la liste des <strong>plants</strong>
</button> </button>
</div> </div>