Advertisement
arlendafitranto

BudgetRepository

Sep 17th, 2023
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 9.64 KB | Source Code | 0 0
  1. <?php
  2.  
  3. namespace Implements\Expense;
  4.  
  5. use App\Models\Expense\Budget;
  6. use App\Models\Expense\Order;
  7. use App\Models\User;
  8. use Yajra\Datatables\Datatables;
  9. use Illuminate\Support\Facades\Gate;
  10. use League\Csv\Reader;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Facades\Log;
  13. use App\Models\Expense\MonthlyBudget;
  14. use Illuminate\Contracts\Database\Eloquent\Builder;
  15.  
  16. class BudgetRepository
  17. {
  18.     public function datatable($year, $ccBy)
  19.     {
  20.         if($ccBy == 'all') {
  21.             $budgets = Budget::with(['cc:id,cc', 'category', 'picExp', 'orders'])->where('year', $year)->get();
  22.  
  23.             /** Additional data - Untuk card di view budget */
  24.             $tot_budget = Budget::where('year', $year)->selectRaw('SUM(amount) as tot_amount')->get();  
  25.             $tot_plan = Order::whereYear('updated_at', $year)->where('status', 'in-progress')->selectRaw('SUM(tot_price) as tot_plan')->get();
  26.             $tot_actual = Order::whereYear('updated_at', $year)->where('status', 'finish')->selectRaw('SUM(tot_price) as tot_actual')->get();
  27.  
  28.         } else {
  29.             $budgets = Budget::with(['cc:id,cc', 'category', 'picExp', 'orders'])->where('year', $year)->where('cc_id', $ccBy)->get();
  30.  
  31.             /** Additional data - Untuk card di view budget */
  32.             $tot_budget = Budget::where('year', $year)->where('cc_id', $ccBy)->selectRaw('SUM(amount) as tot_amount')->get();  
  33.             $tot_plan = Order::whereYear('updated_at', $year)->where('status', 'in-progress')->where('cc_id', $ccBy)->selectRaw('SUM(tot_price) as tot_plan')->get();
  34.             $tot_actual = Order::whereYear('updated_at', $year)->where('status', 'finish')->where('cc_id', $ccBy)->selectRaw('SUM(tot_price) as tot_actual')->get();
  35.  
  36.         }
  37.        
  38.         $tot_forecast = $tot_plan[0]->tot_plan + $tot_actual[0]->tot_actual;
  39.         $balance = $tot_budget[0]->tot_amount - $tot_forecast;
  40.  
  41.         $tot_budget = number_format($tot_budget[0]->tot_amount, 0, '.', ',');
  42.         $tot_forecast = number_format($tot_forecast, 0, '.', ',');
  43.         $balance = number_format($balance, 0, '.', ',');
  44.        
  45.         // $orders = Order::groupBy('budget_id')->selectRaw('budget_id, SUM(tot_price) as tot_plan')->get();
  46.  
  47.         return Datatables::of($budgets)
  48.             ->addIndexColumn()
  49.             ->editColumn('cc_id', function($budgets) {
  50.                 return $budgets->cc->cc;
  51.             })
  52.             ->editColumn('category_id', function($budgets) {
  53.                 return $budgets->category->cat_name;
  54.             })
  55.             ->editColumn('pic', function($budgets) {
  56.                 return $budgets->picExp->name;
  57.             })
  58.             ->editColumn('amount', function($budgets) {
  59.                 return number_format($budgets->amount, '0', '.', ',');
  60.             })
  61.             ->addColumn('tot_forecast', function($budgets) {
  62.                 return number_format($budgets->tot_forecast, '0', '.', ',');
  63.             })
  64.             ->addColumn('tot_actual', function($budgets) {
  65.                 return number_format($budgets->tot_actual, '0', '.', ',');
  66.             })
  67.             ->addColumn('balance', function($budgets) {
  68.                 $balance = $budgets->amount - ($budgets->tot_forecast + $budgets->tot_actual);
  69.                 return number_format($balance, '0', '.', ',');
  70.             })
  71.             ->addColumn('action', function($budgets) {
  72.                 // $edit = Gate::allows('edit-budget', $budgets) ? '<i class="fa-regular fa-edit" onclick="editBudget(' . $budgets->id . ')"></i>' : '';
  73.                 $delete = Gate::allows('app-dev') ? '<i class="fa-regular fa-trash-can" onclick="deleteBudget(' . $budgets->id . ')"></i>' : '';
  74.  
  75.                 $action = '<span style="cursor: pointer;">' . $delete . '</span>';
  76.                
  77.                 return $action;
  78.             })
  79.             ->setRowClass(function($budgets) {
  80.                 $balance = $budgets->amount - ($budgets->tot_forecast + $budgets->tot_actual);
  81.                 return $balance >= 0 ? '' : 'text-danger';
  82.             })
  83.             ->setRowData([
  84.                 'dt_tot_budget' => function() use($tot_budget) {
  85.                     return $tot_budget;
  86.                 },
  87.                 'dt_tot_forecast' => function() use($tot_forecast) {
  88.                     return $tot_forecast;
  89.                 },
  90.                 'dt_balance' => function() use($balance) {
  91.                     return $balance;
  92.                 },
  93.             ])
  94.             ->escapeColumns([])
  95.             ->make(true);
  96.     }
  97.  
  98.     public function upload($path, $delimiter, $is_new, $cc, $year)
  99.     {
  100.         $reader = Reader::createFromPath($path, 'r');
  101.         $reader->setDelimiter($delimiter);
  102.         $headers = $reader->fetchOne();
  103.         $reader->setHeaderOffset(0);
  104.         $data = $reader->getRecords();
  105.  
  106.         /* ------------------ Baru dan revise budget dalam 1 action ----------------- */
  107.         /**
  108.          * * Logic:
  109.          * ? Get request apakah revise atau new
  110.          * ? Revise >> Create
  111.          * ? New >> Update
  112.          *      TODO: Check data lama. Jika ada bukan baru
  113.          *      TODO: STructure untuk update harus sama dengan yang ada dalam DB
  114.          *      TODO: Budget >> Key menggunakan exp_no (dengan id budget dan year berdasarkan dari request)
  115.          */
  116.         /* ---------------------------------- -end- --------------------------------- */
  117.  
  118.         $csv_data = collect($data)[1] ?? null;
  119.  
  120.         if (! $csv_data) {
  121.             /** Tidak ada data dari csv file */
  122.             return false;
  123.         }
  124.  
  125.        
  126.         if ($is_new) {
  127.             /** Data baru */
  128.            
  129.             $current_budget = Budget::where('cc_id', $cc)->where('year', $year)->get();
  130.            
  131.             if (count($current_budget) > 0) {
  132.                 return false;
  133.             }
  134.             // return dd($current_budget);
  135.             try {
  136.                 DB::beginTransaction();
  137.                 foreach ($data as $b) {
  138.                     $budget = Budget::create([
  139.                         'cc_id' => $cc,
  140.                         'exp_no' => $b['exp_no'],
  141.                         'year' => $year,
  142.                         'theme' => $b['theme'],
  143.                         'category_id' => $b['category_id'],
  144.                         'pic' => $b['pic'],
  145.                         'amount' => $b['amount'],
  146.                     ]);
  147.    
  148.                     $budget_id = $budget->id;
  149.    
  150.                     for ($i=1; $i < 13; $i++) {
  151.                        
  152.                         if ($b[$i]) {
  153.                             MonthlyBudget::create([
  154.                                 'budget_id' => $budget_id,
  155.                                 'month' => $i,
  156.                                 'amount' => $b[$i],
  157.                             ]);
  158.                         }
  159.                     }
  160.                 }
  161.                 DB::commit();
  162.             } catch (\Exception $e) {
  163.                 DB::rollBack();
  164.                 Log::error($e->getMessage());
  165.                 return false;
  166.             }
  167.         }
  168.        
  169.         if (! $is_new){
  170.             /** Budget revise */
  171.             // return dd(collect($data)[1]);
  172.             // try {
  173.                
  174.                 foreach ($data as $csv) {
  175.                     $budget = Budget::where('cc_id', $cc)->where('year', $year)->where('exp_no', $csv['exp_no'])->get();
  176.                     if (! $budget) {
  177.                         return false;
  178.                     }
  179.  
  180.                     $budget = Budget::where('cc_id', $cc)->where('year', $year)->where('exp_no', $csv['exp_no'])->update([
  181.                         'theme' => $csv['theme'],
  182.                         'category_id' => $csv['category_id'],
  183.                         'pic' => $csv['pic'],
  184.                         'amount' => $csv['amount'],
  185.                     ]);
  186.    
  187.                     $monthly_budget = MonthlyBudget::where('budget_id', $budget)->delete();
  188.  
  189.                     for ($i=1; $i < 13; $i++) {
  190.                        
  191.                         if ($csv[$i]) {
  192.                             MonthlyBudget::create([
  193.                                 'budget_id' => $budget,
  194.                                 'month' => $i,
  195.                                 'amount' => $csv[$i],
  196.                             ]);
  197.                         }
  198.                     }
  199.                 }
  200.             // } catch (\Exception $e) {
  201.             //     Log::error($e->getMessage());
  202.             //     return false;
  203.             // }
  204.         }
  205.        
  206.         return true;
  207.     }
  208.  
  209.     public function getData($id)
  210.     {
  211.         $budget = Budget::with([
  212.                 'cc:id,cc', 'picExp:id,nik,name', 'monthly:id,budget_id,month,amount'
  213.             ])->find($id);
  214.  
  215.         return $budget;
  216.     }
  217.  
  218.     public function update(array $data)
  219.     {
  220.         $budget = Budget::find($data['budget_id']);
  221.  
  222.         DB::beginTransaction();
  223.         try {
  224.             $budget->update(['amount' => $data['amount']]);
  225.             for ($i=0; $i < 13; $i++) {
  226.                 if ($data['monthly'][$i]['amount'] > 0) {
  227.                     $monthly_budget = MonthlyBudget::where('budget_id', $data['budget_id'])->where('month', $i + 1)->update([
  228.                         'amount' => $data['monthly'][$i]['amount'],
  229.                     ]);
  230.                 } else {
  231.                     $monthly_budget = MonthlyBudget::where('budget_id', $data['budget_id'])->where('month', $i + 1)->delete();
  232.                 }
  233.             }
  234.             DB::commit();
  235.         } catch (\Exception $e) {
  236.             DB::rollBack();
  237.             Log::error($e->getMessage());
  238.             return ['error' => $e->getMessage()];
  239.         }
  240.  
  241.         return $budget;
  242.     }
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement