migrate to gtea from bistbucket
This commit is contained in:
@@ -0,0 +1,235 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\WarehouseAddon\App\Http\Controllers;
|
||||
|
||||
use App\Models\Branch;
|
||||
use App\Models\Warehouse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Product;
|
||||
|
||||
class AcnooWarehouseController extends Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('check.permission:warehouses.read')->only(['index']);
|
||||
$this->middleware('check.permission:warehouses.create')->only(['store']);
|
||||
$this->middleware('check.permission:warehouses.update')->only(['update']);
|
||||
$this->middleware('check.permission:warehouses.delete')->only(['destroy', 'deleteAll']);
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$businessId = auth()->user()->business_id;
|
||||
$branches = Branch::withTrashed()->where('business_id', $businessId)->latest()->get();
|
||||
|
||||
$warehouses = Warehouse::with('branch:id,name')
|
||||
->where('business_id', $businessId)
|
||||
->withSum(['stocks as total_qty' => function ($query) {
|
||||
$query->when(request()->has('branch_id'), function ($q) {
|
||||
$q->whereColumn('stocks.branch_id', 'warehouses.branch_id');
|
||||
});
|
||||
}], 'productStock')
|
||||
->withSum(['stocks as total_value' => function ($query) {
|
||||
$query->when(request()->has('branch_id'), function ($q) {
|
||||
$q->whereColumn('stocks.branch_id', 'warehouses.branch_id');
|
||||
});
|
||||
}], DB::raw('productStock * productPurchasePrice'))
|
||||
->when($request->branch_id, function ($q) use ($request) {
|
||||
$q->where('branch_id', $request->branch_id);
|
||||
})
|
||||
->when(request('search'), function ($q) use ($request) {
|
||||
$q->where(function ($q) use ($request) {
|
||||
$q->where('name', 'like', '%' . $request->search . '%')
|
||||
->orWhere('email', 'like', '%' . $request->search . '%')
|
||||
->orWhere('address', 'like', '%' . $request->search . '%')
|
||||
->orWhere('phone', 'like', '%' . $request->search . '%')
|
||||
->orWhereHas('branch', function ($q) use ($request) {
|
||||
$q->where('name', 'like', '%' . $request->search . '%');
|
||||
});
|
||||
});
|
||||
})
|
||||
->latest()
|
||||
->paginate($request->per_page ?? 20)->appends($request->query());
|
||||
|
||||
if ($request->ajax()) {
|
||||
return response()->json([
|
||||
'data' => view('warehouseaddon::warehouse.datas', compact('warehouses', 'branches'))->render()
|
||||
]);
|
||||
}
|
||||
|
||||
return view('warehouseaddon::warehouse.index', compact('warehouses', 'branches'));
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$user = auth()->user();
|
||||
|
||||
$request->validate([
|
||||
'name' => 'required|string|max:255',
|
||||
'phone' => 'nullable|string|max:20',
|
||||
'address' => 'nullable|string|max:500',
|
||||
'email' => [
|
||||
'nullable',
|
||||
'email',
|
||||
'max:255',
|
||||
Rule::unique('warehouses')->where(fn ($q) =>
|
||||
$q->where('business_id', $user->business_id)
|
||||
),
|
||||
],
|
||||
]);
|
||||
|
||||
$data = $request->except(['business_id', 'branch_id']);
|
||||
$data['business_id'] = $user->business_id;
|
||||
|
||||
if (moduleCheck('MultiBranchAddon')) {
|
||||
$data['branch_id'] = $request->branch_id ?? $user->branch_id ?? $user->active_branch_id;
|
||||
}
|
||||
|
||||
Warehouse::create($data);
|
||||
|
||||
return response()->json([
|
||||
'message' => __('Warehouse saved successfully.'),
|
||||
'redirect' => route('warehouse.warehouses.index'),
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$user = auth()->user();
|
||||
$warehouse = Warehouse::findOrFail($id);
|
||||
|
||||
$request->validate([
|
||||
'name' => 'required|string|max:255',
|
||||
'phone' => 'nullable|string|max:20',
|
||||
'address' => 'nullable|string|max:500',
|
||||
'email' => [
|
||||
'nullable',
|
||||
'email',
|
||||
'max:255',
|
||||
Rule::unique('warehouses')
|
||||
->ignore($warehouse->id)
|
||||
->where(fn ($q) => $q->where('business_id', $user->business_id)),
|
||||
],
|
||||
]);
|
||||
|
||||
$data = $request->except(['business_id', 'branch_id']);
|
||||
|
||||
if (moduleCheck('MultiBranchAddon')) {
|
||||
$data['branch_id'] = $request->branch_id ?? $user->branch_id ?? $user->active_branch_id;
|
||||
}
|
||||
|
||||
$warehouse->update($data);
|
||||
|
||||
return response()->json([
|
||||
'message' => __('Warehouse updated successfully.'),
|
||||
'redirect' => route('warehouse.warehouses.index'),
|
||||
]);
|
||||
}
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
$warehouse = Warehouse::findOrFail($id);
|
||||
$warehouse->delete();
|
||||
|
||||
return response()->json([
|
||||
'message' => __('Warehouse deleted successfully'),
|
||||
'redirect' => route('warehouse.warehouses.index'),
|
||||
]);
|
||||
}
|
||||
|
||||
public function deleteAll(Request $request)
|
||||
{
|
||||
Warehouse::whereIn('id', $request->ids)->delete();
|
||||
|
||||
return response()->json([
|
||||
'message' => __('Selected items deleted successfully.'),
|
||||
'redirect' => route('warehouse.warehouses.index'),
|
||||
]);
|
||||
}
|
||||
|
||||
public function branchWiseWarehouses(Request $request)
|
||||
{
|
||||
$user = auth()->user();
|
||||
|
||||
// Determine the branch
|
||||
$branchId = $user->branch_id ?? $user->active_branch_id;
|
||||
|
||||
$query = Warehouse::query()->where('business_id', $user->business_id);
|
||||
|
||||
if ($request->filled('branch_id')) {
|
||||
$query->where('branch_id', $request->branch_id);
|
||||
} elseif ($branchId) {
|
||||
$query->where('branch_id', $branchId);
|
||||
}
|
||||
|
||||
$warehouses = $query->get();
|
||||
|
||||
return response()->json($warehouses);
|
||||
}
|
||||
|
||||
public function warehouseProduct(Request $request)
|
||||
{
|
||||
$user = auth()->user();
|
||||
$businessId = $user->business_id;
|
||||
$activeBranchId = $user->branch_id ?? $user->active_branch_id;
|
||||
|
||||
$search = $request->input('search');
|
||||
|
||||
$products = Product::with([
|
||||
'stocks',
|
||||
'unit:id,unitName',
|
||||
'brand:id,brandName',
|
||||
'category:id,categoryName',
|
||||
'warehouse:id,name',
|
||||
'rack:id,name',
|
||||
'shelf:id,name'
|
||||
])
|
||||
->where('business_id', $businessId)
|
||||
->whereHas('stocks', function ($query) use ($activeBranchId) {
|
||||
$query->whereNotNull('warehouse_id')
|
||||
->when($activeBranchId, fn($q) => $q->where('branch_id', $activeBranchId));
|
||||
})
|
||||
->when($search, function ($q) use ($search) {
|
||||
$q->where(function ($q) use ($search) {
|
||||
$q->where('productName', 'like', '%' . $search . '%')
|
||||
->orWhere('productCode', 'like', '%' . $search . '%')
|
||||
->orWhere('productPurchasePrice', 'like', '%' . $search . '%')
|
||||
->orWhere('productSalePrice', 'like', '%' . $search . '%')
|
||||
->orWhereHas('category', function ($q) use ($search) {
|
||||
$q->where('categoryName', 'like', '%' . $search . '%');
|
||||
})
|
||||
->orWhereHas('brand', function ($q) use ($search) {
|
||||
$q->where('brandName', 'like', '%' . $search . '%');
|
||||
})
|
||||
->orWhereHas('unit', function ($q) use ($search) {
|
||||
$q->where('unitName', 'like', '%' . $search . '%');
|
||||
});
|
||||
});
|
||||
})
|
||||
->latest()
|
||||
->paginate($request->per_page ?? 20)->appends($request->query());
|
||||
|
||||
if ($request->ajax()) {
|
||||
return response()->json([
|
||||
'data' => view('warehouseaddon::warehouse.products.datas', compact('products'))->render()
|
||||
]);
|
||||
}
|
||||
|
||||
return view('warehouseaddon::warehouse.products.index', compact('products'));
|
||||
}
|
||||
|
||||
public function getWarehouses()
|
||||
{
|
||||
$business_id = auth()->user()->business_id;
|
||||
|
||||
$warehouses = Warehouse::where('business_id', $business_id)->select('id', 'name')->latest()->get();
|
||||
|
||||
return response()->json([
|
||||
'warehouses' => $warehouses,
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\WarehouseAddon\App\Http\Controllers\Api;
|
||||
|
||||
use App\Models\Warehouse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\Rule;
|
||||
use App\Http\Controllers\Controller;
|
||||
|
||||
class WarehouseController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$businessId = auth()->user()->business_id;
|
||||
$data = Warehouse::with(['products.stocks'])
|
||||
->where('business_id', $businessId)
|
||||
->latest()
|
||||
->get()
|
||||
->map(function ($warehouse) {
|
||||
$totalQty = 0;
|
||||
$totalValue = 0;
|
||||
|
||||
foreach ($warehouse->products as $product) {
|
||||
foreach ($product->stocks as $stock) {
|
||||
$totalQty += $stock->productStock;
|
||||
$totalValue += $stock->productStock * $stock->productPurchasePrice;
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $warehouse->id,
|
||||
'business_id' => $warehouse->business_id,
|
||||
'name' => $warehouse->name,
|
||||
'phone' => $warehouse->phone,
|
||||
'email' => $warehouse->email,
|
||||
'address' => $warehouse->address,
|
||||
'total_quantity' => $totalQty,
|
||||
'total_value' => $totalValue,
|
||||
];
|
||||
});
|
||||
|
||||
return response()->json([
|
||||
'message' => __('Data fetched successfully.'),
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'name' => 'required|string|max:255',
|
||||
'phone' => 'nullable|string|max:20',
|
||||
'address' => 'nullable|string|max:500',
|
||||
'email' => [
|
||||
'nullable',
|
||||
'email',
|
||||
'max:255',
|
||||
Rule::unique('warehouses')->where(function ($query) {
|
||||
return $query->where('business_id', auth()->user()->business_id);
|
||||
}),
|
||||
],
|
||||
]);
|
||||
|
||||
$data = Warehouse::create($request->except('business_id') + [
|
||||
'business_id' => auth()->user()->business_id,
|
||||
'branch_id' => $request->branch_id ?? auth()->user()->branch_id ?? auth()->user()->active_branch_id,
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'message' => __('Data saved successfully.'),
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(Request $request, string $id)
|
||||
{
|
||||
$warehouse = Warehouse::find($id);
|
||||
if (!$warehouse) {
|
||||
return response()->json([
|
||||
'message' => __('Warehouse not found.'),
|
||||
'data' => null,
|
||||
], 404);
|
||||
}
|
||||
|
||||
$request->validate([
|
||||
'name' => 'required|string|max:255',
|
||||
'phone' => 'nullable|string|max:20',
|
||||
'address' => 'nullable|string|max:500',
|
||||
'email' => [
|
||||
'nullable',
|
||||
'email',
|
||||
'max:255',
|
||||
Rule::unique('warehouses')->ignore($warehouse->id)->where(function ($query) {
|
||||
return $query->where('business_id', auth()->user()->business_id);
|
||||
}),
|
||||
],
|
||||
]);
|
||||
|
||||
$warehouse->update($request->except('branch_id', 'business_id') + [
|
||||
'branch_id' => $request->branch_id ?? auth()->user()->branch_id ?? auth()->user()->active_branch_id,
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'message' => __('Data saved successfully.'),
|
||||
'data' => $warehouse,
|
||||
]);
|
||||
}
|
||||
|
||||
public function destroy(string $id)
|
||||
{
|
||||
$warehouse = Warehouse::find($id);
|
||||
|
||||
if (!$warehouse) {
|
||||
return response()->json([
|
||||
'message' => __('Warehouse not found.'),
|
||||
], 404);
|
||||
}
|
||||
|
||||
$warehouse->delete();
|
||||
return response()->json([
|
||||
'message' => __('Data deleted successfully.'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
0
Modules/WarehouseAddon/App/Providers/.gitkeep
Normal file
0
Modules/WarehouseAddon/App/Providers/.gitkeep
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\WarehouseAddon\App\Providers;
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
|
||||
|
||||
class RouteServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* The module namespace to assume when generating URLs to actions.
|
||||
*/
|
||||
protected string $moduleNamespace = 'Modules\WarehouseAddon\App\Http\Controllers';
|
||||
|
||||
/**
|
||||
* Called before routes are registered.
|
||||
*
|
||||
* Register any model bindings or pattern based filters.
|
||||
*/
|
||||
public function boot(): void
|
||||
{
|
||||
parent::boot();
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the routes for the application.
|
||||
*/
|
||||
public function map(): void
|
||||
{
|
||||
$this->mapApiRoutes();
|
||||
|
||||
$this->mapWebRoutes();
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the "web" routes for the application.
|
||||
*
|
||||
* These routes all receive session state, CSRF protection, etc.
|
||||
*/
|
||||
protected function mapWebRoutes(): void
|
||||
{
|
||||
Route::middleware('web')
|
||||
->namespace($this->moduleNamespace)
|
||||
->group(module_path('WarehouseAddon', '/routes/web.php'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the "api" routes for the application.
|
||||
*
|
||||
* These routes are typically stateless.
|
||||
*/
|
||||
protected function mapApiRoutes(): void
|
||||
{
|
||||
Route::prefix('api')
|
||||
->middleware('api')
|
||||
->namespace($this->moduleNamespace)
|
||||
->group(module_path('WarehouseAddon', '/routes/api.php'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\WarehouseAddon\App\Providers;
|
||||
|
||||
use Illuminate\Support\Facades\Blade;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
class WarehouseAddonServiceProvider extends ServiceProvider
|
||||
{
|
||||
protected string $moduleName = 'WarehouseAddon';
|
||||
|
||||
protected string $moduleNameLower = 'warehouseaddon';
|
||||
|
||||
/**
|
||||
* Boot the application events.
|
||||
*/
|
||||
public function boot(): void
|
||||
{
|
||||
$this->registerCommands();
|
||||
$this->registerCommandSchedules();
|
||||
$this->registerTranslations();
|
||||
$this->registerConfig();
|
||||
$this->registerViews();
|
||||
$this->loadMigrationsFrom(module_path($this->moduleName, 'Database/migrations'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the service provider.
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
$this->app->register(RouteServiceProvider::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register commands in the format of Command::class
|
||||
*/
|
||||
protected function registerCommands(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Register command Schedules.
|
||||
*/
|
||||
protected function registerCommandSchedules(): void
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Register translations.
|
||||
*/
|
||||
public function registerTranslations(): void
|
||||
{
|
||||
$langPath = resource_path('lang/modules/' . $this->moduleNameLower);
|
||||
|
||||
if (is_dir($langPath)) {
|
||||
$this->loadTranslationsFrom($langPath, $this->moduleNameLower);
|
||||
$this->loadJsonTranslationsFrom($langPath);
|
||||
} else {
|
||||
$this->loadTranslationsFrom(module_path($this->moduleName, 'lang'), $this->moduleNameLower);
|
||||
$this->loadJsonTranslationsFrom(module_path($this->moduleName, 'lang'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register config.
|
||||
*/
|
||||
protected function registerConfig(): void
|
||||
{
|
||||
$this->publishes([module_path($this->moduleName, 'config/config.php') => config_path($this->moduleNameLower . '.php')], 'config');
|
||||
$this->mergeConfigFrom(module_path($this->moduleName, 'config/config.php'), $this->moduleNameLower);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register views.
|
||||
*/
|
||||
public function registerViews(): void
|
||||
{
|
||||
$viewPath = resource_path('views/modules/' . $this->moduleNameLower);
|
||||
$sourcePath = module_path($this->moduleName, 'resources/views');
|
||||
|
||||
$this->publishes([$sourcePath => $viewPath], ['views', $this->moduleNameLower . '-module-views']);
|
||||
|
||||
$this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower);
|
||||
|
||||
$componentNamespace = str_replace('/', '\\', config('modules.namespace') . '\\' . $this->moduleName . '\\' . config('modules.paths.generator.component-class.path'));
|
||||
Blade::componentNamespace($componentNamespace, $this->moduleNameLower);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the services provided by the provider.
|
||||
*/
|
||||
public function provides(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
private function getPublishableViewPaths(): array
|
||||
{
|
||||
$paths = [];
|
||||
foreach (config('view.paths') as $path) {
|
||||
if (is_dir($path . '/modules/' . $this->moduleNameLower)) {
|
||||
$paths[] = $path . '/modules/' . $this->moduleNameLower;
|
||||
}
|
||||
}
|
||||
|
||||
return $paths;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user