$req->code, ]; $rulesInput = [ 'code' => 'required|numeric', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { return abort(403, $isValidInput->messages()->first()); } $ord_invc = OrdersInvoices::getByCode($req->code); if (count($ord_invc) < 1) { return abort(404, 'invoice not found'); } if ($ord_invc[0]->is_gnrt_invc !== OrdersInvoices::IS_GNRT_INVC_YES) return abort(404, 'invoice not found'); $filter = [ 'id' => $ord_invc[0]->ord_id, 'get_checker_data' => 1, 'get_prefer_type_truck' => 1, 'get_additional_vehicles_info' => 1, 'get_client_pt' => 1, 'select_region_pck_drop' => 1, 'get_pic_zone' => 1, 'couple_pck_drop' => 1, ]; $order = Orders::showOrder($filter); if (count($order) < 1) { return abort(404, 'order not found'); } if ($ord_invc[0]->ord_a_item_ids == null) { return abort(404, 'items not found'); } // dd(implode(str_split($order[0]->c_pt_pic_phone_val, 4), ' ')); $drvs_ups = OrdersDriversUploads::list([ 'ord_id' => $order[0]->ord_id, 'pck_id' => $order[0]->ord_pck_id, 'drop_id' => $order[0]->ord_drop_id, 'ord_pck_drop_id' => $order[0]->ord_pck_drop_id, ]); $data = [ 'ord_invc' => $ord_invc[0], 'order' => $order[0], 'drvs_ups' => $drvs_ups, 'items' => OrdersAItems::showAItemByIds(explode(',', $ord_invc[0]->ord_a_item_ids)), ]; $pdf = PDF::loadView("menu_v2.Finance._printInvoice", $data); return $pdf->setPaper('a4', 'potrait')->stream('invoice.pdf'); // return view("menu_v2.Finance._printInvoice", $data); // } catch (\Exception $e) { // $apiResp = Responses::error($e->getMessage()); // return abort(500, $apiResp['meta']['message']); // } } public function view_ledger_balance(Request $req) { return view('menu_v2.Finance.ledgerBalance'); } public function view_pocket_tf_history(Request $req) { $data = []; return view('menu_v2.Finance.pocket_tf_history', $data); } /** * API */ public function api_finance_list_billings(Request $req) { try { $now = time(); $input = []; $rulesInput = []; // validasi input // $isValidInput = Validator::make($input, $rulesInput); // if (!$isValidInput->passes()) { // $apiResp = Responses::bad_input($isValidInput->messages()->first()); // return new Response($apiResp, $apiResp['meta']['code']); // } $filter = [ 'group_by' => 'ord_id', ]; if (($req->start_date != null && $req->start_date != '') && ($req->end_date != null && $req->end_date != '')) { $filter['start_date'] = $req->start_date; $filter['end_date'] = $req->end_date; } $list = Finance::listBillings($filter); $summary = Finance::summaryBillings($filter)[0] ?? new \StdClass(); foreach ($list as $key => $row) { $list[$key]->DT_RowIndex = $key + 1; $list[$key]->action = '-'; $list[$key]->main_item = "Pengantaran Logistik
" . ucwords(strtolower($row->pck_prid_name)) . " - " . ucwords(strtolower($row->drop_prid_name)) . "
" . date('d F Y', $row->set_pck_at); } $apiResp = Responses::success('success list billings'); $apiResp['count'] = count($list); $apiResp['summary'] = [ 'total_billing' => $summary->total_billing ?? 0, 'total_payed' => $summary->total_payed ?? 0, 'total_remaining' => $summary->total_remaining ?? 0, ]; $apiResp['data'] = $list; return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_list_payments(Request $req) { try { $now = time(); $input = []; $rulesInput = []; // validasi input // $isValidInput = Validator::make($input, $rulesInput); // if (!$isValidInput->passes()) { // $apiResp = Responses::bad_input($isValidInput->messages()->first()); // return new Response($apiResp, $apiResp['meta']['code']); // } $filter = [ 'group_by' => 'ord_id', ]; if (($req->start_date != null && $req->start_date != '') && ($req->end_date != null && $req->end_date != '')) { $filter['start_date'] = $req->start_date; $filter['end_date'] = $req->end_date; } $list = Finance::listPayments($filter); $summary = Finance::summaryPayments($filter)[0] ?? new \StdClass(); $newList = []; $cntK = 0; foreach ($list as $key => $row) { $list[$key]->action = '-'; $list[$key]->main_item = "Pengantaran Logistik
" . ucwords(strtolower($row->pck_prid_name)) . " - " . ucwords(strtolower($row->drop_prid_name)) . "
" . date('d F Y', $row->set_pck_at); $isSame = 0; foreach ($newList as $nlK => $rowL) { if (!$row->ord_group_code) continue; if ($row->ord_group_code === $rowL->ord_group_code) { $isSame = 1; $newList[$nlK]->childs[] = clone $list[$key]; } } if ($isSame) continue; $list[$key]->DT_RowIndex = ++$cntK; $list[$key]->childs = []; $newList[] = clone $list[$key]; } $apiResp = Responses::success('success list payments'); $apiResp['count'] = count($newList); $apiResp['summary'] = [ 'total_payment' => $summary->total_payment ?? 0, 'total_payed' => $summary->total_payed ?? 0, 'total_remaining' => $summary->total_remaining ?? 0, ]; $apiResp['data'] = $newList; return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_list_ledger_balances(Request $req) { try { $now = time(); $input = []; $rulesInput = []; // validasi input // $isValidInput = Validator::make($input, $rulesInput); // if (!$isValidInput->passes()) { // $apiResp = Responses::bad_input($isValidInput->messages()->first()); // return new Response($apiResp, $apiResp['meta']['code']); // } $filterList = [ 'with_items' => 1, 'group_by' => 'ord_a_item.id', ]; $filterSum = []; if (($req->start_date != null && $req->start_date != '') && ($req->end_date != null && $req->end_date != '')) { $filterList['start_date'] = $req->start_date; $filterList['end_date'] = $req->end_date; $filterSum['start_date'] = $req->start_date; $filterSum['end_date'] = $req->end_date; } $list = Finance::listLedgerBl($filterList); $summary = Finance::summaryLedgerBl($filterSum)[0]; // grouping & formatting v1 $group_by_order_id = []; foreach ($list as $key => $row) { $row->amt_in = 0; $row->amt_out = 0; if ($row->a_item_type === OrdersAItems::A_TYPE_PRIMARY) { $row->item_desc = "Pengantaran Logistik
" . ucwords(strtolower($row->pck_prid_name)) . " - " . ucwords(strtolower($row->drop_prid_name)) . "
" . date('d F Y', $row->set_pck_at); } if ($row->calc_to_vdr === OrdersAItems::CALC_TO_VDR_YES) { $row->amt_out = $row->amt_total_flat; } if ($row->invc_to_client === OrdersAItems::INVC_TO_CLIENT_YES) { $row->amt_in = $row->amt_bill_total_flat; } $row->amt_bl = $row->amt_in - $row->amt_out; if (!isset($group_by_order_id[$row->ord_id])) { $group_by_order_id[$row->ord_id] = clone $row; $group_by_order_id[$row->ord_id]->a_items = []; } $group_by_order_id[$row->ord_id]->a_items[] = clone $row; } // grouping & formatting v2 $new_group_by_order_id = []; $i = 0; foreach ($group_by_order_id as $key => $row) { $row->DT_RowIndex = ++$i; $row->action = '-'; $new_group_by_order_id[] = clone $row; } $apiResp = Responses::success('success list ledger balance'); $apiResp['count'] = count($new_group_by_order_id); $apiResp['summary'] = [ 'total_bl' => $summary->total_bl ?? 0, 'total_in' => $summary->total_in ?? 0, 'total_out' => $summary->total_out ?? 0, ]; // $apiResp['summary']['total_bl'] = $apiResp['summary']['total_in'] - $apiResp['summary']['total_out']; $apiResp['data'] = $new_group_by_order_id; return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_list_adt_items_payments(Request $req) { try { $now = time(); $input = [ 'ord_id' => $req->ord_id, ]; $rulesInput = [ // 'ord_id' => 'required|integer|not_in:0', // single 'ord_id' => 'required|string', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } $ord_ids = explode(',', $req->ord_id); $filter = [ 'group_by' => 'ord_a_item.id', 'get_user_crt' => 1, 'get_user_rjct' => 1, ]; if ($req->is_access_by_admin == 1) { $filter['is_access_by_admin'] = 1; } if ($ord_ids) { // $filter['ord_id'] = $ord_ids[0]; // single $filter['ord_ids'] = $ord_ids; } if ($req->is_aprv || $req->is_aprv == 0) { $filter['is_aprv'] = $req->is_aprv; } $list = Finance::listAdtItemsPayments($filter); // foreach ($list as $key => $row) { // $list[$key]->DT_RowIndex = $key + 1; // $list[$key]->action = '-'; // // $list[$key]->main_item = "Pengantaran Logistik
" . ucwords(strtolower($row->pck_prid_name)) . " - " . ucwords(strtolower($row->drop_prid_name)) . "
" . date('d F Y', $row->set_pck_at); // } $newList = []; $cntK = 0; foreach ($list as $key => $row) { $list[$key]->action = '-'; $isSame = 0; foreach ($newList as $nlK => $rowL) { // if ($req->is_access_by_admin == 1) continue; if (!$row->group_merge_code) continue; if ($row->group_merge_code === $rowL->group_merge_code) { $isSame = 1; $newList[$nlK]->childs[] = clone $list[$key]; } } if ($isSame) continue; $list[$key]->DT_RowIndex = ++$cntK; $list[$key]->childs = []; if ($list[$key]->a_item_type === OrdersAItems::A_TYPE_PRIMARY && $list[$key]->stts_merge !== OrdersAItems::STTS_MERGE_RESULT) { $list[$key]->previous_termin = OrdersAItems::showAItem([ 'ord_id' => $list[$key]->ord_id, 'is_active' => OrdersAItems::IS_ACTIVE_YES, 'a_item_type' => OrdersAItems::A_TYPE_PRIMARY, 'prev_main_item_id' => $list[$key]->ord_a_item_id, 'v_termin_id_not_zero' => 1, 'limit' => 1, ]); } $newList[] = clone $list[$key]; } $apiResp = Responses::success('success list adt items payments'); $apiResp['count'] = count($newList); $apiResp['data'] = $newList; return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_add_a_items(Request $req) { /** * Case * Jika new item => a_id == "00" * Jika without add new master item => a_id == "0" * Jika is adm price == yes => no input tenggat pembayaran, bukti pengajuan, tujuan pembayaran(receiver) * Jika slc_pay_purpose == fill => input tujuan pembayaran(receiver)n * Jika status pembayaran == lunas => upload bukti pembayaran */ $url_submission_proof_base64 = []; $url_is_paid_proof_base64 = []; try { $now = time(); $input = [ 'ord_id' => $req->ord_id, 'flow_type' => $req->flow_type, 'cash_type' => $req->cash_type, 'a_id' => $req->a_id, // 0 => without add new and master, 00 => new 'a_name' => $req->a_name, 'a_type' => $req->a_type, // flag 'a_price' => $req->a_price, 'a_price_tax_type' => $req->a_price_tax_type, 'a_price_tax_ppn_percent' => $req->a_price_tax_ppn_percent, 'a_price_tax_ppn_flat' => $req->a_price_tax_ppn_flat, 'a_price_tax_pph_percent' => $req->a_price_tax_pph_percent, 'a_price_tax_pph_flat' => $req->a_price_tax_pph_flat, 'a_price_total_tax' => $req->a_price_total_tax, 'a_qty' => $req->a_qty, 'a_invc_price' => $req->a_invc_price, 'a_invc_price_tax_type' => $req->a_invc_price_tax_type, 'a_invc_price_tax_ppn_percent' => $req->a_invc_price_tax_ppn_percent, 'a_invc_price_tax_ppn_flat' => $req->a_invc_price_tax_ppn_flat, 'a_invc_price_tax_pph_percent' => $req->a_invc_price_tax_pph_percent, 'a_invc_price_tax_pph_flat' => $req->a_invc_price_tax_pph_flat, 'a_invc_price_total_tax' => $req->a_invc_price_total_tax, 'is_adm_price' => $req->is_adm_price, 'ddln_pay_at' => $req->ddln_pay_at, 'ddln_pay_type' => $req->ddln_pay_type, // flag 'submission_proof_base64' => $req->submission_proof_base64, 'slc_pay_purpose' => $req->slc_pay_purpose, // fill,none 'bank_id' => $req->bank_id, 'bank_code' => $req->bank_code, 'bank_short' => $req->bank_short, 'bank_name' => $req->bank_name, 'bank_acc_number' => $req->bank_acc_number, 'bank_acc_name' => $req->bank_acc_name, 'is_paid' => $req->is_paid, // flag 'paid_proof_ref_no' => $req->paid_proof_ref_no, 'is_paid_proof_base64' => $req->is_paid_proof_base64, 'is_paid_at' => $req->is_paid_at, 'is_invc_to_client' => $req->is_invc_to_client, // flag 'is_calc_to_vdr' => $req->is_calc_to_vdr, // flag 'crt_type' => $req->crt_type, // flag ]; $rulesInput = [ 'ord_id' => 'required|integer|not_in:0', 'flow_type' => 'required|integer|not_in:0', 'cash_type' => 'required|integer|not_in:0', 'a_id' => 'nullable|numeric', // 0 => without add new and master, 00 => new 'a_name' => 'nullable|string', 'a_type' => 'nullable|integer|min:0', 'a_price' => 'nullable|numeric|min:0', 'a_price_tax_type' => 'nullable|numeric|min:0', 'a_price_tax_ppn_percent' => 'nullable|numeric|min:0', 'a_price_tax_ppn_flat' => 'nullable|numeric|min:0', 'a_price_tax_pph_percent' => 'nullable|numeric|min:0', 'a_price_tax_pph_flat' => 'nullable|numeric', 'a_price_total_tax' => 'nullable|numeric|min:0', 'a_qty' => 'nullable|numeric|min:0', 'a_invc_price' => 'nullable|numeric|min:0', 'a_invc_price_tax_type' => 'nullable|numeric|min:0', 'a_invc_price_tax_ppn_percent' => 'nullable|numeric|min:0', 'a_invc_price_tax_ppn_flat' => 'nullable|numeric|min:0', 'a_invc_price_tax_pph_percent' => 'nullable|numeric|min:0', 'a_invc_price_tax_pph_flat' => 'nullable|numeric|min:0', 'a_invc_price_total_tax' => 'nullable|numeric|min:0', 'is_adm_price' => 'nullable|numeric', 'ddln_pay_at' => 'nullable|numeric', 'ddln_pay_type' => 'nullable|numeric', // flag 'submission_proof_base64' => 'nullable|array', 'slc_pay_purpose' => 'nullable|string', // fill,none 'bank_id' => 'nullable|numeric', 'bank_code' => 'nullable|numeric', 'bank_short' => 'nullable|string', 'bank_name' => 'nullable|string', 'bank_acc_number' => 'nullable|numeric', 'bank_acc_name' => 'nullable|string', 'is_paid' => 'nullable|numeric', // flag 'paid_proof_ref_no' => 'nullable|numeric', 'is_paid_proof_base64' => 'nullable|array', 'is_paid_at' => 'nullable|numeric', 'is_invc_to_client' => 'nullable|numeric', // flag 'is_calc_to_vdr' => 'nullable|numeric', // flag 'crt_type' => 'nullable|numeric', // flag ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } if ($req->slc_pay_purpose == 'fill' && !$req->bank_id) { $apiResp = Responses::bad_input('informasi penerima wajib diisi'); return new Response($apiResp, $apiResp['meta']['code']); } if ($req->is_paid == OrdersAItems::IS_PAID_YES) { if ($req->is_paid_proof_base64 && count($req->is_paid_proof_base64) < 1) { $apiResp = Responses::bad_input('bukti pembayaran wajib diisi'); return new Response($apiResp, $apiResp['meta']['code']); } } if ($req->submission_proof_base64 && count($req->submission_proof_base64) < 1) { $apiResp = Responses::bad_input('bukti pengajuan wajib diisi'); return new Response($apiResp, $apiResp['meta']['code']); } $order = Orders::showOrder([ 'id' => $req->ord_id, // 'get_prefer_type_truck' => 1, 'get_pic_zone' => 1, // 'get_stts_checker' => 1, // 'get_checker_data' => 1, // 'get_checker_user' => 1, // 'get_accidents' => 1, 'get_client_pt' => 1, ]); if (count($order) < 1) { $apiResp = Responses::not_found('order not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } if ($req->auth->role === Users::ROLE_ADMIN) { $crt_type = AItems::CRT_TYPE_ADMIN; } else if ($req->auth->role === Users::ROLE_FINANCE) { $crt_type = AItems::CRT_TYPE_FINANCE; } else { $crt_type = 99; } if ($req->a_id === "00") { $uniqName = AItems::getByName($req->a_name, ['crt_type' => $crt_type]); if (count($uniqName) > 0) { $apiResp = Responses::bad_request('nama additional item sudah terdata'); return (new Response($apiResp, $apiResp['meta']['code'])); } } DB::beginTransaction(); $a_id = $req->a_id; if ($req->a_id === "00") { $insAItems = [ 'name' => $req->a_name, 'type' => $req->a_type, 'price' => $req->a_price, 'is_adm_price' => ($req->is_adm_price == OrdersAItems::IS_ADM_PRICE_YES) ? OrdersAItems::IS_ADM_PRICE_YES : OrdersAItems::IS_ADM_PRICE_NO, 'is_active' => AItems::IS_ACTIVE, 'crt' => $now, 'crt_by' => $req->auth->uid, 'crt_type' => $crt_type, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; $a_id = AItems::add($insAItems); $a_item = AItems::getById($a_id); } else if ($req->a_id === "0") { $insAItems = [ 'name' => $req->a_name, 'type' => $req->a_type, 'price' => $req->a_price, 'is_adm_price' => ($req->is_adm_price == OrdersAItems::IS_ADM_PRICE_YES) ? OrdersAItems::IS_ADM_PRICE_YES : OrdersAItems::IS_ADM_PRICE_NO, 'is_active' => AItems::IS_ACTIVE, 'crt' => $now, 'crt_by' => $req->auth->uid, 'crt_type' => $crt_type, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; } else { $a_item = AItems::getById($a_id); } $insOrdersAItems = [ 'ord_id' => $order[0]->ord_id, 'ord_code' => $order[0]->ord_code, 'flow_type' => $req->flow_type, 'cash_type' => $req->cash_type, 'a_item_type' => OrdersAItems::A_TYPE_SECONDARY, 'ref_ord_id' => $order[0]->ord_id, 'ref_ord_code' => $order[0]->ord_code, 'crt' => $now, 'crt_by' => $req->auth->uid, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; // $insOrdersAItemsInvc = []; if ($req->a_id == "0") { $insOrdersAItems['desc'] = $insAItems['name']; $insOrdersAItems['unit_id'] = $a_id; $insOrdersAItems['unit_type'] = $insAItems['type']; $insOrdersAItems['amt_base_flat'] = $insAItems['price']; $insOrdersAItems['unit_qty'] = $req->a_qty; } else { $insOrdersAItems['desc'] = $a_item[0]->name; $insOrdersAItems['unit_id'] = $a_id; $insOrdersAItems['unit_type'] = $a_item[0]->type; $insOrdersAItems['amt_base_flat'] = $a_item[0]->price; $insOrdersAItems['unit_qty'] = $req->a_qty; } if (isset($req->a_price_tax_type)) { $insOrdersAItems['amt_tax_type'] = $req->a_price_tax_type; $insOrdersAItems['amt_tax_ppn_percent'] = $req->a_price_tax_ppn_percent ?? 0; $insOrdersAItems['amt_tax_ppn_flat'] = $req->a_price_tax_ppn_flat ?? 0; $insOrdersAItems['amt_tax_pph_percent'] = $req->a_price_tax_pph_percent ?? 0; $insOrdersAItems['amt_tax_pph_flat'] = $req->a_price_tax_pph_flat ?? 0; $insOrdersAItems['amt_total_tax_flat'] = $req->a_price_total_tax ?? 0; } if ($req->a_price_tax_type == OrdersAItems::AMT_TAX_TYPE_INCLUDE) { $insOrdersAItems['amt_result_flat'] = $req->a_price_total_tax; $insOrdersAItems['amt_total_flat'] = $req->a_price_total_tax * $req->a_qty; } else if ($req->a_price_tax_type == OrdersAItems::AMT_TAX_TYPE_WITHOUT) { $insOrdersAItems['amt_result_flat'] = $insOrdersAItems['amt_base_flat']; $insOrdersAItems['amt_total_flat'] = $insOrdersAItems['amt_base_flat'] * $req->a_qty; } else { $insOrdersAItems['amt_result_flat'] = $req->a_price_total_tax; $insOrdersAItems['amt_total_flat'] = $req->a_price_total_tax * $req->a_qty; } $req->a_invc_price = $req->a_invc_price ?? 0; $insOrdersAItems['amt_bill_base_flat'] = $req->a_invc_price; if (isset($req->a_invc_price_tax_type)) { $insOrdersAItems['amt_bill_tax_type'] = $req->a_invc_price_tax_type; $insOrdersAItems['amt_bill_tax_ppn_percent'] = $req->a_invc_price_tax_ppn_percent ?? 0; $insOrdersAItems['amt_bill_tax_ppn_flat'] = $req->a_invc_price_tax_ppn_flat ?? 0; $insOrdersAItems['amt_bill_tax_pph_percent'] = $req->a_invc_price_tax_pph_percent ?? 0; $insOrdersAItems['amt_bill_tax_pph_flat'] = $req->a_invc_price_tax_pph_flat ?? 0; $insOrdersAItems['amt_bill_total_tax_flat'] = $req->a_invc_price_total_tax ?? 0; } if ($req->a_invc_price_tax_type == OrdersAItems::AMT_TAX_TYPE_INCLUDE) { $insOrdersAItems['amt_bill_result_flat'] = $insOrdersAItems['amt_bill_base_flat']; $insOrdersAItems['amt_bill_total_flat'] = $insOrdersAItems['amt_bill_base_flat'] * $req->a_qty; } else if ($req->a_invc_price_tax_type == OrdersAItems::AMT_TAX_TYPE_WITHOUT) { $insOrdersAItems['amt_bill_result_flat'] = $insOrdersAItems['amt_bill_base_flat']; $insOrdersAItems['amt_bill_total_flat'] = $insOrdersAItems['amt_bill_base_flat'] * $req->a_qty; } else { $insOrdersAItems['amt_bill_result_flat'] = $req->a_invc_price_total_tax; $insOrdersAItems['amt_bill_total_flat'] = $req->a_invc_price_total_tax * $req->a_qty; } $insOrdersAItems['calc_to_vdr'] = OrdersAItems::CALC_TO_VDR_NO; if ($req->is_calc_to_vdr == OrdersAItems::CALC_TO_VDR_YES) { $insOrdersAItems['calc_to_vdr'] = OrdersAItems::CALC_TO_VDR_YES; $termins = OrdersTermins::listWithFilter([ 'ord_id' => $order[0]->ord_id, 'termin_for' => OrdersTermins::TERMIN_FOR_VENDOR, 'termin_is_paid' => OrdersTermins::IS_PAID_NO, 'in_stts_merge' => [ OrdersAItems::STTS_MERGE_NO, OrdersAItems::STTS_MERGE_RESULT, ], ]); $insOrdersAItems['v_termin_id'] = 0; $insOrdersAItems['ref_v_termin_id'] = 0; if (count($termins) > 0) { $insOrdersAItems['v_termin_id'] = $termins[0]->id; $insOrdersAItems['ref_v_termin_id'] = $termins[0]->id; } if ($insOrdersAItems['v_termin_id'] === 0) { $termins = OrdersTermins::listWithFilter([ 'ord_id' => $order[0]->ord_id, 'termin_for' => OrdersTermins::TERMIN_FOR_VENDOR, 'in_stts_merge' => [ OrdersAItems::STTS_MERGE_NO, OrdersAItems::STTS_MERGE_RESULT, ], ]); $insOrdersAItems['v_termin_id'] = $termins[count($termins) - 1]->id; $insOrdersAItems['ref_v_termin_id'] = $termins[count($termins) - 1]->id; } $buy_price = $order[0]->buy_price + $insOrdersAItems['amt_total_flat']; Orders::updateOrder($order[0]->ord_id, [ 'buy_price' => $buy_price, ]); } $insOrdersAItems['invc_to_client'] = OrdersAItems::INVC_TO_CLIENT_NO; if ($req->is_invc_to_client == OrdersAItems::INVC_TO_CLIENT_YES) { $insOrdersAItems['invc_to_client'] = OrdersAItems::INVC_TO_CLIENT_YES; $termins = OrdersTermins::listWithFilter([ 'ord_id' => $order[0]->ord_id, 'termin_for' => OrdersTermins::TERMIN_FOR_CLIENT, 'termin_is_paid' => OrdersTermins::IS_PAID_NO, 'in_stts_merge' => [ OrdersAItems::STTS_MERGE_NO, OrdersAItems::STTS_MERGE_RESULT, ], ]); $insOrdersAItems['c_termin_id'] = 0; $insOrdersAItems['ref_c_termin_id'] = 0; if (count($termins) > 0) { $insOrdersAItems['c_termin_id'] = $termins[0]->id; $insOrdersAItems['ref_c_termin_id'] = $termins[0]->id; } if ($insOrdersAItems['c_termin_id'] === 0) { DB::rollBack(); $apiResp = Responses::bad_request('tidak dapat melakukan tagihan ke client, karena semua penagihan sudah close'); return (new Response($apiResp, $apiResp['meta']['code'])); } // calc perpajakan if ($termins[0]->termin_tax_type == OrdersAItems::AMT_TAX_TYPE_INCLUDE) { $before_ppn = round($insOrdersAItems['amt_bill_base_flat'] / OrdersAItems::PPN_PERCENT_INCLUDE); $ppn = round($insOrdersAItems['amt_bill_base_flat'] - $before_ppn); $amt_bill_base_tax_flat = round($before_ppn); $amt_bill_total_flat = round($amt_bill_base_tax_flat * $insOrdersAItems['unit_qty']); $insOrdersAItems['amt_bill_tax_type'] = $termins[0]->termin_tax_type; $insOrdersAItems['amt_bill_tax_ppn_percent'] = OrdersAItems::PPN_PERCENT; $insOrdersAItems['amt_bill_tax_ppn_flat'] = $ppn; $insOrdersAItems['amt_bill_tax_pph_percent'] = 0; $insOrdersAItems['amt_bill_tax_pph_flat'] = 0; $insOrdersAItems['amt_bill_total_tax_flat'] = $amt_bill_base_tax_flat; $insOrdersAItems['amt_bill_result_flat'] = $amt_bill_base_tax_flat; $insOrdersAItems['amt_bill_total_flat'] = $amt_bill_total_flat; } // if ($req->a_invc_price > 0) { // $insOrdersAItemsInvc = [ // 'ord_id' => $order[0]->ord_id, // 'ord_code' => $order[0]->ord_code, // 'flow_type' => $req->flow_type, // 'cash_type' => $req->cash_type, // 'a_item_type' => OrdersAItems::A_TYPE_SECONDARY, // 'ref_ord_id' => $order[0]->ord_id, // 'ref_ord_code' => $order[0]->ord_code, // 'desc' => $insOrdersAItems['desc'], // 'unit_id' => $insOrdersAItems['unit_id'], // 'unit_type' => $insOrdersAItems['unit_type'], // 'amt_base_flat' => $req->a_invc_price, // 'unit_qty' => $insOrdersAItems['unit_qty'], // 'amt_result_flat' => $req->a_invc_price, // 'amt_total_flat' => $req->a_invc_price * $insOrdersAItems['unit_qty'], // 'calc_to_vdr' => OrdersAItems::CALC_TO_VDR_NO, // 'v_termin_id' => 0, // 'ref_v_termin_id' => 0, // 'invc_to_client' => OrdersAItems::INVC_TO_CLIENT_YES, // 'c_termin_id' => $insOrdersAItems['c_termin_id'], // 'ref_c_termin_id' => $insOrdersAItems['ref_c_termin_id'], // 'crt' => $now, // 'crt_by' => $req->auth->uid, // 'updt' => $now, // 'updt_by' => $req->auth->uid, // ]; // $insOrdersAItems['c_termin_id'] = 0; // $insOrdersAItems['ref_c_termin_id'] = 0; // $sell_price = $order[0]->price + $insOrdersAItemsInvc['amt_total_flat']; // } else { // $sell_price = $order[0]->price + $insOrdersAItems['amt_total_flat']; // } // cara lama sebelum perpajakan // $sell_price = $order[0]->price + $insOrdersAItems['amt_bill_total_flat']; // cara baru sebelum perpajakan $sell_price = $order[0]->price + $insOrdersAItems['amt_bill_base_flat'] * $insOrdersAItems['unit_qty']; Orders::updateOrder($order[0]->ord_id, [ 'price' => $sell_price, ]); Finance::updtChangeInvc($insOrdersAItems['c_termin_id']); } $insOrdersAItems['only_client'] = OrdersAItems::ONLY_CLIENT_NO; // $insOrdersAItemsInvc['only_client'] = OrdersAItems::ONLY_CLIENT_NO; if ($req->only_client == OrdersAItems::ONLY_CLIENT_YES) { $insOrdersAItems['only_client'] = OrdersAItems::ONLY_CLIENT_YES; // $insOrdersAItemsInvc['only_client'] = OrdersAItems::ONLY_CLIENT_YES; } if ($req->is_adm_price == OrdersAItems::IS_ADM_PRICE_YES) { $insOrdersAItems['is_adm_price'] = OrdersAItems::IS_ADM_PRICE_YES; } else { $insOrdersAItems['ddln_pay_at'] = $req->ddln_pay_at ?? 0; $insOrdersAItems['ddln_pay_type'] = $req->ddln_pay_type ?? OrdersAItems::DDLN_PAY_TYPE_TIME; if ($req->slc_pay_purpose == 'fill' && $req->bank_id) { $insOrdersAItems['bank_id'] = $req->bank_id; $insOrdersAItems['bank_code'] = $req->bank_code; $insOrdersAItems['bank_short_name'] = $req->bank_short; $insOrdersAItems['bank_name'] = $req->bank_name; $insOrdersAItems['bank_acc_name'] = $req->bank_acc_name; $insOrdersAItems['bank_acc_number'] = $req->bank_acc_number; } } if ($req->is_paid == OrdersAItems::IS_PAID_YES) { $insOrdersAItems['is_paid'] = OrdersAItems::IS_PAID_YES; $insOrdersAItems['paid_ref_no'] = $req->paid_proof_ref_no; $insOrdersAItems['paid_at'] = $now; $insOrdersAItems['paid_by'] = $req->auth->uid; } if ($req->crt_type == OrdersAItems::CRT_TYPE_SYSTEM) { $insOrdersAItems['crt_type'] = OrdersAItems::CRT_TYPE_SYSTEM; } else if ($req->crt_type == OrdersAItems::CRT_TYPE_FINANCE) { $insOrdersAItems['crt_type'] = OrdersAItems::CRT_TYPE_FINANCE; } else { $insOrdersAItems['crt_type'] = OrdersAItems::CRT_TYPE_ADMIN; } // $insOrdersAItemsInvc['crt_type'] = $insOrdersAItems['crt_type']; $oa_id = OrdersAItems::add($insOrdersAItems); // if (count($insOrdersAItemsInvc) > 0) { // $insOrdersAItemsInvc['ref_ord_a_item_id'] = $oa_id; // $oa_id2 = OrdersAItems::add($insOrdersAItemsInvc); // } if ($req->is_adm_price == OrdersAItems::IS_ADM_PRICE_YES) {} else { if ($req->submission_proof_base64 && count($req->submission_proof_base64) > 0) { foreach ($req->submission_proof_base64 as $i => $img) { $clearBase64 = preg_replace('/^data:(image|application)\/(png|jpg|jpeg|pdf);base64,/', '', $img); $type = 'jpeg'; if (strpos($img, 'application/pdf') !== false) $type = 'pdf'; $url_submission_proof_base64[$i] = "orders/" . $order[0]->ord_id . "/a_items/" . $oa_id . "/submission/" . $req->auth->uid . "/submission_proof_img_$now" . "_" . "$i.$type"; if (!Storage::disk('public')->put($url_submission_proof_base64[$i], base64_decode($clearBase64))) { DB::rollBack(); $apiResp = Responses::bad_request('gagal upload bukti pengajuan'); return (new Response($apiResp, $apiResp['meta']['code'])); } } } } if ($req->is_paid == OrdersAItems::IS_PAID_YES) { if ($req->is_paid_proof_base64 && count($req->is_paid_proof_base64) > 0) { foreach ($req->is_paid_proof_base64 as $i => $img) { $clearBase64 = preg_replace('/^data:(image|application)\/(png|jpg|jpeg|pdf);base64,/', '', $img); $type = 'jpeg'; if (strpos($img, 'application/pdf') !== false) $type = 'pdf'; $url_is_paid_proof_base64[$i] = "orders/" . $order[0]->ord_id . "/a_items/" . $oa_id . "/payments/" . $req->auth->uid . "/payments_proof_img_$now" . "_" . "$i.$type"; if (!Storage::disk('public')->put($url_is_paid_proof_base64[$i], base64_decode($clearBase64))) { DB::rollBack(); $apiResp = Responses::bad_request('gagal upload bukti pembayaran'); return (new Response($apiResp, $apiResp['meta']['code'])); } } } } OrdersAItems::updt($oa_id, [ 'img_proof_submission' => (count($url_submission_proof_base64) > 0) ? json_encode($url_submission_proof_base64) : null, 'img_proof_payment' => (count($url_is_paid_proof_base64) > 0) ? json_encode($url_is_paid_proof_base64) : null, ]); // OrdersAItems::updt($oa_id2, [ // 'img_proof_submission' => (count($url_submission_proof_base64) > 0) ? json_encode($url_submission_proof_base64) : null, // 'img_proof_payment' => (count($url_is_paid_proof_base64) > 0) ? json_encode($url_is_paid_proof_base64) : null, // ]); $apiResp = Responses::created('success add item'); DB::commit(); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { DB::rollBack(); if (count($url_submission_proof_base64) > 0) { foreach ($url_submission_proof_base64 as $path) { Storage::disk('public')->delete($path); } } if (count($url_is_paid_proof_base64) > 0) { foreach ($url_is_paid_proof_base64 as $path) { Storage::disk('public')->delete($path); } } $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_show_a_item(Request $req, $ord_a_item_id) { try { $now = time(); $input = [ 'ord_a_item_id' => $ord_a_item_id, ]; $rulesInput = [ 'ord_a_item_id' => 'required|integer|not_in:0', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } $filter = [ 'ord_a_item_id' => $ord_a_item_id, 'get_user_crt' => 1, 'get_user_rjct' => 1, ]; $item = OrdersAItems::showAItem($filter); if (count($item) < 1) { $apiResp = Responses::not_found('item not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } if ($item[0]->group_merge_code) { $filter = [ 'exclude_ord_a_item_id' => $ord_a_item_id, 'group_merge_code' => $item[0]->group_merge_code, 'get_user_crt' => 1, 'get_user_rjct' => 1, ]; $childs = OrdersAItems::showAItem($filter); $item[0]->childs = $childs; } $apiResp = Responses::success('success get detail item'); $apiResp['data'] = $item[0]; return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_pay_a_items(Request $req, $ord_a_item_id) { $url_up_paid_proof_base64 = []; try { $now = time(); $input = [ 'ord_a_item_id' => $ord_a_item_id, // 'group_merge_code' => $req->group_merge_code, 'up_paid_ref_no' => $req->up_paid_ref_no, 'up_paid_proof_base64' => $req->up_paid_proof_base64, ]; $rulesInput = [ 'ord_a_item_id' => 'required|integer|not_in:0', // 'group_merge_code' => 'nullable|integer|not_in:0', 'up_paid_ref_no' => 'required|numeric|min:0', 'up_paid_proof_base64' => 'nullable|array', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } if (!$req->up_paid_proof_base64 || count($req->up_paid_proof_base64) < 1) { $apiResp = Responses::bad_input('bukti pembayaran wajib diisi'); return new Response($apiResp, $apiResp['meta']['code']); } $a_item = OrdersAItems::showAItemById($ord_a_item_id); if (count($a_item) < 1) { $apiResp = Responses::not_found('item not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } $order = Orders::showOrder(['id' => $a_item[0]->ord_id]); DB::beginTransaction(); $updtOrdersAItems = [ 'paid_ref_no' => $req->up_paid_ref_no, 'is_paid' => OrdersAItems::IS_PAID_YES, 'updt' => $now, 'updt_by' => $req->auth->uid, 'paid_at' => $now, 'paid_by' => $req->auth->uid, ]; if ($a_item[0]->v_termin_id !== 0 && $a_item[0]->a_item_type === OrdersAItems::A_TYPE_PRIMARY) { $termin = OrdersTermins::getById($a_item[0]->v_termin_id); if ($termin[0]->termin_is_paid !== OrdersTermins::IS_PAID_YES) { OrdersTermins::updt($a_item[0]->v_termin_id, [ 'termin_is_paid' => OrdersTermins::IS_PAID_YES, 'termin_paid_at' => $now, 'termin_paid_by' => $req->auth->uid, 'updt' => $now, 'updt_by' => $req->auth->uid, ]); } } if ($req->up_paid_proof_base64 && count($req->up_paid_proof_base64) > 0) { foreach ($req->up_paid_proof_base64 as $i => $img) { $clearBase64 = preg_replace('/^data:(image|application)\/(png|jpg|jpeg|pdf);base64,/', '', $img); $type = 'jpeg'; if (strpos($img, 'application/pdf') !== false) $type = 'pdf'; $url_up_paid_proof_base64[$i] = "orders/" . $a_item[0]->ord_id . "/a_items/" . $ord_a_item_id . "/payments/" . $req->auth->uid . "/payments_proof_img_$now" . "_" . "$i.$type"; if (!Storage::disk('public')->put($url_up_paid_proof_base64[$i], base64_decode($clearBase64))) { DB::rollBack(); $apiResp = Responses::bad_request('gagal upload bukti pembayaran'); return (new Response($apiResp, $apiResp['meta']['code'])); } } } $updtOrdersAItems['img_proof_payment'] = (count($url_up_paid_proof_base64) > 0) ? json_encode($url_up_paid_proof_base64) : null; OrdersAItems::updt($ord_a_item_id, $updtOrdersAItems); $updtOrd = []; $checkPaidOff = Finance::checkJustPaidOff($a_item[0]->ord_id); if ($checkPaidOff['invc_paid'] === 1) { $updtOrd['is_invc_paid'] = Orders::IS_PAID_YES; $updtOrd['invc_paid_at'] = $now; } if ($checkPaidOff['vdr_paid'] === 1) { $updtOrd['is_vdr_paid'] = Orders::IS_PAID_YES; $updtOrd['vdr_paid_at'] = $now; // kalau vhc & driver bisa order lagi setelah pembayaran lunas // Vehicles::updateVehicle($order[0]->vhc_id, [ // 'is_in_ord' => Vehicles::IN_ORD_NO, // 'ord_id' => 0, // 'ord_code' => 0, // ]); // Drivers::updateDriver($order[0]->drv_id, [ // 'is_in_ord' => Drivers::IN_ORD_NO, // 'ord_id' => 0, // 'ord_code' => 0, // ]); } if ($checkPaidOff['invc_vdr_paid'] === 1 || $checkPaidOff['invc_vdr_paid'] === 2) { if ($order[0]->status === Orders::STTS_DROP || $order[0]->status === Orders::STTS_CLIENT_PAY || $order[0]->status === Orders::STTS_VENDOR_PAYED) { $updtOrd['status'] = Orders::STTS_CLOSE; } } if (count($updtOrd) > 0) { Orders::updateOrder($a_item[0]->ord_id, $updtOrd); } // $currentBill = Finance::listBillings(['ord_id' => $a_item[0]->ord_id]); // $currentPay = Finance::listPayments(['ord_id' => $a_item[0]->ord_id]); // if ($currentBill[0]->total_billing === $currentBill[0]->total_payed || $currentPay[0]->total_payment === $currentPay[0]->total_payed) { // $updtOrd = []; // if ($currentBill[0]->total_billing === $currentBill[0]->total_payed) { // if ($order[0]->is_invc_paid !== Orders::IS_PAID_YES) { // $updtOrd['is_invc_paid'] = Orders::IS_PAID_YES; // $updtOrd['invc_paid_at'] = $now; // } // } // if ($currentPay[0]->total_payment === $currentPay[0]->total_payed) { // if ($order[0]->is_vdr_paid !== Orders::IS_PAID_YES) { // $updtOrd['is_vdr_paid'] = Orders::IS_PAID_YES; // $updtOrd['vdr_paid_at'] = $now; // Vehicles::updateVehicle($order[0]->vhc_id, [ // 'is_in_ord' => Vehicles::IN_ORD_NO, // 'ord_id' => 0, // 'ord_code' => 0, // ]); // Drivers::updateDriver($order[0]->drv_id, [ // 'is_in_ord' => Drivers::IN_ORD_NO, // 'ord_id' => 0, // 'ord_code' => 0, // ]); // } // } // if ($currentBill[0]->total_billing === $currentBill[0]->total_payed && $currentPay[0]->total_payment === $currentPay[0]->total_payed) { // $updtOrd['status'] = Orders::STTS_CLOSE; // } // if (count($updtOrd) > 0) { // Orders::updateOrder($a_item[0]->ord_id, $updtOrd); // } // } $apiResp = Responses::success('success pay item'); DB::commit(); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { DB::rollBack(); if (count($url_up_paid_proof_base64) > 0) { foreach ($url_up_paid_proof_base64 as $path) { Storage::disk('public')->delete($path); } } $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_updt_a_items(Request $req, $ord_a_item_id) { /** * Case * Jika without add updt master item => a_id == "0" || "00" * Jika is adm price == yes => no input tenggat pembayaran, bukti pengajuan, tujuan pembayaran(receiver) * Jika slc_pay_purpose == fill => input tujuan pembayaran(receiver)n * Jika status pembayaran == lunas => upload bukti pembayaran */ $url_submission_proof_base64 = []; $url_is_paid_proof_base64 = []; try { $now = time(); $input = [ 'ord_a_item_id' => $req->ord_a_item_id, 'flow_type' => $req->flow_type, 'cash_type' => $req->cash_type, 'a_id' => $req->a_id, // 0 => without update new and master, 00 => new 'a_name' => $req->a_name, 'a_type' => $req->a_type, // flag 'a_price' => $req->a_price, 'a_qty' => $req->a_qty, 'a_invc_price' => $req->a_invc_price, 'is_adm_price' => $req->is_adm_price, 'ddln_pay_at' => $req->ddln_pay_at, 'ddln_pay_type' => $req->ddln_pay_type, // flag 'submission_proof_base64' => $req->submission_proof_base64, 'slc_pay_purpose' => $req->slc_pay_purpose, // fill,none 'bank_id' => $req->bank_id, 'bank_code' => $req->bank_code, 'bank_short' => $req->bank_short, 'bank_name' => $req->bank_name, 'bank_acc_number' => $req->bank_acc_number, 'bank_acc_name' => $req->bank_acc_name, 'is_paid' => $req->is_paid, // flag 'is_paid_proof_base64' => $req->is_paid_proof_base64, 'is_paid_at' => $req->is_paid_at, 'is_invc_to_client' => $req->is_invc_to_client, // flag 'is_calc_to_vdr' => $req->is_calc_to_vdr, // flag 'crt_type' => $req->crt_type, // flag ]; $rulesInput = [ 'ord_a_item_id' => 'required|integer|not_in:0', 'flow_type' => 'required|integer|not_in:0', 'cash_type' => 'required|integer|not_in:0', 'a_id' => 'nullable|numeric', // 0 => without update new and master, 00 => new 'a_name' => 'nullable|string', 'a_type' => 'nullable|integer|min:0', 'a_price' => 'nullable|numeric|min:0', 'a_qty' => 'nullable|numeric|min:0', 'a_invc_price' => 'nullable|numeric|min:0', 'is_adm_price' => 'nullable|numeric', 'ddln_pay_at' => 'nullable|numeric', 'ddln_pay_type' => 'nullable|numeric', // flag 'submission_proof_base64' => 'nullable|array', 'slc_pay_purpose' => 'nullable|string', // fill,none 'bank_id' => 'nullable|numeric', 'bank_code' => 'nullable|numeric', 'bank_short' => 'nullable|string', 'bank_name' => 'nullable|string', 'bank_acc_number' => 'nullable|numeric', 'bank_acc_name' => 'nullable|string', 'is_paid' => 'nullable|numeric', // flag 'is_paid_proof_base64' => 'nullable|array', 'is_paid_at' => 'nullable|numeric', 'is_invc_to_client' => 'nullable|numeric', // flag 'is_calc_to_vdr' => 'nullable|numeric', // flag 'crt_type' => 'nullable|numeric', // flag ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } if ($req->slc_pay_purpose == 'fill' && !$req->bank_id) { $apiResp = Responses::bad_input('informasi penerima wajib diisi'); return new Response($apiResp, $apiResp['meta']['code']); } if ($req->is_paid == OrdersAItems::IS_PAID_YES) { if ($req->is_paid_proof_base64 && count($req->is_paid_proof_base64) < 1) { $apiResp = Responses::bad_input('bukti pembayaran wajib diisi'); return new Response($apiResp, $apiResp['meta']['code']); } } if ($req->submission_proof_base64 && count($req->submission_proof_base64) < 1) { $apiResp = Responses::bad_input('bukti pengajuan wajib diisi'); return new Response($apiResp, $apiResp['meta']['code']); } $orderAItem = OrdersAItems::getById($ord_a_item_id); if (count($orderAItem) < 1) { $apiResp = Responses::not_found('item not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } $order = Orders::showOrder([ 'id' => $req->ord_id, // 'get_prefer_type_truck' => 1, 'get_pic_zone' => 1, // 'get_stts_checker' => 1, // 'get_checker_data' => 1, // 'get_checker_user' => 1, // 'get_accidents' => 1, 'get_client_pt' => 1, ]); if (count($order) < 1) { $apiResp = Responses::not_found('order not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } // if ($req->a_id === "00") { // $filterUniqName = []; // if ($req->auth->role === Users::ROLE_ADMIN) { // $filterUniqName['crt_type'] = AItems::CRT_TYPE_ADMIN; // } else if ($req->auth->role === Users::ROLE_FINANCE) { // $filterUniqName['crt_type'] = AItems::CRT_TYPE_FINANCE; // } else { // $filterUniqName['crt_type'] = 99; // } // $uniqName = AItems::getByName($req->a_name, $filterUniqName); // if (count($uniqName) > 0) { // $apiResp = Responses::bad_request('nama additional item sudah terdata'); // return (new Response($apiResp, $apiResp['meta']['code'])); // } // } DB::beginTransaction(); $a_id = $req->a_id; if ($req->a_id == "0" || $req->a_id == "00") { $updtAItems = [ 'name' => $req->a_name, 'type' => $req->a_type, 'price' => $req->a_price, 'is_adm_price' => ($req->is_adm_price == OrdersAItems::IS_ADM_PRICE_YES) ? OrdersAItems::IS_ADM_PRICE_YES : OrdersAItems::IS_ADM_PRICE_NO, 'is_active' => AItems::IS_ACTIVE, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; } else { $updtAItems = [ 'name' => $req->a_name, 'type' => $req->a_type, 'price' => $req->a_price, 'is_adm_price' => ($req->is_adm_price == OrdersAItems::IS_ADM_PRICE_YES) ? OrdersAItems::IS_ADM_PRICE_YES : OrdersAItems::IS_ADM_PRICE_NO, 'is_active' => AItems::IS_ACTIVE, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; AItems::updt($a_id, $updtAItems); } $updtOrdersAItems = [ 'ord_id' => $orderAItem[0]->ord_id, 'ord_code' => $orderAItem[0]->ord_code, 'flow_type' => $req->flow_type, 'cash_type' => $req->cash_type, 'a_item_type' => OrdersAItems::A_TYPE_SECONDARY, 'desc' => $updtAItems['name'], 'unit_id' => $a_id, 'unit_type' => $updtAItems['type'], 'amt_base_flat' => $updtAItems['price'], 'unit_qty' => $req->a_qty, 'amt_result_flat' => $updtAItems['price'], 'amt_total_flat' => $updtAItems['price'] * $req->a_qty, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; $req->a_invc_price = $req->a_invc_price ?? 0; $updtOrdersAItems['amt_bill_base_flat'] = $req->a_invc_price; $updtOrdersAItems['amt_bill_result_flat'] = $req->a_invc_price; $updtOrdersAItems['amt_bill_total_flat'] = $req->a_invc_price * $req->a_qty; $updtOrdersAItems['calc_to_vdr'] = OrdersAItems::CALC_TO_VDR_NO; $updtOrdersAItems['v_termin_id'] = 0; $updtOrdersAItems['ref_v_termin_id'] = 0; if ($req->is_calc_to_vdr == OrdersAItems::CALC_TO_VDR_YES) { $updtOrdersAItems['calc_to_vdr'] = OrdersAItems::CALC_TO_VDR_YES; $updtOrdersAItems['v_termin_id'] = $orderAItem[0]->v_termin_id; $updtOrdersAItems['ref_v_termin_id'] = $orderAItem[0]->ref_v_termin_id; if ($orderAItem[0]->calc_to_vdr === OrdersAItems::CALC_TO_VDR_YES) { $buy_price = $order[0]->buy_price - $orderAItem[0]->amt_total_flat + $updtOrdersAItems['amt_total_flat']; Orders::updateOrder($order[0]->ord_id, [ 'buy_price' => $buy_price, ]); } else { $buy_price = $order[0]->buy_price + $updtOrdersAItems['amt_total_flat']; Orders::updateOrder($order[0]->ord_id, [ 'buy_price' => $buy_price, ]); } } else { if ($orderAItem[0]->calc_to_vdr === OrdersAItems::CALC_TO_VDR_YES) { $buy_price = $order[0]->buy_price - $orderAItem[0]->amt_total_flat; Orders::updateOrder($order[0]->ord_id, [ 'buy_price' => $buy_price, ]); } } $updtOrdersAItems['invc_to_client'] = OrdersAItems::INVC_TO_CLIENT_NO; $updtOrdersAItems['c_termin_id'] = 0; $updtOrdersAItems['ref_c_termin_id'] = 0; if ($req->is_invc_to_client == OrdersAItems::INVC_TO_CLIENT_YES) { $updtOrdersAItems['invc_to_client'] = OrdersAItems::INVC_TO_CLIENT_YES; // $updtOrdersAItems['c_termin_id'] = $orderAItem[0]->c_termin_id; // $updtOrdersAItems['ref_c_termin_id'] = $orderAItem[0]->ref_c_termin_id; if ($orderAItem[0]->c_termin_id === 0) { $termins = OrdersTermins::listWithFilter([ 'termin_for' => OrdersTermins::TERMIN_FOR_CLIENT, 'termin_is_paid' => OrdersTermins::IS_PAID_NO, 'ord_id' => $order[0]->ord_id, 'in_stts_merge' => [ OrdersAItems::STTS_MERGE_NO, OrdersAItems::STTS_MERGE_RESULT, ], ]); $updtOrdersAItems['c_termin_id'] = 0; $updtOrdersAItems['ref_c_termin_id'] = 0; if (count($termins) > 0) { $updtOrdersAItems['c_termin_id'] = $termins[0]->id; $updtOrdersAItems['ref_c_termin_id'] = $termins[0]->id; } } else { $updtOrdersAItems['c_termin_id'] = $orderAItem[0]->c_termin_id; $updtOrdersAItems['ref_c_termin_id'] = $orderAItem[0]->ref_c_termin_id; } if ($updtOrdersAItems['c_termin_id'] === 0) { DB::rollBack(); $apiResp = Responses::bad_request('tidak dapat melakukan tagihan ke client, karena semua penagihan sudah close'); return (new Response($apiResp, $apiResp['meta']['code'])); } if ($orderAItem[0]->invc_to_client === OrdersAItems::INVC_TO_CLIENT_YES) { $sell_price = $order[0]->price - $orderAItem[0]->amt_bill_total_flat + $updtOrdersAItems['amt_bill_total_flat']; Orders::updateOrder($order[0]->ord_id, [ 'price' => $sell_price, ]); } else { $sell_price = $order[0]->price + $updtOrdersAItems['amt_bill_total_flat']; Orders::updateOrder($order[0]->ord_id, [ 'price' => $sell_price, ]); } Finance::updtChangeInvc($updtOrdersAItems['c_termin_id']); } else { if ($orderAItem[0]->invc_to_client === OrdersAItems::INVC_TO_CLIENT_YES) { $sell_price = $order[0]->price - $orderAItem[0]->amt_bill_total_flat; Orders::updateOrder($order[0]->ord_id, [ 'price' => $sell_price, ]); Finance::updtChangeInvc($orderAItem[0]->c_termin_id); } } $updtOrdersAItems['only_client'] = OrdersAItems::ONLY_CLIENT_NO; if ($req->only_client == OrdersAItems::ONLY_CLIENT_YES) { $updtOrdersAItems['only_client'] = OrdersAItems::ONLY_CLIENT_YES; } if ($req->is_adm_price == OrdersAItems::IS_ADM_PRICE_YES) { $updtOrdersAItems['is_adm_price'] = OrdersAItems::IS_ADM_PRICE_YES; } else { $updtOrdersAItems['ddln_pay_at'] = $req->ddln_pay_at ?? 0; $updtOrdersAItems['ddln_pay_type'] = $req->ddln_pay_type ?? OrdersAItems::DDLN_PAY_TYPE_TIME; if ($req->slc_pay_purpose == 'fill' && $req->bank_id) { $updtOrdersAItems['bank_id'] = $req->bank_id; $updtOrdersAItems['bank_code'] = $req->bank_code; $updtOrdersAItems['bank_short_name'] = $req->bank_short; $updtOrdersAItems['bank_name'] = $req->bank_name; $updtOrdersAItems['bank_acc_name'] = $req->bank_acc_name; $updtOrdersAItems['bank_acc_number'] = $req->bank_acc_number; } } if ($req->is_paid == OrdersAItems::IS_PAID_YES) { $updtOrdersAItems['is_paid'] = OrdersAItems::IS_PAID_YES; $updtOrdersAItems['paid_at'] = $now; $updtOrdersAItems['paid_by'] = $req->auth->uid; } // if ($req->crt_type == OrdersAItems::CRT_TYPE_SYSTEM) { // $updtOrdersAItems['crt_type'] = OrdersAItems::CRT_TYPE_SYSTEM; // } else if ($req->crt_type == OrdersAItems::CRT_TYPE_FINANCE) { // $updtOrdersAItems['crt_type'] = OrdersAItems::CRT_TYPE_FINANCE; // } else { // $updtOrdersAItems['crt_type'] = OrdersAItems::CRT_TYPE_ADMIN; // } if ($req->is_adm_price == OrdersAItems::IS_ADM_PRICE_YES) {} else { if ($req->submission_proof_base64 && count($req->submission_proof_base64) > 0) { foreach ($req->submission_proof_base64 as $i => $img) { $clearBase64 = preg_replace('/^data:(image|application)\/(png|jpg|jpeg|pdf);base64,/', '', $img); $type = 'jpeg'; if (strpos($img, 'application/pdf') !== false) $type = 'pdf'; $url_submission_proof_base64[$i] = "orders/" . $orderAItem[0]->ord_id . "/a_items/" . $ord_a_item_id . "/submission/" . $req->auth->uid . "/submission_proof_img_$now" . "_" . "$i.$type"; if (!Storage::disk('public')->put($url_submission_proof_base64[$i], base64_decode($clearBase64))) { DB::rollBack(); $apiResp = Responses::bad_request('gagal upload bukti pengajuan'); return (new Response($apiResp, $apiResp['meta']['code'])); } } } } if ($req->is_paid == OrdersAItems::IS_PAID_YES) { if ($req->is_paid_proof_base64 && count($req->is_paid_proof_base64) > 0) { foreach ($req->is_paid_proof_base64 as $i => $img) { $clearBase64 = preg_replace('/^data:(image|application)\/(png|jpg|jpeg|pdf);base64,/', '', $img); $type = 'jpeg'; if (strpos($img, 'application/pdf') !== false) $type = 'pdf'; $url_is_paid_proof_base64[$i] = "orders/" . $orderAItem[0]->ord_id . "/a_items/" . $ord_a_item_id . "/payments/" . $req->auth->uid . "/payments_proof_img_$now" . "_" . "$i.$type"; if (!Storage::disk('public')->put($url_is_paid_proof_base64[$i], base64_decode($clearBase64))) { DB::rollBack(); $apiResp = Responses::bad_request('gagal upload bukti pembayaran'); return (new Response($apiResp, $apiResp['meta']['code'])); } } } } if (count($url_submission_proof_base64) > 0) { $updtOrdersAItems['img_proof_submission'] = json_encode($url_submission_proof_base64); } if (count($url_is_paid_proof_base64) > 0) { $updtOrdersAItems['img_proof_payment'] = json_encode($url_is_paid_proof_base64); } OrdersAItems::updt($ord_a_item_id, $updtOrdersAItems); $apiResp = Responses::success('success update item'); DB::commit(); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { DB::rollBack(); if (count($url_submission_proof_base64) > 0) { foreach ($url_submission_proof_base64 as $path) { Storage::disk('public')->delete($path); } } if (count($url_is_paid_proof_base64) > 0) { foreach ($url_is_paid_proof_base64 as $path) { Storage::disk('public')->delete($path); } } $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_del_a_items(Request $req, $ord_a_item_id) { /** * $req->is_del => * 1. delete submission item from admin * 2. delete item from detail pembayaran menu finance * 3. delete item from detail penagihan menu finance */ try { $now = time(); $input = [ 'ord_a_item_id' => $req->ord_a_item_id, 'is_del' => $req->is_del, ]; $rulesInput = [ 'ord_a_item_id' => 'required|integer|not_in:0', 'is_del' => 'required|integer|not_in:0', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } $orderAItem = OrdersAItems::getById($ord_a_item_id); if (count($orderAItem) < 1) { $apiResp = Responses::not_found('item not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } $order = Orders::showOrder([ 'id' => $orderAItem[0]->ord_id, // 'get_prefer_type_truck' => 1, 'get_pic_zone' => 1, // 'get_stts_checker' => 1, // 'get_checker_data' => 1, // 'get_checker_user' => 1, // 'get_accidents' => 1, 'get_client_pt' => 1, ]); if (count($order) < 1) { $apiResp = Responses::not_found('order not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } if ($req->is_del == 1 || $req->is_del == 2) { if ($orderAItem[0]->is_paid == OrdersAItems::IS_PAID_YES) { $apiResp = Responses::bad_request('tidak bisa dihapus status pembayaran sudah lunas'); return (new Response($apiResp, $apiResp['meta']['code'])); } } // if $req->is_del == 3 if ($orderAItem[0]->is_bill_paid == OrdersAItems::IS_PAID_YES) { $apiResp = Responses::bad_request('tidak bisa dihapus status penagihan sudah lunas'); return (new Response($apiResp, $apiResp['meta']['code'])); } DB::beginTransaction(); if ($req->is_del == 1 || $req->is_del == 2) { $updtOrdersAItems = [ 'dlt' => $now, 'dlt_by' => $req->auth->uid, ]; if ($orderAItem[0]->invc_to_client === OrdersAItems::INVC_TO_CLIENT_YES) { $sell_price = $order[0]->price - $orderAItem[0]->amt_bill_total_flat; Orders::updateOrder($order[0]->ord_id, [ 'price' => $sell_price, ]); Finance::updtChangeInvc($orderAItem[0]->c_termin_id); } if ($orderAItem[0]->calc_to_vdr === OrdersAItems::CALC_TO_VDR_YES) { $buy_price = $order[0]->buy_price - $orderAItem[0]->amt_total_flat; Orders::updateOrder($order[0]->ord_id, [ 'buy_price' => $buy_price, ]); } OrdersAItems::updt($ord_a_item_id, $updtOrdersAItems); } else if ($req->is_del == 3) { if ($orderAItem[0]->calc_to_vdr === OrdersAItems::CALC_TO_VDR_YES) { $updtOrdersAItems = [ 'invc_to_client' => OrdersAItems::INVC_TO_CLIENT_NO, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; $updtOrdersAItems['c_termin_id'] = 0; $updtOrdersAItems['ref_c_termin_id'] = 0; } else { $updtOrdersAItems = [ 'dlt' => $now, 'dlt_by' => $req->auth->uid, ]; $buy_price = $order[0]->buy_price - $orderAItem[0]->amt_total_flat; Orders::updateOrder($order[0]->ord_id, [ 'buy_price' => $buy_price, ]); } $sell_price = $order[0]->price - $orderAItem[0]->amt_bill_total_flat; Orders::updateOrder($order[0]->ord_id, [ 'price' => $sell_price, ]); OrdersAItems::updt($ord_a_item_id, $updtOrdersAItems); Finance::updtChangeInvc($orderAItem[0]->c_termin_id); } $apiResp = Responses::success('success delete item'); DB::commit(); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { DB::rollBack(); $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_reject_a_items(Request $req, $ord_a_item_id) { try { $now = time(); $input = [ 'ord_a_item_id' => $ord_a_item_id, ]; $rulesInput = [ 'ord_a_item_id' => 'required|integer|not_in:0', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } $orderAItem = OrdersAItems::getById($ord_a_item_id); if (count($orderAItem) < 1) { $apiResp = Responses::not_found('item not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } $order = Orders::showOrder([ 'id' => $orderAItem[0]->ord_id, // 'get_prefer_type_truck' => 1, 'get_pic_zone' => 1, // 'get_stts_checker' => 1, // 'get_checker_data' => 1, // 'get_checker_user' => 1, // 'get_accidents' => 1, 'get_client_pt' => 1, ]); if (count($order) < 1) { $apiResp = Responses::not_found('order not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } if ($orderAItem[0]->is_paid == OrdersAItems::IS_PAID_YES) { $apiResp = Responses::bad_request('tidak bisa ditolak status pembayaran sudah lunas'); return (new Response($apiResp, $apiResp['meta']['code'])); } if ($orderAItem[0]->is_bill_paid == OrdersAItems::IS_PAID_YES) { $apiResp = Responses::bad_request('tidak bisa ditolak status penagihan sudah lunas'); return (new Response($apiResp, $apiResp['meta']['code'])); } DB::beginTransaction(); $updtOrdersAItems = []; if ($orderAItem[0]->invc_to_client === OrdersAItems::INVC_TO_CLIENT_YES) { $updtOrdersAItems['is_bill_aprv'] = OrdersAItems::IS_APRV_NO; $updtOrdersAItems['rjct_bill_at'] = $now; $updtOrdersAItems['rjct_bill_by'] = $req->auth->uid; $sell_price = $order[0]->price - $orderAItem[0]->amt_bill_total_flat; Orders::updateOrder($order[0]->ord_id, [ 'price' => $sell_price, ]); Finance::updtChangeInvc($orderAItem[0]->c_termin_id); } else { $updtOrdersAItems['c_termin_id'] = 0; $updtOrdersAItems['ref_c_termin_id'] = 0; } if ($orderAItem[0]->calc_to_vdr === OrdersAItems::CALC_TO_VDR_YES) { $updtOrdersAItems['is_aprv'] = OrdersAItems::IS_APRV_NO; $updtOrdersAItems['rjct_at'] = $now; $updtOrdersAItems['rjct_by'] = $req->auth->uid; $buy_price = $order[0]->buy_price - $orderAItem[0]->amt_total_flat; Orders::updateOrder($order[0]->ord_id, [ 'buy_price' => $buy_price, ]); } else { $updtOrdersAItems['v_termin_id'] = 0; $updtOrdersAItems['ref_v_termin_id'] = 0; } OrdersAItems::updt($ord_a_item_id, $updtOrdersAItems); $apiResp = Responses::success('success reject item'); DB::commit(); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { DB::rollBack(); $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } /** * how merger work * pembayaran yang bisa di merge: status lunas/tidak, belum pernah di merge, item additional(not main item) * pembayaran yang tidak bisa di merge: diarsipkan, bekas merge dan selain dari syarat ditas * jangan lupa dikurangin harganya dengan t_orders.buy_price / t_orders.price dan diupdate * buat row t_orders_a_items baru dengan data yang sama, dengan kriteria berikut: * - kecuali t_orders_a_items[ord_code/id,c_termin/v_termin] adalah baru, kolom ref order mereferensi ke item sebelumnya, namun ref termin adalah data baru * - crt_type dibuat dari finance, begitupun dengan usernya * - is_merge jadi 1, merge_to_a_items_id(item baru dari hasil merge) * jika status pembayaran lunas maka tidak bisa dirubah * setiap ada perubahan di merger yang baru, di arsip pembayaran(order lama,sebelum merger) tidak terubah/terkalulasi jika status pembayaran lunas */ public function api_finance_merger_a_items(Request $req, $ord_a_item_id) { try { $now = time(); $input = [ 'ord_a_item_id' => $ord_a_item_id, 'mrg_to_ord_code' => $req->mrg_to_ord_code, 'mrg_to_ord_id' => $req->mrg_to_ord_id, ]; $rulesInput = [ 'ord_a_item_id' => 'required|integer|not_in:0', 'mrg_to_ord_code' => 'required|string|min:5', 'mrg_to_ord_id' => 'nullable|integer|not_in:0', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } $mergeFromAItem = OrdersAItems::getById($ord_a_item_id); if (count($mergeFromAItem) < 1) { $apiResp = Responses::not_found('item not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } $mergeFromOrder = Orders::showOrder([ 'id' => $mergeFromAItem[0]->ord_id, // 'get_prefer_type_truck' => 1, // 'get_pic_zone' => 1, // 'get_stts_checker' => 1, // 'get_checker_data' => 1, // 'get_checker_user' => 1, // 'get_accidents' => 1, // 'get_client_pt' => 1, ]); if (count($mergeFromOrder) < 1) { $apiResp = Responses::not_found('order not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } $mergeToOrder = Orders::showOrder([ 'code' => $req->mrg_to_ord_code, // 'get_prefer_type_truck' => 1, // 'get_pic_zone' => 1, // 'get_stts_checker' => 1, // 'get_checker_data' => 1, // 'get_checker_user' => 1, // 'get_accidents' => 1, // 'get_client_pt' => 1, ]); if (count($mergeToOrder) < 1) { $apiResp = Responses::not_found('order not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } DB::beginTransaction(); $updtMergeFromAItems = [ 'is_merge_to' => OrdersAItems::IS_MERGE_YES, // 'merge_to_a_id' => 0, 'merge_to_ord_id' => $mergeToOrder[0]->ord_id, 'merge_to_ord_code' => $mergeToOrder[0]->ord_code, 'merge_to_at' => $now, 'merge_to_by' => $req->auth->uid, ]; $insMergeToAItem = [ 'ord_id' => $mergeToOrder[0]->ord_id, 'ord_code' => $mergeToOrder[0]->ord_code, 'flow_type' => $mergeFromAItem[0]->flow_type, 'cash_type' => $mergeFromAItem[0]->cash_type, // 'v_termin_id' => $mergeFromAItem[0]->v_termin_id, // 'c_termin_id' => $mergeFromAItem[0]->c_termin_id, 'a_item_type' => $mergeFromAItem[0]->a_item_type, 'desc' => $mergeFromAItem[0]->desc, 'unit_id' => $mergeFromAItem[0]->unit_id, 'unit_type' => $mergeFromAItem[0]->unit_type, 'unit_qty' => $mergeFromAItem[0]->unit_qty, 'amt_base_flat' => $mergeFromAItem[0]->amt_base_flat, 'amt_disc_type' => $mergeFromAItem[0]->amt_disc_type, 'amt_disc_percent' => $mergeFromAItem[0]->amt_disc_percent, 'amt_disc_flat' => $mergeFromAItem[0]->amt_disc_flat, 'amt_result_flat' => $mergeFromAItem[0]->amt_result_flat, 'amt_total_flat' => $mergeFromAItem[0]->amt_total_flat, 'ddln_pay_at' => $mergeFromAItem[0]->ddln_pay_at, 'ddln_pay_type' => $mergeFromAItem[0]->ddln_pay_type, 'img_proof_submission' => $mergeFromAItem[0]->img_proof_submission, 'img_proof_payment' => $mergeFromAItem[0]->img_proof_payment, 'bank_id' => $mergeFromAItem[0]->bank_id, 'bank_code' => $mergeFromAItem[0]->bank_code, 'bank_name' => $mergeFromAItem[0]->bank_name, 'bank_short_name' => $mergeFromAItem[0]->bank_short_name, 'bank_acc_number' => $mergeFromAItem[0]->bank_acc_number, 'bank_acc_name' => $mergeFromAItem[0]->bank_acc_name, 'amt_bill_base_flat' => $mergeFromAItem[0]->amt_bill_base_flat, 'amt_bill_disc_type' => $mergeFromAItem[0]->amt_bill_disc_type, 'amt_bill_disc_percent' => $mergeFromAItem[0]->amt_bill_disc_percent, 'amt_bill_disc_flat' => $mergeFromAItem[0]->amt_bill_disc_flat, 'amt_bill_result_flat' => $mergeFromAItem[0]->amt_bill_result_flat, 'amt_bill_total_flat' => $mergeFromAItem[0]->amt_bill_total_flat, 'invc_to_client' => $mergeFromAItem[0]->invc_to_client, 'calc_to_vdr' => $mergeFromAItem[0]->calc_to_vdr, 'is_adm_price' => $mergeFromAItem[0]->is_adm_price, 'is_paid' => $mergeFromAItem[0]->is_paid, 'paid_at' => $mergeFromAItem[0]->paid_at, 'paid_by' => $mergeFromAItem[0]->paid_by, 'paid_method' => $mergeFromAItem[0]->paid_method, 'paid_ref_no' => $mergeFromAItem[0]->paid_ref_no, 'is_bill_paid' => $mergeFromAItem[0]->is_bill_paid, 'paid_bill_at' => $mergeFromAItem[0]->paid_bill_at, 'paid_bill_by' => $mergeFromAItem[0]->paid_bill_by, 'paid_bill_method' => $mergeFromAItem[0]->paid_bill_method, 'only_client' => $mergeFromAItem[0]->only_client, 'only_vdr' => $mergeFromAItem[0]->only_vdr, 'is_hidden' => $mergeFromAItem[0]->is_hidden, 'is_tax' => $mergeFromAItem[0]->is_tax, 'is_disc' => $mergeFromAItem[0]->is_disc, 'is_aprv' => $mergeFromAItem[0]->is_aprv, 'rjct_at' => $mergeFromAItem[0]->rjct_at, 'rjct_by' => $mergeFromAItem[0]->rjct_by, 'is_bill_aprv' => $mergeFromAItem[0]->is_bill_aprv, 'rjct_bill_at' => $mergeFromAItem[0]->rjct_bill_at, 'rjct_bill_by' => $mergeFromAItem[0]->rjct_bill_by, 'is_merge_from' => OrdersAItems::IS_MERGE_YES, 'merge_from_a_id' => $mergeFromAItem[0]->id, 'merge_from_ord_id' => $mergeFromAItem[0]->ord_id, 'merge_from_ord_code' => $mergeFromAItem[0]->ord_code, 'merge_from_at' => $now, 'merge_from_by' => $req->auth->uid, 'ref_ord_id' => $mergeFromAItem[0]->ord_id, 'ref_ord_code' => $mergeFromAItem[0]->ord_code, // 'ref_v_termin_id' => $mergeFromAItem[0]->v_termin_id, // 'ref_c_termin_id' => $mergeFromAItem[0]->c_termin_id, 'ref_ord_a_item_id' => $mergeFromAItem[0]->id, 'crt' => $now, 'crt_by' => $req->auth->uid, 'crt_type' => OrdersAItems::CRT_TYPE_FINANCE, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; if ($insMergeToAItem['invc_to_client'] === OrdersAItems::INVC_TO_CLIENT_YES) { $termins = OrdersTermins::listWithFilter([ 'termin_for' => OrdersTermins::TERMIN_FOR_CLIENT, 'termin_is_paid' => OrdersTermins::IS_PAID_NO, 'ord_id' => $mergeToOrder[0]->ord_id, 'in_stts_merge' => [ OrdersAItems::STTS_MERGE_NO, OrdersAItems::STTS_MERGE_RESULT, ], ]); $insMergeToAItem['c_termin_id'] = 0; $insMergeToAItem['ref_c_termin_id'] = 0; if (count($termins) > 0) { $insMergeToAItem['c_termin_id'] = $termins[0]->id; $insMergeToAItem['ref_c_termin_id'] = $termins[0]->id; } if ($insMergeToAItem['c_termin_id'] === 0) { DB::rollBack(); $apiResp = Responses::bad_request('tidak dapat melakukan merge ke transaksi yang dituju, karena semua penagihan ke client sudah close'); return (new Response($apiResp, $apiResp['meta']['code'])); } $sell_price = $mergeToOrder[0]->price + $insMergeToAItem['amt_bill_total_flat']; Orders::updateOrder($mergeToOrder[0]->ord_id, [ 'price' => $sell_price, ]); Finance::updtChangeInvc($insMergeToAItem['c_termin_id']); } else { $insMergeToAItem['c_termin_id'] = 0; $insMergeToAItem['ref_c_termin_id'] = 0; } if ($insMergeToAItem['calc_to_vdr'] === OrdersAItems::CALC_TO_VDR_YES) { $termins = OrdersTermins::listWithFilter([ 'ord_id' => $mergeToOrder[0]->ord_id, 'termin_for' => OrdersTermins::TERMIN_FOR_VENDOR, 'termin_is_paid' => OrdersTermins::IS_PAID_NO, 'in_stts_merge' => [ OrdersAItems::STTS_MERGE_NO, OrdersAItems::STTS_MERGE_RESULT, ], ]); $insMergeToAItem['v_termin_id'] = 0; $insMergeToAItem['ref_v_termin_id'] = 0; if (count($termins) > 0) { $insMergeToAItem['v_termin_id'] = $termins[0]->id; $insMergeToAItem['ref_v_termin_id'] = $termins[0]->id; } if ($insMergeToAItem['v_termin_id'] === 0) { $termins = OrdersTermins::listWithFilter([ 'ord_id' => $mergeToOrder[0]->ord_id, 'termin_for' => OrdersTermins::TERMIN_FOR_VENDOR, 'in_stts_merge' => [ OrdersAItems::STTS_MERGE_NO, OrdersAItems::STTS_MERGE_RESULT, ], ]); $insMergeToAItem['v_termin_id'] = $termins[count($termins) - 1]->id; $insMergeToAItem['ref_v_termin_id'] = $termins[count($termins) - 1]->id; } $buy_price = $mergeToOrder[0]->buy_price + $insMergeToAItem['amt_total_flat']; Orders::updateOrder($mergeToOrder[0]->ord_id, [ 'buy_price' => $buy_price, ]); } else { $insMergeToAItem['v_termin_id'] = 0; $insMergeToAItem['ref_v_termin_id'] = 0; } $aid = OrdersAItems::add($insMergeToAItem); $insMergeToAItem['id'] = $aid; $updtMergeFromAItems['merge_to_a_id'] = $aid; OrdersAItems::updt($ord_a_item_id, $updtMergeFromAItems); $apiResp = Responses::success('success merge item'); DB::commit(); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { DB::rollBack(); $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } /** * merge ada 2 termin dari 1 trx ? jadi 1 termin * merge ada 4 termin dari 2 trx ? masing2 jadi 1 termin * merge kalau sudah ada adt items ? hanya termin yang di recreate, adt items tidak direcreate * merge kalau ada yang sudah lunas baik main item / adt item ? gabisa * saat recreate termin sisanya ngikut termin sebelumnya, saat ini belum ada diskon */ public function api_finance_merger_trx(Request $req) { try { $now = time(); $input = [ 'mrg_from_ord_code' => $req->mrg_from_ord_code, 'mrg_from_ord_id' => $req->mrg_from_ord_id, 'mrg_to_ord_code' => $req->mrg_to_ord_code, 'mrg_to_ord_id' => $req->mrg_to_ord_id, 'new_buy_price' => $req->new_buy_price, 'note' => $req->note, ]; $rulesInput = [ 'mrg_from_ord_code' => 'required|string|min:5', 'mrg_from_ord_id' => 'nullable|integer|not_in:0', 'mrg_to_ord_code' => 'required|string|min:5', 'mrg_to_ord_id' => 'nullable|integer|not_in:0', 'new_buy_price' => 'required|numeric|not_in:0', 'note' => 'nullable|string', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } if ($req->mrg_from_ord_code == $req->mrg_to_ord_code) { $apiResp = Responses::bad_input('tidak dapat merger pada transaksi yang sama'); return (new Response($apiResp, $apiResp['meta']['code'])); } $mrgFromOrd = Orders::showOrder([ 'code' => $req->mrg_from_ord_code, 'get_zone_zonasi' => 1, 'get_vdr_bank' => 1, // 'get_prefer_type_truck' => 1, // 'get_pic_zone' => 1, // 'get_client_pt' => 1, ]); if (count($mrgFromOrd) < 1) { $apiResp = Responses::not_found('order code not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } $mrgToOrd = Orders::showOrder([ 'code' => $req->mrg_to_ord_code, 'get_zone_zonasi' => 1, 'get_vdr_bank' => 1, // 'get_prefer_type_truck' => 1, // 'get_pic_zone' => 1, // 'get_client_pt' => 1, ]); if (count($mrgToOrd) < 1) { $apiResp = Responses::not_found('order code not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } if ($mrgFromOrd[0]->vdr_id !== $mrgToOrd[0]->vdr_id) { $apiResp = Responses::bad_request('merge hanya berlaku untuk vendor yang sama dikedua transaksi'); return (new Response($apiResp, $apiResp['meta']['code'])); } if ($mrgFromOrd[0]->vhc_id !== $mrgToOrd[0]->vhc_id) { $apiResp = Responses::bad_request('merge hanya berlaku untuk kendaraan yang sama dikedua transaksi'); return (new Response($apiResp, $apiResp['meta']['code'])); } if ($mrgFromOrd[0]->drv_id !== $mrgToOrd[0]->drv_id) { $apiResp = Responses::bad_request('merge hanya berlaku untuk pengemudi yang sama dikedua transaksi'); return (new Response($apiResp, $apiResp['meta']['code'])); } // if ($req->new_buy_price > $mrgFromOrd[0]->price) { // $apiResp = Responses::bad_request('biaya melebihi harga jual pada transaksi ' . $mrgFromOrd[0]->ord_code); // return (new Response($apiResp, $apiResp['meta']['code'])); // } // if ($req->new_buy_price > $mrgToOrd[0]->price) { // $apiResp = Responses::bad_request('biaya melebihi harga jual pada transaksi ' . $mrgToOrd[0]->ord_code); // return (new Response($apiResp, $apiResp['meta']['code'])); // } $updtBuyPriceFrom = 0; $updtBuyPriceTo = 0; // pengurangan update buy price dari termin $allTerminsVdrFrom = OrdersTermins::listWithFilter([ 'ord_id' => $mrgFromOrd[0]->ord_id, 'termin_for' => OrdersTermins::TERMIN_FOR_VENDOR, 'in_stts_merge' => [ OrdersAItems::STTS_MERGE_NO, OrdersAItems::STTS_MERGE_RESULT, ], ]); $tvids1 = []; $totTerminV1 = 0; foreach ($allTerminsVdrFrom as $terminVdr1) { $updtBuyPriceFrom -= $terminVdr1->termin_result_flat; if ($terminVdr1->termin_is_paid === OrdersTermins::IS_PAID_YES) { $apiResp = Responses::bad_request('tidak dapat merger, ada item yang sudah terbayar pada transaksi ' . $mrgFromOrd[0]->ord_code); return (new Response($apiResp, $apiResp['meta']['code'])); } $tvids1[] = $terminVdr1->id; $totTerminV1 += $terminVdr1->termin_result_flat; } $allTerminsVdrTo = OrdersTermins::listWithFilter([ 'ord_id' => $mrgToOrd[0]->ord_id, 'termin_for' => OrdersTermins::TERMIN_FOR_VENDOR, 'in_stts_merge' => [ OrdersAItems::STTS_MERGE_NO, OrdersAItems::STTS_MERGE_RESULT, ], ]); $tvids2 = []; $totTerminV2 = 0; foreach ($allTerminsVdrTo as $terminVdr2) { $updtBuyPriceTo -= $terminVdr2->termin_result_flat; if ($terminVdr2->termin_is_paid === OrdersTermins::IS_PAID_YES) { $apiResp = Responses::bad_request('tidak dapat merger, ada item yang sudah terbayar pada order code ' . $mrgToOrd[0]->ord_code); return (new Response($apiResp, $apiResp['meta']['code'])); } $tvids2[] = $terminVdr2->id; $totTerminV2 += $terminVdr2->termin_result_flat; } $pembagi = $totTerminV1 + $totTerminV2; $newTerminBuyPriceFrom = round($totTerminV1 / $pembagi * $req->new_buy_price); $newTerminBuyPriceTo = round($totTerminV2 / $pembagi * $req->new_buy_price); // round(2000/6000*5000); // 1666.6666666666665 -> round -> 1667.0 // penambahan update buy price dari buy_price sebelumnya(termasuk adt items) dan new termin, jadi tidak perlu kalkulasi ulang a_items $updtBuyPriceFrom += $mrgFromOrd[0]->buy_price + $newTerminBuyPriceFrom; $updtBuyPriceTo += $mrgToOrd[0]->buy_price + $newTerminBuyPriceTo; // get orders_a_items main_item with that termin $mainItems1 = OrdersAItems::showAItemByVids($tvids1, ['a_item_type' => OrdersAItems::A_TYPE_PRIMARY]); $mainItems2 = OrdersAItems::showAItemByVids($tvids2, ['a_item_type' => OrdersAItems::A_TYPE_PRIMARY]); $nanoid = new Nanoid(); $merge_code = $nanoid->formattedId('0123456789', 9); // $merge_code = $now; $doWhile = true; do { if (substr($merge_code, 0, 1) == 0) { $merge_code = $nanoid->formattedId('0123456789', 9); } else { $doWhile = false; } } while ($doWhile); DB::beginTransaction(); // new termin1 utk transaksi 1 $v1_termin1_percent = 100; $v1_termin1_calc_percent = $v1_termin1_percent / 100 * $newTerminBuyPriceFrom; $insTermin1From = [ 'ord_id' => $mrgFromOrd[0]->ord_id, 'ord_code' => $mrgFromOrd[0]->ord_code, 'flow_type' => OrdersTermins::FLOW_TYPE_PAYMENT, 'cash_type' => OrdersTermins::TYPE_CASH_OUT, 'sequence' => count($allTerminsVdrFrom) + 1, 'termin_base_flat' => $newTerminBuyPriceFrom, 'termin_amt_type' => OrdersTermins::AMT_TYPE_PERCENT, 'termin_amt' => $v1_termin1_percent, 'termin_calc_percent' => $v1_termin1_calc_percent, 'termin_result_flat' => $v1_termin1_calc_percent, 'termin_ddln_type' => $allTerminsVdrFrom[0]->termin_ddln_type, 'termin_ddln_at' => $allTerminsVdrFrom[0]->termin_ddln_at, 'termin_for' => OrdersTermins::TERMIN_FOR_VENDOR, 'is_active' => OrdersTermins::IS_ACTIVE_YES, 'stts_merge' => OrdersTermins::STTS_MERGE_RESULT, 'group_merge_code' => $merge_code, 'merge_at' => $now, 'crt' => $now, 'crt_by' => $req->auth->uid, 'crt_type' => OrdersTermins::CRT_TYPE_ADMIN, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; $v1_termin1_id = OrdersTermins::add($insTermin1From); $unit_qty = 1; $ddln_pay_type = ($insTermin1From['termin_ddln_at'] === OrdersTermins::DDLN_TERMIN_TYPE_TIME) ? OrdersAItems::DDLN_PAY_TYPE_TIME : OrdersAItems::DDLN_PAY_TYPE_ORD_FINISH; OrdersAItems::add([ 'ord_id' => $mrgFromOrd[0]->ord_id, 'ord_code' => $mrgFromOrd[0]->ord_code, 'flow_type' => OrdersAItems::FLOW_TYPE_PAYMENT, 'cash_type' => OrdersAItems::TYPE_CASH_OUT, 'v_termin_id' => $v1_termin1_id, 'a_item_type' => OrdersAItems::A_TYPE_PRIMARY, 'desc' => "Pengantaran Logistik
" . ucwords(strtolower($mrgFromOrd[0]->pck_prid_name)) . " - " . ucwords(strtolower($mrgFromOrd[0]->drop_prid_name)) . "
" . date('d F Y', $mrgFromOrd[0]->set_pck_at) . " WIB
Pembayaran termin 1", 'unit_id' => 0, 'unit_type' => UnitTypes::UNIT_TYPE_PAKET, 'unit_qty' => $unit_qty, 'amt_base_flat' => $insTermin1From['termin_result_flat'], 'amt_result_flat' => $insTermin1From['termin_result_flat'], 'amt_total_flat' => $insTermin1From['termin_result_flat'] * $unit_qty, 'ddln_pay_at' => $insTermin1From['termin_ddln_at'], 'ddln_pay_type' => $ddln_pay_type, 'img_proof_submission' => null, 'img_proof_payment' => null, 'bank_id' => $mrgFromOrd[0]->vdr_bank_id, 'bank_code' => $mrgFromOrd[0]->vdr_bank_code, 'bank_name' => $mrgFromOrd[0]->vdr_bank_name, 'bank_short_name' => $mrgFromOrd[0]->vdr_bank_short_name, 'bank_acc_number' => $mrgFromOrd[0]->vdr_bank_acc_number, 'bank_acc_name' => $mrgFromOrd[0]->vdr_bank_acc_name, 'invc_to_client' => OrdersAItems::INVC_TO_CLIENT_NO, 'calc_to_vdr' => OrdersAItems::CALC_TO_VDR_YES, 'only_vdr' => OrdersAItems::ONLY_VDR_YES, 'is_active' => OrdersAItems::IS_ACTIVE_YES, 'stts_merge' => OrdersAItems::STTS_MERGE_RESULT, 'group_merge_code' => $merge_code, 'merge_at' => $now, 'ref_ord_id' => $mrgFromOrd[0]->ord_id, 'ref_ord_code' => $mrgFromOrd[0]->ord_code, 'ref_v_termin_id' => $v1_termin1_id, 'crt' => $now, 'crt_by' => $req->auth->uid, 'updt' => $now, 'updt_by' => $req->auth->uid, ]); // new termin1 utk transaksi 2 $v2_termin1_percent = 100; $v2_termin1_calc_percent = $v2_termin1_percent / 100 * $newTerminBuyPriceTo; $insTermin1To = [ 'ord_id' => $mrgToOrd[0]->ord_id, 'ord_code' => $mrgToOrd[0]->ord_code, 'flow_type' => OrdersTermins::FLOW_TYPE_PAYMENT, 'cash_type' => OrdersTermins::TYPE_CASH_OUT, 'sequence' => count($allTerminsVdrTo) + 1, 'termin_base_flat' => $newTerminBuyPriceTo, 'termin_amt_type' => OrdersTermins::AMT_TYPE_PERCENT, 'termin_amt' => $v2_termin1_percent, 'termin_calc_percent' => $v2_termin1_calc_percent, 'termin_result_flat' => $v2_termin1_calc_percent, 'termin_ddln_type' => $allTerminsVdrTo[0]->termin_ddln_type, 'termin_ddln_at' => $allTerminsVdrTo[0]->termin_ddln_at, 'termin_for' => OrdersTermins::TERMIN_FOR_VENDOR, 'is_active' => OrdersTermins::IS_ACTIVE_YES, 'stts_merge' => OrdersTermins::STTS_MERGE_RESULT, 'group_merge_code' => $merge_code, 'merge_at' => $now, 'crt' => $now, 'crt_by' => $req->auth->uid, 'crt_type' => OrdersTermins::CRT_TYPE_ADMIN, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; $v2_termin1_id = OrdersTermins::add($insTermin1To); $unit_qty = 1; $ddln_pay_type = ($insTermin1To['termin_ddln_at'] === OrdersTermins::DDLN_TERMIN_TYPE_TIME) ? OrdersAItems::DDLN_PAY_TYPE_TIME : OrdersAItems::DDLN_PAY_TYPE_ORD_FINISH; OrdersAItems::add([ 'ord_id' => $mrgToOrd[0]->ord_id, 'ord_code' => $mrgToOrd[0]->ord_code, 'flow_type' => OrdersAItems::FLOW_TYPE_PAYMENT, 'cash_type' => OrdersAItems::TYPE_CASH_OUT, 'v_termin_id' => $v2_termin1_id, 'a_item_type' => OrdersAItems::A_TYPE_PRIMARY, 'desc' => "Pengantaran Logistik
" . ucwords(strtolower($mrgToOrd[0]->pck_prid_name)) . " - " . ucwords(strtolower($mrgToOrd[0]->drop_prid_name)) . "
" . date('d F Y', $mrgToOrd[0]->set_pck_at) . " WIB
Pembayaran termin 1", 'unit_id' => 0, 'unit_type' => UnitTypes::UNIT_TYPE_PAKET, 'unit_qty' => $unit_qty, 'amt_base_flat' => $insTermin1To['termin_result_flat'], 'amt_result_flat' => $insTermin1To['termin_result_flat'], 'amt_total_flat' => $insTermin1To['termin_result_flat'] * $unit_qty, 'ddln_pay_at' => $insTermin1To['termin_ddln_at'], 'ddln_pay_type' => $ddln_pay_type, 'img_proof_submission' => null, 'img_proof_payment' => null, 'bank_id' => $mrgToOrd[0]->vdr_bank_id, 'bank_code' => $mrgToOrd[0]->vdr_bank_code, 'bank_name' => $mrgToOrd[0]->vdr_bank_name, 'bank_short_name' => $mrgToOrd[0]->vdr_bank_short_name, 'bank_acc_number' => $mrgToOrd[0]->vdr_bank_acc_number, 'bank_acc_name' => $mrgToOrd[0]->vdr_bank_acc_name, 'invc_to_client' => OrdersAItems::INVC_TO_CLIENT_NO, 'calc_to_vdr' => OrdersAItems::CALC_TO_VDR_YES, 'only_vdr' => OrdersAItems::ONLY_VDR_YES, 'is_active' => OrdersAItems::IS_ACTIVE_YES, 'stts_merge' => OrdersAItems::STTS_MERGE_RESULT, 'group_merge_code' => $merge_code, 'merge_at' => $now, 'ref_ord_id' => $mrgToOrd[0]->ord_id, 'ref_ord_code' => $mrgToOrd[0]->ord_code, 'ref_v_termin_id' => $v2_termin1_id, 'crt' => $now, 'crt_by' => $req->auth->uid, 'updt' => $now, 'updt_by' => $req->auth->uid, ]); foreach ($allTerminsVdrFrom as $terminVdr1) { if ($terminVdr1->termin_is_paid !== OrdersTermins::IS_PAID_YES) { OrdersTermins::updt($terminVdr1->id, [ 'is_active' => OrdersTermins::IS_ACTIVE_NO, 'stts_merge' => OrdersTermins::STTS_MERGE_TO, 'merge_to_code' => $merge_code, 'merge_at' => $now, ]); } } foreach ($allTerminsVdrTo as $terminVdr2) { if ($terminVdr2->termin_is_paid !== OrdersTermins::IS_PAID_YES) { OrdersTermins::updt($terminVdr2->id, [ 'is_active' => OrdersTermins::IS_ACTIVE_NO, 'stts_merge' => OrdersTermins::STTS_MERGE_TO, 'merge_to_code' => $merge_code, 'merge_at' => $now, ]); } } foreach ($mainItems1 as $main1) { OrdersAItems::updt($main1->ord_a_item_id, [ 'is_active' => OrdersTermins::IS_ACTIVE_NO, 'stts_merge' => OrdersTermins::STTS_MERGE_TO, 'merge_to_code' => $merge_code, 'merge_at' => $now, ]); } foreach ($mainItems2 as $main2) { OrdersAItems::updt($main2->ord_a_item_id, [ 'is_active' => OrdersTermins::IS_ACTIVE_NO, 'stts_merge' => OrdersTermins::STTS_MERGE_TO, 'merge_to_code' => $merge_code, 'merge_at' => $now, ]); } Orders::updateOrder($mrgFromOrd[0]->ord_id, [ 'buy_price' => $updtBuyPriceFrom, 'group_code' => $merge_code, 'stts_merge' => Orders::STTS_MERGE_RESULT, 'group_merge_code' => $merge_code, 'merge_at' => $now, 'merge_note' => $req->note, ]); Orders::updateOrder($mrgToOrd[0]->ord_id, [ 'buy_price' => $updtBuyPriceTo, 'group_code' => $merge_code, 'stts_merge' => Orders::STTS_MERGE_RESULT, 'group_merge_code' => $merge_code, 'merge_at' => $now, 'merge_note' => $req->note, ]); $apiResp = Responses::success('success merge transaksi'); DB::commit(); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { DB::rollBack(); $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } // /** * diskon disini defaultnya minus, jadi jangan dikurangin nanti malah jadi + * ppn dan pph jika type pajak sudah termasuk pajak maka mendjadi minus */ public function api_finance_crt_updt_invc(Request $req) { $url_up_paid_proof_base64 = []; try { $now = time(); $input = [ 'ord_id' => $req->ord_id, 'ord_code' => $req->ord_code, 'termin_id' => $req->termin_id, 'items' => $req->items, 'subtotal' => $req->subtotal, 'tax_type' => $req->tax_type, 'tax_type_kind' => $req->tax_type_kind, 'ppn_percent' => $req->ppn_percent, 'ppn_flat' => $req->ppn_flat, 'pph_percent' => $req->pph_percent, 'pph_flat' => $req->pph_flat, 'tax_flat' => $req->tax_flat, 'disc_type' => $req->disc_type, 'disc_percent' => $req->disc_percent, 'disc_flat' => $req->disc_flat, 'total' => $req->total, 'is_gnrt_invc' => $req->is_gnrt_invc, ]; $rulesInput = [ 'ord_id' => 'required|integer|not_in:0', 'ord_code' => 'required|string', 'termin_id' => 'required|integer|not_in:0', 'items' => 'required|string', 'subtotal' => 'required|numeric', 'tax_type' => 'required|numeric', 'tax_type_kind' => 'required|numeric', 'ppn_percent' => 'required|numeric', 'ppn_flat' => 'required|numeric', 'pph_percent' => 'required|numeric', 'pph_flat' => 'required|numeric', 'tax_flat' => 'required|numeric', 'disc_type' => 'required|numeric', 'disc_percent' => 'required|numeric', 'disc_flat' => 'required|numeric', 'total' => 'required|numeric', 'is_gnrt_invc' => 'nullable|integer|not_in:0', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } if (strpos($req->items, ',') !== false) { $req->items = substr($req->items, 0, -1); } $order = Orders::showOrder([ 'id' => $req->ord_id, 'get_client_pt' => 1, ]); if (count($order) < 1 || $order === false) { $apiResp = Responses::not_found('order not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } $ord_invc = OrdersInvoices::getByTerminId($req->termin_id); $is_updt = true; if (count($ord_invc) < 1 || $ord_invc === false) { $is_updt = false; $code = Helper::gnrtInvcCode($order[0]->ord_code); // $nanoid = new Nanoid(); // $code = $nanoid->formattedId('0123456789', 12); // $doWhile = true; // do { // $uniqCode = OrdersInvoices::getByCode($code); // if (count($uniqCode) > 0) { // $code = $nanoid->formattedId('0123456789', 12); // } else { // $doWhile = false; // } // } while ($doWhile); } else { $invc_id = $ord_invc[0]->id; $code = $ord_invc[0]->code; if ($req->is_gnrt_invc == OrdersInvoices::IS_GNRT_INVC_YES) { // $is_gnrt_invc = OrdersInvoices::IS_GNRT_INVC_YES; // $code = Helper::gnrtInvcCode($order[0]->ord_code); } // else if ($ord_invc[0]->is_gnrt_invc == OrdersInvoices::IS_GNRT_INVC_YES) { // $is_gnrt_invc = OrdersInvoices::IS_GNRT_INVC_YES; // } else { // $is_gnrt_invc = OrdersInvoices::IS_GNRT_INVC_NO; // } } $a_item_ppn = OrdersAItems::listAItems([ 'c_termin_id' => $req->termin_id, 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, 'is_tax' => OrdersAItems::IS_TAX_YES, 'is_ppn' => OrdersAItems::IS_TAX_YES, ]); $a_item_pph = OrdersAItems::listAItems([ 'c_termin_id' => $req->termin_id, 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, 'is_tax' => OrdersAItems::IS_TAX_YES, 'is_pph' => OrdersAItems::IS_TAX_YES, ]); $a_item_disc = OrdersAItems::listAItems([ 'c_termin_id' => $req->termin_id, 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, 'is_disc' => OrdersAItems::IS_DISC_YES, ]); $req->tax_flat = round($req->tax_flat); $req->disc_flat = round($req->disc_flat); DB::beginTransaction(); $sell_price = $order[0]->price; $old_bill_items = OrdersAItems::showAItemByIds(explode(',', $req->items)); $perbedaan_selisih = 0; foreach ($old_bill_items as $i => $bill_item) { if ($req->tax_type_kind == OrdersAItems::AMT_TAX_TYPE_INCLUDE) { $before_ppn = round($bill_item->amt_bill_base_flat / OrdersAItems::PPN_PERCENT_INCLUDE); $ppn = round($bill_item->amt_bill_base_flat - $before_ppn); $amt_bill_base_tax_flat = round($before_ppn); $amt_bill_total_flat = round($amt_bill_base_tax_flat * $bill_item->unit_qty); OrdersAItems::updt($bill_item->id, [ 'amt_bill_tax_type' => $req->tax_type_kind, 'amt_bill_tax_ppn_percent' => $req->ppn_percent, 'amt_bill_tax_ppn_flat' => $ppn, 'amt_bill_tax_pph_percent' => $req->pph_percent, 'amt_bill_tax_pph_flat' => 0, 'amt_bill_total_tax_flat' => $amt_bill_base_tax_flat, 'amt_bill_result_flat' => $amt_bill_base_tax_flat, 'amt_bill_total_flat' => $amt_bill_total_flat, ]); $sell_price = round($sell_price + $bill_item->amt_bill_total_flat); $sell_price = round($sell_price - $amt_bill_total_flat); $perbedaan_selisih += round($bill_item->amt_bill_total_flat - $amt_bill_total_flat); } else { OrdersAItems::updt($bill_item->id, [ 'amt_bill_tax_type' => 0, 'amt_bill_tax_ppn_percent' => 0, 'amt_bill_tax_ppn_flat' => 0, 'amt_bill_tax_pph_percent' => 0, 'amt_bill_tax_pph_flat' => 0, 'amt_bill_total_tax_flat' => 0, 'amt_bill_result_flat' => round($bill_item->amt_bill_base_flat), 'amt_bill_total_flat' => round($bill_item->amt_bill_base_flat * $bill_item->unit_qty), ]); $sell_price = round($sell_price - $bill_item->amt_bill_total_flat); $sell_price = round($sell_price + $bill_item->amt_bill_base_flat * $bill_item->unit_qty); } } $sell_price = $sell_price - $perbedaan_selisih; $a_item_ppn_id = 0; $a_item_pph_id = 0; /** * KALAU SUDAH TERMASUK PAJAK YANG DIHITUNG DI SUMMARY (PENGHASILANNYA) YANG 1.5 * KALAU BELUM TERMASUK PAJAK YANG DIHITUNG DI SUMMARY (PENGHASILANNYA) YANG 1.5 + PAJAK */ // dump('sell_price => '. $sell_price); if ($req->tax_type_kind == OrdersAItems::AMT_TAX_TYPE_INCLUDE) { if ($a_item_ppn === false || count($a_item_ppn) < 1) { $insPpn = [ 'ord_id' => $order[0]->ord_id, 'ord_code' => $order[0]->ord_code, 'c_termin_id' => $req->termin_id, 'flow_type' => OrdersInvoices::FLOW_TYPE_BILLING, 'cash_type' => OrdersInvoices::TYPE_CASH_IN, 'a_item_type' => OrdersAItems::A_TYPE_SECONDARY, 'desc' => "PPN ($req->ppn_percent%)", 'unit_id' => 0, 'unit_type' => UnitTypes::UNIT_TYPE_PCS, 'amt_bill_base_flat' => $req->ppn_flat, 'unit_qty' => 1, 'amt_bill_tax_type' => $req->tax_type_kind, 'amt_bill_result_flat' => $req->ppn_flat, 'amt_bill_total_flat' => $req->ppn_flat, 'ddln_pay_at' => 0, 'ddln_pay_type' => OrdersAItems::DDLN_PAY_TYPE_TIME, 'invc_to_client' => OrdersAItems::INVC_TO_CLIENT_YES, 'calc_to_vdr' => OrdersAItems::CALC_TO_VDR_NO, 'is_adm_price' => OrdersAItems::IS_ADM_PRICE_NO, 'only_client' => OrdersAItems::ONLY_CLIENT_YES, 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, 'is_tax' => OrdersAItems::IS_TAX_YES, 'is_tax_type' => $req->tax_type_kind, 'is_ppn' => OrdersAItems::IS_TAX_YES, 'ref_ord_id' => $order[0]->ord_id, 'ref_ord_code' => $order[0]->ord_code, 'ref_c_termin_id' => $req->termin_id, 'crt' => $now, 'crt_by' => $req->auth->uid, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; $a_item_ppn_id = OrdersAItems::add($insPpn); // $sell_price = $sell_price + $insPpn['amt_bill_total_flat']; // + } else { $a_item_ppn_id = $a_item_ppn[0]->id; $updtPpn = [ 'desc' => "PPN ($req->ppn_percent%)", 'unit_id' => 0, 'unit_type' => UnitTypes::UNIT_TYPE_PCS, 'amt_bill_base_flat' => $req->ppn_flat, 'unit_qty' => 1, 'amt_bill_result_flat' => $req->ppn_flat, 'amt_bill_total_flat' => $req->ppn_flat, 'is_tax_type' => $req->tax_type_kind, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; OrdersAItems::updt($a_item_ppn[0]->id, $updtPpn); // if ($updtPpn['amt_bill_total_flat'] != $a_item_ppn[0]->amt_bill_total_flat) { // $sell_price = $sell_price - $a_item_ppn[0]->amt_bill_total_flat + $updtPpn['amt_bill_total_flat']; // - + // } if ($updtPpn['amt_bill_total_flat'] != $a_item_ppn[0]->amt_bill_total_flat) { // $sell_price = $sell_price - $a_item_ppn[0]->amt_bill_total_flat + $updtPpn['amt_bill_total_flat']; // - + } } if ($a_item_pph === false || count($a_item_pph) < 1) { // $insPph = [ // 'ord_id' => $order[0]->ord_id, // 'ord_code' => $order[0]->ord_code, // 'c_termin_id' => $req->termin_id, // 'flow_type' => OrdersInvoices::FLOW_TYPE_BILLING, // 'cash_type' => OrdersInvoices::TYPE_CASH_IN, // 'a_item_type' => OrdersAItems::A_TYPE_SECONDARY, // 'desc' => "PPH ($req->pph_percent%)", // 'unit_id' => 0, // 'unit_type' => UnitTypes::UNIT_TYPE_PCS, // 'amt_bill_base_flat' => $req->pph_flat, // 'unit_qty' => 1, // 'amt_bill_tax_type' => $req->tax_type_kind, // 'amt_bill_result_flat' => $req->pph_flat, // 'amt_bill_total_flat' => $req->pph_flat, // 'ddln_pay_at' => 0, // 'ddln_pay_type' => OrdersAItems::DDLN_PAY_TYPE_TIME, // 'invc_to_client' => OrdersAItems::INVC_TO_CLIENT_YES, // 'calc_to_vdr' => OrdersAItems::CALC_TO_VDR_NO, // 'is_adm_price' => OrdersAItems::IS_ADM_PRICE_NO, // 'only_client' => OrdersAItems::ONLY_CLIENT_YES, // 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, // 'is_tax' => OrdersAItems::IS_TAX_YES, // 'is_tax_type' => $req->tax_type_kind, // 'is_pph' => OrdersAItems::IS_TAX_YES, // 'ref_ord_id' => $order[0]->ord_id, // 'ref_ord_code' => $order[0]->ord_code, // 'ref_c_termin_id' => $req->termin_id, // 'crt' => $now, // 'crt_by' => $req->auth->uid, // 'updt' => $now, // 'updt_by' => $req->auth->uid, // ]; // $a_item_pph_id = OrdersAItems::add($insPph); // // $sell_price = $sell_price + $insPph['amt_bill_total_flat']; // + } else { // $a_item_pph_id = $a_item_pph[0]->id; // $updtPph = [ // 'desc' => "PPH ($req->pph_percent%)", // 'unit_id' => 0, // 'unit_type' => UnitTypes::UNIT_TYPE_PCS, // 'amt_bill_base_flat' => $req->pph_flat, // 'unit_qty' => 1, // 'amt_bill_result_flat' => $req->pph_flat, // 'amt_bill_total_flat' => $req->pph_flat, // 'is_tax_type' => $req->tax_type_kind, // 'updt' => $now, // 'updt_by' => $req->auth->uid, // ]; // OrdersAItems::updt($a_item_pph[0]->id, $updtPph); // // if ($updtPph['amt_bill_total_flat'] != $a_item_pph[0]->amt_bill_total_flat) { // // $sell_price = $sell_price - $a_item_pph[0]->amt_bill_total_flat + $updtPph['amt_bill_total_flat']; // - + // // } // if ($updtPph['amt_bill_total_flat'] != $a_item_pph[0]->amt_bill_total_flat) { // // $sell_price = $sell_price - $a_item_pph[0]->amt_bill_total_flat + $updtPph['amt_bill_total_flat']; // - + // } } } if ($a_item_disc === false || count($a_item_disc) < 1) { if ($req->disc_type == OrdersAItems::AMT_TYPE_PERCENT) { $desc = "Discount ($req->disc_percent%)"; } else { $desc = "Discount"; } $insDisc = [ 'ord_id' => $order[0]->ord_id, 'ord_code' => $order[0]->ord_code, 'c_termin_id' => $req->termin_id, 'flow_type' => OrdersInvoices::FLOW_TYPE_BILLING, 'cash_type' => OrdersInvoices::TYPE_CASH_IN, 'a_item_type' => OrdersAItems::A_TYPE_SECONDARY, 'desc' => $desc, 'unit_id' => 0, 'unit_type' => UnitTypes::UNIT_TYPE_PCS, 'amt_bill_base_flat' => -$req->disc_flat, 'unit_qty' => 1, 'amt_bill_result_flat' => -$req->disc_flat, 'amt_bill_total_flat' => -$req->disc_flat, 'ddln_pay_at' => 0, 'ddln_pay_type' => OrdersAItems::DDLN_PAY_TYPE_TIME, 'invc_to_client' => OrdersAItems::INVC_TO_CLIENT_YES, 'calc_to_vdr' => OrdersAItems::CALC_TO_VDR_NO, 'is_adm_price' => OrdersAItems::IS_ADM_PRICE_NO, 'only_client' => OrdersAItems::ONLY_CLIENT_YES, 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, 'is_disc' => OrdersAItems::IS_DISC_YES, 'ref_ord_id' => $order[0]->ord_id, 'ref_ord_code' => $order[0]->ord_code, 'ref_c_termin_id' => $req->termin_id, 'crt' => $now, 'crt_by' => $req->auth->uid, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; $a_item_disc_id = OrdersAItems::add($insDisc); $sell_price = $sell_price + $insDisc['amt_bill_total_flat']; } else { $a_item_disc_id = $a_item_disc[0]->id; if ($req->disc_type == OrdersAItems::AMT_TYPE_PERCENT) { $desc = "Discount ($req->disc_percent%)"; } else { $desc = "Discount"; } $updtDisc = [ 'desc' => $desc, 'unit_id' => 0, 'unit_type' => UnitTypes::UNIT_TYPE_PCS, 'amt_bill_base_flat' => -$req->disc_flat, 'unit_qty' => 1, 'amt_bill_result_flat' => -$req->disc_flat, 'amt_bill_total_flat' => -$req->disc_flat, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; OrdersAItems::updt($a_item_disc[0]->id, $updtDisc); if ($updtDisc['amt_bill_total_flat'] != $a_item_disc[0]->amt_bill_total_flat) { // $sell_price = $sell_price + $a_item_disc[0]->amt_bill_total_flat; // ngebug $sell_price = $sell_price - $a_item_disc[0]->amt_bill_total_flat + $updtDisc['amt_bill_total_flat']; // $sell_price = $sell_price + $updtDisc['amt_bill_total_flat']; } } if ($req->tax_type_kind == OrdersAItems::AMT_TAX_TYPE_EXCLUDE) { if ($a_item_ppn === false || count($a_item_ppn) < 1) { $insPpn = [ 'ord_id' => $order[0]->ord_id, 'ord_code' => $order[0]->ord_code, 'c_termin_id' => $req->termin_id, 'flow_type' => OrdersInvoices::FLOW_TYPE_BILLING, 'cash_type' => OrdersInvoices::TYPE_CASH_IN, 'a_item_type' => OrdersAItems::A_TYPE_SECONDARY, 'desc' => "PPN ($req->ppn_percent%)", 'unit_id' => 0, 'unit_type' => UnitTypes::UNIT_TYPE_PCS, 'amt_bill_base_flat' => $req->ppn_flat, 'unit_qty' => 1, 'amt_bill_tax_type' => $req->tax_type_kind, 'amt_bill_result_flat' => $req->ppn_flat, 'amt_bill_total_flat' => $req->ppn_flat, 'ddln_pay_at' => 0, 'ddln_pay_type' => OrdersAItems::DDLN_PAY_TYPE_TIME, 'invc_to_client' => OrdersAItems::INVC_TO_CLIENT_YES, 'calc_to_vdr' => OrdersAItems::CALC_TO_VDR_NO, 'is_adm_price' => OrdersAItems::IS_ADM_PRICE_NO, 'only_client' => OrdersAItems::ONLY_CLIENT_YES, 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, 'is_tax' => OrdersAItems::IS_TAX_YES, 'is_tax_type' => $req->tax_type_kind, 'is_ppn' => OrdersAItems::IS_TAX_YES, 'ref_ord_id' => $order[0]->ord_id, 'ref_ord_code' => $order[0]->ord_code, 'ref_c_termin_id' => $req->termin_id, 'crt' => $now, 'crt_by' => $req->auth->uid, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; $a_item_ppn_id = OrdersAItems::add($insPpn); $sell_price = $sell_price + $insPpn['amt_bill_total_flat']; // + } else { $a_item_ppn_id = $a_item_ppn[0]->id; $updtPpn = [ 'desc' => "PPN ($req->ppn_percent%)", 'unit_id' => 0, 'unit_type' => UnitTypes::UNIT_TYPE_PCS, 'amt_bill_base_flat' => $req->ppn_flat, 'unit_qty' => 1, 'amt_bill_result_flat' => $req->ppn_flat, 'amt_bill_total_flat' => $req->ppn_flat, 'is_tax_type' => $req->tax_type_kind, 'updt' => $now, 'updt_by' => $req->auth->uid, ]; OrdersAItems::updt($a_item_ppn[0]->id, $updtPpn); // if ($updtPpn['amt_bill_total_flat'] != $a_item_ppn[0]->amt_bill_total_flat) { // $sell_price = $sell_price - $a_item_ppn[0]->amt_bill_total_flat + $updtPpn['amt_bill_total_flat']; // - + // } if ($updtPpn['amt_bill_total_flat'] != $a_item_ppn[0]->amt_bill_total_flat) { $sell_price = $sell_price - $a_item_ppn[0]->amt_bill_total_flat + $updtPpn['amt_bill_total_flat']; // - + } } if ($a_item_pph === false || count($a_item_pph) < 1) { // $insPph = [ // 'ord_id' => $order[0]->ord_id, // 'ord_code' => $order[0]->ord_code, // 'c_termin_id' => $req->termin_id, // 'flow_type' => OrdersInvoices::FLOW_TYPE_BILLING, // 'cash_type' => OrdersInvoices::TYPE_CASH_IN, // 'a_item_type' => OrdersAItems::A_TYPE_SECONDARY, // 'desc' => "PPH ($req->pph_percent%)", // 'unit_id' => 0, // 'unit_type' => UnitTypes::UNIT_TYPE_PCS, // 'amt_bill_base_flat' => $req->pph_flat, // 'unit_qty' => 1, // 'amt_bill_tax_type' => $req->tax_type_kind, // 'amt_bill_result_flat' => $req->pph_flat, // 'amt_bill_total_flat' => $req->pph_flat, // 'ddln_pay_at' => 0, // 'ddln_pay_type' => OrdersAItems::DDLN_PAY_TYPE_TIME, // 'invc_to_client' => OrdersAItems::INVC_TO_CLIENT_YES, // 'calc_to_vdr' => OrdersAItems::CALC_TO_VDR_NO, // 'is_adm_price' => OrdersAItems::IS_ADM_PRICE_NO, // 'only_client' => OrdersAItems::ONLY_CLIENT_YES, // 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, // 'is_tax' => OrdersAItems::IS_TAX_YES, // 'is_tax_type' => $req->tax_type_kind, // 'is_pph' => OrdersAItems::IS_TAX_YES, // 'ref_ord_id' => $order[0]->ord_id, // 'ref_ord_code' => $order[0]->ord_code, // 'ref_c_termin_id' => $req->termin_id, // 'crt' => $now, // 'crt_by' => $req->auth->uid, // 'updt' => $now, // 'updt_by' => $req->auth->uid, // ]; // $a_item_pph_id = OrdersAItems::add($insPph); // $sell_price = $sell_price + $insPph['amt_bill_total_flat']; // + } else { // $a_item_pph_id = $a_item_pph[0]->id; // $updtPph = [ // 'desc' => "PPH ($req->pph_percent%)", // 'unit_id' => 0, // 'unit_type' => UnitTypes::UNIT_TYPE_PCS, // 'amt_bill_base_flat' => $req->pph_flat, // 'unit_qty' => 1, // 'amt_bill_result_flat' => $req->pph_flat, // 'amt_bill_total_flat' => $req->pph_flat, // 'is_tax_type' => $req->tax_type_kind, // 'updt' => $now, // 'updt_by' => $req->auth->uid, // ]; // OrdersAItems::updt($a_item_pph[0]->id, $updtPph); // // if ($updtPph['amt_bill_total_flat'] != $a_item_pph[0]->amt_bill_total_flat) { // // $sell_price = $sell_price - $a_item_pph[0]->amt_bill_total_flat + $updtPph['amt_bill_total_flat']; // - + // // } // if ($updtPph['amt_bill_total_flat'] != $a_item_pph[0]->amt_bill_total_flat) { // $sell_price = $sell_price - $a_item_pph[0]->amt_bill_total_flat + $updtPph['amt_bill_total_flat']; // - + // } } } Orders::updateOrder($order[0]->ord_id, [ 'price' => $sell_price, // 'price' => round($req->total), ]); if ($is_updt) { // $sell_price = $sell_price - $ord_invc[0]->amt_disc_flat - $ord_invc[0]->tax_flat; OrdersInvoices::updt($ord_invc[0]->id, [ 'code' => $code, 'ord_a_item_ids' => $req->items, 'amt_base_flat' => $req->subtotal, 'amt_disc_type' => $req->disc_type, 'amt_disc_percent' => $req->disc_percent, 'amt_disc_flat' => $req->disc_flat, 'amt_tax_type' => $req->tax_type, 'amt_tax_type_kind' => $req->tax_type_kind, 'amt_tax_ppn_percent' => $req->ppn_percent, 'amt_tax_ppn_flat' => $req->ppn_flat, 'amt_tax_pph_percent' => $req->pph_percent, 'amt_tax_pph_flat' => $req->pph_flat, 'amt_tax_flat' => $req->tax_flat, 'amt_total_flat' => round($req->total), // 'bank_id' => Banks::DFT_BANK_ID, // 'bank_code' => Banks::DFT_BANK_CODE, // 'bank_short_name' => Banks::DFT_BANK_NAME, // 'bank_name' => Banks::DFT_BANK_SHORT_NAME, // 'bank_acc_name' => Banks::DFT_BANK_ACC_NAME, // 'bank_acc_number' => Banks::DFT_BANK_ACC_NUMBER, 'invc_at' => $now, // 'invc_for_uid' => $order[0]->c_id, // 'invc_for_ptid' => $order[0]->c_pt_id, // 'invc_for_type' => OrdersInvoices::INVC_FOR_CLIENT, // 'pay_due_type' => OrdersInvoices::PAY_DUE_TYPE_14_WORK_DAY, 'a_item_ppn_id' => $a_item_ppn_id, 'a_item_pph_id' => $a_item_pph_id, 'a_item_disc_id' => $a_item_disc_id, 'is_gnrt_invc' => $req->is_gnrt_invc ?? 0, 'updt' => $now, 'updt_by' => $req->auth->uid, ]); } else { $invc_id = OrdersInvoices::add([ 'code' => $code, 'ord_id' => $order[0]->ord_id, 'ord_code' => $order[0]->ord_code, 'flow_type' => OrdersInvoices::FLOW_TYPE_BILLING, 'cash_type' => OrdersInvoices::TYPE_CASH_IN, 'c_termin_id' => $req->termin_id, 'ord_a_item_ids' => $req->items, 'amt_base_flat' => $req->subtotal, 'amt_disc_type' => $req->disc_type, 'amt_disc_percent' => $req->disc_percent, 'amt_disc_flat' => $req->disc_flat, 'amt_tax_type' => $req->tax_type, 'amt_tax_type_kind' => $req->tax_type_kind, 'amt_tax_ppn_percent' => $req->ppn_percent, 'amt_tax_ppn_flat' => $req->ppn_flat, 'amt_tax_pph_percent' => $req->pph_percent, 'amt_tax_pph_flat' => $req->pph_flat, 'amt_tax_flat' => $req->tax_flat, 'amt_total_flat' => $req->total, 'bank_id' => Banks::DFT_BANK_ID, 'bank_code' => Banks::DFT_BANK_CODE, 'bank_short_name' => Banks::DFT_BANK_NAME, 'bank_name' => Banks::DFT_BANK_SHORT_NAME, 'bank_acc_name' => Banks::DFT_BANK_ACC_NAME, 'bank_acc_number' => Banks::DFT_BANK_ACC_NUMBER, 'invc_at' => $now, 'invc_for_uid' => $order[0]->c_id, 'invc_for_ptid' => $order[0]->c_pt_id, 'invc_for_type' => OrdersInvoices::INVC_FOR_CLIENT, 'pay_due_type' => OrdersInvoices::PAY_DUE_TYPE_14_WORK_DAY, 'a_item_ppn_id' => $a_item_ppn_id, 'a_item_pph_id' => $a_item_pph_id, 'a_item_disc_id' => $a_item_disc_id, 'is_gnrt_invc' => $req->is_gnrt_invc ?? 0, 'crt' => $now, 'crt_by' => $req->auth->uid, 'crt_type' => OrdersInvoices::CRT_TYPE_FINANCE, 'updt' => $now, 'updt_by' => $req->auth->uid, ]); } $apiResp = Responses::success('success create / update invoice'); $apiResp['id'] = $invc_id; $apiResp['code'] = $code; DB::commit(); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { DB::rollBack(); if (count($url_up_paid_proof_base64) > 0) { foreach ($url_up_paid_proof_base64 as $path) { Storage::disk('public')->delete($path); } } $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_crt_updt_tax(Request $req) { try { $now = time(); $input = [ 'termin_id' => $req->termin_id, 'ord_id' => $req->ord_id, 'ord_code' => $req->ord_code, 'invc_tax_type' => $req->invc_tax_type, 'invc_tax_ppn_percent' => $req->invc_tax_ppn_percent, 'invc_tax_pph_percent' => $req->invc_tax_pph_percent, ]; $rulesInput = [ 'ord_id' => 'required|integer|not_in:0', 'ord_code' => 'required|integer|not_in:0', 'termin_id' => 'required|integer|not_in:0', 'invc_tax_type' => 'required|numeric', 'invc_tax_ppn_percent' => 'required|numeric', 'invc_tax_pph_percent' => 'required|numeric', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } $order = Orders::showOrder([ 'id' => $req->ord_id, 'get_client_pt' => 1, ]); if (count($order) < 1 || $order === false) { $apiResp = Responses::not_found('order not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } $a_item_ppn = OrdersAItems::listAItems([ 'c_termin_id' => $req->termin_id, 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, 'is_tax' => OrdersAItems::IS_TAX_YES, 'is_ppn' => OrdersAItems::IS_TAX_YES, ]); $a_item_pph = OrdersAItems::listAItems([ 'c_termin_id' => $req->termin_id, 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, 'is_tax' => OrdersAItems::IS_TAX_YES, 'is_pph' => OrdersAItems::IS_TAX_YES, ]); DB::beginTransaction(); $sell_price = $order[0]->price; $ord_invc = OrdersInvoices::getByTerminId($req->termin_id); if (count($ord_invc) < 1 || $ord_invc === false) {} else { OrdersInvoices::updt($ord_invc[0]->id, [ 'is_gnrt_invc' => OrdersInvoices::IS_GNRT_INVC_NO, ]); } OrdersTermins::updt($req->termin_id, [ 'termin_tax_type' => $req->invc_tax_type, 'termin_tax_ppn_percent' => $req->invc_tax_ppn_percent, 'termin_tax_pph_percent' => $req->invc_tax_pph_percent, ]); if ($a_item_ppn === false || count($a_item_ppn) < 1) {} else { if ($a_item_ppn[0]->amt_bill_tax_type === OrdersAItems::AMT_TAX_TYPE_INCLUDE) { $sell_price = $sell_price - $a_item_ppn[0]->amt_bill_total_flat; } else if ($a_item_ppn[0]->amt_bill_tax_type === OrdersAItems::AMT_TAX_TYPE_EXCLUDE) { $sell_price = $sell_price - $a_item_ppn[0]->amt_bill_total_flat; } OrdersAItems::dlt($a_item_ppn[0]->id); } if ($a_item_pph === false || count($a_item_pph) < 1) {} else { if ($a_item_pph[0]->amt_bill_tax_type === OrdersAItems::AMT_TAX_TYPE_INCLUDE) { $sell_price = $sell_price - $a_item_pph[0]->amt_bill_total_flat; } else if ($a_item_pph[0]->amt_bill_tax_type === OrdersAItems::AMT_TAX_TYPE_EXCLUDE) { $sell_price = $sell_price - $a_item_pph[0]->amt_bill_total_flat; } OrdersAItems::dlt($a_item_pph[0]->id); } Orders::updateOrder($order[0]->ord_id, [ 'price' => $sell_price, // 'price' => round($req->total), ]); $apiResp = Responses::success('success save tax'); DB::commit(); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { DB::rollBack(); $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_confirm_invc(Request $req) { $url_up_paid_proof_base64 = []; try { $now = time(); $input = [ 'invc_id' => $req->invc_id, 'invc_code' => $req->invc_code, 'amt_invoicing' => $req->amt_invoicing, 'amt_bill_confirm' => $req->amt_bill_confirm, 'amt_bill_confirm_note' => $req->amt_bill_confirm_note, ]; $rulesInput = [ 'invc_id' => 'required|integer|not_in:0', 'invc_code' => 'nullable|numeric', 'amt_invoicing' => 'required|numeric', 'amt_bill_confirm' => 'required|numeric', 'amt_bill_confirm_note' => 'nullable|string', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } // if (!$req->up_paid_proof_base64 || count($req->up_paid_proof_base64) < 1) { // $apiResp = Responses::bad_input('bukti pembayaran wajib diisi'); // return new Response($apiResp, $apiResp['meta']['code']); // } $ord_invc = OrdersInvoices::getById($req->invc_id); if (count($ord_invc) < 1 || $ord_invc === false) { $apiResp = Responses::not_found('invoice not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } $item_ids = explode(',', $ord_invc[0]->ord_a_item_ids); $order = Orders::showOrder(['id' => $ord_invc[0]->ord_id]); // $a_item_ppn = OrdersAItems::listAItems([ // 'c_termin_id' => $req->termin_id, // 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, // 'is_tax' => OrdersAItems::IS_TAX_YES, // ]); // $a_item_disc = OrdersAItems::listAItems([ // 'c_termin_id' => $req->termin_id, // 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, // 'is_disc' => OrdersAItems::IS_DISC_YES, // ]); DB::beginTransaction(); $updtOrdersInvoices = [ 'updt' => $now, 'updt_by' => $req->auth->uid, 'is_paid' => OrdersInvoices::IS_PAID_YES, 'paid_at' => $now, 'paid_by' => $req->auth->uid, ]; if ($ord_invc[0]->c_termin_id !== 0) { $termin = OrdersTermins::getById($ord_invc[0]->c_termin_id); if ($termin[0]->termin_is_paid !== OrdersTermins::IS_PAID_YES) { OrdersTermins::updt($ord_invc[0]->c_termin_id, [ 'termin_is_paid' => OrdersTermins::IS_PAID_YES, 'termin_paid_at' => $now, 'termin_paid_by' => $req->auth->uid, 'amt_bill_confirm' => $req->amt_bill_confirm, 'amt_bill_confirm_note' => $req->amt_bill_confirm_note, 'updt' => $now, 'updt_by' => $req->auth->uid, ]); } } $qty = 1; $selisih = $req->amt_bill_confirm - $req->amt_invoicing; OrdersAItems::add([ 'ord_id' => $ord_invc[0]->ord_id, 'ord_code' => $ord_invc[0]->ord_code, 'flow_type' => OrdersAItems::FLOW_TYPE_BILLING, 'cash_type' => OrdersAItems::TYPE_CASH_IN, 'c_termin_id' => $ord_invc[0]->c_termin_id, 'a_item_type' => OrdersAItems::A_TYPE_SECONDARY, // 'desc' => $main_item_dec . "
Pembayaran termin 1", 'desc' => 'Selisih dari nilai yang ditagihkan dan diterima pada trx_code:' . $ord_invc[0]->ord_code, 'unit_id' => 0, 'unit_type' => UnitTypes::UNIT_TYPE_PCS, 'unit_qty' => $qty, 'amt_bill_base_flat' => $selisih, 'amt_bill_result_flat' => $selisih, 'amt_bill_total_flat' => $selisih * $qty, 'ddln_pay_at' => 0, 'ddln_pay_type' => OrdersAItems::DDLN_PAY_TYPE_TIME, 'img_proof_submission' => null, 'img_proof_payment' => null, 'bank_id' => Banks::DFT_BANK_ID, 'bank_code' => Banks::DFT_BANK_CODE, 'bank_name' => Banks::DFT_BANK_NAME, 'bank_short_name' => Banks::DFT_BANK_SHORT_NAME, 'bank_acc_number' => Banks::DFT_BANK_ACC_NUMBER, 'bank_acc_name' => Banks::DFT_BANK_ACC_NAME, // 'invc_to_client' => OrdersAItems::INVC_TO_CLIENT_YES, // seharusnya yang ini kalau diaktifin (mau dihitung di summary / ledger balance) 'invc_to_client' => OrdersAItems::INVC_TO_CLIENT_NO, 'calc_to_vdr' => OrdersAItems::CALC_TO_VDR_NO, 'is_adm_price' => OrdersAItems::IS_ADM_PRICE_NO, // 'only_client' => OrdersAItems::ONLY_CLIENT_YES, // seharusnya yang ini kalau diaktifin (mau dihitung di summary / ledger balance) 'only_client' => OrdersAItems::ONLY_CLIENT_NO, 'is_hidden' => OrdersAItems::IS_HIDDEN_YES, 'is_substract' => OrdersAItems::IS_SUBTRACT_YES, 'ref_ord_id' => $ord_invc[0]->ord_id, 'ref_ord_code' => $ord_invc[0]->ord_code, 'ref_c_termin_id' => $ord_invc[0]->c_termin_id, 'is_bill_paid' => OrdersAItems::IS_PAID_YES, 'paid_bill_at' => $now, 'paid_bill_by' => $req->auth->uid, 'crt' => $now, 'crt_by' => $req->auth->uid, 'updt' => $now, 'updt_by' => $req->auth->uid, ]); foreach ($item_ids as $id) { OrdersAItems::updt($id, [ 'updt' => $now, 'updt_by' => $req->auth->uid, 'is_bill_paid' => OrdersAItems::IS_PAID_YES, 'paid_bill_at' => $now, 'paid_bill_by' => $req->auth->uid, ]); } if ($ord_invc[0]->a_item_ppn_id != 0) { OrdersAItems::updt($ord_invc[0]->a_item_ppn_id, [ 'updt' => $now, 'updt_by' => $req->auth->uid, 'is_bill_paid' => OrdersAItems::IS_PAID_YES, 'paid_bill_at' => $now, 'paid_bill_by' => $req->auth->uid, ]); } if ($ord_invc[0]->a_item_pph_id != 0) { OrdersAItems::updt($ord_invc[0]->a_item_pph_id, [ 'updt' => $now, 'updt_by' => $req->auth->uid, 'is_bill_paid' => OrdersAItems::IS_PAID_YES, 'paid_bill_at' => $now, 'paid_bill_by' => $req->auth->uid, ]); } if ($ord_invc[0]->a_item_disc_id != 0) { OrdersAItems::updt($ord_invc[0]->a_item_disc_id, [ 'updt' => $now, 'updt_by' => $req->auth->uid, 'is_bill_paid' => OrdersAItems::IS_PAID_YES, 'paid_bill_at' => $now, 'paid_bill_by' => $req->auth->uid, ]); } OrdersInvoices::updt($ord_invc[0]->id, $updtOrdersInvoices); $updtOrd = []; $checkPaidOff = Finance::checkJustPaidOff($ord_invc[0]->ord_id); if ($checkPaidOff['invc_paid'] === 1) { $updtOrd['is_invc_paid'] = Orders::IS_PAID_YES; $updtOrd['invc_paid_at'] = $now; } if ($checkPaidOff['vdr_paid'] === 1) { $updtOrd['is_vdr_paid'] = Orders::IS_PAID_YES; $updtOrd['vdr_paid_at'] = $now; // kalau vhc & driver bisa order lagi setelah pembayaran lunas // Vehicles::updateVehicle($order[0]->vhc_id, [ // 'is_in_ord' => Vehicles::IN_ORD_NO, // 'ord_id' => 0, // 'ord_code' => 0, // ]); // Drivers::updateDriver($order[0]->drv_id, [ // 'is_in_ord' => Drivers::IN_ORD_NO, // 'ord_id' => 0, // 'ord_code' => 0, // ]); } if ($checkPaidOff['invc_vdr_paid'] === 1 || $checkPaidOff['invc_vdr_paid'] === 2) { if ($order[0]->status === Orders::STTS_DROP || $order[0]->status === Orders::STTS_CLIENT_PAY || $order[0]->status === Orders::STTS_VENDOR_PAYED) { $updtOrd['status'] = Orders::STTS_CLOSE; } } if (count($updtOrd) > 0) { Orders::updateOrder($ord_invc[0]->ord_id, $updtOrd); } // $currentBill = Finance::listBillings(['ord_id' => $ord_invc[0]->ord_id]); // $currentPay = Finance::listPayments(['ord_id' => $ord_invc[0]->ord_id]); // if ($currentBill[0]->total_billing === $currentBill[0]->total_payed || $currentPay[0]->total_payment === $currentPay[0]->total_payed) { // $updtOrd = []; // if ($currentBill[0]->total_billing === $currentBill[0]->total_payed) { // if ($order[0]->is_invc_paid !== Orders::IS_PAID_YES) { // $updtOrd['is_invc_paid'] = Orders::IS_PAID_YES; // $updtOrd['invc_paid_at'] = $now; // } // } // if ($currentPay[0]->total_payment === $currentPay[0]->total_payed) { // if ($order[0]->is_vdr_paid !== Orders::IS_PAID_YES) { // $updtOrd['is_vdr_paid'] = Orders::IS_PAID_YES; // $updtOrd['vdr_paid_at'] = $now; // Vehicles::updateVehicle($order[0]->vhc_id, [ // 'is_in_ord' => Vehicles::IN_ORD_NO, // 'ord_id' => 0, // 'ord_code' => 0, // ]); // Drivers::updateDriver($order[0]->drv_id, [ // 'is_in_ord' => Drivers::IN_ORD_NO, // 'ord_id' => 0, // 'ord_code' => 0, // ]); // } // } // if ($currentBill[0]->total_billing === $currentBill[0]->total_payed && $currentPay[0]->total_payment === $currentPay[0]->total_payed) { // $updtOrd['status'] = Orders::STTS_CLOSE; // } // if (count($updtOrd) > 0) { // Orders::updateOrder($ord_invc[0]->ord_id, $updtOrd); // } // } $apiResp = Responses::success('success paid invoice'); DB::commit(); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { DB::rollBack(); if (count($url_up_paid_proof_base64) > 0) { foreach ($url_up_paid_proof_base64 as $path) { Storage::disk('public')->delete($path); } } $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_finance_save_note(Request $req, $ord_id) { $url_up_paid_proof_base64 = []; try { $now = time(); $input = [ 'ord_id' => $ord_id, 'fnnc_note' => $req->fnnc_note, ]; $rulesInput = [ 'ord_id' => 'required|integer|not_in:0', 'fnnc_note' => 'required|string|min:2', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } $order = Orders::showOrder(['id' => $ord_id]); if (count($order) < 1 || $order === false) { $apiResp = Responses::not_found('order not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } DB::beginTransaction(); $updtOrd = [ 'fnnc_note' => $req->fnnc_note, ]; Orders::updateOrder($order[0]->ord_id, $updtOrd); $apiResp = Responses::success('success save note'); DB::commit(); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { DB::rollBack(); if (count($url_up_paid_proof_base64) > 0) { foreach ($url_up_paid_proof_base64 as $path) { Storage::disk('public')->delete($path); } } $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } // DANA || CHECKPOINTS public function api_list_pocket_tf_history(Request $req) { try { $now = time(); $input = []; $rulesInput = []; // validasi input // $isValidInput = Validator::make($input, $rulesInput); // if (!$isValidInput->passes()) { // $apiResp = Responses::bad_input($isValidInput->messages()->first()); // return new Response($apiResp, $apiResp['meta']['code']); // } $filter = [ 'tf_method' => OrdersCheckpoints::TF_METHOD_DANA, 'where_not_tf_at' => '0', 'order_by' => 'point.tf_at DESC', ]; // $historys = OrdersLogsTf::listLogsTf($filter); $historys = OrdersCheckpoints::listCheckpoints($filter); $i = 0; foreach ($historys as $key => $row) { $historys[$key]->DT_RowIndex = ++$i; $historys[$key]->action = '-'; } $apiResp = Responses::success('success'); $apiResp['data'] = $historys; return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } public function api_resend_pocket(Request $req) { try { $now = time(); $input = []; $rulesInput = []; $input = [ 'ord_checkpoint_id' => $req->ord_checkpoint_id, ]; $rulesInput = [ 'ord_checkpoint_id' => 'required|integer|not_in:0', ]; // validasi input $isValidInput = Validator::make($input, $rulesInput); if (!$isValidInput->passes()) { $apiResp = Responses::bad_input($isValidInput->messages()->first()); return new Response($apiResp, $apiResp['meta']['code']); } $filter = [ 'id' => $req->ord_checkpoint_id, 'limit' => '1', ]; $historys = OrdersCheckpoints::listCheckpoints($filter); if (count($historys) < 1) { $apiResp = Responses::bad_request('Riwayat transfer tidak ditemukan'); return new Response($apiResp, $apiResp['meta']['code']); } $order = Orders::showOrder([ 'id' => $historys[0]->ord_id, 'get_drv_bank' => 1, 'ord_pck_drop_id' => $req->ord_pck_drop_id, 'couple_pck_drop' => 1, ]); if (count($order) < 1) { $apiResp = Responses::not_found('order not found'); return (new Response($apiResp, $apiResp['meta']['code'])); } $drvPhone = DrvPhoneDevices::get(['drv_id' => $order[0]->drv_id]); if (count($drvPhone) < 1) { $apiResp = Responses::bad_request('Driver belum pernah melakukan login'); return (new Response($apiResp, $apiResp['meta']['code'])); } $admins = Users::getUsersActiveByRole(Users::ROLE_FINANCE); $admins_data = []; foreach ($admins as $k => $v) { array_push($admins_data, [ "admin_id" => $v->id, "admin_name" => $v->first_name, "admin_phone" => $v->phone_code . " " . implode(" ", str_split($v->phone, 4)), "admin_mail" => $v->email, "admin_addr" => "" ]); } $dana = Dana::getDanaById(Dana::PK_ID); if (count($dana) < 1) { $apiResp = Responses::bad_request('dana error'); return (new Response($apiResp, $apiResp['meta']['code'])); } $dana = $dana[0]; DB::beginTransaction(); $url = env('API_DANA_BINGCORP') . '/order/create'; $guzReq = new GuzzleClient(); $json = [ 'ord_id' => $order[0]->ord_id, 'ord_code' => $order[0]->ord_code, 'checkpoint_id' => $historys[0]->ord_checkpoint_id, 'bank_code' => $order[0]->drv_bank_code, 'bank_name' => $order[0]->drv_bank_name, 'bank_branch' => $order[0]->drv_bank_branch_name ?? null, 'amt' => $historys[0]->pocket_total, 'acc_name' => $order[0]->drv_bank_acc_name, 'acc_number' => $order[0]->drv_bank_acc_number, 'device_id' => $drvPhone[0]->device_id, ]; if ($dana->amt > $historys[0]->pocket_total && $dana->amt > Dana::MINIMUM_AMT) { try { $respDana = $guzReq->request('POST', $url, [ 'headers' => [ // 'Host' => $_SERVER['SERVER_ADDR'] ?? '127.0.0.1', 'User-Agent' => 'curl/7.65.3', 'Accept' => '*/*', 'Accept-Encoding' => 'gzip, deflate, br', // 'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8', 'Content-Type' => 'application/json', // 'Connection' => 'keep-alive', ], 'json' => $json, ]); $isValidDana = 1; $bodyDana = json_decode($respDana->getBody()->getContents()); if ($respDana->getStatusCode() != 200 || $bodyDana->meta->code != 200) { $isValidDana = 0; // DB::rollBack(); OrdersLogsTf::addLogsTf([ 'ord_id' => $order[0]->ord_id, 'ord_code' => $order[0]->ord_code, 'type' => OrdersLogsTf::TYPE_TF_CHECKPOINT, 'checkpoint_id' => $historys[0]->ord_checkpoint_id, 'amount' => $historys[0]->pocket_total, 'stts' => OrdersLogsTf::STTS_FAIL, 'fail_at' => time(), 'note' => $bodyDana->data->note, 'bank_id' => $order[0]->drv_bank_id, 'bank_name' => $order[0]->drv_bank_name, 'bank_code' => $order[0]->drv_bank_code, 'bank_short_name' => $order[0]->drv_bank_short_name, 'bank_branch_name' => $order[0]->drv_bank_branch_name ?? null, 'bank_acc_name' => $order[0]->drv_bank_acc_name, 'bank_acc_number' => $order[0]->drv_bank_acc_number, 'method' => OrdersLogsTf::METHOD_DANA, 'url' => $url, 'ref_code' => $bodyDana->data->dana_reference_no, 'req_data' => json_encode($json), 'resp_data' => json_encode($bodyDana), 'crt' => time(), 'updt' => time(), ]); OrdersCheckpoints::updateCheckpoint($historys[0]->ord_checkpoint_id, [ 'pocket_is_paid' => OrdersCheckpoints::IS_TF_FAIL, 'pocket_paid_note' => $bodyDana->data->note, 'bank_id' => $order[0]->drv_bank_id, 'bank_name' => $order[0]->drv_bank_name, 'bank_code' => $order[0]->drv_bank_code, 'bank_short_name' => $order[0]->drv_bank_short_name, 'bank_branch_name' => $order[0]->drv_bank_branch_name ?? null, 'bank_acc_name' => $order[0]->drv_bank_acc_name, 'bank_acc_number' => $order[0]->drv_bank_acc_number, 'tf_method' => OrdersCheckpoints::TF_METHOD_DANA, 'tf_at' => $now, 'tf_url' => $url, 'tf_ref_code' => $bodyDana->data->dana_reference_no, 'tf_note' => $bodyDana->data->note, 'tf_req_data' => json_encode($json), 'tf_resp_data' => json_encode($bodyDana), ]); $apiResp = Responses::bad_request('Gagal transfer ke rekening driver'); return (new Response($apiResp, $apiResp['meta']['code'])); } if ($isValidDana === 1) { OrdersLogsTf::addLogsTf([ 'ord_id' => $order[0]->ord_id, 'ord_code' => $order[0]->ord_code, 'type' => OrdersLogsTf::TYPE_TF_CHECKPOINT, 'checkpoint_id' => $historys[0]->ord_checkpoint_id, 'amount' => $historys[0]->pocket_total, 'stts' => OrdersLogsTf::STTS_PAID, 'paid_at' => time(), 'note' => $bodyDana->data->note, 'bank_id' => $order[0]->drv_bank_id, 'bank_name' => $order[0]->drv_bank_name, 'bank_code' => $order[0]->drv_bank_code, 'bank_short_name' => $order[0]->drv_bank_short_name, 'bank_branch_name' => $order[0]->drv_bank_branch_name ?? null, 'bank_acc_name' => $order[0]->drv_bank_acc_name, 'bank_acc_number' => $order[0]->drv_bank_acc_number, 'method' => OrdersLogsTf::METHOD_DANA, 'url' => $url, 'ref_code' => $bodyDana->data->dana_reference_no, 'req_data' => json_encode($json), 'resp_data' => json_encode($bodyDana), 'crt' => time(), 'updt' => time(), ]); OrdersCheckpoints::updateCheckpoint($historys[0]->ord_checkpoint_id, [ 'pocket_is_paid' => OrdersCheckpoints::IS_PAID, 'pocket_paid_at' => $now, // 'pocket_paid_by' => $req->auth->id, 'bank_id' => $order[0]->drv_bank_id, 'bank_name' => $order[0]->drv_bank_name, 'bank_code' => $order[0]->drv_bank_code, 'bank_short_name' => $order[0]->drv_bank_short_name, 'bank_branch_name' => $order[0]->drv_bank_branch_name ?? null, 'bank_acc_name' => $order[0]->drv_bank_acc_name, 'bank_acc_number' => $order[0]->drv_bank_acc_number, 'tf_method' => OrdersCheckpoints::TF_METHOD_DANA, 'tf_at' => $now, 'tf_url' => $url, 'tf_ref_code' => $bodyDana->data->dana_reference_no ?? 0, 'tf_note' => $bodyDana->data->note ?? 0, 'tf_req_data' => json_encode($json), 'tf_resp_data' => json_encode($bodyDana), ]); Dana::updateDana($dana->id, ['amt' => DB::raw('amt-'.$historys[0]->pocket_total)]); } } catch (\GuzzleHttp\Exception\BadResponseException $e) { $respDana = $e->getResponse(); $bodyDana = json_decode($respDana->getBody()->getContents()); // DB::rollBack(); OrdersLogsTf::addLogsTf([ 'ord_id' => $order[0]->ord_id, 'ord_code' => $order[0]->ord_code, 'type' => OrdersLogsTf::TYPE_TF_CHECKPOINT, 'checkpoint_id' => $historys[0]->ord_checkpoint_id, 'amount' => $historys[0]->pocket_total, 'stts' => OrdersLogsTf::STTS_FAIL, 'fail_at' => time(), 'note' => $bodyDana->data->note, 'bank_id' => $order[0]->drv_bank_id, 'bank_name' => $order[0]->drv_bank_name, 'bank_code' => $order[0]->drv_bank_code, 'bank_short_name' => $order[0]->drv_bank_short_name, 'bank_branch_name' => $order[0]->drv_bank_branch_name ?? null, 'bank_acc_name' => $order[0]->drv_bank_acc_name, 'bank_acc_number' => $order[0]->drv_bank_acc_number, 'method' => OrdersLogsTf::METHOD_DANA, 'url' => $url, 'ref_code' => $bodyDana->data->dana_reference_no, 'req_data' => json_encode($json), 'resp_data' => json_encode($bodyDana), 'crt' => time(), 'updt' => time(), ]); OrdersCheckpoints::updateCheckpoint($historys[0]->ord_checkpoint_id, [ 'pocket_is_paid' => OrdersCheckpoints::IS_TF_FAIL, 'pocket_paid_note' => $bodyDana->data->note, 'bank_id' => $order[0]->drv_bank_id, 'bank_name' => $order[0]->drv_bank_name, 'bank_code' => $order[0]->drv_bank_code, 'bank_short_name' => $order[0]->drv_bank_short_name, 'bank_branch_name' => $order[0]->drv_bank_branch_name ?? null, 'bank_acc_name' => $order[0]->drv_bank_acc_name, 'bank_acc_number' => $order[0]->drv_bank_acc_number, 'tf_method' => OrdersCheckpoints::TF_METHOD_DANA, 'tf_at' => $now, 'tf_url' => $url, 'tf_ref_code' => $bodyDana->data->dana_reference_no, 'tf_note' => $bodyDana->data->note, 'tf_req_data' => json_encode($json), 'tf_resp_data' => json_encode($bodyDana), ]); $apiResp = Responses::bad_request('Gagal transfer ke rekening driver'); return (new Response($apiResp, $apiResp['meta']['code'])); } } else { $url = env('API_URL_NODE') . '/order/finance_info_dana_amount'; $guzReq = new GuzzleClient(); $respNode = $guzReq->request('POST', $url, [ 'headers' => [ 'Host' => $_SERVER['SERVER_ADDR'] ?? '127.0.0.1', 'User-Agent' => 'curl/7.65.3', 'Accept' => '*/*', 'Accept-Encoding' => 'gzip, deflate, br', // 'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8', // 'Connection' => 'keep-alive', ], 'json' => [ "trx_code" => $order[0]->ord_code, "drv_name" => $order[0]->drv_name, "pickup_zone_title" => $order[0]->pck_name, "pickup_zone_addr" => $order[0]->pck_addr, "drop_zone_title" => $order[0]->drop_name, "drop_zone_addr" => $order[0]->drop_addr, "pocket_total" => 'Rp'.number_format($historys[0]->pocket_total, 0, ',', '.'), "bank_name" => $order[0]->drv_bank_name, "bank_code" => $order[0]->drv_bank_code, "bank_branch_name" => $order[0]->drv_bank_branch_name ?? '', "bank_acc_name" => $order[0]->drv_bank_acc_name, "bank_acc_no" => $order[0]->drv_bank_acc_number, "admins" => $admins_data ], ]); if ($respNode->getStatusCode() != 200) { DB::rollBack(); $apiResp = Responses::bad_request('gagal mengirim email ke finance'); return (new Response($apiResp, $apiResp['meta']['code'])); } $body = json_decode($respNode->getBody()->getContents()); } DB::commit(); $url = env('API_URL_NODE') . '/order/finance_info_tf_pocket'; $guzReq = new GuzzleClient(); $respNode = $guzReq->request('POST', $url, [ 'headers' => [ 'Host' => $_SERVER['SERVER_ADDR'] ?? '127.0.0.1', 'User-Agent' => 'curl/7.65.3', 'Accept' => '*/*', 'Accept-Encoding' => 'gzip, deflate, br', // 'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8', // 'Connection' => 'keep-alive', ], 'json' => [ "trx_code" => $order[0]->ord_code, "drv_name" => $order[0]->drv_name, "pickup_zone_title" => $order[0]->pck_name, "pickup_zone_addr" => $order[0]->pck_addr, "drop_zone_title" => $order[0]->drop_name, "drop_zone_addr" => $order[0]->drop_addr, "pocket_total" => 'Rp'.number_format($historys[0]->pocket_total, 0, ',', '.'), "bank_name" => $order[0]->drv_bank_name, "bank_code" => $order[0]->drv_bank_code, "bank_branch_name" => $order[0]->drv_bank_branch_name ?? '', "bank_acc_name" => $order[0]->drv_bank_acc_name, "bank_acc_no" => $order[0]->drv_bank_acc_number, "admins" => $admins_data ], ]); if ($respNode->getStatusCode() != 200) { DB::rollBack(); $apiResp = Responses::bad_request('gagal mengirim email ke finance'); return (new Response($apiResp, $apiResp['meta']['code'])); } $body = json_decode($respNode->getBody()->getContents()); $apiResp = Responses::success('Berhasil transfer ulang'); return (new Response($apiResp, $apiResp['meta']['code'])); } catch (\Exception $e) { $apiResp = Responses::error($e->getMessage()); return (new Response($apiResp, $apiResp['meta']['code'])); } } }