Compare commits

..

20 Commits

Author SHA1 Message Date
Dillon Ngo 19c4ee4fda Quick fix 2024-07-01 15:00:14 +08:00
Omair Saleh 13f13c7a0e export based on payment date 2024-07-01 13:46:12 +08:00
Omair Saleh ffa63f611b export based on payment date 2024-07-01 13:42:12 +08:00
Omair Saleh 82675ab80c export based on payment date 2024-07-01 13:40:14 +08:00
Omair Saleh aac04c4135 export based on payment date 2024-07-01 13:17:22 +08:00
Omair Saleh 56dca799f8 export based on payment date 2024-07-01 13:13:57 +08:00
Omair Saleh 42d8f811c6 export based on payment date 2024-07-01 13:13:15 +08:00
Omair Saleh 030136fd03 Merge remote-tracking branch 'origin/master' 2024-07-01 12:57:42 +08:00
Omair Saleh c8b6e271e3 export based on payment date 2024-07-01 12:57:23 +08:00
Dillon Ngo f93997b858 Merge branch 'dillon/62.2-benchmarking-yd-api-cron-job' into 'master'
Benchmark cron job for YD API call

See merge request CIEFWorldwideSdnBhd/shipping-portal!232
2024-06-29 07:33:25 +00:00
Dillon Ngo 6fbc23d7c4 Benchmark cron job for YD API call 2024-06-29 15:32:32 +08:00
Dillon Ngo e0a264d58f Merge branch 'dillon/62.2-benchmarking-yd-api-cron-job' into 'master'
Benchmark cron job for YD API call

See merge request CIEFWorldwideSdnBhd/shipping-portal!231
2024-06-29 06:01:54 +00:00
Dillon Ngo fec20b0947 Benchmark cron job for YD API call 2024-06-29 14:01:13 +08:00
Dillon Ngo 0bf61d93c5 Merge branch 'dillon/62.2-benchmarking-yd-api-cron-job' into 'master'
Benchmark cron job for YD API call

