3600 lines
135 KiB
PHP
Executable File
3600 lines
135 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Response;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Str;
|
|
use Validator;
|
|
use Hidehalo\Nanoid\Client as Nanoid;
|
|
use GuzzleHttp\Client as GuzzleClient;
|
|
use App\Responses;
|
|
use App\Helper;
|
|
use App\Models\Users;
|
|
use App\Models\Banks;
|
|
use App\Models\Finance;
|
|
use App\Models\Orders;
|
|
use App\Models\OrdersAItems;
|
|
use App\Models\AItems;
|
|
use App\Models\UnitTypes;
|
|
use App\Models\OrdersTermins;
|
|
use App\Models\OrdersInvoices;
|
|
use App\Models\Vehicles;
|
|
use App\Models\Drivers;
|
|
use App\Models\OrdersItems;
|
|
use App\Models\OrdersDriversUploads;
|
|
use App\Models\Dana;
|
|
use App\Models\Checkpoints;
|
|
use App\Models\OrdersLogsTf;
|
|
use App\Models\OrdersCheckpoints;
|
|
use App\Models\DrvPhoneDevices;
|
|
use Barryvdh\DomPDF\Facade\Pdf;
|
|
|
|
class FinanceController extends Controller
|
|
{
|
|
/**
|
|
* VIEW
|
|
*/
|
|
|
|
public function view_finance_download_invoice(Request $req)
|
|
{
|
|
// try {
|
|
$now = time();
|
|
$input = [
|
|
'code' => $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 <br>" . ucwords(strtolower($row->pck_prid_name)) . " - " . ucwords(strtolower($row->drop_prid_name)) . " <br>" . 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 <br>" . ucwords(strtolower($row->pck_prid_name)) . " - " . ucwords(strtolower($row->drop_prid_name)) . " <br>" . 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 <br>" . ucwords(strtolower($row->pck_prid_name)) . " - " . ucwords(strtolower($row->drop_prid_name)) . " <br>" . 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 <br>" . ucwords(strtolower($row->pck_prid_name)) . " - " . ucwords(strtolower($row->drop_prid_name)) . " <br>" . 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<br>" . ucwords(strtolower($mrgFromOrd[0]->pck_prid_name)) . " - " . ucwords(strtolower($mrgFromOrd[0]->drop_prid_name)) . "<br>" . date('d F Y', $mrgFromOrd[0]->set_pck_at) . " WIB<br>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<br>" . ucwords(strtolower($mrgToOrd[0]->pck_prid_name)) . " - " . ucwords(strtolower($mrgToOrd[0]->drop_prid_name)) . "<br>" . date('d F Y', $mrgToOrd[0]->set_pck_at) . " WIB<br>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 . "<br>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']));
|
|
}
|
|
}
|
|
}
|