diff --git a/Modules/Branch/Http/Controllers/BranchController.php b/Modules/Branch/Http/Controllers/BranchController.php
index f8d9b122..8af40292 100644
--- a/Modules/Branch/Http/Controllers/BranchController.php
+++ b/Modules/Branch/Http/Controllers/BranchController.php
@@ -89,4 +89,17 @@ class BranchController extends Controller
return redirect()->route('branch.index')
->with('success', 'Branch deleted successfully.');
}
+
+ public function switchBranch($branchId)
+ {
+ $branch = Branch::findOrFail($branchId);
+
+ // Update user's active branch
+ auth()->user()->update(['active_branch_id' => $branch->id]);
+
+ // Store in session
+ session(['active_branch_id' => $branch->id]);
+
+ return redirect()->back()->with('success', 'Branch switched successfully to ' . $branch->name);
+ }
}
\ No newline at end of file
diff --git a/Modules/Branch/Routes/web.php b/Modules/Branch/Routes/web.php
index cd6c6b24..03e454fa 100644
--- a/Modules/Branch/Routes/web.php
+++ b/Modules/Branch/Routes/web.php
@@ -5,4 +5,5 @@ use Modules\Branch\Http\Controllers\BranchController;
Route::middleware(['auth'])->group(function () {
Route::resource('branch', BranchController::class);
+ Route::get('/branch/switch/{branch}', [BranchController::class, 'switchBranch'])->name('branch.switch');
});
\ No newline at end of file
diff --git a/Modules/Product/DataTables/ProductDataTable.php b/Modules/Product/DataTables/ProductDataTable.php
index 1a8bc310..efd09d4e 100644
--- a/Modules/Product/DataTables/ProductDataTable.php
+++ b/Modules/Product/DataTables/ProductDataTable.php
@@ -15,12 +15,12 @@ class ProductDataTable extends DataTable
public function dataTable($query)
{
return datatables()
- ->eloquent($query)
+ ->query($query)
->addColumn('action', function ($data) {
return view('product::products.partials.actions', compact('data'));
})
->addColumn('product_image', function ($data) {
- $url = $data->getFirstMediaUrl('images');
+ $url = Product::find($data->id)->getFirstMediaUrl('images');
return '
';
})
->addColumn('product_name', function ($data) {
@@ -34,10 +34,26 @@ class ProductDataTable extends DataTable
public function query(Product $model)
{
- return $model->newQuery()
- ->with('category')
- ->leftJoin(DB::raw('(SELECT product_id, SUM(quantity) as total_quantity FROM product_batches GROUP BY product_id) as pb'), 'products.id', '=', 'pb.product_id')
- ->select('products.*', DB::raw('COALESCE(pb.total_quantity, 0) as product_quantity'));
+ $products = DB::table('products')
+ ->leftJoinSub(
+ DB::table('product_batches')
+ ->select('product_id', DB::raw('SUM(qty) as total_quantity'))
+ ->groupBy('product_id'),
+ 'pb',
+ 'products.id',
+ '=',
+ 'pb.product_id'
+ )
+ ->select(
+ 'products.id',
+ 'products.product_name',
+ 'products.product_code',
+ 'products.product_unit',
+ 'products.category_id',
+ DB::raw('COALESCE(pb.total_quantity, 0) as product_quantity')
+ );
+
+ return $products;
}
public function html()
@@ -77,9 +93,9 @@ class ProductDataTable extends DataTable
->title('Code')
->className('text-center align-middle'),
- Column::make('category.category_name')
- ->title('Category')
- ->className('text-center align-middle'),
+ // Column::make('category.category_name')
+ // ->title('Category')
+ // ->className('text-center align-middle'),
Column::make('product_unit')
->title('Unit')
diff --git a/Modules/Product/Entities/Product.php b/Modules/Product/Entities/Product.php
index 060d5cce..8996b232 100644
--- a/Modules/Product/Entities/Product.php
+++ b/Modules/Product/Entities/Product.php
@@ -4,7 +4,6 @@ namespace Modules\Product\Entities;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
-use Modules\Product\Notifications\NotifyQuantityAlert;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
@@ -12,27 +11,39 @@ use App\Models\ProductBatch;
class Product extends Model implements HasMedia
{
-
use HasFactory, InteractsWithMedia;
protected $guarded = [];
protected $with = ['media'];
+ // Append product_quantity ke output model
protected $appends = ['product_quantity'];
+ /**
+ * Relasi ke kategori
+ */
public function category() {
- return $this->belongsTo(Category::class, 'category_id', 'id');
+ return $this->belongsTo(Category::class, 'category_id');
}
+ /**
+ * Relasi ke batches (stok per cabang)
+ */
public function batches() {
- return $this->hasMany(ProductBatch::class, 'product_id', 'id');
+ return $this->hasMany(ProductBatch::class, 'product_id');
}
+ /**
+ * Getter jumlah stok produk total dari semua batch
+ */
public function getProductQuantityAttribute() {
- return $this->batches()->sum('quantity');
+ return $this->batches()->sum('qty') ?? 0;
}
+ /**
+ * Media fallback & koleksi media
+ */
public function registerMediaCollections(): void {
$this->addMediaCollection('images')
->useFallbackUrl('/images/fallback_product_image.png');
@@ -44,22 +55,31 @@ class Product extends Model implements HasMedia
->height(50);
}
+ /**
+ * Setter & Getter harga modal (dikonversi ke cent jika ingin akurasi tinggi)
+ */
public function setProductCostAttribute($value) {
- $this->attributes['product_cost'] = ($value * 100);
+ $this->attributes['product_cost'] = $value !== null ? ($value * 100) : null;
}
public function getProductCostAttribute($value) {
- return ($value / 100);
+ return $value !== null ? ($value / 100) : null;
}
+ /**
+ * Setter & Getter harga jual
+ */
public function setProductPriceAttribute($value) {
- $this->attributes['product_price'] = ($value * 100);
+ $this->attributes['product_price'] = $value !== null ? ($value * 100) : null;
}
public function getProductPriceAttribute($value) {
- return ($value / 100);
+ return $value !== null ? ($value / 100) : null;
}
+ /**
+ * Hitung harga grosir jika kuantitas mencukupi
+ */
public function getWholesalePrice($quantity) {
if ($this->min_quantity_for_wholesale && $quantity >= $this->min_quantity_for_wholesale) {
$discount = $this->wholesale_discount_percentage / 100;
@@ -68,6 +88,9 @@ class Product extends Model implements HasMedia
return $this->product_price;
}
+ /**
+ * Cek apakah kuantitas memenuhi harga grosir
+ */
public function isWholesalePrice($quantity) {
return $this->min_quantity_for_wholesale && $quantity >= $this->min_quantity_for_wholesale;
}
diff --git a/Modules/Purchase/DataTables/PurchaseDataTable.php b/Modules/Purchase/DataTables/PurchaseDataTable.php
index 0f1568b4..3853db09 100644
--- a/Modules/Purchase/DataTables/PurchaseDataTable.php
+++ b/Modules/Purchase/DataTables/PurchaseDataTable.php
@@ -8,42 +8,87 @@ use Yajra\DataTables\Html\Column;
use Yajra\DataTables\Html\Editor\Editor;
use Yajra\DataTables\Html\Editor\Fields;
use Yajra\DataTables\Services\DataTable;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\DB;
class PurchaseDataTable extends DataTable
{
public function dataTable($query)
{
+ Log::info('PurchaseDataTable::dataTable called', [
+ 'query_type' => get_class($query)
+ ]);
+
+ // Gunakan query builder DB langsung untuk memastikan data diambil
+ $purchases = DB::table('purchases')
+ ->select([
+ 'purchases.id',
+ 'purchases.date',
+ 'purchases.reference_no',
+ 'purchases.supplier_id',
+ 'purchases.total',
+ 'purchases.paid_amount',
+ 'purchases.due_amount',
+ 'purchases.payment_status',
+ 'suppliers.name as supplier_name'
+ ])
+ ->leftJoin('suppliers', 'purchases.supplier_id', '=', 'suppliers.id')
+ ->get();
+
+ Log::info('Direct DB Query Results', [
+ 'count' => $purchases->count(),
+ 'data' => $purchases->take(3)->toArray()
+ ]);
+
return datatables()
- ->eloquent($query)
+ ->of($purchases)
->addColumn('action', function ($data) {
return view('purchase::partials.actions', [
'id' => $data->id
]);
})
- ->editColumn('total_amount', function ($data) {
- return format_currency($data->total_amount);
+ ->editColumn('total', function ($data) {
+ return format_currency($data->total / 100);
})
->editColumn('paid_amount', function ($data) {
- return format_currency($data->paid_amount);
+ return format_currency($data->paid_amount / 100);
})
->editColumn('due_amount', function ($data) {
- return format_currency($data->due_amount);
- })
- ->editColumn('status', function ($data) {
- return view('purchase::partials.status', [
- 'status' => $data->status
- ]);
+ return format_currency($data->due_amount / 100);
})
->editColumn('payment_status', function ($data) {
return view('purchase::partials.payment-status', [
'payment_status' => $data->payment_status
]);
- });
+ })
+ ->rawColumns(['action', 'payment_status']);
}
public function query(Purchase $model)
{
- return $model->newQuery();
+ // Cek semua data purchase yang ada
+ $allPurchases = DB::table('purchases')->get();
+ Log::info('All Purchases from DB', [
+ 'count' => $allPurchases->count(),
+ 'data' => $allPurchases->take(3)->toArray()
+ ]);
+
+ // Periksa struktur tabel
+ $columns = DB::getSchemaBuilder()->getColumnListing('purchases');
+ Log::info('Purchases Table Columns', [
+ 'columns' => $columns
+ ]);
+
+ $activeBranch = session('active_branch');
+
+ Log::info('Active Branch', [
+ 'branch_id' => $activeBranch
+ ]);
+
+ // Kita tidak menggunakan query ini karena menggunakan DB query langsung di dataTable()
+ $query = $model->newQuery();
+
+ return $query;
}
public function html()
@@ -79,7 +124,7 @@ class PurchaseDataTable extends DataTable
->title('Date')
->className('text-center align-middle'),
- Column::make('reference')
+ Column::make('reference_no')
->title('Reference')
->className('text-center align-middle'),
@@ -87,15 +132,11 @@ class PurchaseDataTable extends DataTable
->title('Supplier')
->className('text-center align-middle'),
- Column::make('status')
- ->title('Status')
- ->className('text-center align-middle'),
-
Column::make('payment_status')
->title('Payment Status')
->className('text-center align-middle'),
- Column::make('total_amount')
+ Column::make('total')
->title('Total')
->className('text-center align-middle'),
diff --git a/Modules/Purchase/Entities/Purchase.php b/Modules/Purchase/Entities/Purchase.php
index f92192ed..35f8de97 100644
--- a/Modules/Purchase/Entities/Purchase.php
+++ b/Modules/Purchase/Entities/Purchase.php
@@ -6,33 +6,35 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Support\Facades\Log;
class Purchase extends Model
{
use HasFactory;
protected $fillable = [
+ 'branch_id',
+ 'user_id',
+ 'date',
'reference_no',
'supplier_id',
- 'date',
- 'discount_amount',
- 'payment_method',
+ 'discount_percentage',
+ 'discount',
+ 'total',
'paid_amount',
- 'total_amount',
'due_amount',
'payment_status',
- 'user_id',
- 'branch_id',
- 'created_by',
- 'updated_by'
+ 'payment_method',
+ 'note',
];
protected $casts = [
'date' => 'date',
+ 'discount_percentage' => 'float',
+ 'discount' => 'decimal:2',
+ 'total' => 'decimal:2',
'paid_amount' => 'decimal:2',
- 'total_amount' => 'decimal:2',
- 'due_amount' => 'decimal:2',
- 'discount_amount' => 'decimal:2'
+ 'due_amount' => 'decimal:2'
];
public function purchaseDetails(): HasMany
@@ -42,7 +44,7 @@ class Purchase extends Model
public function supplier(): BelongsTo
{
- return $this->belongsTo('Modules\People\Entities\Supplier');
+ return $this->belongsTo('Modules\People\Entities\Supplier', 'supplier_id');
}
public function user(): BelongsTo
@@ -66,17 +68,31 @@ class Purchase extends Model
$number = Purchase::max('id') + 1;
$model->reference_no = make_reference_id('PR', $number);
});
+
+ // Log when model is retrieved
+ static::retrieved(function ($model) {
+ Log::info('Purchase Model Retrieved', [
+ 'id' => $model->id,
+ 'reference_no' => $model->reference_no,
+ 'supplier_id' => $model->supplier_id,
+ 'payment_status' => $model->payment_status
+ ]);
+ });
}
public function scopeCompleted($query) {
return $query->where('payment_status', 'Paid');
}
- public function getPaidAmountAttribute($value) {
+ public function getDiscountAttribute($value) {
return $value / 100;
}
- public function getTotalAmountAttribute($value) {
+ public function getTotalAttribute($value) {
+ return $value / 100;
+ }
+
+ public function getPaidAmountAttribute($value) {
return $value / 100;
}
@@ -84,7 +100,19 @@ class Purchase extends Model
return $value / 100;
}
- public function getDiscountAmountAttribute($value) {
- return $value / 100;
+ public function setDiscountAttribute($value) {
+ $this->attributes['discount'] = $value * 100;
+ }
+
+ public function setTotalAttribute($value) {
+ $this->attributes['total'] = $value * 100;
+ }
+
+ public function setPaidAmountAttribute($value) {
+ $this->attributes['paid_amount'] = $value * 100;
+ }
+
+ public function setDueAmountAttribute($value) {
+ $this->attributes['due_amount'] = $value * 100;
}
}
diff --git a/Modules/Purchase/Http/Controllers/PurchaseController.php b/Modules/Purchase/Http/Controllers/PurchaseController.php
index 68ca07de..6023083c 100644
--- a/Modules/Purchase/Http/Controllers/PurchaseController.php
+++ b/Modules/Purchase/Http/Controllers/PurchaseController.php
@@ -11,13 +11,12 @@ use Modules\People\Entities\Supplier;
use Modules\Product\Entities\Product;
use Modules\Purchase\Entities\Purchase;
use Modules\Purchase\Entities\PurchaseDetail;
-use Modules\Purchase\Entities\PurchasePayment;
use Modules\Purchase\Http\Requests\StorePurchaseRequest;
use Modules\Purchase\Http\Requests\UpdatePurchaseRequest;
use App\Models\ProductBatch;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
-use Barryvdh\DomPDF\Facade\Pdf;
+use Illuminate\Support\Facades\Log;
class PurchaseController extends Controller
{
@@ -25,6 +24,51 @@ class PurchaseController extends Controller
public function index(PurchaseDataTable $dataTable) {
abort_if(Gate::denies('access_purchases'), 403);
+ // Log untuk debugging
+ Log::info('PurchaseController@index called', [
+ 'active_branch' => session('active_branch'),
+ 'user' => auth()->user()->name ?? 'Unknown'
+ ]);
+
+ // Periksa data purchases secara langsung
+ $purchases = DB::table('purchases')->get();
+ Log::info('Direct Purchase Query', [
+ 'count' => $purchases->count(),
+ 'data' => $purchases->take(3)->toArray()
+ ]);
+
+ // Jika tidak ada data di DataTable, tampilkan data langsung dari DB
+ if ($purchases->count() > 0 && request()->ajax()) {
+ Log::info('Returning direct data for AJAX request');
+ return datatables()
+ ->of($purchases)
+ ->addColumn('action', function ($data) {
+ return view('purchase::partials.actions', [
+ 'id' => $data->id
+ ])->render();
+ })
+ ->addColumn('supplier_name', function ($data) {
+ $supplier = DB::table('suppliers')->where('id', $data->supplier_id)->first();
+ return $supplier ? $supplier->name : 'N/A';
+ })
+ ->editColumn('total', function ($data) {
+ return format_currency($data->total / 100);
+ })
+ ->editColumn('paid_amount', function ($data) {
+ return format_currency($data->paid_amount / 100);
+ })
+ ->editColumn('due_amount', function ($data) {
+ return format_currency($data->due_amount / 100);
+ })
+ ->editColumn('payment_status', function ($data) {
+ return view('purchase::partials.payment-status', [
+ 'payment_status' => $data->payment_status
+ ])->render();
+ })
+ ->rawColumns(['action', 'payment_status'])
+ ->make(true);
+ }
+
return $dataTable->render('purchase::index');
}
@@ -36,129 +80,148 @@ class PurchaseController extends Controller
public function store(Request $request)
- {
- $validator = Validator::make($request->all(), [
- 'reference_no' => 'required|string',
- 'supplier_id' => 'required|exists:suppliers,id',
- 'date' => 'required|date',
- 'payment_method' => 'required|string',
- 'paid_amount' => 'required|numeric|min:0',
- 'products' => 'required|array|min:1',
- 'products.*.product_id' => 'required|exists:products,id',
- 'products.*.quantity' => 'required|integer|min:1',
- 'products.*.purchase_price' => 'required|numeric|min:0',
- 'products.*.expired_date' => 'nullable|date|after:today',
- 'discount_percentage' => 'nullable|numeric|min:0',
- 'discount_amount' => 'nullable|numeric|min:0',
- 'note' => 'nullable|string'
- ]);
+{
+ $validator = Validator::make($request->all(), [
+ 'reference_no' => 'required|string',
+ 'supplier_id' => 'required|exists:suppliers,id',
+ 'date' => 'required|date',
+ 'payment_method' => 'required|string',
+ 'paid_amount' => 'required|numeric|min:0',
+ 'products' => 'required|array|min:1',
+ 'products.*.product_id' => 'required|exists:products,id',
+ 'products.*.qty' => 'required|integer|min:1',
+ 'products.*.purchase_price' => 'required|numeric|min:0',
+ 'products.*.expired_date' => 'nullable|date|after:today',
+ 'discount_percentage' => 'nullable|numeric|min:0',
+ 'discount_amount' => 'nullable|numeric|min:0',
+ 'note' => 'nullable|string'
+ ]);
- if ($validator->fails()) {
+ if ($validator->fails()) {
+ return response()->json([
+ 'message' => 'Validation failed',
+ 'errors' => $validator->errors()
+ ], 422);
+ }
+
+ DB::beginTransaction();
+ try {
+ // Log request data
+ Log::info("Request Data", $request->all());
+
+ // Calculate total amount
+ $totalAmount = collect($request->products)->sum(function ($product) {
+ return $product['qty'] * $product['purchase_price'];
+ });
+
+ // Calculate due amount
+ $dueAmount = $totalAmount - $request->paid_amount;
+
+ // Determine payment status
+ $paymentStatus = $request->paid_amount == 0 ? 'Unpaid' :
+ ($dueAmount == 0 ? 'Paid' : 'Partial');
+
+ // Check active branch
+ if (!session('active_branch')) {
return response()->json([
- 'message' => 'Validation failed',
- 'errors' => $validator->errors()
+ 'message' => 'Branch not selected'
], 422);
}
- DB::beginTransaction();
+ // 1. Simpan ke purchases
+ $purchase = Purchase::create([
+ 'reference_no' => $request->reference_no,
+ 'supplier_id' => $request->supplier_id,
+ 'date' => $request->date,
+ 'discount_percentage' => $request->discount_percentage ?? 0,
+ 'discount' => round($request->discount_amount * 100),
+ 'payment_method' => $request->payment_method,
+ 'paid_amount' => round($request->paid_amount * 100),
+ 'total' => round($totalAmount * 100),
+ 'due_amount' => round($dueAmount * 100),
+ 'payment_status' => $paymentStatus,
+ 'note' => $request->note,
+ 'user_id' => auth()->id(),
+ 'branch_id' => session('active_branch')
+ ]);
- try {
- // Calculate total amount
- $totalAmount = collect($request->products)->sum(function ($product) {
- return $product['quantity'] * $product['purchase_price'];
- });
+ // Log purchase created
+ Log::info("Purchase Created", ['purchase' => $purchase->toArray()]);
- // Calculate due amount
- $dueAmount = $totalAmount - $request->paid_amount;
-
- // Determine payment status
- $paymentStatus = $request->paid_amount == 0 ? 'Unpaid' :
- ($dueAmount == 0 ? 'Paid' : 'Partial');
-
- // 1. Simpan ke purchases
- $purchase = Purchase::create([
- 'reference_no' => $request->reference_no,
- 'supplier_id' => $request->supplier_id,
- 'supplier_name' => Supplier::findOrFail($request->supplier_id)->name,
- 'date' => $request->date,
- 'discount_percentage' => $request->discount_percentage ?? 0,
- //'discount_amount' => $request->discount_amount ?? 0,
- 'payment_method' => $request->payment_method,
- 'paid_amount' => round($request->paid_amount * 100),
- 'total_amount' => round($totalAmount * 100),
- 'discount_amount' => round($request->discount_amount * 100),
- 'due_amount' => $dueAmount,
- 'payment_status' => $paymentStatus,
- 'note' => $request->note,
- 'user_id' => auth()->id(),
- 'branch_id' => session(['active_branch' => 1]),// contoh ID cabang default
- 'created_by' => auth()->user()->name,
- 'updated_by' => auth()->user()->name
+ // 2. Simpan detail produk & batch
+ foreach ($request->products as $product) {
+ // Detail
+ PurchaseDetail::create([
+ 'purchase_id' => $purchase->id,
+ 'product_id' => $product['product_id'],
+ 'product_name' => Product::findOrFail($product['product_id'])->product_name,
+ 'product_code' => Product::findOrFail($product['product_id'])->product_code,
+ 'qty' => $product['qty'],
+ // 'price' => $product['purchase_price'],
+ 'unit_price' => $product['purchase_price'],
+ 'subtotal' => $product['qty'] * $product['purchase_price'],
+ 'product_discount_amount' => 0,
+ 'product_discount_type' => 'fixed',
+ 'product_tax_amount' => 0
]);
- // 2. Simpan detail produk & batch
- foreach ($request->products as $product) {
- // Detail
- PurchaseDetail::create([
- 'purchase_id' => $purchase->id,
- 'product_id' => $product['product_id'],
- 'product_name' => Product::findOrFail($product['product_id'])->product_name,
- 'product_code' => Product::findOrFail($product['product_id'])->product_code,
- 'quantity' => $product['quantity'],
- 'price' => $product['purchase_price'],
- 'unit_price' => $product['purchase_price'],
- 'sub_total' => $product['quantity'] * $product['purchase_price'],
- 'product_discount_amount' => 0,
- 'product_discount_type' => 'fixed',
- 'product_tax_amount' => 0,
- 'created_by' => auth()->user()->name,
- 'updated_by' => auth()->user()->name
- ]);
-
- // Batch
- ProductBatch::addStock([
- 'product_id' => $product['product_id'],
- 'branch_id' => session(['active_branch' => 1]), // contoh ID cabang default,
- 'quantity' => $product['quantity'],
- 'purchase_price' => $product['purchase_price'],
- 'expired_date' => $product['expired_date'],
- 'purchase_id' => $purchase->id,
- 'batch_code' => $purchase->reference_no . '-' . $product['product_id'],
- 'created_by' => auth()->user()->name,
- 'updated_by' => auth()->user()->name
- ]);
- }
-
- // 3. Simpan pembayaran (jika ada)
- if ($purchase->paid_amount > 0) {
- PurchasePayment::create([
- 'purchase_id' => $purchase->id,
- 'branch_id' => session(['active_branch' => 1]), // contoh ID cabang default,
- 'amount' => $purchase->paid_amount,
- 'date' => $purchase->date,
- 'reference' => 'PAY-' . $purchase->reference_no,
- 'payment_method' => $purchase->payment_method,
- 'note' => 'Initial payment for purchase ' . $purchase->reference_no,
- 'created_by' => auth()->user()->name,
- 'updated_by' => auth()->user()->name
- ]);
- }
-
- DB::commit();
-
- return response()->json([
- 'message' => 'Purchase created successfully',
- 'data' => $purchase
- ], 201);
-
- } catch (\Exception $e) {
- DB::rollBack();
- return response()->json([
- 'message' => 'Failed to create purchase',
- 'error' => $e->getMessage()
- ], 500);
+ // Batch
+ ProductBatch::addStock([
+ 'product_id' => $product['product_id'],
+ 'branch_id' => session('active_branch'),
+ 'qty' => $product['qty'],
+ 'purchase_price' => $product['purchase_price'],
+ 'exp_date' => $product['expired_date'],
+ 'purchase_id' => $purchase->id,
+ 'batch_code' => $purchase->reference_no . '-' . $product['product_id'],
+ 'created_by' => auth()->user()->name ?? 'system',
+ 'updated_by' => auth()->user()->name ?? 'system'
+ ]);
}
+
+ // 3. Simpan pembayaran (jika ada)
+ if ($purchase->paid_amount > 0) {
+ // Kode ini dinonaktifkan karena tabel purchase_payments sudah dihapus
+ /*
+ PurchasePayment::create([
+ 'purchase_id' => $purchase->id,
+ 'branch_id' => session('active_branch'),
+ 'amount' => $purchase->paid_amount,
+ 'date' => $purchase->date,
+ 'reference' => 'PAY-' . $purchase->reference_no,
+ 'payment_method' => $purchase->payment_method,
+ 'note' => 'Initial payment for purchase ' . $purchase->reference_no
+ ]);
+ */
+
+ // Hanya catat di log
+ Log::info("Purchase Payment Info (not saved to DB)", [
+ 'purchase_id' => $purchase->id,
+ 'amount' => $purchase->paid_amount,
+ 'payment_method' => $purchase->payment_method
+ ]);
+ }
+
+ DB::commit();
+
+ return response()->json([
+ 'message' => 'Purchase created successfully',
+ 'data' => $purchase
+ ], 201);
+ } catch (\Exception $e) {
+ DB::rollBack();
+ Log::error("Error Creating Purchase", [
+ 'error' => $e->getMessage(),
+ 'line' => $e->getLine(),
+ 'file' => $e->getFile()
+ ]);
+
+ return response()->json([
+ 'message' => 'Failed to create purchase',
+ 'error' => $e->getMessage()
+ ], 500);
}
+}
public function getStock(Request $request, $productId, $branchId)
{
@@ -197,7 +260,7 @@ class PurchaseController extends Controller
'options' => [
'product_discount' => $purchase_detail->product_discount_amount,
'product_discount_type' => $purchase_detail->product_discount_type,
- 'sub_total' => $purchase_detail->sub_total,
+ 'subtotal' => $purchase_detail->subtotal,
'code' => $purchase_detail->product_code,
'stock' => Product::findOrFail($purchase_detail->product_id)->product_quantity,
'product_tax' => $purchase_detail->product_tax_amount,
@@ -225,7 +288,7 @@ class PurchaseController extends Controller
if ($purchase->status == 'Completed') {
$product = Product::findOrFail($purchase_detail->product_id);
$product->update([
- 'product_quantity' => $product->product_quantity - $purchase_detail->quantity
+ 'product_quantity' => $product->product_quantity - $purchase_detail->qty
]);
}
$purchase_detail->delete();
@@ -233,21 +296,16 @@ class PurchaseController extends Controller
$purchase->update([
'date' => $request->date,
- 'reference' => $request->reference,
+ 'reference_no' => $request->reference,
'supplier_id' => $request->supplier_id,
- 'supplier_name' => Supplier::findOrFail($request->supplier_id)->supplier_name,
- 'tax_percentage' => $request->tax_percentage,
'discount_percentage' => $request->discount_percentage,
- 'shipping_amount' => $request->shipping_amount * 100,
+ 'discount' => $request->shipping_amount * 100,
'paid_amount' => $request->paid_amount * 100,
- 'total_amount' => $request->total_amount * 100,
+ 'total' => $request->total_amount * 100,
'due_amount' => $due_amount * 100,
- 'status' => $request->status,
'payment_status' => $payment_status,
'payment_method' => $request->payment_method,
- 'note' => $request->note,
- 'tax_amount' => Cart::instance('purchase')->tax() * 100,
- 'discount_amount' => Cart::instance('purchase')->discount() * 100,
+ 'note' => $request->note
]);
foreach (Cart::instance('purchase')->content() as $cart_item) {
@@ -256,10 +314,10 @@ class PurchaseController extends Controller
'product_id' => $cart_item->id,
'product_name' => $cart_item->name,
'product_code' => $cart_item->options->code,
- 'quantity' => $cart_item->qty,
+ 'qty' => $cart_item->qty,
'price' => $cart_item->price * 100,
- 'unit_price' => $cart_item->options->unit_price * 100,
- 'sub_total' => $cart_item->options->sub_total * 100,
+ 'unit_price' => $cart_item->price * 100,
+ 'subtotal' => $cart_item->options->subtotal * 100,
'product_discount_amount' => $cart_item->options->product_discount * 100,
'product_discount_type' => $cart_item->options->product_discount_type,
'product_tax_amount' => $cart_item->options->product_tax * 100,
@@ -297,11 +355,14 @@ class PurchaseController extends Controller
$purchase = Purchase::findOrFail($id);
$supplier = Supplier::findOrFail($purchase->supplier_id);
- $pdf = PDF::loadView('purchase::print', [
- 'purchase' => $purchase,
- 'supplier' => $supplier,
- ])->setPaper('a4');
+ // Menggunakan cara alternatif untuk membuat PDF
+ $pdf = app('dompdf.wrapper')
+ ->loadView('purchase::print', [
+ 'purchase' => $purchase,
+ 'supplier' => $supplier,
+ ])
+ ->setPaper('a4');
- return $pdf->stream('purchase-'. $purchase->reference .'.pdf');
+ return $pdf->stream('purchase-'. $purchase->reference_no .'.pdf');
}
}
diff --git a/Modules/Purchase/Http/Livewire/CreatePurchase.php b/Modules/Purchase/Http/Livewire/CreatePurchase.php
index 6b0d4e87..008df06e 100644
--- a/Modules/Purchase/Http/Livewire/CreatePurchase.php
+++ b/Modules/Purchase/Http/Livewire/CreatePurchase.php
@@ -7,8 +7,8 @@ use Modules\People\Entities\Supplier;
use Modules\Product\Entities\Product;
use Modules\Purchase\Entities\Purchase;
use Modules\Purchase\Entities\PurchaseDetail;
-use Modules\Purchase\Entities\PurchasePayment;
use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
class CreatePurchase extends Component
@@ -127,85 +127,110 @@ class CreatePurchase extends Component
public function save()
{
- $this->validate();
-
try {
+ $this->validate();
+
+ // Log session variables
+ Log::info("CreatePurchase: Session variables", [
+ 'branch_id' => session('branch_id'),
+ 'active_branch' => session('active_branch'),
+ 'all_session' => session()->all()
+ ]);
+
+ // Log bahwa validasi berhasil
+ Log::info("CreatePurchase: Validation successful", [
+ 'supplier_id' => $this->supplier_id,
+ 'reference_no' => $this->reference_no,
+ 'items_count' => count($this->items)
+ ]);
+
DB::beginTransaction();
$supplier = Supplier::findOrFail($this->supplier_id);
+ Log::info("CreatePurchase: Supplier found", ['supplier' => $supplier->toArray()]);
$purchase = Purchase::create([
- 'branch_id' => session('branch_id'),
+ 'branch_id' => session('branch_id') ?? session('active_branch') ?? 1,
'user_id' => auth()->id(),
'date' => $this->date,
'reference_no' => $this->reference_no,
'supplier_id' => $this->supplier_id,
- 'supplier_name' => $supplier->supplier_name,
- 'discount_percentage' => $this->discount_percentage,
- 'discount' => $this->discount,
- 'total' => $this->total_amount,
- 'paid_amount' => $this->paid_amount,
- 'due_amount' => $this->due_amount,
+ 'discount_percentage' => $this->discount_percentage ?? 0,
+ 'discount' => $this->discount ?? 0,
+ 'total' => $this->total_amount ?? 0,
+ 'paid_amount' => $this->paid_amount ?? 0,
+ 'due_amount' => $this->due_amount ?? 0,
'payment_status' => ($this->paid_amount >= $this->total_after_discount) ? 'paid' : 'due',
'payment_method' => $this->payment_method,
'note' => $this->note,
]);
+
+ Log::info("CreatePurchase: Purchase created", ['purchase' => $purchase->toArray()]);
// Save purchase items and update product quantities
- foreach ($this->items as $item) {
+ foreach ($this->items as $index => $item) {
+ Log::info("CreatePurchase: Processing item", ['index' => $index, 'item' => $item]);
+
$product = Product::findOrFail($item['product_id']);
+ Log::info("CreatePurchase: Product found", ['product' => $product->toArray()]);
// Create purchase detail
- PurchaseDetail::create([
+ $purchaseDetail = PurchaseDetail::create([
'purchase_id' => $purchase->id,
'product_id' => $item['product_id'],
'product_name' => $product->product_name,
- 'product_code' => $product->product_code,
+ // 'product_code' => $product->product_code,
'qty' => $item['qty'],
- 'purchase_price' => $item['purchase_price'],
+ // 'price' => $item['purchase_price'],
'unit_price' => $item['unit_price'],
'subtotal' => $item['qty'] * $item['unit_price'],
'product_discount_amount' => $item['discount'] ?? 0,
'product_discount_type' => $item['discount_type'] ?? null,
'product_tax_amount' => $item['tax'] ?? 0,
]);
-
- // Update product quantity
- $product->update([
- 'product_quantity' => $product->product_quantity + $item['qty']
- ]);
+
+ Log::info("CreatePurchase: Purchase detail created", ['purchaseDetail' => $purchaseDetail->toArray()]);
// Create or update product batch
+ $batchData = [
+ 'product_id' => $item['product_id'],
+ 'branch_id' => session('branch_id') ?? session('active_branch') ?? 1,
+ 'batch_code' => $this->reference_no . '-' . $item['product_id'],
+ 'qty' => $item['qty'],
+ 'unit_price' => $item['purchase_price'],
+ 'exp_date' => null,
+ 'purchase_id' => $purchase->id,
+ 'created_by' => auth()->user()->name ?? 'system',
+ 'updated_by' => auth()->user()->name ?? 'system',
+ 'created_at' => now(),
+ 'updated_at' => now(),
+ ];
+
+ Log::info("CreatePurchase: Inserting batch", ['batchData' => $batchData]);
+
DB::table('product_batches')->updateOrInsert(
[
'product_id' => $item['product_id'],
- 'batch_number' => $this->reference_no,
+ 'batch_code' => $this->reference_no . '-' . $item['product_id'],
],
- [
- 'product_id' => $item['product_id'],
- 'batch_number' => $this->reference_no,
- 'qty' => $item['qty'],
- 'expiry_date' => null,
- 'created_at' => now(),
- 'updated_at' => now(),
- ]
+ $batchData
);
+
+ Log::info("CreatePurchase: Batch inserted/updated successfully");
}
// Create purchase payment if there's a paid amount
if ($this->paid_amount > 0) {
- PurchasePayment::create([
- 'branch_id' => session('branch_id'),
+ // Hanya catat informasi pembayaran di log
+ Log::info("CreatePurchase: Payment info (not saved to DB)", [
'purchase_id' => $purchase->id,
'amount' => $this->paid_amount,
- 'date' => now(),
- 'reference' => 'PAY-' . strtoupper(Str::random(6)),
- 'payment_method' => $this->payment_method,
- 'note' => $this->note,
+ 'payment_method' => $this->payment_method
]);
}
DB::commit();
+ Log::info("CreatePurchase: Transaction committed successfully");
$this->dispatch('showSuccessMessage', [
'message' => 'Purchase created successfully!',
@@ -214,10 +239,20 @@ class CreatePurchase extends Component
} catch (\Exception $e) {
DB::rollBack();
+ Log::error("CreatePurchase: Error creating purchase", [
+ 'message' => $e->getMessage(),
+ 'trace' => $e->getTraceAsString()
+ ]);
+
$this->dispatch('showErrorMessage', [
'message' => 'Error creating purchase: ' . $e->getMessage()
]);
}
+
+ // Dispatch debug event untuk front-end
+ $this->dispatch('debug', [
+ 'message' => 'Purchase process completed, check console logs'
+ ]);
}
public function render()
diff --git a/Modules/Purchase/Resources/views/index.blade.php b/Modules/Purchase/Resources/views/index.blade.php
index 84c37368..71324cb0 100644
--- a/Modules/Purchase/Resources/views/index.blade.php
+++ b/Modules/Purchase/Resources/views/index.blade.php
@@ -24,11 +24,145 @@
- {{ $dataTable->table() }}
+
+
+
+
+ ID |
+ Date |
+ Reference |
+ Supplier ID |
+ Total |
+ Paid |
+ Due |
+ Status |
+
+
+
+ @php
+ $purchases = DB::table('purchases')->get();
+ @endphp
+
+ @forelse($purchases as $purchase)
+
+ {{ $purchase->id }} |
+ {{ $purchase->date }} |
+ {{ $purchase->reference_no }} |
+ {{ $purchase->supplier_id }} |
+ {{ $purchase->total / 100 }} |
+ {{ $purchase->paid_amount / 100 }} |
+ {{ $purchase->due_amount / 100 }} |
+ {{ $purchase->payment_status }} |
+
+ @empty
+
+ No purchases found in database. |
+
+ @endforelse
+
+
+
+
+
+ {{--
+
+
+
Active Branch: {{ session('active_branch') ?? 'Not set' }}
+
Database Connection: {{ config('database.default') }}
+
Purchases Table Exists: {{ Schema::hasTable('purchases') ? 'Yes' : 'No' }}
+
Purchases Count: {{ DB::table('purchases')->count() }}
+
+
+
--}}
@endsection
@push('scripts')
{{ $dataTable->scripts() }}
+
@endpush
diff --git a/Modules/Purchase/Resources/views/livewire/create-purchase.blade.php b/Modules/Purchase/Resources/views/livewire/create-purchase.blade.php
index 29f852f8..7152c50a 100644
--- a/Modules/Purchase/Resources/views/livewire/create-purchase.blade.php
+++ b/Modules/Purchase/Resources/views/livewire/create-purchase.blade.php
@@ -3,6 +3,7 @@
document.addEventListener('livewire:init', function () {
// Success Message
Livewire.on('showSuccessMessage', function(data) {
+ console.log('Success message received:', data);
Swal.fire({
title: 'Success!',
text: data.message,
@@ -17,6 +18,7 @@
// Error Message
Livewire.on('showErrorMessage', function(data) {
+ console.log('Error message received:', data);
Swal.fire({
title: 'Error!',
text: data.message,
@@ -27,6 +29,7 @@
// Confirmation Dialog
Livewire.on('showConfirmDialog', function(data) {
+ console.log('Confirmation dialog received:', data);
Swal.fire({
title: data.title,
text: data.text,
@@ -42,6 +45,24 @@
}
});
});
+
+ // Debug Event
+ Livewire.on('debug', function(data) {
+ console.log('DEBUG EVENT:', data);
+ });
+ });
+
+ // Debug form submission
+ document.addEventListener('DOMContentLoaded', function() {
+ const form = document.querySelector('form[wire\\:submit\\.prevent="save"]');
+ if (form) {
+ console.log('Form found, adding submit event listener');
+ form.addEventListener('submit', function(e) {
+ console.log('Form submit event triggered');
+ });
+ } else {
+ console.error('Form not found!');
+ }
});
@endpush
diff --git a/Modules/Purchase/Resources/views/livewire/purchase-list.blade.php b/Modules/Purchase/Resources/views/livewire/purchase-list.blade.php
index 4daab923..9573e54b 100644
--- a/Modules/Purchase/Resources/views/livewire/purchase-list.blade.php
+++ b/Modules/Purchase/Resources/views/livewire/purchase-list.blade.php
@@ -59,11 +59,10 @@
Reference |
Date |
Supplier |
- Total Amount |
+ Total |
Paid Amount |
Due Amount |
Payment Status |
- Created By |
Actions |
@@ -73,15 +72,14 @@
{{ $purchase->reference_no }} |
{{ $purchase->date->format('d/m/Y') }} |
{{ $purchase->supplier->name }} |
- {{ number_format($purchase->total_amount, 2) }} |
+ {{ number_format($purchase->total, 2) }} |
{{ number_format($purchase->paid_amount, 2) }} |
- {{ $purchase->due_amount ? number_format($purchase->due_amount, 2) : '0.00' }} |
+ {{ number_format($purchase->due_amount, 2) }} |
{{ $purchase->payment_status }}
|
- {{ $purchase->created_by }} |
-@push('scripts')
-@endpush
diff --git a/Modules/Purchase/Resources/views/partials/payment-status.blade.php b/Modules/Purchase/Resources/views/partials/payment-status.blade.php
index 7ac6bf4c..1f9a58b4 100644
--- a/Modules/Purchase/Resources/views/partials/payment-status.blade.php
+++ b/Modules/Purchase/Resources/views/partials/payment-status.blade.php
@@ -1,13 +1,13 @@
-@if ($data->payment_status == 'Partial')
+@if (strtolower($payment_status) == 'partial')
- {{ $data->payment_status }}
+ Partial
-@elseif ($data->payment_status == 'Paid')
+@elseif (strtolower($payment_status) == 'paid')
- {{ $data->payment_status }}
+ Paid
@else
- {{ $data->payment_status }}
+ {{ $payment_status ?? 'Unpaid' }}
@endif
diff --git a/Modules/Purchase/Routes/web.php b/Modules/Purchase/Routes/web.php
index 2a2eff7a..44a266a2 100644
--- a/Modules/Purchase/Routes/web.php
+++ b/Modules/Purchase/Routes/web.php
@@ -29,7 +29,8 @@ Route::middleware(['web', 'auth'])->group(function () {
Route::get('/stock/{productId}/{branchId}', [PurchaseController::class, 'getStock'])->name('purchases.stock');
});
- // Purchase Payments
+ // Purchase Payments - dinonaktifkan karena tabel sudah dihapus
+ /*
Route::prefix('purchase-payments')->group(function () {
Route::get('/{purchase_id}', 'PurchasePaymentsController@index')->name('purchase-payments.index');
Route::get('/{purchase_id}/create', 'PurchasePaymentsController@create')->name('purchase-payments.create');
@@ -38,6 +39,7 @@ Route::middleware(['web', 'auth'])->group(function () {
Route::patch('/update/{purchasePayment}', 'PurchasePaymentsController@update')->name('purchase-payments.update');
Route::delete('/destroy/{purchasePayment}', 'PurchasePaymentsController@destroy')->name('purchase-payments.destroy');
});
+ */
// Livewire Routes
Route::get('/purchases/create', function () {
diff --git a/Modules/PurchasesReturn/Config/config.php b/Modules/PurchasesReturn/Config/config.php
deleted file mode 100644
index cc177b93..00000000
--- a/Modules/PurchasesReturn/Config/config.php
+++ /dev/null
@@ -1,5 +0,0 @@
- 'PurchasesReturn'
-];
diff --git a/Modules/PurchasesReturn/DataTables/PurchaseReturnPaymentsDataTable.php b/Modules/PurchasesReturn/DataTables/PurchaseReturnPaymentsDataTable.php
deleted file mode 100644
index f05edb28..00000000
--- a/Modules/PurchasesReturn/DataTables/PurchaseReturnPaymentsDataTable.php
+++ /dev/null
@@ -1,78 +0,0 @@
-eloquent($query)
- ->addColumn('amount', function ($data) {
- return format_currency($data->amount);
- })
- ->addColumn('action', function ($data) {
- return view('purchasesreturn::payments.partials.actions', compact('data'));
- });
- }
-
- public function query(PurchaseReturnPayment $model) {
- return $model->newQuery()->byPurchaseReturn()->with('purchaseReturn');
- }
-
- public function html() {
- return $this->builder()
- ->setTableId('purchase-payments-table')
- ->columns($this->getColumns())
- ->minifiedAjax()
- ->dom("<'row'<'col-md-3'l><'col-md-5 mb-2'B><'col-md-4'f>> .
- 'tr' .
- <'row'<'col-md-5'i><'col-md-7 mt-2'p>>")
- ->orderBy(5)
- ->buttons(
- Button::make('excel')
- ->text(' Excel'),
- Button::make('print')
- ->text(' Print'),
- Button::make('reset')
- ->text(' Reset'),
- Button::make('reload')
- ->text(' Reload')
- );
- }
-
- protected function getColumns() {
- return [
- Column::make('date')
- ->className('align-middle text-center'),
-
- Column::make('reference')
- ->className('align-middle text-center'),
-
- Column::computed('amount')
- ->className('align-middle text-center'),
-
- Column::make('payment_method')
- ->className('align-middle text-center'),
-
- Column::computed('action')
- ->exportable(false)
- ->printable(false)
- ->className('align-middle text-center'),
-
- Column::make('created_at')
- ->visible(false),
- ];
- }
-
- protected function filename(): string {
- return 'PurchaseReturnPayments_' . date('YmdHis');
- }
-}
diff --git a/Modules/PurchasesReturn/DataTables/PurchaseReturnsDataTable.php b/Modules/PurchasesReturn/DataTables/PurchaseReturnsDataTable.php
deleted file mode 100644
index a1d70066..00000000
--- a/Modules/PurchasesReturn/DataTables/PurchaseReturnsDataTable.php
+++ /dev/null
@@ -1,100 +0,0 @@
-eloquent($query)
- ->addColumn('total_amount', function ($data) {
- return format_currency($data->total_amount);
- })
- ->addColumn('paid_amount', function ($data) {
- return format_currency($data->paid_amount);
- })
- ->addColumn('due_amount', function ($data) {
- return format_currency($data->due_amount);
- })
- ->addColumn('status', function ($data) {
- return view('purchasesreturn::partials.status', compact('data'));
- })
- ->addColumn('payment_status', function ($data) {
- return view('purchasesreturn::partials.payment-status', compact('data'));
- })
- ->addColumn('action', function ($data) {
- return view('purchasesreturn::partials.actions', compact('data'));
- });
- }
-
- public function query(PurchaseReturn $model) {
- return $model->newQuery();
- }
-
- public function html() {
- return $this->builder()
- ->setTableId('purchase-returns-table')
- ->columns($this->getColumns())
- ->minifiedAjax()
- ->dom("<'row'<'col-md-3'l><'col-md-5 mb-2'B><'col-md-4'f>> .
- 'tr' .
- <'row'<'col-md-5'i><'col-md-7 mt-2'p>>")
- ->orderBy(8)
- ->buttons(
- Button::make('excel')
- ->text(' Excel'),
- Button::make('print')
- ->text(' Print'),
- Button::make('reset')
- ->text(' Reset'),
- Button::make('reload')
- ->text(' Reload')
- );
- }
-
- protected function getColumns() {
- return [
- Column::make('reference')
- ->className('text-center align-middle'),
-
- Column::make('supplier_name')
- ->title('Supplier')
- ->className('text-center align-middle'),
-
- Column::computed('status')
- ->className('text-center align-middle'),
-
- Column::computed('total_amount')
- ->className('text-center align-middle'),
-
- Column::computed('paid_amount')
- ->className('text-center align-middle'),
-
- Column::computed('due_amount')
- ->className('text-center align-middle'),
-
- Column::computed('payment_status')
- ->className('text-center align-middle'),
-
- Column::computed('action')
- ->exportable(false)
- ->printable(false)
- ->className('text-center align-middle'),
-
- Column::make('created_at')
- ->visible(false)
- ];
- }
-
- protected function filename(): string {
- return 'PurchaseReturns_' . date('YmdHis');
- }
-}
diff --git a/Modules/PurchasesReturn/Database/Migrations/2021_08_08_222603_create_purchase_returns_table.php b/Modules/PurchasesReturn/Database/Migrations/2021_08_08_222603_create_purchase_returns_table.php
deleted file mode 100644
index a70879cf..00000000
--- a/Modules/PurchasesReturn/Database/Migrations/2021_08_08_222603_create_purchase_returns_table.php
+++ /dev/null
@@ -1,48 +0,0 @@
-id();
- $table->date('date');
- $table->string('reference');
- $table->unsignedBigInteger('supplier_id')->nullable();
- $table->string('supplier_name');
- $table->integer('tax_percentage')->default(0);
- $table->integer('tax_amount')->default(0);
- $table->integer('discount_percentage')->default(0);
- $table->integer('discount_amount')->default(0);
- $table->integer('shipping_amount')->default(0);
- $table->integer('total_amount');
- $table->integer('paid_amount');
- $table->integer('due_amount');
- $table->string('status');
- $table->string('payment_status');
- $table->string('payment_method');
- $table->text('note')->nullable();
- $table->foreign('supplier_id')->references('id')->on('suppliers')->nullOnDelete();
- $table->timestamps();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::dropIfExists('purchase_returns');
- }
-}
diff --git a/Modules/PurchasesReturn/Database/Migrations/2021_08_08_222612_create_purchase_return_details_table.php b/Modules/PurchasesReturn/Database/Migrations/2021_08_08_222612_create_purchase_return_details_table.php
deleted file mode 100644
index dd5227a5..00000000
--- a/Modules/PurchasesReturn/Database/Migrations/2021_08_08_222612_create_purchase_return_details_table.php
+++ /dev/null
@@ -1,46 +0,0 @@
-id();
- $table->unsignedBigInteger('purchase_return_id');
- $table->unsignedBigInteger('product_id')->nullable();
- $table->string('product_name');
- $table->string('product_code');
- $table->integer('quantity');
- $table->integer('price');
- $table->integer('unit_price');
- $table->integer('sub_total');
- $table->integer('product_discount_amount');
- $table->string('product_discount_type')->default('fixed');
- $table->integer('product_tax_amount');
- $table->foreign('purchase_return_id')->references('id')
- ->on('purchase_returns')->cascadeOnDelete();
- $table->foreign('product_id')->references('id')
- ->on('products')->nullOnDelete();
- $table->timestamps();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::dropIfExists('purchase_return_details');
- }
-}
diff --git a/Modules/PurchasesReturn/Database/Migrations/2021_08_08_222646_create_purchase_return_payments_table.php b/Modules/PurchasesReturn/Database/Migrations/2021_08_08_222646_create_purchase_return_payments_table.php
deleted file mode 100644
index 0763b37d..00000000
--- a/Modules/PurchasesReturn/Database/Migrations/2021_08_08_222646_create_purchase_return_payments_table.php
+++ /dev/null
@@ -1,38 +0,0 @@
-id();
- $table->unsignedBigInteger('purchase_return_id');
- $table->integer('amount');
- $table->date('date');
- $table->string('reference');
- $table->string('payment_method');
- $table->text('note')->nullable();
- $table->foreign('purchase_return_id')->references('id')->on('purchase_returns')->cascadeOnDelete();
- $table->timestamps();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::dropIfExists('purchase_return_payments');
- }
-}
diff --git a/Modules/PurchasesReturn/Database/Seeders/PurchasesReturnDatabaseSeeder.php b/Modules/PurchasesReturn/Database/Seeders/PurchasesReturnDatabaseSeeder.php
deleted file mode 100644
index 205c622e..00000000
--- a/Modules/PurchasesReturn/Database/Seeders/PurchasesReturnDatabaseSeeder.php
+++ /dev/null
@@ -1,21 +0,0 @@
-call("OthersTableSeeder");
- }
-}
diff --git a/Modules/PurchasesReturn/Entities/PurchaseReturn.php b/Modules/PurchasesReturn/Entities/PurchaseReturn.php
deleted file mode 100644
index 463dff4f..00000000
--- a/Modules/PurchasesReturn/Entities/PurchaseReturn.php
+++ /dev/null
@@ -1,58 +0,0 @@
-hasMany(PurchaseReturnDetail::class, 'purchase_return_id', 'id');
- }
-
- public function purchaseReturnPayments() {
- return $this->hasMany(PurchaseReturnPayment::class, 'purchase_return_id', 'id');
- }
-
- public static function boot() {
- parent::boot();
-
- static::creating(function ($model) {
- $number = PurchaseReturn::max('id') + 1;
- $model->reference = make_reference_id('PRRN', $number);
- });
- }
-
- public function scopeCompleted($query) {
- return $query->where('status', 'Completed');
- }
-
- public function getShippingAmountAttribute($value) {
- return $value / 100;
- }
-
- public function getPaidAmountAttribute($value) {
- return $value / 100;
- }
-
- public function getTotalAmountAttribute($value) {
- return $value / 100;
- }
-
- public function getDueAmountAttribute($value) {
- return $value / 100;
- }
-
- public function getTaxAmountAttribute($value) {
- return $value / 100;
- }
-
- public function getDiscountAmountAttribute($value) {
- return $value / 100;
- }
-}
diff --git a/Modules/PurchasesReturn/Entities/PurchaseReturnDetail.php b/Modules/PurchasesReturn/Entities/PurchaseReturnDetail.php
deleted file mode 100644
index 651289cd..00000000
--- a/Modules/PurchasesReturn/Entities/PurchaseReturnDetail.php
+++ /dev/null
@@ -1,44 +0,0 @@
-belongsTo(Product::class, 'product_id', 'id');
- }
-
- public function purchaseReturn() {
- return $this->belongsTo(PurchaseReturn::class, 'purchase_return_id', 'id');
- }
-
- public function getPriceAttribute($value) {
- return $value / 100;
- }
-
- public function getUnitPriceAttribute($value) {
- return $value / 100;
- }
-
- public function getSubTotalAttribute($value) {
- return $value / 100;
- }
-
- public function getProductDiscountAmountAttribute($value) {
- return $value / 100;
- }
-
- public function getProductTaxAmountAttribute($value) {
- return $value / 100;
- }
-}
diff --git a/Modules/PurchasesReturn/Entities/PurchaseReturnPayment.php b/Modules/PurchasesReturn/Entities/PurchaseReturnPayment.php
deleted file mode 100644
index 8880c2a1..00000000
--- a/Modules/PurchasesReturn/Entities/PurchaseReturnPayment.php
+++ /dev/null
@@ -1,34 +0,0 @@
-belongsTo(PurchaseReturn::class, 'purchase_return_id', 'id');
- }
-
- public function setAmountAttribute($value) {
- $this->attributes['amount'] = $value * 100;
- }
-
- public function getAmountAttribute($value) {
- return $value / 100;
- }
-
- public function getDateAttribute($value) {
- return Carbon::parse($value)->format('d M, Y');
- }
-
- public function scopeByPurchaseReturn($query) {
- return $query->where('purchase_return_id', request()->route('purchase_return_id'));
- }
-}
diff --git a/Modules/PurchasesReturn/Http/Controllers/PurchaseReturnPaymentsController.php b/Modules/PurchasesReturn/Http/Controllers/PurchaseReturnPaymentsController.php
deleted file mode 100644
index 6f55a119..00000000
--- a/Modules/PurchasesReturn/Http/Controllers/PurchaseReturnPaymentsController.php
+++ /dev/null
@@ -1,146 +0,0 @@
-render('purchasesreturn::payments.index', compact('purchase_return'));
- }
-
-
- public function create($purchase_return_id) {
- abort_if(Gate::denies('access_purchase_return_payments'), 403);
-
- $purchase_return = PurchaseReturn::findOrFail($purchase_return_id);
-
- return view('purchasesreturn::payments.create', compact('purchase_return'));
- }
-
-
- public function store(Request $request) {
- abort_if(Gate::denies('access_purchase_return_payments'), 403);
-
- $request->validate([
- 'date' => 'required|date',
- 'reference' => 'required|string|max:255',
- 'amount' => 'required|numeric',
- 'note' => 'nullable|string|max:1000',
- 'purchase_return_id' => 'required',
- 'payment_method' => 'required|string|max:255'
- ]);
-
- DB::transaction(function () use ($request) {
- PurchaseReturnPayment::create([
- 'date' => $request->date,
- 'reference' => $request->reference,
- 'amount' => $request->amount,
- 'note' => $request->note,
- 'purchase_return_id' => $request->purchase_return_id,
- 'payment_method' => $request->payment_method
- ]);
-
- $purchase_return = PurchaseReturn::findOrFail($request->purchase_return_id);
-
- $due_amount = $purchase_return->due_amount - $request->amount;
-
- if ($due_amount == $purchase_return->total_amount) {
- $payment_status = 'Unpaid';
- } elseif ($due_amount > 0) {
- $payment_status = 'Partial';
- } else {
- $payment_status = 'Paid';
- }
-
- $purchase_return->update([
- 'paid_amount' => ($purchase_return->paid_amount + $request->amount) * 100,
- 'due_amount' => $due_amount * 100,
- 'payment_status' => $payment_status
- ]);
- });
-
- toast('Purchase Return Payment Created!', 'success');
-
- return redirect()->route('purchase-returns.index');
- }
-
-
- public function edit($purchase_return_id, PurchaseReturnPayment $purchaseReturnPayment) {
- abort_if(Gate::denies('access_purchase_return_payments'), 403);
-
- $purchase_return = PurchaseReturn::findOrFail($purchase_return_id);
-
- return view('purchasesreturn::payments.edit', compact('purchaseReturnPayment', 'purchase_return'));
- }
-
-
- public function update(Request $request, PurchaseReturnPayment $purchaseReturnPayment) {
- abort_if(Gate::denies('access_purchase_return_payments'), 403);
-
- $request->validate([
- 'date' => 'required|date',
- 'reference' => 'required|string|max:255',
- 'amount' => 'required|numeric',
- 'note' => 'nullable|string|max:1000',
- 'purchase_return_id' => 'required',
- 'payment_method' => 'required|string|max:255'
- ]);
-
- DB::transaction(function () use ($request, $purchaseReturnPayment) {
- $purchase_return = $purchaseReturnPayment->purchaseReturn;
-
- $due_amount = ($purchase_return->due_amount + $purchaseReturnPayment->amount) - $request->amount;
-
- if ($due_amount == $purchase_return->total_amount) {
- $payment_status = 'Unpaid';
- } elseif ($due_amount > 0) {
- $payment_status = 'Partial';
- } else {
- $payment_status = 'Paid';
- }
-
- $purchase_return->update([
- 'paid_amount' => (($purchase_return->paid_amount - $purchaseReturnPayment->amount) + $request->amount) * 100,
- 'due_amount' => $due_amount * 100,
- 'payment_status' => $payment_status
- ]);
-
- $purchaseReturnPayment->update([
- 'date' => $request->date,
- 'reference' => $request->reference,
- 'amount' => $request->amount,
- 'note' => $request->note,
- 'purchase_return_id' => $request->purchase_return_id,
- 'payment_method' => $request->payment_method
- ]);
- });
-
- toast('Purchase Return Payment Updated!', 'info');
-
- return redirect()->route('purchase-returns.index');
- }
-
-
- public function destroy(PurchaseReturnPayment $purchaseReturnPayment) {
- abort_if(Gate::denies('access_purchase_return_payments'), 403);
-
- $purchaseReturnPayment->delete();
-
- toast('Purchase Return Payment Deleted!', 'warning');
-
- return redirect()->route('purchase-returns.index');
- }
-}
diff --git a/Modules/PurchasesReturn/Http/Controllers/PurchasesReturnController.php b/Modules/PurchasesReturn/Http/Controllers/PurchasesReturnController.php
deleted file mode 100644
index e8eb175a..00000000
--- a/Modules/PurchasesReturn/Http/Controllers/PurchasesReturnController.php
+++ /dev/null
@@ -1,232 +0,0 @@
-render('purchasesreturn::index');
- }
-
-
- public function create() {
- abort_if(Gate::denies('create_purchase_returns'), 403);
-
- Cart::instance('purchase_return')->destroy();
-
- return view('purchasesreturn::create');
- }
-
-
- public function store(StorePurchaseReturnRequest $request) {
- DB::transaction(function () use ($request) {
- $due_amount = $request->total_amount - $request->paid_amount;
-
- if ($due_amount == $request->total_amount) {
- $payment_status = 'Unpaid';
- } elseif ($due_amount > 0) {
- $payment_status = 'Partial';
- } else {
- $payment_status = 'Paid';
- }
-
- $purchase_return = PurchaseReturn::create([
- 'date' => $request->date,
- 'supplier_id' => $request->supplier_id,
- 'supplier_name' => Supplier::findOrFail($request->supplier_id)->supplier_name,
- 'tax_percentage' => $request->tax_percentage,
- 'discount_percentage' => $request->discount_percentage,
- 'shipping_amount' => $request->shipping_amount * 100,
- 'paid_amount' => $request->paid_amount * 100,
- 'total_amount' => $request->total_amount * 100,
- 'due_amount' => $due_amount * 100,
- 'status' => $request->status,
- 'payment_status' => $payment_status,
- 'payment_method' => $request->payment_method,
- 'note' => $request->note,
- 'tax_amount' => Cart::instance('purchase_return')->tax() * 100,
- 'discount_amount' => Cart::instance('purchase_return')->discount() * 100,
- ]);
-
- foreach (Cart::instance('purchase_return')->content() as $cart_item) {
- PurchaseReturnDetail::create([
- 'purchase_return_id' => $purchase_return->id,
- 'product_id' => $cart_item->id,
- 'product_name' => $cart_item->name,
- 'product_code' => $cart_item->options->code,
- 'quantity' => $cart_item->qty,
- 'price' => $cart_item->price * 100,
- 'unit_price' => $cart_item->options->unit_price * 100,
- 'sub_total' => $cart_item->options->sub_total * 100,
- 'product_discount_amount' => $cart_item->options->product_discount * 100,
- 'product_discount_type' => $cart_item->options->product_discount_type,
- 'product_tax_amount' => $cart_item->options->product_tax * 100,
- ]);
-
- if ($request->status == 'Shipped' || $request->status == 'Completed') {
- $product = Product::findOrFail($cart_item->id);
- $product->update([
- 'product_quantity' => $product->product_quantity - $cart_item->qty
- ]);
- }
- }
-
- Cart::instance('purchase_return')->destroy();
-
- if ($purchase_return->paid_amount > 0) {
- PurchaseReturnPayment::create([
- 'date' => $request->date,
- 'reference' => 'INV/' . $purchase_return->reference,
- 'amount' => $purchase_return->paid_amount,
- 'purchase_return_id' => $purchase_return->id,
- 'payment_method' => $request->payment_method
- ]);
- }
- });
-
- toast('Purchase Return Created!', 'success');
-
- return redirect()->route('purchase-returns.index');
- }
-
-
- public function show(PurchaseReturn $purchase_return) {
- abort_if(Gate::denies('show_purchase_returns'), 403);
-
- $supplier = Supplier::findOrFail($purchase_return->supplier_id);
-
- return view('purchasesreturn::show', compact('purchase_return', 'supplier'));
- }
-
-
- public function edit(PurchaseReturn $purchase_return) {
- abort_if(Gate::denies('edit_purchase_returns'), 403);
-
- $purchase_return_details = $purchase_return->purchaseReturnDetails;
-
- Cart::instance('purchase_return')->destroy();
-
- $cart = Cart::instance('purchase_return');
-
- foreach ($purchase_return_details as $purchase_return_detail) {
- $cart->add([
- 'id' => $purchase_return_detail->product_id,
- 'name' => $purchase_return_detail->product_name,
- 'qty' => $purchase_return_detail->quantity,
- 'price' => $purchase_return_detail->price,
- 'weight' => 1,
- 'options' => [
- 'product_discount' => $purchase_return_detail->product_discount_amount,
- 'product_discount_type' => $purchase_return_detail->product_discount_type,
- 'sub_total' => $purchase_return_detail->sub_total,
- 'code' => $purchase_return_detail->product_code,
- 'stock' => Product::findOrFail($purchase_return_detail->product_id)->product_quantity,
- 'product_tax' => $purchase_return_detail->product_tax_amount,
- 'unit_price' => $purchase_return_detail->unit_price
- ]
- ]);
- }
-
- return view('purchasesreturn::edit', compact('purchase_return'));
- }
-
-
- public function update(UpdatePurchaseReturnRequest $request, PurchaseReturn $purchase_return) {
- DB::transaction(function () use ($request, $purchase_return) {
- $due_amount = $request->total_amount - $request->paid_amount;
-
- if ($due_amount == $request->total_amount) {
- $payment_status = 'Unpaid';
- } elseif ($due_amount > 0) {
- $payment_status = 'Partial';
- } else {
- $payment_status = 'Paid';
- }
-
- foreach ($purchase_return->purchaseReturnDetails as $purchase_return_detail) {
- if ($purchase_return->status == 'Shipped' || $purchase_return->status == 'Completed') {
- $product = Product::findOrFail($purchase_return_detail->product_id);
- $product->update([
- 'product_quantity' => $product->product_quantity + $purchase_return_detail->quantity
- ]);
- }
- $purchase_return_detail->delete();
- }
-
- $purchase_return->update([
- 'date' => $request->date,
- 'reference' => $request->reference,
- 'supplier_id' => $request->supplier_id,
- 'supplier_name' => Supplier::findOrFail($request->supplier_id)->supplier_name,
- 'tax_percentage' => $request->tax_percentage,
- 'discount_percentage' => $request->discount_percentage,
- 'shipping_amount' => $request->shipping_amount * 100,
- 'paid_amount' => $request->paid_amount * 100,
- 'total_amount' => $request->total_amount * 100,
- 'due_amount' => $due_amount * 100,
- 'status' => $request->status,
- 'payment_status' => $payment_status,
- 'payment_method' => $request->payment_method,
- 'note' => $request->note,
- 'tax_amount' => Cart::instance('purchase_return')->tax() * 100,
- 'discount_amount' => Cart::instance('purchase_return')->discount() * 100,
- ]);
-
- foreach (Cart::instance('purchase_return')->content() as $cart_item) {
- PurchaseReturnDetail::create([
- 'purchase_return_id' => $purchase_return->id,
- 'product_id' => $cart_item->id,
- 'product_name' => $cart_item->name,
- 'product_code' => $cart_item->options->code,
- 'quantity' => $cart_item->qty,
- 'price' => $cart_item->price * 100,
- 'unit_price' => $cart_item->options->unit_price * 100,
- 'sub_total' => $cart_item->options->sub_total * 100,
- 'product_discount_amount' => $cart_item->options->product_discount * 100,
- 'product_discount_type' => $cart_item->options->product_discount_type,
- 'product_tax_amount' => $cart_item->options->product_tax * 100,
- ]);
-
- if ($request->status == 'Shipped' || $request->status == 'Completed') {
- $product = Product::findOrFail($cart_item->id);
- $product->update([
- 'product_quantity' => $product->product_quantity - $cart_item->qty
- ]);
- }
- }
-
- Cart::instance('purchase_return')->destroy();
- });
-
- toast('Purchase Return Updated!', 'info');
-
- return redirect()->route('purchase-returns.index');
- }
-
-
- public function destroy(PurchaseReturn $purchase_return) {
- abort_if(Gate::denies('delete_purchase_returns'), 403);
-
- $purchase_return->delete();
-
- toast('Purchase Return Deleted!', 'warning');
-
- return redirect()->route('purchase-returns.index');
- }
-}
diff --git a/Modules/PurchasesReturn/Http/Requests/StorePurchaseReturnRequest.php b/Modules/PurchasesReturn/Http/Requests/StorePurchaseReturnRequest.php
deleted file mode 100644
index d8bd9671..00000000
--- a/Modules/PurchasesReturn/Http/Requests/StorePurchaseReturnRequest.php
+++ /dev/null
@@ -1,40 +0,0 @@
- 'required|numeric',
- 'reference' => 'required|string|max:255',
- 'tax_percentage' => 'required|integer|min:0|max:100',
- 'discount_percentage' => 'required|integer|min:0|max:100',
- 'shipping_amount' => 'required|numeric',
- 'total_amount' => 'required|numeric',
- 'paid_amount' => 'required|numeric',
- 'status' => 'required|string|max:255',
- 'payment_method' => 'required|string|max:255',
- 'note' => 'nullable|string|max:1000'
- ];
- }
-
- /**
- * Determine if the user is authorized to make this request.
- *
- * @return bool
- */
- public function authorize()
- {
- return Gate::allows('create_purchase_returns');
- }
-}
diff --git a/Modules/PurchasesReturn/Http/Requests/UpdatePurchaseReturnRequest.php b/Modules/PurchasesReturn/Http/Requests/UpdatePurchaseReturnRequest.php
deleted file mode 100644
index 7b8ea1c8..00000000
--- a/Modules/PurchasesReturn/Http/Requests/UpdatePurchaseReturnRequest.php
+++ /dev/null
@@ -1,40 +0,0 @@
- 'required|numeric',
- 'reference' => 'required|string|max:255',
- 'tax_percentage' => 'required|integer|min:0|max:100',
- 'discount_percentage' => 'required|integer|min:0|max:100',
- 'shipping_amount' => 'required|numeric',
- 'total_amount' => 'required|numeric',
- 'paid_amount' => 'required|numeric|max:' . $this->purchase_return->total_amount,
- 'status' => 'required|string|max:255',
- 'payment_method' => 'required|string|max:255',
- 'note' => 'nullable|string|max:1000'
- ];
- }
-
- /**
- * Determine if the user is authorized to make this request.
- *
- * @return bool
- */
- public function authorize()
- {
- return Gate::allows('edit_purchase_returns');
- }
-}
diff --git a/Modules/PurchasesReturn/Providers/PurchasesReturnServiceProvider.php b/Modules/PurchasesReturn/Providers/PurchasesReturnServiceProvider.php
deleted file mode 100644
index 07269253..00000000
--- a/Modules/PurchasesReturn/Providers/PurchasesReturnServiceProvider.php
+++ /dev/null
@@ -1,112 +0,0 @@
-registerTranslations();
- $this->registerConfig();
- $this->registerViews();
- $this->loadMigrationsFrom(module_path($this->moduleName, 'Database/Migrations'));
- }
-
- /**
- * Register the service provider.
- *
- * @return void
- */
- public function register()
- {
- $this->app->register(RouteServiceProvider::class);
- }
-
- /**
- * Register config.
- *
- * @return void
- */
- protected function registerConfig()
- {
- $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.
- *
- * @return void
- */
- public function registerViews()
- {
- $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);
- }
-
- /**
- * Register translations.
- *
- * @return void
- */
- public function registerTranslations()
- {
- $langPath = resource_path('lang/modules/' . $this->moduleNameLower);
-
- if (is_dir($langPath)) {
- $this->loadTranslationsFrom($langPath, $this->moduleNameLower);
- } else {
- $this->loadTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower);
- }
- }
-
- /**
- * Get the services provided by the provider.
- *
- * @return array
- */
- public function provides()
- {
- return [];
- }
-
- private function getPublishableViewPaths(): array
- {
- $paths = [];
- foreach (\Config::get('view.paths') as $path) {
- if (is_dir($path . '/modules/' . $this->moduleNameLower)) {
- $paths[] = $path . '/modules/' . $this->moduleNameLower;
- }
- }
- return $paths;
- }
-}
diff --git a/Modules/PurchasesReturn/Providers/RouteServiceProvider.php b/Modules/PurchasesReturn/Providers/RouteServiceProvider.php
deleted file mode 100644
index c82f8c19..00000000
--- a/Modules/PurchasesReturn/Providers/RouteServiceProvider.php
+++ /dev/null
@@ -1,69 +0,0 @@
-mapApiRoutes();
-
- $this->mapWebRoutes();
- }
-
- /**
- * Define the "web" routes for the application.
- *
- * These routes all receive session state, CSRF protection, etc.
- *
- * @return void
- */
- protected function mapWebRoutes()
- {
- Route::middleware('web')
- ->namespace($this->moduleNamespace)
- ->group(module_path('PurchasesReturn', '/Routes/web.php'));
- }
-
- /**
- * Define the "api" routes for the application.
- *
- * These routes are typically stateless.
- *
- * @return void
- */
- protected function mapApiRoutes()
- {
- Route::prefix('api')
- ->middleware('api')
- ->namespace($this->moduleNamespace)
- ->group(module_path('PurchasesReturn', '/Routes/api.php'));
- }
-}
diff --git a/Modules/PurchasesReturn/Resources/views/create.blade.php b/Modules/PurchasesReturn/Resources/views/create.blade.php
deleted file mode 100644
index 0e039a9a..00000000
--- a/Modules/PurchasesReturn/Resources/views/create.blade.php
+++ /dev/null
@@ -1,138 +0,0 @@
-@extends('layouts.app')
-
-@section('title', 'Create Purchase Return')
-
-@section('breadcrumb')
-
- - Home
- - Purchase Returns
- - Add
-
-@endsection
-
-@section('content')
-
-
-
-
-
-
-
- @include('utils.alerts')
-
-
-
-
-
-
-@endsection
-
-@push('page_scripts')
-
-
-@endpush
diff --git a/Modules/PurchasesReturn/Resources/views/edit.blade.php b/Modules/PurchasesReturn/Resources/views/edit.blade.php
deleted file mode 100644
index cc6398d9..00000000
--- a/Modules/PurchasesReturn/Resources/views/edit.blade.php
+++ /dev/null
@@ -1,124 +0,0 @@
-@extends('layouts.app')
-
-@section('title', 'Edit Purchase Return')
-
-@section('breadcrumb')
-
- - Home
- - Purchase Returns
- - Edit
-
-@endsection
-
-@section('content')
-
-
-
-
-
-
-
- @include('utils.alerts')
-
-
-
-
-
-
-@endsection
-
-@push('page_scripts')
-
-
-@endpush
diff --git a/Modules/PurchasesReturn/Resources/views/index.blade.php b/Modules/PurchasesReturn/Resources/views/index.blade.php
deleted file mode 100644
index 004208f3..00000000
--- a/Modules/PurchasesReturn/Resources/views/index.blade.php
+++ /dev/null
@@ -1,40 +0,0 @@
-@extends('layouts.app')
-
-@section('title', 'Purchase Returns')
-
-@section('third_party_stylesheets')
-
-@endsection
-
-@section('breadcrumb')
-
- - Home
- - Purchase Returns
-
-@endsection
-
-@section('content')
-
-@endsection
-
-@push('page_scripts')
- {!! $dataTable->scripts() !!}
-@endpush
diff --git a/Modules/PurchasesReturn/Resources/views/partials/actions.blade.php b/Modules/PurchasesReturn/Resources/views/partials/actions.blade.php
deleted file mode 100644
index 16c4027d..00000000
--- a/Modules/PurchasesReturn/Resources/views/partials/actions.blade.php
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
diff --git a/Modules/PurchasesReturn/Resources/views/partials/payment-status.blade.php b/Modules/PurchasesReturn/Resources/views/partials/payment-status.blade.php
deleted file mode 100644
index 7ac6bf4c..00000000
--- a/Modules/PurchasesReturn/Resources/views/partials/payment-status.blade.php
+++ /dev/null
@@ -1,13 +0,0 @@
-@if ($data->payment_status == 'Partial')
-
- {{ $data->payment_status }}
-
-@elseif ($data->payment_status == 'Paid')
-
- {{ $data->payment_status }}
-
-@else
-
- {{ $data->payment_status }}
-
-@endif
diff --git a/Modules/PurchasesReturn/Resources/views/partials/status.blade.php b/Modules/PurchasesReturn/Resources/views/partials/status.blade.php
deleted file mode 100644
index e6f2dfe7..00000000
--- a/Modules/PurchasesReturn/Resources/views/partials/status.blade.php
+++ /dev/null
@@ -1,13 +0,0 @@
-@if ($data->status == 'Pending')
-
- {{ $data->status }}
-
-@elseif ($data->status == 'Shipped')
-
- {{ $data->status }}
-
-@else
-
- {{ $data->status }}
-
-@endif
diff --git a/Modules/PurchasesReturn/Resources/views/payments/create.blade.php b/Modules/PurchasesReturn/Resources/views/payments/create.blade.php
deleted file mode 100644
index 7c8eebaa..00000000
--- a/Modules/PurchasesReturn/Resources/views/payments/create.blade.php
+++ /dev/null
@@ -1,114 +0,0 @@
-@extends('layouts.app')
-
-@section('title', 'Create Payment')
-
-@section('breadcrumb')
-
- - Home
- - Purchase Returns
- - {{ $purchase_return->reference }}
- - Add Payment
-
-@endsection
-
-@section('content')
-
-
-
-@endsection
-
-@push('page_scripts')
-
-
-@endpush
-
diff --git a/Modules/PurchasesReturn/Resources/views/payments/edit.blade.php b/Modules/PurchasesReturn/Resources/views/payments/edit.blade.php
deleted file mode 100644
index c06cfa6e..00000000
--- a/Modules/PurchasesReturn/Resources/views/payments/edit.blade.php
+++ /dev/null
@@ -1,117 +0,0 @@
-@extends('layouts.app')
-
-@section('title', 'Edit Payment')
-
-@section('breadcrumb')
-
- - Home
- - Purchase Returns
- - {{ $purchase_return->reference }}
- - Edit Payment
-
-@endsection
-
-@section('content')
-
-
-
-@endsection
-
-@push('page_scripts')
-
-
-@endpush
-
diff --git a/Modules/PurchasesReturn/Resources/views/payments/index.blade.php b/Modules/PurchasesReturn/Resources/views/payments/index.blade.php
deleted file mode 100644
index 4464f876..00000000
--- a/Modules/PurchasesReturn/Resources/views/payments/index.blade.php
+++ /dev/null
@@ -1,37 +0,0 @@
-@extends('layouts.app')
-
-@section('title', 'Sale Payments')
-
-@section('third_party_stylesheets')
-
-@endsection
-
-@section('breadcrumb')
-
- - Home
- - Purcase Returns
- - {{ $purchase_return->reference }}
- - Payments
-
-@endsection
-
-@section('content')
-
-
-
- @include('utils.alerts')
-
-
-
- {!! $dataTable->table() !!}
-
-
-
-
-
-
-@endsection
-
-@push('page_scripts')
- {!! $dataTable->scripts() !!}
-@endpush
diff --git a/Modules/PurchasesReturn/Resources/views/payments/partials/actions.blade.php b/Modules/PurchasesReturn/Resources/views/payments/partials/actions.blade.php
deleted file mode 100644
index 19c19a53..00000000
--- a/Modules/PurchasesReturn/Resources/views/payments/partials/actions.blade.php
+++ /dev/null
@@ -1,19 +0,0 @@
-@can('access_purchase_return_payments')
-
-
-
-@endcan
-@can('access_purchase_return_payments')
-
-@endcan
diff --git a/Modules/PurchasesReturn/Resources/views/print.blade.php b/Modules/PurchasesReturn/Resources/views/print.blade.php
deleted file mode 100644
index d0b5b7d0..00000000
--- a/Modules/PurchasesReturn/Resources/views/print.blade.php
+++ /dev/null
@@ -1,133 +0,0 @@
-
-
-
-
-
-
- Purchase Return Details
-
-
-
-
-
-
-
-  }})
-
- Reference:: {{ $purchase_return->reference }}
-
-
-
-
-
-
- Company Info:
- {{ settings()->company_name }}
- {{ settings()->company_address }}
- Email: {{ settings()->company_email }}
- Phone: {{ settings()->company_phone }}
-
-
-
- Supplier Info:
- {{ $supplier->supplier_name }}
- {{ $supplier->address }}
- Email: {{ $supplier->supplier_email }}
- Phone: {{ $supplier->supplier_phone }}
-
-
-
- Invoice Info:
- Invoice: INV/{{ $purchase_return->reference }}
- Date: {{ \Carbon\Carbon::parse($purchase_return->date)->format('d M, Y') }}
-
- Status: {{ $purchase_return->status }}
-
-
- Payment Status: {{ $purchase_return->payment_status }}
-
-
-
-
-
-
-
-
-
- Product |
- Net Unit Price |
- Quantity |
- Discount |
- Tax |
- Sub Total |
-
-
-
- @foreach($purchase_return->purchaseReturnDetails as $item)
-
-
- {{ $item->product_name }}
-
- {{ $item->product_code }}
-
- |
-
- {{ format_currency($item->unit_price) }} |
-
-
- {{ $item->quantity }}
- |
-
-
- {{ format_currency($item->product_discount_amount) }}
- |
-
-
- {{ format_currency($item->product_tax_amount) }}
- |
-
-
- {{ format_currency($item->sub_total) }}
- |
-
- @endforeach
-
-
-
-
-
-
-
-
- Discount ({{ $purchase_return->discount_percentage }}%) |
- {{ format_currency($purchase_return->discount_amount) }} |
-
-
- Tax ({{ $purchase_return->tax_percentage }}%) |
- {{ format_currency($purchase_return->tax_amount) }} |
-
-
- Shipping) |
- {{ format_currency($purchase_return->shipping_amount) }} |
-
-
- Grand Total |
- {{ format_currency($purchase_return->total_amount) }} |
-
-
-
-
-
-
-
- {{ settings()->company_name }} © {{ date('Y') }}.
-
-
-
-
-
-
-
-
-
diff --git a/Modules/PurchasesReturn/Resources/views/show.blade.php b/Modules/PurchasesReturn/Resources/views/show.blade.php
deleted file mode 100644
index 387cc6e5..00000000
--- a/Modules/PurchasesReturn/Resources/views/show.blade.php
+++ /dev/null
@@ -1,135 +0,0 @@
-@extends('layouts.app')
-
-@section('title', 'Purchase Details')
-
-@section('breadcrumb')
-
- - Home
- - Purchase Returns
- - Details
-
-@endsection
-
-@section('content')
-
-
-
-
-
-
-
-
- Company Info:
- {{ settings()->company_name }}
- {{ settings()->company_address }}
- Email: {{ settings()->company_email }}
- Phone: {{ settings()->company_phone }}
-
-
-
- Supplier Info:
- {{ $supplier->supplier_name }}
- {{ $supplier->address }}
- Email: {{ $supplier->supplier_email }}
- Phone: {{ $supplier->supplier_phone }}
-
-
-
- Invoice Info:
- Invoice: INV/{{ $purchase_return->reference }}
- Date: {{ \Carbon\Carbon::parse($purchase_return->date)->format('d M, Y') }}
-
- Status: {{ $purchase_return->status }}
-
-
- Payment Status: {{ $purchase_return->payment_status }}
-
-
-
-
-
-
-
-
-
- Product |
- Net Unit Price |
- Quantity |
- Discount |
- Tax |
- Sub Total |
-
-
-
- @foreach($purchase_return->purchaseReturnDetails as $item)
-
-
- {{ $item->product_name }}
-
- {{ $item->product_code }}
-
- |
-
- {{ format_currency($item->unit_price) }} |
-
-
- {{ $item->quantity }}
- |
-
-
- {{ format_currency($item->product_discount_amount) }}
- |
-
-
- {{ format_currency($item->product_tax_amount) }}
- |
-
-
- {{ format_currency($item->sub_total) }}
- |
-
- @endforeach
-
-
-
-
-
-
-
-
- Discount ({{ $purchase_return->discount_percentage }}%) |
- {{ format_currency($purchase_return->discount_amount) }} |
-
-
- Tax ({{ $purchase_return->tax_percentage }}%) |
- {{ format_currency($purchase_return->tax_amount) }} |
-
-
- Shipping) |
- {{ format_currency($purchase_return->shipping_amount) }} |
-
-
- Grand Total |
- {{ format_currency($purchase_return->total_amount) }} |
-
-
-
-
-
-
-
-
-
-
-@endsection
-
diff --git a/Modules/PurchasesReturn/Routes/web.php b/Modules/PurchasesReturn/Routes/web.php
deleted file mode 100644
index 950e5d06..00000000
--- a/Modules/PurchasesReturn/Routes/web.php
+++ /dev/null
@@ -1,46 +0,0 @@
- 'auth'], function() {
-
- //Generate PDF
- Route::get('/purchase-returns/pdf/{id}', function ($id) {
- $purchaseReturn = \Modules\PurchasesReturn\Entities\PurchaseReturn::findOrFail($id);
- $supplier = \Modules\People\Entities\Supplier::findOrFail($purchaseReturn->supplier_id);
-
- $pdf = \PDF::loadView('purchasesreturn::print', [
- 'purchase_return' => $purchaseReturn,
- 'supplier' => $supplier,
- ])->setPaper('a4');
-
- return $pdf->stream('purchase-return-'. $purchaseReturn->reference .'.pdf');
- })->name('purchase-returns.pdf');
-
- //Purchase Returns
- Route::resource('purchase-returns', 'PurchasesReturnController');
-
- //Payments
- Route::get('/purchase-return-payments/{purchase_return_id}', 'PurchaseReturnPaymentsController@index')
- ->name('purchase-return-payments.index');
- Route::get('/purchase-return-payments/{purchase_return_id}/create', 'PurchaseReturnPaymentsController@create')
- ->name('purchase-return-payments.create');
- Route::post('/purchase-return-payments/store', 'PurchaseReturnPaymentsController@store')
- ->name('purchase-return-payments.store');
- Route::get('/purchase-return-payments/{purchase_return_id}/edit/{purchaseReturnPayment}', 'PurchaseReturnPaymentsController@edit')
- ->name('purchase-return-payments.edit');
- Route::patch('/purchase-return-payments/update/{purchaseReturnPayment}', 'PurchaseReturnPaymentsController@update')
- ->name('purchase-return-payments.update');
- Route::delete('/purchase-return-payments/destroy/{purchaseReturnPayment}', 'PurchaseReturnPaymentsController@destroy')
- ->name('purchase-return-payments.destroy');
-
-});
diff --git a/Modules/PurchasesReturn/module.json b/Modules/PurchasesReturn/module.json
deleted file mode 100644
index 84634475..00000000
--- a/Modules/PurchasesReturn/module.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "name": "PurchasesReturn",
- "alias": "purchasesreturn",
- "description": "",
- "keywords": [],
- "priority": 0,
- "providers": [
- "Modules\\PurchasesReturn\\Providers\\PurchasesReturnServiceProvider"
- ],
- "aliases": {},
- "files": [],
- "requires": []
-}
diff --git a/Modules/PurchasesReturn/package.json b/Modules/PurchasesReturn/package.json
deleted file mode 100644
index 4599509f..00000000
--- a/Modules/PurchasesReturn/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "private": true,
- "scripts": {
- "dev": "npm run development",
- "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
- "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
- "watch-poll": "npm run watch -- --watch-poll",
- "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
- "prod": "npm run production",
- "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
- },
- "devDependencies": {
- "cross-env": "^7.0",
- "laravel-mix": "^5.0.1",
- "laravel-mix-merge-manifest": "^0.1.2"
- }
-}
diff --git a/Modules/PurchasesReturn/webpack.mix.js b/Modules/PurchasesReturn/webpack.mix.js
deleted file mode 100644
index 9b6f74a2..00000000
--- a/Modules/PurchasesReturn/webpack.mix.js
+++ /dev/null
@@ -1,14 +0,0 @@
-const dotenvExpand = require('dotenv-expand');
-dotenvExpand(require('dotenv').config({ path: '../../.env'/*, debug: true*/}));
-
-const mix = require('laravel-mix');
-require('laravel-mix-merge-manifest');
-
-mix.setPublicPath('../../public').mergeManifest();
-
-mix.js(__dirname + '/Resources/assets/js/app.js', 'js/purchasesreturn.js')
- .sass( __dirname + '/Resources/assets/sass/app.scss', 'css/purchasesreturn.css');
-
-if (mix.inProduction()) {
- mix.version();
-}
diff --git a/Modules/Reports/Http/Controllers/ReportsController.php b/Modules/Reports/Http/Controllers/ReportsController.php
index 060c378d..d41855db 100644
--- a/Modules/Reports/Http/Controllers/ReportsController.php
+++ b/Modules/Reports/Http/Controllers/ReportsController.php
@@ -15,12 +15,6 @@ class ReportsController extends Controller
return view('reports::profit-loss.index');
}
- public function paymentsReport() {
- abort_if(Gate::denies('access_reports'), 403);
-
- return view('reports::payments.index');
- }
-
public function salesReport() {
abort_if(Gate::denies('access_reports'), 403);
@@ -32,16 +26,4 @@ class ReportsController extends Controller
return view('reports::purchases.index');
}
-
- public function salesReturnReport() {
- abort_if(Gate::denies('access_reports'), 403);
-
- return view('reports::sales-return.index');
- }
-
- public function purchasesReturnReport() {
- abort_if(Gate::denies('access_reports'), 403);
-
- return view('reports::purchases-return.index');
- }
}
diff --git a/Modules/Reports/Routes/web.php b/Modules/Reports/Routes/web.php
index db19d38a..78613856 100644
--- a/Modules/Reports/Routes/web.php
+++ b/Modules/Reports/Routes/web.php
@@ -15,19 +15,10 @@ Route::group(['middleware' => 'auth'], function () {
//Profit Loss Report
Route::get('/profit-loss-report', 'ReportsController@profitLossReport')
->name('profit-loss-report.index');
- //Payments Report
- Route::get('/payments-report', 'ReportsController@paymentsReport')
- ->name('payments-report.index');
//Sales Report
Route::get('/sales-report', 'ReportsController@salesReport')
->name('sales-report.index');
//Purchases Report
Route::get('/purchases-report', 'ReportsController@purchasesReport')
->name('purchases-report.index');
- //Sales Return Report
- Route::get('/sales-return-report', 'ReportsController@salesReturnReport')
- ->name('sales-return-report.index');
- //Purchases Return Report
- Route::get('/purchases-return-report', 'ReportsController@purchasesReturnReport')
- ->name('purchases-return-report.index');
});
diff --git a/Modules/PurchasesReturn/Config/.gitkeep b/Modules/StockTransfer/Config/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Config/.gitkeep
rename to Modules/StockTransfer/Config/.gitkeep
diff --git a/Modules/StockTransfer/Config/config.php b/Modules/StockTransfer/Config/config.php
new file mode 100644
index 00000000..50818514
--- /dev/null
+++ b/Modules/StockTransfer/Config/config.php
@@ -0,0 +1,5 @@
+ 'StockTransfer'
+];
diff --git a/Modules/PurchasesReturn/Console/.gitkeep b/Modules/StockTransfer/Console/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Console/.gitkeep
rename to Modules/StockTransfer/Console/.gitkeep
diff --git a/Modules/PurchasesReturn/Database/Migrations/.gitkeep b/Modules/StockTransfer/Database/Migrations/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Database/Migrations/.gitkeep
rename to Modules/StockTransfer/Database/Migrations/.gitkeep
diff --git a/Modules/StockTransfer/Database/Migrations/2024_03_21_000001_create_stock_transfers_table.php b/Modules/StockTransfer/Database/Migrations/2024_03_21_000001_create_stock_transfers_table.php
new file mode 100644
index 00000000..7da1f7f6
--- /dev/null
+++ b/Modules/StockTransfer/Database/Migrations/2024_03_21_000001_create_stock_transfers_table.php
@@ -0,0 +1,29 @@
+id();
+ $table->string('reference_no')->unique();
+ $table->foreignId('source_branch_id')->constrained('branches')->onDelete('restrict');
+ $table->foreignId('destination_branch_id')->constrained('branches')->onDelete('restrict');
+ $table->date('transfer_date');
+ $table->text('note')->nullable();
+ $table->string('status')->default('pending'); // pending, completed, cancelled
+ $table->string('created_by');
+ $table->string('updated_by')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ public function down()
+ {
+ Schema::dropIfExists('stock_transfers');
+ }
+};
\ No newline at end of file
diff --git a/Modules/StockTransfer/Database/Migrations/2024_03_21_000002_create_stock_transfer_items_table.php b/Modules/StockTransfer/Database/Migrations/2024_03_21_000002_create_stock_transfer_items_table.php
new file mode 100644
index 00000000..963b3dfe
--- /dev/null
+++ b/Modules/StockTransfer/Database/Migrations/2024_03_21_000002_create_stock_transfer_items_table.php
@@ -0,0 +1,25 @@
+id();
+ $table->foreignId('stock_transfer_id')->constrained('stock_transfers')->onDelete('cascade');
+ $table->foreignId('product_id')->constrained('products')->onDelete('restrict');
+ $table->foreignId('product_batch_id')->constrained('product_batches')->onDelete('restrict');
+ $table->integer('quantity');
+ $table->timestamps();
+ });
+ }
+
+ public function down()
+ {
+ Schema::dropIfExists('stock_transfer_items');
+ }
+};
\ No newline at end of file
diff --git a/Modules/PurchasesReturn/Database/Seeders/.gitkeep b/Modules/StockTransfer/Database/Seeders/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Database/Seeders/.gitkeep
rename to Modules/StockTransfer/Database/Seeders/.gitkeep
diff --git a/Modules/PurchasesReturn/Database/factories/.gitkeep b/Modules/StockTransfer/Database/factories/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Database/factories/.gitkeep
rename to Modules/StockTransfer/Database/factories/.gitkeep
diff --git a/Modules/PurchasesReturn/Entities/.gitkeep b/Modules/StockTransfer/Entities/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Entities/.gitkeep
rename to Modules/StockTransfer/Entities/.gitkeep
diff --git a/Modules/StockTransfer/Entities/StockTransfer.php b/Modules/StockTransfer/Entities/StockTransfer.php
new file mode 100644
index 00000000..eb32ac36
--- /dev/null
+++ b/Modules/StockTransfer/Entities/StockTransfer.php
@@ -0,0 +1,59 @@
+ 'date'
+ ];
+
+ public function sourceBranch()
+ {
+ return $this->belongsTo(Branch::class, 'source_branch_id');
+ }
+
+ public function destinationBranch()
+ {
+ return $this->belongsTo(Branch::class, 'destination_branch_id');
+ }
+
+ public function items()
+ {
+ return $this->hasMany(StockTransferItem::class);
+ }
+
+ public function getTransferDateAttribute($value)
+ {
+ return Carbon::parse($value)->format('d M, Y');
+ }
+
+ public static function boot()
+ {
+ parent::boot();
+
+ static::creating(function ($model) {
+ $number = StockTransfer::max('id') + 1;
+ $model->reference_no = 'TRF-' . date('Ymd') . '-' . str_pad($number, 4, '0', STR_PAD_LEFT);
+ });
+ }
+}
\ No newline at end of file
diff --git a/Modules/StockTransfer/Entities/StockTransferItem.php b/Modules/StockTransfer/Entities/StockTransferItem.php
new file mode 100644
index 00000000..253a67cc
--- /dev/null
+++ b/Modules/StockTransfer/Entities/StockTransferItem.php
@@ -0,0 +1,39 @@
+ 'integer'
+ ];
+
+ public function stockTransfer()
+ {
+ return $this->belongsTo(StockTransfer::class);
+ }
+
+ public function product()
+ {
+ return $this->belongsTo(Product::class);
+ }
+
+ public function productBatch()
+ {
+ return $this->belongsTo(ProductBatch::class);
+ }
+}
\ No newline at end of file
diff --git a/Modules/PurchasesReturn/Http/Controllers/.gitkeep b/Modules/StockTransfer/Http/Controllers/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Http/Controllers/.gitkeep
rename to Modules/StockTransfer/Http/Controllers/.gitkeep
diff --git a/Modules/StockTransfer/Http/Controllers/StockTransferController.php b/Modules/StockTransfer/Http/Controllers/StockTransferController.php
new file mode 100644
index 00000000..434c2b3d
--- /dev/null
+++ b/Modules/StockTransfer/Http/Controllers/StockTransferController.php
@@ -0,0 +1,114 @@
+latest()
+ ->paginate(10);
+
+ return view('stocktransfer::index', compact('stockTransfers'));
+ }
+
+ public function create()
+ {
+ $branches = Branch::all();
+ $products = Product::all();
+
+ return view('stocktransfer::create', compact('branches', 'products'));
+ }
+
+ public function store(StockTransferRequest $request)
+ {
+ try {
+ DB::beginTransaction();
+
+ // Create stock transfer record
+ $transfer = StockTransfer::create([
+ 'source_branch_id' => $request->source_branch_id,
+ 'destination_branch_id' => $request->destination_branch_id,
+ 'transfer_date' => $request->transfer_date,
+ 'note' => $request->note,
+ 'status' => 'pending',
+ 'created_by' => auth()->id(),
+ ]);
+
+ // Process each transfer item
+ foreach ($request->items as $item) {
+ // Get source batch
+ $sourceBatch = ProductBatch::findOrFail($item['product_batch_id']);
+
+ // Step 1: Deduct quantity from source branch
+ $sourceBatch->quantity -= $item['quantity'];
+ $sourceBatch->save();
+
+ // Step 2: Create new batch in destination branch
+ ProductBatch::create([
+ 'product_id' => $sourceBatch->product_id,
+ 'branch_id' => $request->destination_branch_id,
+ 'batch_code' => $sourceBatch->batch_code,
+ 'quantity' => $item['quantity'],
+ 'purchase_price' => $sourceBatch->purchase_price,
+ 'expired_date' => $sourceBatch->expired_date,
+ 'created_by' => auth()->id(),
+ 'updated_by' => auth()->id()
+ ]);
+
+ // Step 3: Create transfer item record
+ StockTransferItem::create([
+ 'stock_transfer_id' => $transfer->id,
+ 'product_id' => $sourceBatch->product_id,
+ 'product_batch_id' => $sourceBatch->id,
+ 'quantity' => $item['quantity']
+ ]);
+ }
+
+ // Update transfer status to completed
+ $transfer->update([
+ 'status' => 'completed',
+ 'updated_by' => auth()->id()
+ ]);
+
+ DB::commit();
+
+ return redirect()
+ ->route('stock-transfers.show', $transfer)
+ ->with('success', 'Stock transfer created successfully.');
+ } catch (\Exception $e) {
+ DB::rollBack();
+ return redirect()
+ ->back()
+ ->with('error', 'Error creating stock transfer: ' . $e->getMessage())
+ ->withInput();
+ }
+ }
+
+ public function show(StockTransfer $stockTransfer)
+ {
+ $stockTransfer->load(['sourceBranch', 'destinationBranch', 'items.product', 'items.productBatch']);
+ return view('stocktransfer::show', compact('stockTransfer'));
+ }
+
+ public function getBatches($productId, $branchId)
+ {
+ $batches = ProductBatch::where('product_id', $productId)
+ ->where('branch_id', $branchId)
+ ->where('quantity', '>', 0)
+ ->get(['id', 'batch_code', 'quantity']);
+
+ return response()->json($batches);
+ }
+}
\ No newline at end of file
diff --git a/Modules/PurchasesReturn/Http/Middleware/.gitkeep b/Modules/StockTransfer/Http/Middleware/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Http/Middleware/.gitkeep
rename to Modules/StockTransfer/Http/Middleware/.gitkeep
diff --git a/Modules/PurchasesReturn/Http/Requests/.gitkeep b/Modules/StockTransfer/Http/Requests/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Http/Requests/.gitkeep
rename to Modules/StockTransfer/Http/Requests/.gitkeep
diff --git a/Modules/StockTransfer/Http/Requests/StockTransferRequest.php b/Modules/StockTransfer/Http/Requests/StockTransferRequest.php
new file mode 100644
index 00000000..11d9eb43
--- /dev/null
+++ b/Modules/StockTransfer/Http/Requests/StockTransferRequest.php
@@ -0,0 +1,84 @@
+ [
+ 'required',
+ 'exists:branches,id',
+ 'different:destination_branch_id'
+ ],
+ 'destination_branch_id' => [
+ 'required',
+ 'exists:branches,id',
+ 'different:source_branch_id'
+ ],
+ 'transfer_date' => 'required|date',
+ 'note' => 'nullable|string|max:1000',
+ 'items' => 'required|array|min:1',
+ 'items.*.product_id' => 'required|exists:products,id',
+ 'items.*.product_batch_id' => [
+ 'required',
+ 'exists:product_batches,id',
+ function ($attribute, $value, $fail) {
+ $index = explode('.', $attribute)[1];
+ $sourceBranchId = $this->input('source_branch_id');
+ $productId = $this->input("items.{$index}.product_id");
+ $quantity = $this->input("items.{$index}.quantity");
+
+ // Check if batch belongs to source branch
+ $batch = ProductBatch::where('id', $value)
+ ->where('product_id', $productId)
+ ->where('branch_id', $sourceBranchId)
+ ->first();
+
+ if (!$batch) {
+ $fail('Selected batch does not belong to source branch.');
+ return;
+ }
+
+ // Check if quantity is available
+ if ($batch->quantity < $quantity) {
+ $fail("Insufficient quantity in batch. Available: {$batch->quantity}");
+ }
+ }
+ ],
+ 'items.*.quantity' => 'required|integer|min:1'
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'source_branch_id.required' => 'Source branch is required',
+ 'source_branch_id.exists' => 'Selected source branch is invalid',
+ 'source_branch_id.different' => 'Source branch must be different from destination branch',
+ 'destination_branch_id.required' => 'Destination branch is required',
+ 'destination_branch_id.exists' => 'Selected destination branch is invalid',
+ 'destination_branch_id.different' => 'Destination branch must be different from source branch',
+ 'transfer_date.required' => 'Transfer date is required',
+ 'transfer_date.date' => 'Invalid transfer date format',
+ 'items.required' => 'At least one product is required',
+ 'items.min' => 'At least one product is required',
+ 'items.*.product_id.required' => 'Product is required',
+ 'items.*.product_id.exists' => 'Selected product is invalid',
+ 'items.*.product_batch_id.required' => 'Product batch is required',
+ 'items.*.product_batch_id.exists' => 'Selected product batch is invalid',
+ 'items.*.quantity.required' => 'Quantity is required',
+ 'items.*.quantity.integer' => 'Quantity must be a whole number',
+ 'items.*.quantity.min' => 'Quantity must be at least 1'
+ ];
+ }
+}
\ No newline at end of file
diff --git a/Modules/PurchasesReturn/Providers/.gitkeep b/Modules/StockTransfer/Providers/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Providers/.gitkeep
rename to Modules/StockTransfer/Providers/.gitkeep
diff --git a/Modules/StockTransfer/Providers/StockTransferServiceProvider.php b/Modules/StockTransfer/Providers/StockTransferServiceProvider.php
new file mode 100644
index 00000000..8e12d580
--- /dev/null
+++ b/Modules/StockTransfer/Providers/StockTransferServiceProvider.php
@@ -0,0 +1,28 @@
+loadTranslationsFrom(module_path('StockTransfer', 'Resources/lang'), 'stocktransfer');
+ $this->loadViewsFrom(module_path('StockTransfer', 'Resources/views'), 'stocktransfer');
+ $this->loadMigrationsFrom(module_path('StockTransfer', 'Database/Migrations'));
+ $this->loadRoutesFrom(module_path('StockTransfer', 'Routes/web.php'));
+ }
+
+ /**
+ * Register the service provider.
+ */
+ public function register()
+ {
+ //
+ }
+}
\ No newline at end of file
diff --git a/Modules/PurchasesReturn/Resources/assets/.gitkeep b/Modules/StockTransfer/Resources/assets/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Resources/assets/.gitkeep
rename to Modules/StockTransfer/Resources/assets/.gitkeep
diff --git a/Modules/PurchasesReturn/Resources/assets/js/app.js b/Modules/StockTransfer/Resources/assets/js/app.js
similarity index 100%
rename from Modules/PurchasesReturn/Resources/assets/js/app.js
rename to Modules/StockTransfer/Resources/assets/js/app.js
diff --git a/Modules/PurchasesReturn/Resources/assets/sass/app.scss b/Modules/StockTransfer/Resources/assets/sass/app.scss
similarity index 100%
rename from Modules/PurchasesReturn/Resources/assets/sass/app.scss
rename to Modules/StockTransfer/Resources/assets/sass/app.scss
diff --git a/Modules/PurchasesReturn/Resources/lang/.gitkeep b/Modules/StockTransfer/Resources/lang/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Resources/lang/.gitkeep
rename to Modules/StockTransfer/Resources/lang/.gitkeep
diff --git a/Modules/PurchasesReturn/Resources/views/.gitkeep b/Modules/StockTransfer/Resources/views/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Resources/views/.gitkeep
rename to Modules/StockTransfer/Resources/views/.gitkeep
diff --git a/Modules/StockTransfer/Resources/views/create.blade.php b/Modules/StockTransfer/Resources/views/create.blade.php
new file mode 100644
index 00000000..29a94f7f
--- /dev/null
+++ b/Modules/StockTransfer/Resources/views/create.blade.php
@@ -0,0 +1,252 @@
+@extends('layouts.app')
+
+@section('title', 'Create Stock Transfer')
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
\ No newline at end of file
diff --git a/Modules/StockTransfer/Resources/views/index.blade.php b/Modules/StockTransfer/Resources/views/index.blade.php
new file mode 100644
index 00000000..1fe4a2c4
--- /dev/null
+++ b/Modules/StockTransfer/Resources/views/index.blade.php
@@ -0,0 +1,68 @@
+@extends('layouts.app')
+
+@section('title', 'Stock Transfers')
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
+ Reference No |
+ Source Branch |
+ Destination Branch |
+ Date |
+ Status |
+ Action |
+
+
+
+ @forelse($stockTransfers as $transfer)
+
+ {{ $transfer->reference_no }} |
+ {{ $transfer->sourceBranch->name }} |
+ {{ $transfer->destinationBranch->name }} |
+ {{ $transfer->transfer_date->format('d M Y') }} |
+
+
+ {{ ucfirst($transfer->status) }}
+
+ |
+
+
+
+
+ |
+
+ @empty
+
+ No stock transfers found |
+
+ @endforelse
+
+
+
+
+
+ {{ $stockTransfers->links() }}
+
+
+
+
+
+
+@endsection
diff --git a/Modules/StockTransfer/Resources/views/layouts/master.blade.php b/Modules/StockTransfer/Resources/views/layouts/master.blade.php
new file mode 100644
index 00000000..6d4f3c0d
--- /dev/null
+++ b/Modules/StockTransfer/Resources/views/layouts/master.blade.php
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ Module StockTransfer
+
+ {{-- Laravel Vite - CSS File --}}
+ {{-- {{ module_vite('build-stocktransfer', 'Resources/assets/sass/app.scss') }} --}}
+
+
+
+ @yield('content')
+
+ {{-- Laravel Vite - JS File --}}
+ {{-- {{ module_vite('build-stocktransfer', 'Resources/assets/js/app.js') }} --}}
+
+
diff --git a/Modules/StockTransfer/Resources/views/show.blade.php b/Modules/StockTransfer/Resources/views/show.blade.php
new file mode 100644
index 00000000..2e2afff1
--- /dev/null
+++ b/Modules/StockTransfer/Resources/views/show.blade.php
@@ -0,0 +1,84 @@
+@extends('layouts.app')
+
+@section('title', 'Stock Transfer Details')
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
+ Reference No |
+ {{ $stockTransfer->reference_no }} |
+
+
+ Source Branch |
+ {{ $stockTransfer->sourceBranch->name }} |
+
+
+ Destination Branch |
+ {{ $stockTransfer->destinationBranch->name }} |
+
+
+ Transfer Date |
+ {{ $stockTransfer->transfer_date->format('d M Y') }} |
+
+
+ Status |
+
+
+ {{ ucfirst($stockTransfer->status) }}
+
+ |
+
+
+ Note |
+ {{ $stockTransfer->note ?? '-' }} |
+
+
+
+
+
+
+
+ Transfer Items
+
+
+
+
+ Product |
+ Batch |
+ Quantity |
+
+
+
+ @foreach($stockTransfer->items as $item)
+
+ {{ $item->product->name }} |
+ {{ $item->productBatch->batch_number }} |
+ {{ $item->quantity }} |
+
+ @endforeach
+
+
+
+
+
+
+
+
+
+
+@endsection
\ No newline at end of file
diff --git a/Modules/PurchasesReturn/Routes/.gitkeep b/Modules/StockTransfer/Routes/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Routes/.gitkeep
rename to Modules/StockTransfer/Routes/.gitkeep
diff --git a/Modules/PurchasesReturn/Routes/api.php b/Modules/StockTransfer/Routes/api.php
similarity index 84%
rename from Modules/PurchasesReturn/Routes/api.php
rename to Modules/StockTransfer/Routes/api.php
index 9465203e..719a4fbc 100644
--- a/Modules/PurchasesReturn/Routes/api.php
+++ b/Modules/StockTransfer/Routes/api.php
@@ -13,6 +13,6 @@ use Illuminate\Http\Request;
|
*/
-Route::middleware('auth:api')->get('/purchasesreturn', function (Request $request) {
+Route::middleware('auth:api')->get('/stocktransfer', function (Request $request) {
return $request->user();
});
\ No newline at end of file
diff --git a/Modules/StockTransfer/Routes/web.php b/Modules/StockTransfer/Routes/web.php
new file mode 100644
index 00000000..583e1fac
--- /dev/null
+++ b/Modules/StockTransfer/Routes/web.php
@@ -0,0 +1,25 @@
+group(function () {
+ Route::prefix('stock-transfers')->group(function () {
+ Route::get('/', [StockTransferController::class, 'index'])->name('stock-transfers.index');
+ Route::get('/create', [StockTransferController::class, 'create'])->name('stock-transfers.create');
+ Route::post('/', [StockTransferController::class, 'store'])->name('stock-transfers.store');
+ Route::get('/{stockTransfer}', [StockTransferController::class, 'show'])->name('stock-transfers.show');
+ Route::get('/batches/{productId}/{branchId}', [StockTransferController::class, 'getBatches'])->name('stock-transfers.batches');
+ });
+});
diff --git a/Modules/PurchasesReturn/Tests/Feature/.gitkeep b/Modules/StockTransfer/Tests/Feature/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Tests/Feature/.gitkeep
rename to Modules/StockTransfer/Tests/Feature/.gitkeep
diff --git a/Modules/PurchasesReturn/Tests/Unit/.gitkeep b/Modules/StockTransfer/Tests/Unit/.gitkeep
similarity index 100%
rename from Modules/PurchasesReturn/Tests/Unit/.gitkeep
rename to Modules/StockTransfer/Tests/Unit/.gitkeep
diff --git a/Modules/PurchasesReturn/composer.json b/Modules/StockTransfer/composer.json
similarity index 79%
rename from Modules/PurchasesReturn/composer.json
rename to Modules/StockTransfer/composer.json
index cc90950a..ad9b0dec 100644
--- a/Modules/PurchasesReturn/composer.json
+++ b/Modules/StockTransfer/composer.json
@@ -1,5 +1,5 @@
{
- "name": "nwidart/purchasesreturn",
+ "name": "nwidart/stocktransfer",
"description": "",
"authors": [
{
@@ -17,7 +17,7 @@
},
"autoload": {
"psr-4": {
- "Modules\\PurchasesReturn\\": ""
+ "Modules\\StockTransfer\\": ""
}
}
}
diff --git a/Modules/StockTransfer/module.json b/Modules/StockTransfer/module.json
new file mode 100644
index 00000000..bfaea1b0
--- /dev/null
+++ b/Modules/StockTransfer/module.json
@@ -0,0 +1,11 @@
+{
+ "name": "StockTransfer",
+ "alias": "stocktransfer",
+ "description": "Stock Transfer Module",
+ "keywords": [],
+ "priority": 0,
+ "providers": [
+ "Modules\\StockTransfer\\Providers\\StockTransferServiceProvider"
+ ],
+ "files": []
+}
diff --git a/app/Helpers/helpers.php b/app/Helpers/helpers.php
index 153b43ba..f5c7dea9 100644
--- a/app/Helpers/helpers.php
+++ b/app/Helpers/helpers.php
@@ -1,6 +1,7 @@
currency->symbol . ' ' . number_format($price, 0, $settings->currency->decimal_separator, $settings->currency->thousand_separator) . ',-';
+ try {
+ $settings = settings();
+ Log::info('Format Currency', [
+ 'price' => $price,
+ 'currency_symbol' => $settings->currency->symbol ?? 'Rp'
+ ]);
+
+ if (!isset($settings->currency)) {
+ return 'Rp ' . number_format($price, 0, ',', '.') . ',-';
+ }
+
+ return $settings->currency->symbol . ' ' . number_format($price, 0, $settings->currency->decimal_separator, $settings->currency->thousand_separator) . ',-';
+ } catch (\Exception $e) {
+ Log::error('Error in format_currency', [
+ 'price' => $price,
+ 'error' => $e->getMessage()
+ ]);
+ return 'Rp ' . number_format($price, 0, ',', '.') . ',-';
+ }
}
}
diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php
index f1e96a35..59835a58 100644
--- a/app/Http/Controllers/HomeController.php
+++ b/app/Http/Controllers/HomeController.php
@@ -7,8 +7,6 @@ use Illuminate\Support\Facades\DB;
use Modules\Expense\Entities\Expense;
use Modules\Purchase\Entities\Purchase;
use Modules\Purchase\Entities\PurchasePayment;
-use Modules\PurchasesReturn\Entities\PurchaseReturn;
-use Modules\PurchasesReturn\Entities\PurchaseReturnPayment;
use Modules\Sale\Entities\Sale;
use Modules\Sale\Entities\SalePayment;
@@ -35,10 +33,6 @@ class HomeController extends Controller
->where('branch_id', $activeBranchId)
->sum('total_amount');
- $purchase_returns = PurchaseReturn::where('payment_status', 'Completed')
- ->where('branch_id', $activeBranchId)
- ->sum('total_amount');
-
$product_costs = 0;
foreach (Sale::where('payment_status', 'Completed')
@@ -55,13 +49,11 @@ class HomeController extends Controller
$profit = $revenue - $product_costs;
return view('home', [
- 'revenue' => $revenue,
- 'purchase_returns' => $purchase_returns / 100,
- 'profit' => $profit
+ 'revenue' => $revenue,
+ 'profit' => $profit
]);
}
-
public function currentMonthChart() {
abort_if(!request()->ajax(), 404);
@@ -91,7 +83,6 @@ class HomeController extends Controller
]);
}
-
public function salesPurchasesChart() {
abort_if(!request()->ajax(), 404);
@@ -103,7 +94,6 @@ class HomeController extends Controller
return response()->json(['sales' => $sales, 'purchases' => $purchases]);
}
-
public function paymentChart() {
abort_if(!request()->ajax(), 404);
@@ -135,15 +125,6 @@ class HomeController extends Controller
->groupBy('month')->orderBy('month')
->get()->pluck('amount', 'month');
- $purchase_return_payments = PurchaseReturnPayment::where('date', '>=', $date_range)
- ->where('branch_id', $activeBranchId)
- ->select([
- DB::raw("DATE_FORMAT(date, '%m-%Y') as month"),
- DB::raw("SUM(amount) as amount")
- ])
- ->groupBy('month')->orderBy('month')
- ->get()->pluck('amount', 'month');
-
$expenses = Expense::where('date', '>=', $date_range)
->where('branch_id', $activeBranchId)
->select([
@@ -198,22 +179,24 @@ class HomeController extends Controller
->get([
DB::raw(DB::raw("DATE_FORMAT(date,'%d-%m-%y') as date")),
DB::raw('SUM(total_amount) AS count'),
- ])
- ->pluck('count', 'date');
+ ])->pluck('count', 'date');
$dates = $dates->merge($sales);
$data = [];
- $days = [];
+ $labels = [];
+
foreach ($dates as $key => $value) {
$data[] = $value / 100;
- $days[] = $key;
+ $labels[] = $key;
}
- return response()->json(['data' => $data, 'days' => $days]);
+ return [
+ 'data' => $data,
+ 'labels' => $labels,
+ ];
}
-
public function purchasesChartData() {
$activeBranchId = session('active_branch_id') ?? 1;
@@ -233,19 +216,21 @@ class HomeController extends Controller
->get([
DB::raw(DB::raw("DATE_FORMAT(date,'%d-%m-%y') as date")),
DB::raw('SUM(total_amount) AS count'),
- ])
- ->pluck('count', 'date');
+ ])->pluck('count', 'date');
$dates = $dates->merge($purchases);
$data = [];
- $days = [];
+ $labels = [];
+
foreach ($dates as $key => $value) {
$data[] = $value / 100;
- $days[] = $key;
+ $labels[] = $key;
}
- return response()->json(['data' => $data, 'days' => $days]);
-
+ return [
+ 'data' => $data,
+ 'labels' => $labels,
+ ];
}
}
diff --git a/app/Models/ProductBatch.php b/app/Models/ProductBatch.php
index 8fc7d3e1..d4dfd539 100644
--- a/app/Models/ProductBatch.php
+++ b/app/Models/ProductBatch.php
@@ -5,6 +5,7 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Str;
+use Modules\Product\Entities\Product;
class ProductBatch extends Model
{
@@ -12,14 +13,17 @@ class ProductBatch extends Model
'product_id',
'branch_id',
'batch_code',
- 'quantity',
- 'purchase_price',
- 'expired_date',
+ 'qty',
+ 'unit_price',
+ 'exp_date',
+ 'purchase_id',
+ 'created_by',
+ 'updated_by'
];
protected $casts = [
- 'expired_date' => 'date',
- 'purchase_price' => 'decimal:2',
+ 'exp_date' => 'date',
+ 'unit_price' => 'decimal:2',
];
public function product(): BelongsTo
@@ -47,8 +51,8 @@ class ProductBatch extends Model
{
return self::where('product_id', $productId)
->where('branch_id', $branchId)
- ->where('quantity', '>', 0)
- ->orderBy('expired_date', 'asc')
+ ->where('qty', '>', 0)
+ ->orderBy('exp_date', 'asc')
->orderBy('created_at', 'asc')
->get();
}
@@ -65,15 +69,15 @@ class ProductBatch extends Model
foreach ($batches as $batch) {
if ($remainingQuantity <= 0) break;
- $deductAmount = min($remainingQuantity, $batch->quantity);
- $batch->quantity -= $deductAmount;
+ $deductAmount = min($remainingQuantity, $batch->qty);
+ $batch->qty -= $deductAmount;
$batch->save();
$usedBatches[] = [
'batch_id' => $batch->id,
- 'quantity' => $deductAmount,
- 'purchase_price' => $batch->purchase_price,
- 'expired_date' => $batch->expired_date
+ 'qty' => $deductAmount,
+ 'unit_price' => $batch->unit_price,
+ 'exp_date' => $batch->exp_date
];
$remainingQuantity -= $deductAmount;
@@ -91,6 +95,18 @@ class ProductBatch extends Model
*/
public static function addStock(array $data)
{
+ // Rename expired_date to exp_date if it exists
+ if (isset($data['expired_date'])) {
+ $data['exp_date'] = $data['expired_date'];
+ unset($data['expired_date']);
+ }
+
+ // Rename purchase_price to unit_price if it exists
+ if (isset($data['purchase_price'])) {
+ $data['unit_price'] = $data['purchase_price'];
+ unset($data['purchase_price']);
+ }
+
// Generate batch code if not provided
if (!isset($data['batch_code'])) {
$data['batch_code'] = self::generateBatchCode();
diff --git a/database/migrations/2024_03_21_create_product_batches_table.php b/database/migrations/2024_03_21_create_product_batches_table.php
index d70989ec..cf82398b 100644
--- a/database/migrations/2024_03_21_create_product_batches_table.php
+++ b/database/migrations/2024_03_21_create_product_batches_table.php
@@ -14,7 +14,7 @@ return new class extends Migration
$table->foreignId('branch_id')->constrained('branches')->onDelete('cascade');
$table->string('batch_code')->nullable();
$table->integer('quantity');
- $table->decimal('purchase_price', 10, 2);
+ $table->decimal('unit_price', 10, 2);
$table->date('expired_date')->nullable();
$table->timestamps();
diff --git a/database/migrations/2025_05_21_103215_remove_purchase_price_from_purchase_details_table.php b/database/migrations/2025_05_21_103215_remove_purchase_price_from_purchase_details_table.php
new file mode 100644
index 00000000..5929e163
--- /dev/null
+++ b/database/migrations/2025_05_21_103215_remove_purchase_price_from_purchase_details_table.php
@@ -0,0 +1,28 @@
+dropColumn('purchase_price');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('purchase_details', function (Blueprint $table) {
+ $table->decimal('purchase_price', 10, 2)->after('product_id');
+ });
+ }
+};
diff --git a/database/migrations/2025_05_21_103216_remove_supplier_name_from_purchases_table.php b/database/migrations/2025_05_21_103216_remove_supplier_name_from_purchases_table.php
new file mode 100644
index 00000000..7a78e95e
--- /dev/null
+++ b/database/migrations/2025_05_21_103216_remove_supplier_name_from_purchases_table.php
@@ -0,0 +1,28 @@
+dropColumn('supplier_name');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('purchases', function (Blueprint $table) {
+ $table->string('supplier_name')->after('supplier_id');
+ });
+ }
+};
\ No newline at end of file
diff --git a/database/migrations/2025_05_21_104306_remove_supplier_name_from_purchases_table.php b/database/migrations/2025_05_21_104306_remove_supplier_name_from_purchases_table.php
new file mode 100644
index 00000000..ba4d2b44
--- /dev/null
+++ b/database/migrations/2025_05_21_104306_remove_supplier_name_from_purchases_table.php
@@ -0,0 +1,28 @@
+
@can('show_total_stats')
-
+
-
-
-
-
-
-
-
- {{ format_currency($purchase_returns) }}
- Purchases Return
-
-
-
-
-
-
+
diff --git a/resources/views/layouts/header.blade.php b/resources/views/layouts/header.blade.php
index 81f583f6..de457f5f 100644
--- a/resources/views/layouts/header.blade.php
+++ b/resources/views/layouts/header.blade.php
@@ -10,6 +10,24 @@
@endcan
|