/** * Store a sale * * 1. Save Sale * 2. Save Payment or shipment * 3. Save Transaction Log * * @return Response */ public function status() { if (!Input::has('sale')) { return new JSend('error', (array) Input::all(), 'Tidak ada data sale.'); } $errors = new MessageBag(); DB::beginTransaction(); //1. Validate Sale Parameter $sale = Input::get('sale'); if (is_null($sale['id'])) { return new JSend('error', (array) Input::all(), 'Tidak ada data sale.'); } else { $is_new = false; } //1a. Get original data $sale_data = \App\Models\Sale::findorfail($sale['id']); //1b. Check if there were statuses differences if ($sale_data['status'] == $sale['status']) { $errors->add('Sale', 'Tidak ada perubahan status.'); } //2. Check if status = paid if (!$errors->count() && in_array($sale['status'], ['paid'])) { if (!isset($sale['payment']) || is_null($sale['payment'])) { $errors->add('Sale', 'Tidak ada data pembayaran.'); } else { $paid_data = \App\Models\Payment::findornew($sale['payment']['id']); $payment_rule = ['transaction_id' => 'exists:transactions,id|' . (!$paid_data ? '' : 'in:' . $sale_data['id']), 'method' => 'required|max:255', 'destination' => 'required|max:255', 'account_name' => 'required|max:255', 'account_number' => 'required|max:255', 'ondate' => 'required|date_format:"Y-m-d H:i:s"', 'amount' => 'required|numeric|in:' . $sale_data['bills']]; $validator = Validator::make($sale['payment'], $payment_rule); //if there was log and validator false if (!$validator->passes()) { $errors->add('Log', $validator->errors()); } else { $sale['payment']['transaction_id'] = $sale['id']; $paid_data = $paid_data->fill($sale['payment']); if (!$paid_data->save()) { $errors->add('Log', $paid_data->getError()); } } } } //2. Check if status = shipping if (!$errors->count() && in_array($sale['status'], ['shipping'])) { if (is_null($sale['shipment']['receipt_number'])) { $errors->add('Sale', 'Tidak ada nomor resi.'); } else { $shipping_data = \App\Models\Shipment::id($sale['shipment']['id'])->first(); if ($shipping_data) { $shipment_rule = ['receipt_number' => 'required|max:255']; $validator = Validator::make($sale['shipment'], $shipment_rule); //if there was log and validator false if (!$validator->passes()) { $errors->add('Log', $validator->errors()); } else { $sale['shipment']['transaction_id'] = $sale['id']; $shipping_data = $shipping_data->fill($sale['shipment']); if (!$shipping_data->save()) { $errors->add('Log', $shipping_data->getError()); } } } else { $errors->add('Log', 'Shipment tidak valid.'); } } } //3. Check if status = others if (!$errors->count() && !in_array($sale['status'], ['paid', 'shipping'])) { $log_rules = ['transaction_id' => 'exists:transactions,id|' . ($is_new ? '' : 'in:' . $sale_data['id']), 'status' => 'required|max:255|in:cart,wait,payment_process,paid,packed,shipping,delivered,canceled,abandoned']; $validator = Validator::make($sale, $log_rules); //if there was log and validator false if (!$validator->passes()) { $errors->add('Log', $validator->errors()); } else { $log_data = new \App\Models\TransactionLog(); $log_data = $log_data->fill(['status' => $sale['status'], 'transaction_id' => $sale_data['id'], 'notes' => isset($sale['notes']) ? $sale['notes'] : '']); if (!$log_data->save()) { $errors->add('Log', $log_data->getError()); } } } if ($errors->count()) { DB::rollback(); return new JSend('error', (array) Input::all(), $errors); } DB::commit(); $final_sale = \App\Models\Sale::id($sale_data['id'])->with(['voucher', 'transactionlogs', 'user', 'transactiondetails', 'transactiondetails.varian', 'transactiondetails.varian.product', 'paidpointlogs', 'payment', 'shipment', 'shipment.address', 'shipment.courier', 'transactionextensions', 'transactionextensions.productextension'])->first()->toArray(); return new JSend('success', (array) $final_sale); }