Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Order Handling in Dashboard #1543

Open
wants to merge 34 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
78aab96
refactor: update widget type from double_number to number_amount for …
inikoo Mar 14, 2025
169e721
fix: Dashboard: column count in org and grp, centering label
aqordeon Mar 14, 2025
0554748
pay status and change hydrator to use pay status
KirinZero0 Mar 14, 2025
4a9fa6b
Merge branch '1542-order-handling-info-in-organisation-dashboard' of …
KirinZero0 Mar 14, 2025
d6071c3
fix: Dashboard: condition column
aqordeon Mar 14, 2025
580062c
Merge branch '1542-order-handling-info-in-organisation-dashboard' of …
aqordeon Mar 14, 2025
a88a4c9
fix: Dashboard: condition column & footer
aqordeon Mar 14, 2025
d113ddd
baskets migrations
KirinZero0 Mar 14, 2025
c8d5109
Merge branch '1542-order-handling-info-in-organisation-dashboard' of …
KirinZero0 Mar 14, 2025
ee7f27e
down logic
KirinZero0 Mar 14, 2025
20af6e9
Registration Intervals
KirinZero0 Mar 14, 2025
6b5ab3b
working on structure of dashboard data
inikoo Mar 14, 2025
73b80f3
refactor dashboard
inikoo Mar 16, 2025
2e442bd
#1542 fix: Dashboard: new Settings
aqordeon Mar 17, 2025
cec54f3
hydrators interval for basket created
Ganes556 Mar 17, 2025
8b6ec30
hydrator basket
Ganes556 Mar 17, 2025
ecddd3b
#1542 apply hydrator
Ganes556 Mar 17, 2025
7ff2c53
#1542 table totals
inikoo Mar 17, 2025
fb1caf2
#1542 table headers
inikoo Mar 18, 2025
354e37a
Merge branch '1542-order-handling-info-in-organisation-dashboard' of …
aqordeon Mar 18, 2025
4921454
#1542 delta columns + reorder columns
inikoo Mar 18, 2025
4762048
#1542 feat: Dashboard: new structrue
aqordeon Mar 18, 2025
63ad548
Merge branch '1542-order-handling-info-in-organisation-dashboard' of …
aqordeon Mar 18, 2025
dce0dae
fix currency in dashboard
Ganes556 Mar 18, 2025
377f842
#1542 reorganise files
inikoo Mar 18, 2025
e1571bd
#1542 feat: Dashboard: new structrue (footer)
aqordeon Mar 18, 2025
718a4b6
Merge remote-tracking branch 'origin/1542-order-handling-info-in-orga…
inikoo Mar 18, 2025
94928bc
#1542 group dashboard
inikoo Mar 18, 2025
92344f6
#1542 fix: Dashboard: label
aqordeon Mar 20, 2025
a7451c9
refactor: Clean up ShowOrganisationDashboard code and improve formatting
inikoo Mar 20, 2025
ba7144b
#1542 fix: Dashboard: conditional column minified
aqordeon Mar 21, 2025
bbb94f2
#1542 fix: Dashboard: setting open/closed
aqordeon Mar 21, 2025
6210896
#1542 fix: Dashboard: setting advanced transition
aqordeon Mar 21, 2025
0386dd7
#1542 feat: add new widget commit by dandi
dandiAW Mar 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

/*
* Author: Raul Perusquia <raul@inikoo.com>
* Created: Sun, 16 Mar 2025 21:12:40 Malaysia Time, Kuala Lumpur, Malaysia
* Copyright (c) 2025, Raul A Perusquia Flores
*/

namespace App\Actions\Accounting\InvoiceCategory;

use App\Actions\OrgAction;
use App\Http\Resources\Dashboards\DashboardInvoiceCategoriesSalesResource;
use App\Models\Accounting\InvoiceCategory;
use App\Models\SysAdmin\Group;
use App\Models\SysAdmin\Organisation;
use App\Services\QueryBuilder;

class IndexInvoiceCategoriesSalesTable extends OrgAction
{
public function handle(Group|Organisation $parent)
{
$queryBuilder = QueryBuilder::for(InvoiceCategory::class);
if (class_basename($parent) == 'Organisation') {
$queryBuilder->where('organisation_id', $parent->id);
} else {
$queryBuilder->where('group_id', $parent->id);
}


return $queryBuilder
->defaultSort('invoice_categories.name')
->select(['id', 'name', 'slug', 'state', 'invoice_categories.currency_id', 'invoice_categories.organisation_id'])
->allowedSorts(['name', 'state'])
->withPaginator(null)
->withQueryString();
}


public function action(Group|Organisation $parent): array
{
if ($parent instanceof Group) {
$this->initialisationFromGroup($parent, []);
} else {
$this->initialisation($parent, []);
}
$shops = $this->handle($parent);

return json_decode(DashboardInvoiceCategoriesSalesResource::collection($shops)->toJson(), true);
}

}
6 changes: 6 additions & 0 deletions app/Actions/CRM/Customer/StoreCustomer.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,17 @@
use App\Actions\Catalogue\Shop\Hydrators\ShopHydrateCrmStats;
use App\Actions\Catalogue\Shop\Hydrators\ShopHydrateCustomerInvoices;
use App\Actions\Catalogue\Shop\Hydrators\ShopHydrateCustomers;
use App\Actions\Catalogue\Shop\Hydrators\ShopHydrateRegistrationIntervals;
use App\Actions\CRM\Customer\Search\CustomerRecordSearch;
use App\Actions\Fulfilment\FulfilmentCustomer\StoreFulfilmentCustomerFromCustomer;
use App\Actions\Helpers\Address\ParseCountryID;
use App\Actions\Helpers\SerialReference\GetSerialReference;
use App\Actions\Helpers\TaxNumber\StoreTaxNumber;
use App\Actions\OrgAction;
use App\Actions\SysAdmin\Group\Hydrators\GroupHydrateCustomers;
use App\Actions\SysAdmin\Group\Hydrators\GroupHydrateRegistrationIntervals;
use App\Actions\SysAdmin\Organisation\Hydrators\OrganisationHydrateCustomers;
use App\Actions\SysAdmin\Organisation\Hydrators\OrganisationHydrateRegistrationIntervals;
use App\Actions\Traits\Rules\WithNoStrictRules;
use App\Actions\Traits\WithModelAddressActions;
use App\Enums\Catalogue\Shop\ShopTypeEnum;
Expand Down Expand Up @@ -144,9 +147,12 @@ public function handle(Shop $shop, array $modelData): Customer

ShopHydrateCrmStats::dispatch($customer->shop)->delay($this->hydratorsDelay);
ShopHydrateCustomers::dispatch($customer->shop)->delay($this->hydratorsDelay);
ShopHydrateRegistrationIntervals::dispatch($customer->shop)->delay($this->hydratorsDelay);
ShopHydrateCustomerInvoices::dispatch($customer->shop)->delay($this->hydratorsDelay);
GroupHydrateCustomers::dispatch($customer->group)->delay($this->hydratorsDelay);
GroupHydrateRegistrationIntervals::dispatch($customer->group)->delay($this->hydratorsDelay);
OrganisationHydrateCustomers::dispatch($customer->organisation)->delay($this->hydratorsDelay);
OrganisationHydrateRegistrationIntervals::dispatch($customer->organisation)->delay($this->hydratorsDelay);

CustomerRecordSearch::dispatch($customer);

Expand Down
2 changes: 2 additions & 0 deletions app/Actions/Catalogue/Shop/HydrateShops.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
use App\Actions\Catalogue\Shop\Hydrators\ShopHydrateInvoiceIntervals;
use App\Actions\Catalogue\Shop\Hydrators\ShopHydrateInvoices;
use App\Actions\Catalogue\Shop\Hydrators\ShopHydrateOrderHandling;
use App\Actions\Catalogue\Shop\Hydrators\ShopHydrateOrderIntervals;
use App\Actions\Catalogue\Shop\Hydrators\ShopHydrateOrders;
use App\Actions\Catalogue\Shop\Hydrators\ShopHydratePaymentAccounts;
use App\Actions\Catalogue\Shop\Hydrators\ShopHydratePayments;
Expand Down Expand Up @@ -80,6 +81,7 @@ public function handle(Shop $shop): void
ShopHydrateCrmStats::run($shop);
ShopHydrateAdjustments::run($shop);
ShopHydrateOrderHandling::run($shop);
ShopHydrateOrderIntervals::run($shop);

}