See merge request CIEFWorldwideSdnBhd/shipping-portal!230
2024-06-29 03:21:24 +00:00
Dillon Ngo bea24fb48e Benchmark cron job for YD API call 2024-06-29 11:19:55 +08:00
edmondlang 17a4522f50 add transaction counter 2024-06-26 23:52:25 +08:00
edmondlang dfedb99c13 fix bug: customer pay full amount but payment cant go through due to rounding up issue 2024-06-26 23:43:40 +08:00
edmondlang 669cac9bd4 fix-approved-payment-failed-group 2024-06-26 13:47:58 +08:00
edmondlang d7625aece7 update group-transaction-with-completed-payments 2024-06-26 13:07:30 +08:00
edmondlang a36c5c3063 show group-transaction-with-completed-payments 2024-06-26 12:47:44 +08:00
13 changed files with 195 additions and 137 deletions
@@ -13,6 +13,7 @@ use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
class FetchOrdersFromYDPortalJob implements ShouldQueue
{
@@ -29,12 +30,17 @@ class FetchOrdersFromYDPortalJob implements ShouldQueue
*/
public function handle()
{
Log::info('FetchOrdersFromYDPortalJob starts');
Log::info('FetchPackingListsFromYdPortalProcessor starts');
(App()->make(FetchPackingListsFromYdPortalProcessor::class))->execute();
Log::info('FetchContainersFromYdPortalProcessor starts');
(App()->make(FetchContainersFromYdPortalProcessor::class))->execute();
Log::info('FetchContainersUpdatesFromYdPortalProcessor starts');
(App()->make(FetchContainersUpdatesFromYdPortalProcessor::class))->execute();
Log::info('FetchDeliveryUpdatesFromYdPortalProcessor starts');
(App()->make(FetchDeliveryUpdatesFromYdPortalProcessor::class))->execute();
// (App()->make(FetchOrderListsFromYdPortalProcessor::class))->execute();
Log::info('FetchOrdersFromYDPortalJob ends');
// (App()->make(FetchOrderListsFromYdPortalProcessor::class))->execute();
}
}
@@ -31,6 +31,7 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading
return [
'DocNo',
'DocDate',
'PaymentDate',
'DebtorCode',
'Ref',
'ShipInfo',
@@ -59,12 +60,12 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading
{
$start_date = $this->request->input('startDate', null);
if ($start_date) {
$start_date = Carbon::parse($this->request->input('startDate'))->format('Y-m-d');
$start_date = Carbon::parse($start_date)->startOfDay();
}
$end_date = $this->request->input('endDate', null);
if ($end_date) {
$end_date = Carbon::parse($this->request->input('endDate'))->format('Y-m-d');
$end_date = Carbon::parse($end_date)->endOfDay();
}
$query = Transaction::query();
@@ -77,30 +78,31 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading
$approvalStatus = ApprovalStatus::APPROVED;
}
// $query->where('type', TransactionType::SHIPPING_INVOICE)->whereIn('status', [$approvalStatus]);
$query->whereIn('type', [TransactionType::SHIPPING_INVOICE, TransactionType::STORAGE_INVOICE])->whereIn('status', [$approvalStatus]);
// Adjusted the query to include both types and status
$query->whereIn('type', [TransactionType::SHIPPING_INVOICE, TransactionType::STORAGE_INVOICE])
->where('status', $approvalStatus);
if($start_date && $end_date) {
$query->whereBetween('updated_at', [
Carbon::parse($start_date)->format('Y-m-d 0:00:00'),
Carbon::parse($end_date)->format('Y-m-d 23:59:59')
]);
}
elseif($start_date && !$end_date) {
$query->whereHas('transactions', function($transaction) use ($start_date) {
$transaction->where('type', TransactionType::PAYMENT)->where('updated_at', '>=', Carbon::parse($start_date)->format('Y-m-d 0:00:00'));
if ($start_date && $end_date) {
$query->whereHas('transactions', function($transaction) use ($start_date, $end_date) {
$transaction->where('type', TransactionType::PAYMENT)
->whereBetween('updated_at', [$start_date, $end_date]);
});
}
elseif(!$start_date && $end_date) {
} elseif ($start_date) {
$query->whereHas('transactions', function($transaction) use ($start_date) {
$transaction->where('type', TransactionType::PAYMENT)
->where('updated_at', '>=', $start_date);
});
} elseif ($end_date) {
$query->whereHas('transactions', function($transaction) use ($end_date) {
$transaction->where('type', TransactionType::PAYMENT)->where('updated_at', '>=', Carbon::parse($end_date)->format('Y-m-d 0:00:00'));
$transaction->where('type', TransactionType::PAYMENT)
->where('updated_at', '<=', $end_date);
});
}
return $query;
}
public function map($transaction): array
{
$container = $transaction->owner->containers()->first();
@@ -142,6 +144,7 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading
$rows[] = [
$firstItem ? '<<New>>' : '',
$transaction->created_at->format('m/d/Y H:m'),
$transaction->transactions()->where('type', TransactionType::PAYMENT)->first()->updated_at->format('m/d/Y H:m'),
$company->debtor,
$order->reference,
$order->reference,
@@ -166,7 +169,7 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading
return [
'<<New>>',
$transaction->created_at->format('m/d/Y H:m'),
$transaction->transactions()->where('type', TransactionType::PAYMENT)->first()->updated_at->format('m/d/Y H:m'),
$company->debtor,
$order->reference,
$order->reference,
@@ -76,6 +76,7 @@ class FetchDeliveryUpdatesFromYdPortalProcessor
try {
$client = new \GuzzleHttp\Client(['cookies' => true, 'headers' => ['Cookie' => 'utc_offset=480']]);
Log::info('Delivery tracking sTrackingNo: '. $packingList->reference);
$request = $client->request('get', 'https://main.universe.com.my/Tracking/User/Paging?sEcho=1&sTrackingNo='.$packingList->reference.'&sOrgId=sti', ['timeout' => 3]);
$deliveryTracking = json_decode($request->getBody()->getContents());
foreach (array_reverse($deliveryTracking->aaData) as $trackingRow) {
@@ -119,7 +120,7 @@ class FetchDeliveryUpdatesFromYdPortalProcessor
}
}
Log::info('FetchDeliveryUpdatesFromYdPortalProcessor ends');
}
}
@@ -114,7 +114,7 @@ class CreatePaymentTransactionProcessor
/** @var Wallet $wallet */
$wallet = $company_module->wallets()->first();
if((float) number_format(($wallet->amount - $amount),2) < 0){
if((float) number_format(($wallet->amount - $amount),2) < -0.01){
throw new MalformedRequestException('Insufficient wallet balance. Please Top up your wallet.');
}
@@ -0,0 +1,94 @@
<?php
namespace App\Console\Commands;
use App\Classes\Modules\Billplzs\Processors\CallbackBillplzProcessor;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Models\Group;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Http;
class FixApprovedPaymentFailedGroup extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'fix-approved-payment-failed-group';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Fix all payment is approved or completed but group failed to be updated';
protected $output = null;
protected $outputArray = [];
/** @var CallbackBillplzProcessor */
private $callbackBillplzProcessor;
/**
* Create a new command instance.
*
* @return void
*/
public function __construct(CallbackBillplzProcessor $callbackBillplzProcessor)
{
parent::__construct();
$this->callbackBillplzProcessor = $callbackBillplzProcessor;
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
ini_set('memory_limit', '-1');
$this->outputArray = [];
$start = new Carbon();
$groups = Group::whereNotIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
->whereHas('payment', function ($query) {
$query->whereIn('status', [2, 3]);
})->get();
foreach ($groups as $group) {
$transaction = $group->payment;
$response = Http::withBasicAuth(config('billplz.api_key') . ':', '')->get(config('billplz.base_url') . '/api/v3/bills/' . $transaction->payment_reference);
dump($transaction->payment_reference);
if ($response->successful()) {
$data = $response->json();
if ($data['paid']) {
$status = ApprovalStatus::PENDING_VERIFICATION;
if ($data['state'] === 'paid') {
$status = ApprovalStatus::APPROVED;
}
$this->info(Carbon::now() . ' : Fixing ' . $transaction->payment_reference);
$this->callbackBillplzProcessor->execute($transaction, $status);
}
} else {
$this->info("billplz error</br>");
}
}
$end = new Carbon();
$elapsedTime = $start->diff($end)->format('%H:%I:%S');
if ($groups) {
$this->info(Carbon::now() . ' : Done . ElapsedTime: ' . $elapsedTime);
}
}
}
@@ -147,7 +147,7 @@ class TransactionWithStorageResource extends JsonResource
}
private function getReferenceForGroupPayment($groups){
if(count($groups)){
if (is_array($groups) && count($groups) > 0) {
$firstGroup = $groups[0];
return $firstGroup['reference'];
}
+8
View File
@@ -84,4 +84,12 @@ class Group extends Model implements Documentable, Transactionable
{
return $this->BelongsTo(Currency::class, 'original_currency_id', 'id');
}
/**
* @return hasOne
*/
public function payment()
{
return $this->hasOne(Transaction::class, 'payment_reference', 'reference');
}
}
-1
View File
@@ -31,7 +31,6 @@
"vue": "^2.6.10",
"vue-avatar": "^2.1.8",
"vue-debounce": "^2.6.0",
"vue-multi-select": "^4.6.0",
"vue-template-compiler": "^2.6.10",
"vue-the-mask": "^0.11.1",
"vuelidate": "^0.7.4",
@@ -71,43 +71,6 @@
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="row m-b-15">
<div class="col-12 col-md pr-md-1 pb-3 pb-md-0">
<validation-wrapper-component :validator="$v.parameters.pickup_time">
<label>收货时间 Available Hours</label>
<input type="time" class="form-control" name="pickup_time" v-model="parameters.pickup_time">
</validation-wrapper-component>
</div>
<div class="col-12 col-md pl-md-1">
<validation-wrapper-component :validator="$v.parameters.latest_pickup_time">
<label>最晚收货时间 Latest Available Hours</label>
<input type="time" class="form-control" name="latest_pickup_time" v-model="parameters.latest_pickup_time">
</validation-wrapper-component>
</div>
</div>
<div class="row m-b-15">
<div class="col-12 col-md pr-md-1 pb-3 pb-md-0">
<validation-wrapper-component selectable class="m-b-15" :validator="$v.parameters.property_type">
<label class="text-primary">房型 Receiver's Property Type</label>
<select-component :options="propertyOptions" v-model="parameters.property_type"></select-component>
</validation-wrapper-component>
</div>
<div class="col-12 col-md pl-md-1 ">
<tools-required-component></tools-required-component>
</div>
</div>
<div class="col no-padding">
<div class="row">
<div class="col"></div>
<div class="col-12 col-sm-7">
<h6 class="text-right fs-12 text-danger m-b-15 text-right">**kindly reply within 2 hours while warehouse contact to arrange for delivery, otherwise, reschedule of delivery date will apply.</h6>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row" v-if="[7,8].includes($store.getters.getCompanyModuleType)">
@@ -211,19 +174,8 @@
remark: '',
phone: '',
person_in_charge: '',
pickup_time: '',
latest_pickup_time: '',
property_type: '',
tools_required: '',
},
propertyOptions: [
{ id: 1, text: '住家-Landed house' },
{ id: 2, text: '公寓-Condominium (Drop on lobby only)' },
{ id: 3, text: '工厂-Factory' },
{ id: 4, text: '店面-Shop' },
{ id: 5, text: '商场-Shopping Mall (Drop on loading bay only)' },
{ id: 6, text: 'Others' },
],
}
}
},
created(){
@@ -1,59 +0,0 @@
<template>
<div>
<label class="text-primary">卸货工具 Tools required to unload goods</label>
<vue-multi-select
ref="multiSelect"
v-model="values"
:options="options"
:btnLabel="btnLabel"
@open="open"
@close="close"
:selectOptions="data">
<template v-slot:option="{ option }">
<input type="checkbox" :checked="option.selected"/>
<span>{{ option.name }}</span>
</template>
</vue-multi-select>
</div>
</template>
<script>
import vueMultiSelect from 'vue-multi-select';
import 'vue-multi-select/dist/lib/vue-multi-select.css';
export default {
data() {
return {
values: [],
data: [{
list: [
{ name: 'Manpower' },
{ name: 'Forklift' },
{ name: 'None of the above' }
],
}],
options: {
multi: true,
groups: true,
},
};
},
methods: {
open() {
console.log('open');
},
close() {
console.log('close');
},
btnLabel(values) {
if (values.length === 0) {
return 'Select Tools required';
}
return values.map(v => v.name).join(', ');
},
},
components: {
vueMultiSelect,
},
};
</script>
@@ -92,6 +92,22 @@
</div>
</div>
</div>
<div class="row bg-white padding-5" v-if="$store.getters.isSuperAdmin">
<div class="col-auto">
<div class="font-heading fs-8 muted all-caps">Payment Method</div>
<div class="font-heading fs-10">
{{ convertPaymentMethodToText(item.payment_method) }}
</div>
</div>
<div class="col-auto">
<div class="font-heading fs-8 muted all-caps">Created At</div>
<div class="font-heading fs-10">{{ item.created_at }}</div>
</div>
<div class="col-auto">
<div class="font-heading fs-8 muted all-caps">Updated At</div>
<div class="font-heading fs-10">{{ item.updated_at }}</div>
</div>
</div>
<div class="row b-t b-grey" v-if="expandPaymentDetails">
<div class="col bg-white padding-15">
<!-- <div class="row align-items-end m-b-10 text-success bold">
@@ -198,6 +214,17 @@
this.expandPaymentDetails = !this.expandPaymentDetails;
}
},
convertPaymentMethodToText(number) {
var paymentMethods = {
1: "CASH",
2: "CHEQUE",
3: "BA",
4: "WALLET",
5: "PAYMENT_GATEWAY"
};
return paymentMethods[number] || "Unknown Payment Method";
},
},
mixins: [componentHandler]
}
@@ -19,10 +19,6 @@ export default {
remark: {},
phone: {required, numeric},
person_in_charge: { required },
pickup_time: { required },
latest_pickup_time: { required },
property_type: {},
tools_required: {},
}
},
mixins: [addressFormHandler]
+31
View File
@@ -34,6 +34,7 @@ use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Crypt;
use App\Models\Container;
use App\Models\Group;
use App\Models\Transaction;
use App\Models\Wallet;
use Illuminate\Support\Facades\DB;
@@ -1271,6 +1272,8 @@ Route::get('/payment-and-billing-2', function () {
Route::get('/show-all-extra-payments', function () {
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 0);
$transactionCounter = 0;
$invoices = Transaction::where('type', TransactionType::SHIPPING_INVOICE)
->where('status', ApprovalStatus::COMPLETED)
@@ -1300,6 +1303,7 @@ Route::get('/show-all-extra-payments', function () {
if (($paidAmount <= $invoice->amount) || ($paidAmount - $invoice->amount < 0.01)) {
continue;
}
$transactionCounter += 1;
echo '<tr>';
echo '<td>' . $invoice->type . '</td>';
@@ -1310,8 +1314,35 @@ Route::get('/show-all-extra-payments', function () {
echo '</tr>';
}
echo '</table>';
echo'<br> Total: ' . $transactionCounter;
});
Route::get('/segments', function (Request $request) {
return view('pages.segments.index');
})->name('segments');
Route::get('/group-transaction-with-completed-payments', function () {
$groups = Group::whereNotIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
->whereHas('payment', function ($query) {
$query->whereIn('status', [2, 3]);
})->get();
foreach ($groups as $group) {
$groupPayment = $group->payment;
$order = $group->groupTransactions->first()->transaction->owner->owner;
$companyModule = $order->companyModule;
$connection = $companyModule->connections()->first();
$companyMarking = $connection ? $connection->invitee_reference : '';
dump([
'reference' => $group->reference,
'groupPayment_id' => $groupPayment->id,
'groupPayment_status' => $groupPayment->status,
'order' => $order->reference,
'companyMarking' => $companyMarking,
]);
echo '<tr><td><a target="_blank" href="' . route('customer.payment-and-billing', $companyMarking) . '">' . $companyMarking . '</a><br></td></tr>';
}
});