125 lines
3.5 KiB
PHP
125 lines
3.5 KiB
PHP
<?php namespace App\Http\Controllers\App;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Supplier;
|
|
use Illuminate\Http\Request;
|
|
use Notsoweb\ApiResponse\Enums\ApiResponse;
|
|
|
|
class SupplierController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$query = Supplier::query();
|
|
|
|
// Filtro por búsqueda
|
|
if ($request->has('q')) {
|
|
$query->where(function($q) use ($request) {
|
|
$q->where('business_name', 'like', "%{$request->q}%")
|
|
->orWhere('rfc', 'like', "%{$request->q}%");
|
|
});
|
|
}
|
|
|
|
// Filtro por estado
|
|
if ($request->has('is_active')) {
|
|
$query->where('is_active', $request->is_active);
|
|
}
|
|
|
|
$suppliers = $query->orderBy('business_name')
|
|
->paginate(config('app.pagination'));
|
|
|
|
return ApiResponse::OK->response([
|
|
'suppliers' => $suppliers
|
|
]);
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$validated = $request->validate([
|
|
'business_name' => 'required|string|max:255',
|
|
'email' => 'nullable|email',
|
|
'phone' => 'nullable|string|max:10',
|
|
'rfc' => 'nullable|string|unique:suppliers,rfc',
|
|
'address' => 'nullable|string',
|
|
'postal_code' => 'nullable|string',
|
|
'notes' => 'nullable|string',
|
|
]);
|
|
|
|
$supplier = Supplier::create($validated);
|
|
|
|
return ApiResponse::CREATED->response([
|
|
'supplier' => $supplier
|
|
]);
|
|
}
|
|
|
|
public function show(Supplier $supplier)
|
|
{
|
|
return ApiResponse::OK->response([
|
|
'supplier' => $supplier->load('inventoryMovements')
|
|
]);
|
|
}
|
|
|
|
public function update(Request $request, Supplier $supplier)
|
|
{
|
|
$validated = $request->validate([
|
|
'business_name' => 'nullable|string|max:255',
|
|
'email' => 'nullable|email',
|
|
'phone' => 'nullable|string|max:10',
|
|
'rfc' => 'nullable|string|unique:suppliers,rfc,' . $supplier->id,
|
|
'address' => 'nullable|string',
|
|
'postal_code' => 'nullable|string',
|
|
'notes' => 'nullable|string',
|
|
]);
|
|
|
|
$supplier->update($validated);
|
|
|
|
return ApiResponse::OK->response([
|
|
'supplier' => $supplier->fresh()
|
|
]);
|
|
}
|
|
|
|
public function destroy(Supplier $supplier)
|
|
{
|
|
$supplier->delete();
|
|
return ApiResponse::OK->response();
|
|
}
|
|
|
|
/**
|
|
* Productos suministrados por el proveedor
|
|
*/
|
|
public function products(Supplier $supplier)
|
|
{
|
|
$products = $supplier->suppliedProducts()
|
|
->with(['category', 'price'])
|
|
->paginate(config('app.pagination'));
|
|
|
|
return ApiResponse::OK->response([
|
|
'products' => $products
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Historial de compras al proveedor
|
|
*/
|
|
public function purchases(Supplier $supplier, Request $request)
|
|
{
|
|
$query = $supplier->inventoryMovements()
|
|
->with(['inventory', 'warehouseTo', 'user'])
|
|
->orderBy('created_at', 'desc');
|
|
|
|
if ($request->has('from_date')) {
|
|
$query->whereDate('created_at', '>=', $request->from_date);
|
|
}
|
|
|
|
if ($request->has('to_date')) {
|
|
$query->whereDate('created_at', '<=', $request->to_date);
|
|
}
|
|
|
|
$purchases = $query->paginate(config('app.pagination'));
|
|
|
|
return ApiResponse::OK->response([
|
|
'purchases' => $purchases,
|
|
'total_amount' => $supplier->total_purchases
|
|
]);
|
|
}
|
|
}
|