Expand Down
18 changes: 10 additions & 8 deletions app/Actions/Catalogue/Shop/Hydrators/ShopHydrateOrderHandling.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use App\Actions\Traits\WithEnumStats;
use App\Enums\Dispatching\DeliveryNote\DeliveryNoteStateEnum;
use App\Enums\Dispatching\Picking\PickingStateEnum;
use App\Enums\Ordering\Order\OrderPayStatusEnum;
use App\Enums\Ordering\Order\OrderStateEnum;
use App\Models\Catalogue\Shop;
use Illuminate\Queue\Middleware\WithoutOverlapping;
Expand Down Expand Up @@ -40,6 +41,7 @@ public function getJobMiddleware(): array
public function handle(Shop $shop): void
{
$stats = [
// aka Basket for UI
'number_orders_state_creating' => $shop->orders()->where('state', OrderStateEnum::CREATING)->count(),
'orders_state_creating_amount' => $shop->orders()->where('state', OrderStateEnum::CREATING)->sum('net_amount'),
'orders_state_creating_amount_org_currency' => $shop->orders()->where('state', OrderStateEnum::CREATING)->sum('org_net_amount'),
Expand All @@ -50,15 +52,15 @@ public function handle(Shop $shop): void
'orders_state_submitted_amount_org_currency' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->sum('org_net_amount'),
'orders_state_submitted_amount_grp_currency' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->sum('grp_net_amount'),

'number_orders_state_submitted_paid' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->whereColumn('payment_amount', '>=', 'total_amount')->count(),
'orders_state_submitted_paid_amount' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->whereColumn('payment_amount', '>=', 'total_amount')->sum('net_amount'),
'orders_state_submitted_paid_amount_org_currency' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->whereColumn('payment_amount', '>=', 'total_amount')->sum('org_net_amount'),
'orders_state_submitted_paid_amount_grp_currency' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->whereColumn('payment_amount', '>=', 'total_amount')->sum('grp_net_amount'),
'number_orders_state_submitted_paid' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('pay_status', OrderPayStatusEnum::PAID)->count(),
'orders_state_submitted_paid_amount' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('pay_status', OrderPayStatusEnum::PAID)->sum('net_amount'),
'orders_state_submitted_paid_amount_org_currency' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('pay_status', OrderPayStatusEnum::PAID)->sum('org_net_amount'),
'orders_state_submitted_paid_amount_grp_currency' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('pay_status', OrderPayStatusEnum::PAID)->sum('grp_net_amount'),

'number_orders_state_submitted_not_paid' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('payment_amount', 0)->count(),
'orders_state_submitted_not_paid_amount' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('payment_amount', 0)->sum('net_amount'),
'orders_state_submitted_not_paid_amount_org_currency' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('payment_amount', 0)->sum('org_net_amount'),
'orders_state_submitted_not_paid_amount_grp_currency' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('payment_amount', 0)->sum('grp_net_amount'),
'number_orders_state_submitted_not_paid' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('pay_status', OrderPayStatusEnum::UNPAID)->count(),
'orders_state_submitted_not_paid_amount' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('pay_status', OrderPayStatusEnum::UNPAID)->sum('net_amount'),
'orders_state_submitted_not_paid_amount_org_currency' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('pay_status', OrderPayStatusEnum::UNPAID)->sum('org_net_amount'),
'orders_state_submitted_not_paid_amount_grp_currency' => $shop->orders()->where('state', OrderStateEnum::SUBMITTED)->where('pay_status', OrderPayStatusEnum::UNPAID)->sum('grp_net_amount'),

'number_orders_state_in_warehouse' => $shop->orders()->where('state', OrderStateEnum::IN_WAREHOUSE)->count(),
'orders_state_in_warehouse_amount' => $shop->orders()->where('state', OrderStateEnum::IN_WAREHOUSE)->sum('net_amount'),
Expand Down
62 changes: 62 additions & 0 deletions app/Actions/Catalogue/Shop/Hydrators/ShopHydrateOrderIntervals.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

/*
* Author: Ganes <gustiganes@gmail.com>
* Created on: 17-03-2025, Bali, Indonesia
* Github: https://github.com/Ganes556
* Copyright: 2025
*
*/

namespace App\Actions\Catalogue\Shop\Hydrators;

use App\Actions\Traits\WithIntervalsAggregators;
use App\Enums\Ordering\Order\OrderStateEnum;
use App\Models\Catalogue\Shop;
use App\Models\Ordering\Order;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Lorisleiva\Actions\Concerns\AsAction;

class ShopHydrateOrderIntervals
{
use AsAction;
use WithIntervalsAggregators;

public string $jobQueue = 'sales';

private Shop $shop;

public function __construct(Shop $shop)
{
$this->shop = $shop;
}

public function getJobMiddleware(): array
{
return [(new WithoutOverlapping($this->shop->id))->dontRelease()];
}

public function handle(Shop $shop): void
{

$stats = [];

$queryBase = Order::where('shop_id', $shop->id)->where('state', OrderStateEnum::CREATING)->selectRaw(' count(*) as sum_aggregate');
$stats = $this->getIntervalsData(
stats: $stats,
dateField: 'created_at',
queryBase: $queryBase,
statField: 'baskets_created_'
);

$stats = $this->getIntervalsData(
stats: $stats,
dateField: 'updated_at',
queryBase: $queryBase,
statField: 'baskets_updated_'
);


$shop->orderingIntervals()->update($stats);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php
/*
* author Arya Permana - Kirin
* created on 14-03-2025-16h-40m
* github: https://github.com/KirinZero0
* copyright 2025
*/

namespace App\Actions\Catalogue\Shop\Hydrators;

use App\Actions\Traits\WithIntervalsAggregators;
use App\Enums\Accounting\Invoice\InvoiceTypeEnum;
use App\Models\Accounting\Invoice;
use App\Models\Catalogue\Shop;
use App\Models\CRM\Customer;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Lorisleiva\Actions\Concerns\AsAction;

class ShopHydrateRegistrationIntervals
{
use AsAction;
use WithIntervalsAggregators;

public string $jobQueue = 'sales';

private Shop $shop;

public function __construct(Shop $shop)
{
$this->shop = $shop;
}

public function getJobMiddleware(): array
{
return [(new WithoutOverlapping($this->shop->id))->dontRelease()];
}

public function handle(Shop $shop): void
{

$stats = [];

$queryBase = Customer::where('shop_id', $shop->id)->selectRaw('count(*) as sum_aggregate');
$stats = $this->getIntervalsData(
stats: $stats,
queryBase: $queryBase,
statField: 'registrations_'
);

$shop->orderingIntervals()->update($stats);
}

}
64 changes: 63 additions & 1 deletion app/Actions/Catalogue/Shop/Hydrators/ShopHydrateSales.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@
namespace App\Actions\Catalogue\Shop\Hydrators;

use App\Actions\Traits\WithIntervalsAggregators;
use App\Enums\Ordering\Order\OrderStateEnum;
use App\Models\Accounting\Invoice;
use App\Models\Catalogue\Shop;
use App\Models\Ordering\Order;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Lorisleiva\Actions\Concerns\AsAction;

Expand Down Expand Up @@ -66,10 +68,70 @@ public function handle(Shop $shop, ?array $intervals = null, $doPreviousInterval
doPreviousPeriods: $doPreviousIntervals
);

// basket
$queryBase = Order::where('shop_id', $shop->id)->where('state', OrderStateEnum::CREATING)->selectRaw('sum(net_amount) as sum_aggregate');

$stats = $this->getIntervalsData(
stats: $stats,
dateField: 'created_at',
queryBase: $queryBase,
statField: 'baskets_created_',
intervals: $intervals,
doPreviousPeriods: $doPreviousIntervals
);

$stats = $this->getIntervalsData(
stats: $stats,
dateField: 'updated_at',
queryBase: $queryBase,
statField: 'baskets_updated_',
intervals: $intervals,
doPreviousPeriods: $doPreviousIntervals
);

$queryBase = Order::where('shop_id', $shop->id)->where('state', OrderStateEnum::CREATING)->selectRaw('sum(grp_net_amount) as sum_aggregate');

$stats = $this->getIntervalsData(
stats: $stats,
dateField: 'created_at',
queryBase: $queryBase,
statField: 'baskets_created_grp_currency_',
intervals: $intervals,
doPreviousPeriods: $doPreviousIntervals
);

$stats = $this->getIntervalsData(
stats: $stats,
dateField: 'updated_at',
queryBase: $queryBase,
statField: 'baskets_updated_grp_currency_',
intervals: $intervals,
doPreviousPeriods: $doPreviousIntervals
);

$queryBase = Order::where('shop_id', $shop->id)->where('state', OrderStateEnum::CREATING)->selectRaw('sum(org_net_amount) as sum_aggregate');

$stats = $this->getIntervalsData(
stats: $stats,
dateField: 'created_at',
queryBase: $queryBase,
statField: 'baskets_created_org_currency_',
intervals: $intervals,
doPreviousPeriods: $doPreviousIntervals
);

$stats = $this->getIntervalsData(
stats: $stats,
dateField: 'updated_at',
queryBase: $queryBase,
statField: 'baskets_updated_org_currency_',
intervals: $intervals,
doPreviousPeriods: $doPreviousIntervals
);

$shop->salesIntervals()->update($stats);
}




}
3 changes: 1 addition & 2 deletions app/Actions/Catalogue/Shop/UI/ShowShop.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

namespace App\Actions\Catalogue\Shop\UI;

use App\Actions\Dashboard\ShowOrganisationDashboard;
use App\Actions\Helpers\History\UI\IndexHistory;
use App\Actions\OrgAction;
use App\Actions\SysAdmin\Organisation\UI\ShowOrganisationDashboard;
use App\Actions\Traits\WithDashboard;
use App\Actions\UI\WithInertia;
use App\Enums\CRM\Customer\CustomerStateEnum;
Expand All @@ -19,7 +19,6 @@
use App\Http\Resources\Catalogue\ShopResource;
use App\Http\Resources\History\HistoryResource;
use App\Models\Catalogue\Shop;
use App\Models\CRM\Customer;
use App\Models\SysAdmin\Organisation;
use Illuminate\Support\Arr;
use Inertia\Inertia;
Expand Down
Loading