From 5d63a7058d00d395885a523006058b03fcf273d5 Mon Sep 17 00:00:00 2001 From: adeliaala Date: Thu, 22 May 2025 20:54:09 +0700 Subject: [PATCH] purchases --- .../Http/Controllers/BranchController.php | 13 + Modules/Branch/Routes/web.php | 1 + .../Product/DataTables/ProductDataTable.php | 34 +- Modules/Product/Entities/Product.php | 41 ++- .../Purchase/DataTables/PurchaseDataTable.php | 77 ++++- Modules/Purchase/Entities/Purchase.php | 60 +++- .../Http/Controllers/PurchaseController.php | 327 +++++++++++------- .../Purchase/Http/Livewire/CreatePurchase.php | 103 ++++-- .../Purchase/Resources/views/index.blade.php | 136 +++++++- .../views/livewire/create-purchase.blade.php | 21 ++ .../views/livewire/purchase-list.blade.php | 10 +- .../views/partials/actions.blade.php | 2 - .../views/partials/payment-status.blade.php | 10 +- Modules/Purchase/Routes/web.php | 4 +- Modules/PurchasesReturn/Config/config.php | 5 - .../PurchaseReturnPaymentsDataTable.php | 78 ----- .../DataTables/PurchaseReturnsDataTable.php | 100 ------ ...8_222603_create_purchase_returns_table.php | 48 --- ...2_create_purchase_return_details_table.php | 46 --- ..._create_purchase_return_payments_table.php | 38 -- .../Seeders/PurchasesReturnDatabaseSeeder.php | 21 -- .../Entities/PurchaseReturn.php | 58 ---- .../Entities/PurchaseReturnDetail.php | 44 --- .../Entities/PurchaseReturnPayment.php | 34 -- .../PurchaseReturnPaymentsController.php | 146 -------- .../Controllers/PurchasesReturnController.php | 232 ------------- .../Requests/StorePurchaseReturnRequest.php | 40 --- .../Requests/UpdatePurchaseReturnRequest.php | 40 --- .../PurchasesReturnServiceProvider.php | 112 ------ .../Providers/RouteServiceProvider.php | 69 ---- .../Resources/views/create.blade.php | 138 -------- .../Resources/views/edit.blade.php | 124 ------- .../Resources/views/index.blade.php | 40 --- .../views/partials/actions.blade.php | 42 --- .../views/partials/payment-status.blade.php | 13 - .../Resources/views/partials/status.blade.php | 13 - .../Resources/views/payments/create.blade.php | 114 ------ .../Resources/views/payments/edit.blade.php | 117 ------- .../Resources/views/payments/index.blade.php | 37 -- .../views/payments/partials/actions.blade.php | 19 - .../Resources/views/print.blade.php | 133 ------- .../Resources/views/show.blade.php | 135 -------- Modules/PurchasesReturn/Routes/web.php | 46 --- Modules/PurchasesReturn/module.json | 13 - Modules/PurchasesReturn/package.json | 17 - Modules/PurchasesReturn/webpack.mix.js | 14 - .../Http/Controllers/ReportsController.php | 18 - Modules/Reports/Routes/web.php | 9 - .../Config/.gitkeep | 0 Modules/StockTransfer/Config/config.php | 5 + .../Console/.gitkeep | 0 .../Database/Migrations/.gitkeep | 0 ...21_000001_create_stock_transfers_table.php | 29 ++ ...0002_create_stock_transfer_items_table.php | 25 ++ .../Database/Seeders/.gitkeep | 0 .../Database/factories/.gitkeep | 0 .../Entities/.gitkeep | 0 .../StockTransfer/Entities/StockTransfer.php | 59 ++++ .../Entities/StockTransferItem.php | 39 +++ .../Http/Controllers/.gitkeep | 0 .../Controllers/StockTransferController.php | 114 ++++++ .../Http/Middleware/.gitkeep | 0 .../Http/Requests/.gitkeep | 0 .../Http/Requests/StockTransferRequest.php | 84 +++++ .../Providers/.gitkeep | 0 .../StockTransferServiceProvider.php | 28 ++ .../Resources/assets/.gitkeep | 0 .../Resources/assets/js/app.js | 0 .../Resources/assets/sass/app.scss | 0 .../Resources/lang/.gitkeep | 0 .../Resources/views/.gitkeep | 0 .../Resources/views/create.blade.php | 252 ++++++++++++++ .../Resources/views/index.blade.php | 68 ++++ .../Resources/views/layouts/master.blade.php | 19 + .../Resources/views/show.blade.php | 84 +++++ .../Routes/.gitkeep | 0 .../Routes/api.php | 2 +- Modules/StockTransfer/Routes/web.php | 25 ++ .../Tests/Feature/.gitkeep | 0 .../Tests/Unit/.gitkeep | 0 .../composer.json | 4 +- Modules/StockTransfer/module.json | 11 + app/Helpers/helpers.php | 22 +- app/Http/Controllers/HomeController.php | 51 +-- app/Models/ProductBatch.php | 40 ++- ...024_03_21_create_product_batches_table.php | 2 +- ...hase_price_from_purchase_details_table.php | 28 ++ ...ove_supplier_name_from_purchases_table.php | 28 ++ ...ove_supplier_name_from_purchases_table.php | 28 ++ modules_statuses.json | 3 +- resources/views/home.blade.php | 18 +- resources/views/layouts/header.blade.php | 18 + resources/views/layouts/menu.blade.php | 61 ++-- 93 files changed, 1645 insertions(+), 2494 deletions(-) delete mode 100644 Modules/PurchasesReturn/Config/config.php delete mode 100644 Modules/PurchasesReturn/DataTables/PurchaseReturnPaymentsDataTable.php delete mode 100644 Modules/PurchasesReturn/DataTables/PurchaseReturnsDataTable.php delete mode 100644 Modules/PurchasesReturn/Database/Migrations/2021_08_08_222603_create_purchase_returns_table.php delete mode 100644 Modules/PurchasesReturn/Database/Migrations/2021_08_08_222612_create_purchase_return_details_table.php delete mode 100644 Modules/PurchasesReturn/Database/Migrations/2021_08_08_222646_create_purchase_return_payments_table.php delete mode 100644 Modules/PurchasesReturn/Database/Seeders/PurchasesReturnDatabaseSeeder.php delete mode 100644 Modules/PurchasesReturn/Entities/PurchaseReturn.php delete mode 100644 Modules/PurchasesReturn/Entities/PurchaseReturnDetail.php delete mode 100644 Modules/PurchasesReturn/Entities/PurchaseReturnPayment.php delete mode 100644 Modules/PurchasesReturn/Http/Controllers/PurchaseReturnPaymentsController.php delete mode 100644 Modules/PurchasesReturn/Http/Controllers/PurchasesReturnController.php delete mode 100644 Modules/PurchasesReturn/Http/Requests/StorePurchaseReturnRequest.php delete mode 100644 Modules/PurchasesReturn/Http/Requests/UpdatePurchaseReturnRequest.php delete mode 100644 Modules/PurchasesReturn/Providers/PurchasesReturnServiceProvider.php delete mode 100644 Modules/PurchasesReturn/Providers/RouteServiceProvider.php delete mode 100644 Modules/PurchasesReturn/Resources/views/create.blade.php delete mode 100644 Modules/PurchasesReturn/Resources/views/edit.blade.php delete mode 100644 Modules/PurchasesReturn/Resources/views/index.blade.php delete mode 100644 Modules/PurchasesReturn/Resources/views/partials/actions.blade.php delete mode 100644 Modules/PurchasesReturn/Resources/views/partials/payment-status.blade.php delete mode 100644 Modules/PurchasesReturn/Resources/views/partials/status.blade.php delete mode 100644 Modules/PurchasesReturn/Resources/views/payments/create.blade.php delete mode 100644 Modules/PurchasesReturn/Resources/views/payments/edit.blade.php delete mode 100644 Modules/PurchasesReturn/Resources/views/payments/index.blade.php delete mode 100644 Modules/PurchasesReturn/Resources/views/payments/partials/actions.blade.php delete mode 100644 Modules/PurchasesReturn/Resources/views/print.blade.php delete mode 100644 Modules/PurchasesReturn/Resources/views/show.blade.php delete mode 100644 Modules/PurchasesReturn/Routes/web.php delete mode 100644 Modules/PurchasesReturn/module.json delete mode 100644 Modules/PurchasesReturn/package.json delete mode 100644 Modules/PurchasesReturn/webpack.mix.js rename Modules/{PurchasesReturn => StockTransfer}/Config/.gitkeep (100%) create mode 100644 Modules/StockTransfer/Config/config.php rename Modules/{PurchasesReturn => StockTransfer}/Console/.gitkeep (100%) rename Modules/{PurchasesReturn => StockTransfer}/Database/Migrations/.gitkeep (100%) create mode 100644 Modules/StockTransfer/Database/Migrations/2024_03_21_000001_create_stock_transfers_table.php create mode 100644 Modules/StockTransfer/Database/Migrations/2024_03_21_000002_create_stock_transfer_items_table.php rename Modules/{PurchasesReturn => StockTransfer}/Database/Seeders/.gitkeep (100%) rename Modules/{PurchasesReturn => StockTransfer}/Database/factories/.gitkeep (100%) rename Modules/{PurchasesReturn => StockTransfer}/Entities/.gitkeep (100%) create mode 100644 Modules/StockTransfer/Entities/StockTransfer.php create mode 100644 Modules/StockTransfer/Entities/StockTransferItem.php rename Modules/{PurchasesReturn => StockTransfer}/Http/Controllers/.gitkeep (100%) create mode 100644 Modules/StockTransfer/Http/Controllers/StockTransferController.php rename Modules/{PurchasesReturn => StockTransfer}/Http/Middleware/.gitkeep (100%) rename Modules/{PurchasesReturn => StockTransfer}/Http/Requests/.gitkeep (100%) create mode 100644 Modules/StockTransfer/Http/Requests/StockTransferRequest.php rename Modules/{PurchasesReturn => StockTransfer}/Providers/.gitkeep (100%) create mode 100644 Modules/StockTransfer/Providers/StockTransferServiceProvider.php rename Modules/{PurchasesReturn => StockTransfer}/Resources/assets/.gitkeep (100%) rename Modules/{PurchasesReturn => StockTransfer}/Resources/assets/js/app.js (100%) rename Modules/{PurchasesReturn => StockTransfer}/Resources/assets/sass/app.scss (100%) rename Modules/{PurchasesReturn => StockTransfer}/Resources/lang/.gitkeep (100%) rename Modules/{PurchasesReturn => StockTransfer}/Resources/views/.gitkeep (100%) create mode 100644 Modules/StockTransfer/Resources/views/create.blade.php create mode 100644 Modules/StockTransfer/Resources/views/index.blade.php create mode 100644 Modules/StockTransfer/Resources/views/layouts/master.blade.php create mode 100644 Modules/StockTransfer/Resources/views/show.blade.php rename Modules/{PurchasesReturn => StockTransfer}/Routes/.gitkeep (100%) rename Modules/{PurchasesReturn => StockTransfer}/Routes/api.php (84%) create mode 100644 Modules/StockTransfer/Routes/web.php rename Modules/{PurchasesReturn => StockTransfer}/Tests/Feature/.gitkeep (100%) rename Modules/{PurchasesReturn => StockTransfer}/Tests/Unit/.gitkeep (100%) rename Modules/{PurchasesReturn => StockTransfer}/composer.json (79%) create mode 100644 Modules/StockTransfer/module.json create mode 100644 database/migrations/2025_05_21_103215_remove_purchase_price_from_purchase_details_table.php create mode 100644 database/migrations/2025_05_21_103216_remove_supplier_name_from_purchases_table.php create mode 100644 database/migrations/2025_05_21_104306_remove_supplier_name_from_purchases_table.php 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() }} +
+ + + + + + + + + + + + + + + @php + $purchases = DB::table('purchases')->get(); + @endphp + + @forelse($purchases as $purchase) + + + + + + + + + + + @empty + + + + @endforelse + +
IDDateReferenceSupplier IDTotalPaidDueStatus
{{ $purchase->id }}{{ $purchase->date }}{{ $purchase->reference_no }}{{ $purchase->supplier_id }}{{ $purchase->total / 100 }}{{ $purchase->paid_amount / 100 }}{{ $purchase->due_amount / 100 }}{{ $purchase->payment_status }}
No purchases found in database.
+
+ + + {{--
+
+

Debug Info

+
+
+

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 }}
@@ -100,7 +98,7 @@ @empty - No purchases found. + No purchases found. @endforelse diff --git a/Modules/Purchase/Resources/views/partials/actions.blade.php b/Modules/Purchase/Resources/views/partials/actions.blade.php index 3e92bfc7..895d8cf1 100644 --- a/Modules/Purchase/Resources/views/partials/actions.blade.php +++ b/Modules/Purchase/Resources/views/partials/actions.blade.php @@ -13,7 +13,6 @@
-@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') - -@endsection - -@section('content') -
-
-
- -
-
- -
-
-
-
- @include('utils.alerts') -
- @csrf -
-
-
- - -
-
-
-
-
- - -
-
-
-
-
-
- - -
-
-
-
- - - -
-
-
- - -
-
-
-
-
- - -
-
-
-
-
- -
- -
- -
-
-
-
-
- -
- - -
- -
- -
- -
-
-
-
-
-@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') - -@endsection - -@section('content') -
-
-
- -
-
- -
-
-
-
- @include('utils.alerts') -
- @csrf - @method('patch') -
-
-
- - -
-
-
-
-
- - -
-
-
-
-
-
- - -
-
-
-
- - - -
-
-
- - -
-
-
-
-
- - -
-
-
-
-
- - -
-
-
- -
- - -
- -
- -
- -
-
-
-
-
-@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') - -@endsection - -@section('content') -
-
-
-
-
- - Add Purchase Return - - -
- -
- {!! $dataTable->table() !!} -
-
-
-
-
-
-@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') - -@endsection - -@section('content') -
-
- @csrf -
-
- @include('utils.alerts') -
- -
-
-
-
-
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
-
- -
- -
- -
-
-
-
-
-
-
- - -
-
-
-
- -
- - -
- - -
-
-
-
-
-
-@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') - -@endsection - -@section('content') -
-
- @csrf - @method('patch') -
-
- @include('utils.alerts') -
- -
-
-
-
-
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
-
- -
- -
- -
-
-
-
-
-
-
- - -
-
-
-
- -
- - -
- - -
-
-
-
-
-
-@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') - -@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 - - - -
-
-
-
- Logo -

