Files
wticreatorstudio/Modules/StaffPayroll/Services/GenerateVideoIncentivesService.php
T
2024-02-12 22:54:20 -05:00

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(),
]
);
}
}
}