Files
accounting_dev_v2/application/controllers/Queueworker.php
T
2026-09-11 16:03:00 +07:00

14 lines
3.2 KiB
PHP

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Queueworker extends CI_Controller
{
public function run($queue='default',$limit=10){if(!$this->input->is_cli_request())show_404();$this->load->library('JobQueueService');$this->jobqueueservice->recoverStale();$worker=gethostname().':'.getmypid();$done=0;for($i=0;$i<min(100,max(1,(int)$limit));$i++){$job=$this->jobqueueservice->reserve($worker,$queue);if(!$job)break;try{$payload=json_decode($job->payload,true);if(!is_array($payload))throw new RuntimeException('Payload job tidak valid.');$this->handle($job->job_type,$payload,$job);$this->jobqueueservice->complete($job->id);$done++;}catch(Throwable$e){$this->jobqueueservice->fail($job,$e);fwrite(STDERR,'Job '.$job->id.': '.$e->getMessage().PHP_EOL);}}echo $done." job selesai.\n";}
public function replay($deadId){if(!$this->input->is_cli_request())show_404();$dead=$this->db->get_where('app_dead_letters',array('id'=>(int)$deadId))->row();if(!$dead)throw new RuntimeException('Dead-letter tidak ditemukan.');$this->load->library('JobQueueService');$id=$this->jobqueueservice->enqueue($dead->job_type,json_decode($dead->payload,true),'replay:'.$dead->job_id.':'.$dead->id.':'.date('YmdHis'),'default',5,3,$dead->company_id);echo 'Dead-letter direplay sebagai job '.$id.PHP_EOL;}
private function handle($type,array$p,$job){
if($type==='asset_depreciation'){$this->load->library('FixedAssetService');$this->fixedassetservice->depreciate((int)$p['asset_id'],$p['through'],(int)$p['user_id'],true);return;}
if($type==='payroll_calculation'){$this->load->library('PayrollService');$this->payrollservice->calculate($p['month'],(int)$p['user_id']);return;}
if($type==='email'||$type==='reminder'){$this->load->library('email');$this->email->from($p['from']??getenv('MAIL_FROM'),$p['from_name']??'Accounting');$this->email->to($p['to']);$this->email->subject($p['subject']);$this->email->message($p['message']);if(!$this->email->send(false))throw new RuntimeException('Email gagal dikirim: '.$this->email->print_debugger(array('headers')));return;}
if($type!=='report_export')throw new RuntimeException('Handler job belum tersedia: '.$type);$filters=$p['filters'];$dir=FCPATH.'uploads/accounting/reports/';if(!is_dir($dir)&&!mkdir($dir,0750,true))throw new RuntimeException('Folder export tidak dapat dibuat.');$format=in_array($p['format'],array('pdf','xlsx','excel'),true)?$p['format']:'csv';$file='RPT-'.$job->id.'-'.date('YmdHis').'.'.($format==='pdf'?'html':'csv');$rows=$this->db->query("SELECT j.tanggal,j.no_ref,j.keterangan,a.kode_akun,a.nama_akun,d.debit,d.kredit FROM journal_details d JOIN journals j ON j.id=d.journal_id JOIN accounts a ON a.id=d.account_id WHERE j.company_id=? AND j.status IN('posted','reversed') AND j.tanggal BETWEEN ? AND ? ORDER BY j.tanggal,j.id,d.id",array((int)$job->company_id,$filters['from'],$filters['to']))->result_array();$h=fopen($dir.$file,'w');if(!$h)throw new RuntimeException('File export tidak dapat ditulis.');if($format==='pdf')fwrite($h,'<html><body><h2>'.html_escape($p['report_code']).'</h2><pre>'.html_escape(json_encode($rows,JSON_PRETTY_PRINT)).'</pre></body></html>');elseif($rows){fputcsv($h,array_keys($rows[0]));foreach($rows as$r)fputcsv($h,$r);}fclose($h);
}
}