mirror of
https://github.com/Bigherollc/wticreatorstudio.git
synced 2026-10-01 09:13:19 -04:00
94 lines
3.1 KiB
PHP
94 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace Modules\Staffpayroll\Services;
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Modules\StaffPayroll\Entities\Invoice;
|
|
use Modules\StaffPayroll\Entities\InvoiceSetting;
|
|
use Modules\StaffPayroll\Repositories\InvoiceRepository;
|
|
use Modules\StaffPayroll\Repositories\InvoiceSettingRepository;
|
|
use Modules\StaffPayroll\Services\InvoiceSettingService;
|
|
use Modules\StudioPlus\Entities\StudioPlusUser;
|
|
use Modules\StudioPlus\Entities\StudioPlusVideo;
|
|
use Modules\StudioPlusWtiiabaddon\Entities\StudioPlusIncentive;
|
|
|
|
class GenerateVideoIncentivesService
|
|
{
|
|
private $invoiceSettingService;
|
|
private $invoiceRepository;
|
|
|
|
public function __construct()
|
|
{
|
|
$invoice = new Invoice;
|
|
$this->invoiceRepository = new InvoiceRepository($invoice);
|
|
|
|
$invoiceSetting = new InvoiceSetting;
|
|
$invoiceSettingRepository = new InvoiceSettingRepository($invoiceSetting);
|
|
$this->invoiceSettingService = new InvoiceSettingService($this->invoiceRepository, $invoiceSettingRepository);
|
|
}
|
|
|
|
public function __invoke()
|
|
{
|
|
$startOfMonth = now()->startOfMonth()->toDateString();
|
|
$lastOfMonth = now()->lastOfMonth()->toDateString();
|
|
|
|
$users = DB::select(DB::raw("
|
|
select
|
|
users.id,
|
|
users.first_name,
|
|
incentives.target_rule,
|
|
incentives.description,
|
|
incentives.amount_value_earned,
|
|
count(videos.id) videos_count
|
|
from
|
|
studio_plus_videos videos
|
|
left join studio_plus_channels channels on channels.id = videos.studio_plus_channel_id
|
|
left join users on users.id = channels.user_id
|
|
left join studio_plus_asins asins on asins.id = videos.studio_plus_asin_id
|
|
inner join studio_plus_incentive_asins IA on IA.studio_plus_asin_id = asins.id
|
|
left join studio_plus_incentives incentives on IA.studio_plus_incentive_id = incentives.id
|
|
left join studio_plus_incentive_categories categories on categories.id = incentives.incentive_category_id
|
|
where
|
|
videos.created_at between '{$startOfMonth}' and '{$lastOfMonth}'
|
|
and categories.name like '%Video Upload Bonus%'
|
|
and videos.status like '%Published To Amazon%'
|
|
group by
|
|
users.id,
|
|
users.first_name,
|
|
incentives.target_rule,
|
|
incentives.description,
|
|
incentives.amount_value_earned
|
|
having
|
|
videos_count > incentives.target_rule;
|
|
"));
|
|
|
|
$this->addIncentiveItem($users);
|
|
}
|
|
|
|
private function addIncentiveItem(array $users): void
|
|
{
|
|
foreach ($users as $user) {
|
|
$newUser = User::query()
|
|
->where('id', $user->id)
|
|
->first();
|
|
|
|
$latestInvoiceNumber = $this->invoiceSettingService->getLatestInvoiceNumber($newUser);
|
|
$invoice = $this->invoiceRepository->getInvoiceOfMonth($newUser, $latestInvoiceNumber);
|
|
|
|
$invoice->items()->updateOrCreate(
|
|
[
|
|
'description' => $user->description,
|
|
],
|
|
[
|
|
'item_no' => 1,
|
|
'name' => 'Video Incentives Bonus',
|
|
'amount' => $user->amount_value_earned,
|
|
'quantity' => 1,
|
|
'issue_date' => now()->toDateString(),
|
|
]
|
|
);
|
|
}
|
|
}
|
|
}
|