pdv.backend/app/Http/Controllers/App/SupplierController.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
]);
}
}