Merge branch 'master' of gitlab.com:CIEFWorldwideSdnBhd/exchange-2.0 into dillon/accounting-bank-mapping

 Conflicts:
	routes/web.php
This commit is contained in:
Omair Saleh
2023-05-16 12:17:43 +08:00
22 changed files with 365 additions and 28 deletions
+19 -1
View File
@@ -2,6 +2,7 @@
namespace App\Classes\General;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
@@ -24,4 +25,21 @@ class Helper
return array_slice(get_class_methods($className), 1);
}
}
/**
* @param $log
* @return array
*/
static function debugLoggerForPerfexCRM($log){
if($log){
$message = $log['message'];
$substring = 'No data were found';
if (isset($message)) {
if (strpos($message, $substring) !== false) {
// Log::info('Message exist');
} else {
Log::info($log['message']);
}
}
}
}
}
+7 -1
View File
@@ -19,6 +19,7 @@ use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
use App\Classes\General\Helper;
class UpdatePerfexCRMInvoice implements ShouldQueue
{
@@ -60,7 +61,12 @@ class UpdatePerfexCRMInvoice implements ShouldQueue
if(is_null($invoice)){
$result = (App()->make(CreatePerfexCRMInvoiceProcessor::class))->execute($transaction, null, null, $this->updatePerfexCRMInvoiceObject->getIsPaid());
$invoiceId = $result->payload['id'];
if ($result) {
$invoiceId = $result->payload['id'];
} else {
// Log::error(json_encode('UpdatePerfexCRMInvoice CreatePerfexCRMInvoiceProcessor failed'));
Helper::debugLoggerForPerfexCRM('UpdatePerfexCRMInvoice CreatePerfexCRMInvoiceProcessor failed');
}
}
else{
$invoiceId = $invoice->id;
@@ -11,7 +11,7 @@ use App\Classes\Modules\Announcements\Services\CreatesAnnouncement;
use App\Classes\Modules\Announcements\Processors\AssignAnnouncementToSegmentProcessor;
use App\Http\Resources\AnnouncementResource;
use Carbon\Carbon;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -67,8 +67,8 @@ class CreateAnnouncementLogic extends AbstractControllerLogic
$annoucement_object = new AnnouncementObject(
$request->input('title'),
$request->input('description'),
$request->input('starting_on'),
$request->input('ending_on')
Carbon::createFromFormat('d-m-Y', $request->input('starting_on'))->format('Y-m-d H:i:s'),
Carbon::createFromFormat('d-m-Y', $request->input('ending_on'))->format('Y-m-d H:i:s')
);
$this->canCreateAnnouncement->passes($annoucement_object);
@@ -10,7 +10,7 @@ use App\Classes\Modules\Announcements\Services\FetchesAnnouncement;
use App\Classes\Modules\Announcements\Services\UpdatesAnnouncement;
use App\Http\Resources\AnnouncementResource;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -66,8 +66,8 @@ class UpdateAnnouncementLogic extends AbstractControllerLogic
$annoucement_object = new AnnouncementObject(
$request->input('title'),
$request->input('description'),
$request->input('starting_on'),
$request->input('ending_on')
Carbon::createFromFormat('d-m-Y', $request->input('starting_on'))->format('Y-m-d H:i:s'),
Carbon::createFromFormat('d-m-Y', $request->input('ending_on'))->format('Y-m-d H:i:s')
);
$this->canUpdateAnnouncement->passes($annoucement_object);
@@ -91,7 +91,7 @@ class CallbackBillplzLogic
$status = $billplzXSignatureObject->getStatus() === 'failed' ? ApprovalStatus::REJECTED : ApprovalStatus::PENDING_VERIFICATION;
}
if($transaction->status !== ApprovalStatus::COMPLETED){
if($transaction->status !== ApprovalStatus::COMPLETED && $transaction->status !== ApprovalStatus::APPROVED){
if($transaction->owner instanceof Wallet && $transaction->status !== ApprovalStatus::APPROVED && $status === ApprovalStatus::APPROVED) {
$this->updatesWalletBalance->execute($transaction->owner, $transaction->amount);
@@ -4,6 +4,7 @@ namespace App\Classes\Modules\Billplzs\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Log;
class CreatesBillplzBill
@@ -26,7 +27,7 @@ class CreatesBillplzBill
$response = Http::withBasicAuth(config('billplz.api_key').':', '')->post(config('billplz.base_url').'/api/v3/bills', [
'collection_id' => $wallet ? config('billplz.wallet_collection_id') : config('billplz.collection_id'),
'name' => $name,
'email' => $email,
'email' => App::environment('production') ? $email : 'development@cief-malaysia.com',
'description' => $description,
'amount' => $this->finalizeAmount($amount),
'redirect_url' => route('online_payment.redirect'),
@@ -65,7 +65,7 @@ class AutoPurchaseOrderFillLogic extends AbstractControllerLogic
public function logic(Request $request) : JsonResponse
{
$bookings = Booking::where('service_id', '!=', 4)->where(function($query){
return $query->whereMonth('created_at', '>', 07)->whereYear('created_at', 2022);
return $query->whereMonth('created_at', '<', 03)->whereYear('created_at', 2023);
})->whereDoesntHave('transactions', function($q){
$q->where('type', TransactionType::PURCHASE_ORDER);
$q->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED]);
@@ -0,0 +1,23 @@
<?php
namespace App\Classes\Modules\Imports\Services;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
class GenericImport implements ToCollection, WithHeadingRow
{
function headingRow(): int { return 1; }
public $rows;
/**
* @param Collection $collection
*/
public function collection(Collection $collection)
{
$this->rows = $collection;
}
}
@@ -5,6 +5,7 @@ namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
use App\Classes\General\Helper;
class FetchesPerfexCRMTask
{
@@ -38,7 +39,8 @@ class FetchesPerfexCRMTask
return (object) $data;
}else{
Log::error($response);
// Log::error($response);
Helper::debugLoggerForPerfexCRM($response);
return null;
}
}catch(\Exception $exception){
@@ -6,6 +6,7 @@ use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
use App\Classes\ValueObjects\Constants\PerfexCRMCustomFields;
use App\Classes\General\Helper;
class UpdatesPerfexCRMCustomer
{
@@ -37,7 +38,8 @@ class UpdatesPerfexCRMCustomer
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
// Log::error($response);
Helper::debugLoggerForPerfexCRM($response);
return null;
}
}catch(\Exception $exception){
@@ -2,7 +2,7 @@
namespace App\Http\Controllers\Bookings;
use App\Classes\Modules\Accounts\ControllersLogic\DeleteBookingLogic;
use App\Classes\Modules\Bookings\ControllersLogic\DeleteBookingLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -0,0 +1,116 @@
<?php
namespace App\Http\Controllers\Imports;
use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
use App\Classes\Modules\Imports\Services\GenericImport;
use App\Classes\Modules\Segments\DataTransferObjects\SeasonalSegmentObject;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Models\Segment;
use App\Models\User;
use Carbon\Carbon;
use DateTime;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use App\Classes\Modules\Segments\Services\CreatesSeasonalSegment;
use App\Classes\Modules\Companies\Processors\AssignSegmentProcessor;
use App\Models\SeasonalSegment;
class ImportHoneyTrapController
{
/**
* @param Request $request
* @return array
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function import(Request $request)
{
$object = new DocumentObject('', $request->input('files'), '', ApprovalStatus::APPROVED, 'imports');
$file = json_decode($object->getFiles()[0])->file_info->original->file;
$import = new GenericImport();
Excel::import($import, $file);
$excelRows = $import->rows;
$excelRows = $excelRows->toArray();
$returnArray = [];
$segment_id = Segment::where('name', 'honey trap platinum')->first()->id;
foreach ($excelRows as $row) {
if (is_null($row['email']) || empty($row['email'])) {
continue;
}
if (is_null($row['end_date']) || empty($row['end_date'])) {
// use csv import must have an end_date
$row['status'] = 'failed';
$row['message'] = 'End Date is required';
$returnArray[] = $row;
continue;
}
$row['end_date'] = $end_date = $this->changeExcelDate($row['end_date']);
$start_date = $row['start_date'] ? $this->changeExcelDate($row['start_date']) : Carbon::now();
$row['start_date'] = $start_date;
$end_date = Carbon::parse($end_date);
// Check if the end_date is in the past
if ($end_date->isPast()) {
// end_date must be after today's date
$row['status'] = 'failed';
$row['message'] = "End Date must be after today's date";
$returnArray[] = $row;
continue;
}
$user = User::where('email', $row['email'])->first();
if (!$user) {
// if user not found
$row['status'] = 'failed';
$row['message'] = 'Email not found';
$returnArray[] = $row;
continue;
}
$company = $user->company->first();
if (!$company) {
// if company not found
$row['status'] = 'failed';
$row['message'] = 'Company not found';
$returnArray[] = $row;
continue;
}
$company_seasonal_honey_trap_count = SeasonalSegment::where('company_id', $company->id)->where('segment_id', $segment_id)->get();
if (count($company_seasonal_honey_trap_count)) {
// seasonal segment already exists
$row['status'] = 'failed';
$row['message'] = 'Company is already in the Honey Trap Segment';
$returnArray[] = $row;
continue;
}
$seasonalSegmentObject = new SeasonalSegmentObject($company->id, $segment_id, $start_date, $end_date ?? null);
(App()->make(createsSeasonalSegment::class))->execute($seasonalSegmentObject);
(App()->make(assignSegmentProcessor::class))->execute($company, $segment_id);
// success added honey trap seasonal segment
$row['status'] = 'success';
$row['message'] = '';
$returnArray[] = $row;
continue;
}
return response()->json($returnArray);
}
public function changeExcelDate($date)
{
$unixTime = (($date - 25569) * 86400);
$date = new DateTime("@$unixTime");
return $date->format('d/m/Y');
}
}
+2 -2
View File
@@ -20,8 +20,8 @@ class AnnouncementResource extends JsonResource
'title' => $this->title,
'description' => $this->description,
'segments' => $this->segments,
'starting_on' => Carbon::parse($this->starting_on)->format('Y-m-d'),
'ending_on' => Carbon::parse($this->ending_on)->format('Y-m-d'),
'starting_on' => Carbon::parse($this->starting_on)->format('d-m-Y'),
'ending_on' => Carbon::parse($this->ending_on)->format('d-m-Y'),
'created_at' => Carbon::parse($this->created_at)->format('d-m-Y'),
];
}
+5 -1
View File
@@ -123,7 +123,11 @@ button:focus{
button:disabled {
cursor: not-allowed;
}
}
.not-allowed {
cursor: not-allowed;
}
/*
Alternate buttons
--------------------------------------------------
@@ -128,7 +128,7 @@
</div>
<div class="row p-t-5">
<div class="col">
<currency-converter-component :data="serviceType" :section="section" :id="data.id" v-on:newCalculation="updateCalculation($event)"></currency-converter-component>
<currency-converter-component :companySegment="data.segments" :data="serviceType" :section="section" :id="data.id" v-on:newCalculation="updateCalculation($event)"></currency-converter-component>
</div>
</div>
<div class="row p-b-15" v-if="(summary.calculation.total > 0 && (data.status === 1 || data.status === 2)) || ($store.getters.isAdmin && summary.calculation.total > 0)">
@@ -110,8 +110,8 @@
<div class="row m-l-0 m-r-0">
<div class="col no-padding">
<div class="form-group form-group-default m-b-0">
<label>You'r Sending</label>
<input id="cc_sending" name="cc_sending" type="text" placeholder="0.00" value="0.00" v-model="senderInput" class="form-control" @keyup="updateAmount($event, 0)" v-money="money">
<label>You're Sending</label>
<input id="cc_sending" name="cc_sending" type="text" placeholder="0.00" value="0.00" v-model="senderInput" class="form-control" :class="[{'not-allowed': disabledMyr}]" @keyup="updateAmount($event, 0)" v-money="money" :disabled="disabledMyr">
</div>
</div>
<div class="col-auto bg-primary text-white">
@@ -178,6 +178,10 @@
required: true,
type: Object
},
companySegment: {
required: true,
type: Array
},
id: {
required: true,
type: Number
@@ -211,6 +215,20 @@
created(){
this.serviceType = this.data;
},
computed: {
currentSegmentNames(){
return this.companySegment.map(function (value){
return value.name;
})
},
disabledMyr(){
if (!this.currentSegmentNames.includes('enable enter MYR rate')) {
return true;
}
return false;
},
},
watch: {
data: {
handler: function (val) {
@@ -0,0 +1,94 @@
<template>
<div class="row">
<div class="col">
<div class="row" @keyup.enter="submitForm">
<div class="col ml-md-3 ml-0 mt-md-0 mt-3 bg-white padding-15">
<loading-component style="height: 200px; top: 0;" key="1" color="success" v-show="$store.getters.isLoading(section)"></loading-component>
<div class="row" v-show="!$store.getters.isLoading(section)" v-if="!returnData">
<div class="col">
<div class="row m-b-10">
<div class="col">
<div class="font-heading fs-16 all-caps bold m-b-15">Upload Honey Trap Csv</div>
</div>
</div>
<error-message-component class="m-b-20" :error="error"></error-message-component>
<div class="row">
<div class="col">
<file-input-component :validator="$v.files" v-model="files">
<template slot="label">
<div class="font-heading fs-11 text-primary all-caps">Honey Trap Csv</div>
</template>
</file-input-component>
</div>
</div>
<div class="row m-t-20">
<div class="col">
<div class="row">
<div class="col">
<button type="button" class="btn btn-block p-t-10 p-b-10 p-r-35 p-l-35 btn-success b-rad-none" @click="submitForm">Upload & Update</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div v-if="returnData">
<div class="font-heading fs-16 all-caps bold m-b-15">Uploaded Customer</div>
<table class="w-100 table table-bordered">
<tr class="thead-dark">
<th class="text-capitalize" v-for="key in returnDataKeys"> {{ key }}</th>
</tr>
<tr v-for="row in returnData">
<td v-for="col in row" :class="[{'text-danger': row['status'] == 'failed'}]">
{{ col }}
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import ModalFromHandler from '../../../general/mixins/modalFormHandler'
import { required } from "vuelidate/lib/validators";
export default {
data(){
return {
files: [],
parameters: {},
returnData: null
}
},
validations: {
files: {
required
}
},
computed: {
returnDataKeys() {
return Object.keys(Object.assign({}, this.returnData[0]))
},
},
methods: {
submitForm(){
this.parameters = {
files: this.files
};
this.submit(this.route('api.honey_trap.upload'), 'post', this.section, true, false);
},
errorHandler(error){
console.log(error);
},
successHandler(response) {
console.log(response);
this.returnData = response;
console.log(this.returnDataKeys);
},
},
mixins: [ModalFromHandler]
}
</script>
@@ -6,7 +6,6 @@
<div class="row">
<div class="col p-r-0">
<div class="form-group no-margin form-group-default b-rad-none">
<!-- <label class="text-primary">Marking</label> -->
<label class="font-heading all-caps fs-8 muted">Marking</label>
<input type="text" class="form-control" v-model="marking" />
</div>
@@ -45,7 +44,6 @@
},
methods: {
search() {
console.log('sd');
this.options['reference_like'] = this.marking;
console.log(this.options);
this.currentKey+=1;
@@ -32,16 +32,16 @@
</div>
<div class="row m-b-20">
<div class="col-6">
<div class="col-6 p-r-0">
<validation-wrapper-component :validator="$v.parameters.starting_on">
<label>Start Date</label>
<input type="date" v-model="parameters.starting_on">
<date-picker-component v-model="parameters.starting_on"></date-picker-component>
</validation-wrapper-component>
</div>
<div class="col-6">
<div class="col-6 p-l-0">
<validation-wrapper-component :validator="$v.parameters.ending_on">
<label>End Date</label>
<input type="date" v-model="parameters.ending_on">
<date-picker-component v-model="parameters.ending_on"></date-picker-component>
</validation-wrapper-component>
</div>
</div>
@@ -0,0 +1,12 @@
@extends('layouts.base_portal')
@section('inner_content')
<div class="row d-none" :class="[{'d-flex': $store.getters.isAdmin}]" v-if="$store.getters.isAdmin">
<div class="col">
<div class="row m-b-20">
<div class="col">
<upload-honey-trap-csv-component section="uploadHoneyTrapCsvComponent"></upload-honey-trap-csv-component>
</div>
</div>
</div>
</div>
@endsection
+1
View File
@@ -29,6 +29,7 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function
Route::get('/storage/{fileName}/fetch', 'Documents\RenderDocumentController@fileStorageServe')->where(['fileName' => '.*'])->name('storage.document.file');
Route::post('/import/update-debtor/f614e339d7058904a831aad742e24d55', 'Imports\ImportUpdateDebtorController@import')->name('debtor.import');
Route::post('/import/upload-honey-trap', 'Imports\ImportHoneyTrapController@import')->name('honey_trap.upload');
require __DIR__ . '/company.php';
+44 -2
View File
@@ -20,6 +20,7 @@ use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\Modules\Documents\Services\CreatesFiles;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
use App\Classes\Modules\Documents\Services\CreatesDocument;
use Spatie\Activitylog\Models\Activity;
use Webklex\PDFMerger\Facades\PDFMergerFacade as PDFMerger;
use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
use App\Classes\Modules\Bookings\Processors\CreatePurchaseOrderFor1688OrderProcessor;
@@ -405,11 +406,13 @@ Route::get('/wallet/audit', function (Request $request) {
if((int) $transaction->type === TransactionType::PAYMENT) $payments += (float) $transaction->amount;
if((int) $transaction->type === TransactionType::DEBIT_NOTE) $debit += (float) $transaction->amount;
}
if((round((float) $wallet->amount - (($topups + $credit) - ($payments + $debit)), 2) == 0) AND $wallet->amount > -0.01) continue;
$auditBalance = ($topups + $credit) - ($payments + $debit);
$diffenrence = round((float) $wallet->amount - (($topups + $credit) - ($payments + $debit)), 2);
if((($diffenrence == 0) || ($diffenrence == -0)) AND $wallet->amount > -0.01) continue;
$i++;
echo $i.". Marking: ". $wallet->owner->reference ."(".$wallet->id.")<br>Current Balance: ". $wallet->amount ."<br>Audit Balance: ". (($topups + $credit) - ($payments + $debit)) ."<br>Difference: ". round((float) $wallet->amount - (($topups + $credit) - ($payments + $debit)), 2) ."<br><br><br>";
echo $i.". Marking: ". $wallet->owner->reference ."(".$wallet->id.")<br>Current Balance: ". $wallet->amount ."<br>Audit Balance: ". ($auditBalance) ."<br>Difference: ". $diffenrence ."<br><br><br>";
}
});
@@ -569,6 +572,45 @@ Route::get('/statements/mapping/rerun', [BankStatementController::class, 'rerun'
Route::get('/statements/{statement}/download', 'StatementController@download')->name('statements.download');
Route::get('/bank-record', 'Imports\ImportBankRecordController@import');
Route::get('/po/outsource/check', function(){
$bookings = Booking::whereIn('marking', [34735, 43980, 35339, 28104, 40185, 46648, 34192, 21512, 84607, 31319, 23566, 48372, 59239, 72665, 81127, 46881, 41055, 67368, 41817, 60443, 28958, 46782, 98512, 43356, 78469, 88173, 52592, 77036, 76750, 77732, 31980, 57146, 38544, 78567, 98297, 90128, 43680, 86478, 80340, 41961, 26857, 33992, 79929, 53226, 88107, 31187, 68015, 43762, 34928, 55525, 44528, 57146, 31980, 27399, 63141, 74987, 85935, 37032, 95911, 59511, 47395, 97293, 43906, 74944, 53418, 61988, 81406, 83889, 83359, 66896, 21425, 61124, 23536, 56129, 21116, 64213, 72950, 20502, 20067, 64213, 59854, 44783, 35681, 74828, 28179, 32961, 46412, 99908, 49008, 77655, 45250, 65047, 37167, 90598, 26275, 58013, 38994, 63187, 33219, 52669, 79885, 74828, 91775, 29282, 46781, 96415, 36318, 84491, 32659, 23846, 38994, 65329, 25936, 68209, 72866, 63231, 32216, 82977, 24819, 32600, 38019, 80872, 65505, 37236, 82262, 30815, 59033, 46776, 87317, 89548, 36548, 54468, 35340, 98242, 29234, 47129, 67047, 64210, 36698, 39353, 86435, 65240, 37116, 71007, 40148, 88187, 76368, 91155, 57040, 95456, 29961, 66447, 43023, 29396, 30637, 60789, 84221, 35805, 44552, 35524, 43457, 22810, 83545, 92252, 83603, 59797, 40526, 32520, 71011, 95151, 90464, 78629, 61225, 74864, 73518, 53793, 26478, 57640, 43674, 23476, 76683, 23920, 22810, 44603, 56291, 23580, 94241, 51565, 83769, 63123, 58369, 99399, 41098, 60942, 69442, 80963, 48392, 73169, 59764, 66099, 21107, 33029, 38288, 32223, 55931, 43685, 24267, 83865, 52066, 61501, 83210, 20731, 55951, 82502, 66618, 62216, 22020, 42402, 99644, 35305, 49263, 37387, 73928, 92279, 26445, 83497, 96740, 38374, 29273, 94073, 99785, 21502, 51269, 31609, 97369, 73078, 28982, 64902, 41380, 87008, 59377, 39441, 81341, 62750, 29410, 85975, 37215, 43386, 80627, 79967, 81729, 81738, 58658, 40579, 56179, 37548, 72436, 77165, 32069, 97447, 84575, 49167, 45507, 96371, 90835, 27942, 87691, 30431, 47815, 82960, 43228, 87534, 93737, 98938, 69548, 82923, 48463, 24385, 96569, 53812, 32926, 54418, 34399, 53189, 49377, 27036, 68832, 72799, 76120, 78203, 87009, 86992, 97722, 96262, 95551, 77632, 54408, 33931, 62397, 58343, 52347, 59419, 50339, 54941, 31199, 92385, 90028, 90379, 43070, 25357, 24591, 60276, 91851, 96371, 81886, 24377, 21236, 66737, 93637, 85844, 23130, 75659, 27318, 43587, 46555, 28903, 44930, 52377, 20387, 40705, 79255, 29196, 30968, 76319, 54600, 29881, 37920, 43319, 35893, 65863, 33102, 71589, 45905, 49031, 97435, 70157, 78795, 47570, 71881, 92076, 45847, 35957, 58785, 84896, 65918, 25550, 49031, 50624, 83286, 63111, 21402, 56300, 77238, 21271, 21984, 30500, 76170, 95325, 22888, 84895, 26100, 84952, 49302, 41944, 43703, 84028, 53672, 49162, 28342, 47182, 70484, 59467, 85415, 20202, 97967, 58011, 85807, 79868, 81192, 86985, 43867, 47473, 28063, 68849, 61628, 96641, 37285, 58384, 86505, 51720, 63951, 91958, 28082, 46229, 57439, 55178, 96813, 34444, 28100, 75967, 33204, 75922, 68707, 71960, 34769, 29161, 49088, 79773, 91131, 53033, 77611, 81034, 72625, 36273, 78240, 34647, 21838, 73195, 83282, 60911, 29019, 98859, 44064, 82113, 51118, 54681, 59751, 64347, 21623, 47023, 62168, 23466, 62137, 85432, 85043, 41984, 30417, 40616, 97170, 69106, 81484, 68902, 78149, 62438, 67710, 57370, 99207, 64271, 33959, 60821, 51292, 44130, 28469, 77069, 91088, 47702, 89046, 84958, 41601, 99752, 72976, 26393, 85548, 32920, 86353, 97430, 71507, 36667, 57059, 71148, 44588, 35807, 80213, 89884, 76616, 35999, 79860, 37284, 72249, 32885, 70622, 47036, 97366, 60483, 89171, 37048, 34227, 76290, 46761, 31389, 73977, 54421, 87527, 75925, 68236, 31131, 43871, 54753, 90896, 41653, 82304, 87123, 80391, 42368, 35553, 60587, 30941, 31843, 25076])
->get();
$averageItems = 5;
$totalItems = 0;
$pay = 0;
foreach ($bookings as $booking){
$po = $booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::PENDING_VERIFICATION])->first();
if(!$po){
echo '<span style="color: red">'.$booking->marking.' Purchase order not found!</span><br>';
continue;
}
// $items = $po->transactionDetails()->get();
//
// foreach ($items as $item){
// $activity = Activity::where('causer_id', 4332)->where('subject_id', $item->id)->where('subject_type', \App\Models\TransactionDetail::class)->get();
// if($activity) {
// $totalItems++;
// }
// }
// // check activities by user
$itemsCount = $po->transactionDetails()->count();
$totalItems += $itemsCount;
$sum = $itemsCount / $averageItems;
$pay += $sum < 1 ? 1 : round($sum);
}
echo '<h3>Total Items: '.$totalItems.'</h3>';
echo '<h3>Total Pay: '.$pay.'</h3>';
});
Route::get('/upload-honey-trap', function () {
return view('pages.honey_trap');
})->name('upload_honey_trap');