- 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 }} -
-
- -
- -
- - - - - - - - - - - - - @foreach($purchase_return->purchaseReturnDetails as $item) - - - - - - - - - - - - - - @endforeach - -
ProductNet Unit PriceQuantityDiscountTaxSub Total
- {{ $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) }} -
-
-
-
- - - - - - - - - - - - - - - - - - - -
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') - -@endsection - -@section('content') -
-
-
-
-
-
- Reference: {{ $purchase_return->reference }} -
- - Print - - - Save - -
-
-
-
-
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 }} -
-
- -
- -
- - - - - - - - - - - - - @foreach($purchase_return->purchaseReturnDetails as $item) - - - - - - - - - - - - - - @endforeach - -
ProductNet Unit PriceQuantityDiscountTaxSub Total
- {{ $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) }} -
-
-
-
- - - - - - - - - - - - - - - - - - - -
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') +
+
+
+
+
+

Create Stock Transfer

+
+
+
+ @csrf +
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + +
Product *Batch *Available QuantityTransfer Quantity *Action
+ + + + + 0 + + + + +
+
+ +
+
+ +
+
+ + Cancel +
+
+
+
+
+
+
+
+@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') +
+
+
+
+
+

Stock Transfers

+
+ @can('create_stock_transfers') + + Create Transfer + + @endcan +
+
+
+
+ + + + + + + + + + + + + @forelse($stockTransfers as $transfer) + + + + + + + + + @empty + + + + @endforelse + +
Reference NoSource BranchDestination BranchDateStatusAction
{{ $transfer->reference_no }}{{ $transfer->sourceBranch->name }}{{ $transfer->destinationBranch->name }}{{ $transfer->transfer_date->format('d M Y') }} + + {{ ucfirst($transfer->status) }} + + + + + +
No stock transfers found
+
+ +
+ {{ $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') +
+
+
+
+
+

Stock Transfer Details

+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
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

+
+ + + + + + + + + + @foreach($stockTransfer->items as $item) + + + + + + @endforeach + +
ProductBatchQuantity
{{ $item->product->name }}{{ $item->productBatch->batch_number }}{{ $item->quantity }}
+
+
+
+
+
+
+
+
+@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')
-
+
@@ -26,21 +26,7 @@
-
-
-
-
- -
-
-
{{ 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