load->library(array('NumberingService','PostingService','AccountMappingService','FiscalPeriodService'));} public function index(){$q=$this->db->order_by('is_active','DESC')->order_by('name');if($this->db->field_exists('company_id','suppliers'))$q->where('company_id',$this->companycontext->id());$data=array('active_menu'=>'suppliers','rows'=>$q->get('suppliers')->result());$this->load->view('partials/header',$data);$this->load->view('suppliers/index',$data);$this->load->view('partials/footer');} public function save(){if(strtoupper($this->input->method())!=='POST')show_404();$data=$this->payload();$this->assertUnique($data['supplier_code']);if($data['opening_balance']>0&&!$data['opening_balance_date'])throw new BusinessException('Tanggal saldo awal wajib diisi.');$this->db->trans_begin();try{if($this->db->field_exists('company_id','suppliers'))$data['company_id']=$this->companycontext->id();$data['created_by']=(int)$this->session->userdata('user_id');$data['created_at']=$data['updated_at']=date('Y-m-d H:i:s');$this->db->insert('suppliers',$data);$id=(int)$this->db->insert_id();if($data['opening_balance']>0)$this->opening($id,$data);if(!$this->db->trans_status())throw new RuntimeException('Gagal menyimpan supplier.');$this->db->trans_commit();$this->session->set_flashdata('success','Supplier berhasil ditambahkan.');redirect('suppliers');}catch(Throwable$e){$this->db->trans_rollback();show_error($e->getMessage(),422);}} public function update($id){if(strtoupper($this->input->method())!=='POST')show_404();$old=$this->find((int)$id);$data=$this->payload(false);$this->assertUnique($data['supplier_code'],(int)$old->id);$data['updated_at']=date('Y-m-d H:i:s');$this->scope((int)$id)->update('suppliers',$data);log_activity('suppliers','update','Memperbarui supplier '.$data['supplier_code'].' - '.$data['name'],'success');$this->session->set_flashdata('success','Data supplier berhasil diperbarui.');redirect('suppliers');} public function update_status($id){if(strtoupper($this->input->method())!=='POST')show_404();$s=$this->find((int)$id);$active=$s->is_active?0:1;$this->scope((int)$id)->update('suppliers',array('is_active'=>$active,'updated_at'=>date('Y-m-d H:i:s')));log_activity('suppliers','update',($active?'Mengaktifkan':'Menonaktifkan').' supplier '.$s->supplier_code.' - '.$s->name,'success');$this->session->set_flashdata('success','Supplier berhasil '.($active?'diaktifkan.':'dinonaktifkan. Histori transaksi tetap tersimpan.'));redirect('suppliers');} private function payload($opening=true){$email=trim((string)$this->input->post('email',true));if($email!==''&&!filter_var($email,FILTER_VALIDATE_EMAIL))throw new BusinessException('Format email supplier tidak valid.');$d=array('supplier_code'=>strtoupper(trim((string)$this->input->post('supplier_code',true))),'name'=>trim((string)$this->input->post('name',true)),'tax_number'=>trim((string)$this->input->post('tax_number',true)),'address'=>trim((string)$this->input->post('address',true)),'contact_person'=>trim((string)$this->input->post('contact_person',true)),'phone'=>trim((string)$this->input->post('phone',true)),'email'=>$email,'bank_name'=>trim((string)$this->input->post('bank_name',true)),'bank_account_no'=>trim((string)$this->input->post('bank_account_no',true)),'bank_account_name'=>trim((string)$this->input->post('bank_account_name',true)),'payment_term_days'=>max(0,(int)$this->input->post('payment_term_days')),'is_active'=>$this->input->post('is_active')?1:0);if($opening){$d['opening_balance']=max(0,(float)$this->input->post('opening_balance'));$d['opening_balance_date']=$this->input->post('opening_balance_date')?:null;}if($d['supplier_code']===''||$d['name']==='')throw new BusinessException('Kode dan nama supplier wajib diisi.');return$d;} private function find($id){$r=$this->scope($id)->get('suppliers')->row();if(!$r)show_404();return$r;} private function scope($id){$this->db->where('id',$id);if($this->db->field_exists('company_id','suppliers'))$this->db->where('company_id',$this->companycontext->id());return$this->db;} private function assertUnique($code,$ignore=0){$this->db->where('supplier_code',$code);if($ignore)$this->db->where('id !=',$ignore);if($this->db->field_exists('company_id','suppliers'))$this->db->where('company_id',$this->companycontext->id());if($this->db->count_all_results('suppliers'))throw new BusinessException('Kode supplier sudah digunakan.');} private function opening($id,$d){$this->fiscalperiodservice->assertOpen($d['opening_balance_date']);$internal=$this->numberingservice->next('supplier_invoice',$d['opening_balance_date']);$desc='[AUTO] Saldo awal hutang supplier '.$d['supplier_code'].' - '.$d['name'].' per '.$d['opening_balance_date'];$journal=$this->postingservice->post(array('tanggal'=>$d['opening_balance_date'],'no_ref'=>$internal,'keterangan'=>$desc,'ref_type'=>'supplier_opening_balance','ref_id'=>$id,'created_by'=>$this->session->userdata('user_id')),array(array('account_id'=>$this->accountmappingservice->get('payable_opening_balance'),'debit'=>$d['opening_balance'],'kredit'=>0,'keterangan'=>$desc),array('account_id'=>$this->accountmappingservice->get('accounts_payable'),'debit'=>0,'kredit'=>$d['opening_balance'],'keterangan'=>$desc)),false,true);$x=array('supplier_invoice_no'=>'OPEN-'.$d['supplier_code'],'internal_no'=>$internal,'supplier_id'=>$id,'invoice_date'=>$d['opening_balance_date'],'due_date'=>$d['opening_balance_date'],'status'=>'partial','total'=>$d['opening_balance'],'balance'=>$d['opening_balance'],'journal_id'=>$journal,'created_by'=>$this->session->userdata('user_id'),'posted_by'=>$this->session->userdata('user_id'),'posted_at'=>date('Y-m-d H:i:s'),'created_at'=>date('Y-m-d H:i:s'));if($this->db->field_exists('company_id','supplier_invoices'))$x['company_id']=$this->companycontext->id();$this->db->insert('supplier_invoices',$x);} }