Ilmu Coding Ilmucoding.com - Merupakan situs yang membantu Anda belajar coding lebih mudah, nyaman, interaktif dan profesional. Belajar sekarang di ilmu coding. GRATIS

Sistem Informasi Penjualan dengan Codeigniter 4 Part #6 – Import Export

7 min read

Sistem Informasi Penjualan dengan Codeigniter 4 - Part 6 - Import Export

Ini merupakan part ke 6 dari tutorial cara membuat aplikasi Sistem Informasi Penjualan dengan Codeigniter 4 – import export data transaction.

Pada part ini Anda akan belajar membuat fitur import dan export menggunakan php spreadsheet. Fitur php spreadsheet akan diinstall melalui composer. Jadi, Anda perlu menginstall composer terlebih dahulu jika belum menginstallnya.

Pada part sebelumnya Ilmu Coding sudah membahas membuat fitur filtering dan custom pagination. Jika Anda belum membacanya, alangkah baiknya untuk membaca part ke 5 terlebih dahulu agar bisa memahami part ini dengan baik.

Sebelum memulai part ke 6 ini, jangan lupa segelas kopi dan cemilan untuk menemanimu ngoding.

Let’s go!

Sekilas Tentang PhpSpreadsheet

PhpSpreadsheet adalah library yang ditulis dalam bahasa pemrograman PHP murni dan menyediakan sekumpulan class yang memungkinkan Anda membaca dan menulis ke berbagai format file spreadsheet, seperti Excel dan LibreOffice Calc.

Dokumentasi yang disiapkan sangat lengkap untuk memandu penggunanya memahami dan menggunakan PhpSpreadsheet. Anda bisa membaca dokumentasi lengkapnya di sini.

Sedangkan pada part ini kita akan membutuhkan PhpSpreadsheet untuk menangani fitur import dan export laporan transaksi ke dalam format excel.

Untuk itu, pertama-tama kita perlu menginstallnya terlebih dahulu.

Ada 2 cara untuk menginstallnya.

Cara pertama dengan masuk ke dalam direktori project, kemudian ketik command berikut ini:

composer require phpoffice/phpspreadsheet

Cara kedua dengan membuka file composer.json yang berada pada direktori project_name/composer.json.

Modifikasi bagian script yang dicetak tebal di bawah ini:

"require": {
    "php": ">=7.2",
    "ext-curl": "*",
    "ext-json": "*",
    "kint-php/kint": "^3.3",
    "psr/log": "^1.1",
    "laminas/laminas-escaper": "^2.6",
    "phpoffice/phpspreadsheet": "^1.9"
}, 

Catatan Penting:

Jika ada baris kode di dalam file Anda yang tidak ada pada script di atas, hapus saja.

Sebab saya mendapatkan error ketika masih terdapat ext-intl: “*”.

Apabila sudah selesai memodifikasi composer.json, silahkan ketik command berikut ini:

composer update

Sekilas Tentang Composer Autoload

Sepanjang yang saya pahami, di Codeigniter 3 kita mesti mengatur pada file application/config/config.php kode:

$config['composer_autoload'] = FALSE; 

Menjadi:

 $config['composer_autoload'] = 'vendor/autoload.php'; 

Tujuannya agar folder vendor dan library-library di dalamnya bisa digunakan.

Namun di Codeigniter 4 kita sudah tidak memerlukannya lagi.

Kenapa?

Sebab secara otomatis Codeigniter 4 sudah terhubung ke file vendor/autoload.php.

Mantab, kan?

Modifikasi Validation Transaction

Silahkan buka file app/Config/Validation.php.

Kemudian tambahkan baris kode ini untuk menangani validation pada modul transaction.

public $transaction = [
	'trx_file'         => 'uploaded[trx_file]|ext_in[trx_file,xls,xlsx]|max_size[trx_file,1000]',
];

public $transaction_errors = [
	'trx_file'=> [
		'ext_in' 	=> 'File Excel hanya boleh diisi dengan xls atau xlsx.',
		'max_size'	=> 'File Excel product maksimal 1mb',
		'uploaded'	=> 'File Excel product wajib diisi'
	]
];

Simpan.

Membuat Fitur Import Transaction

Ada 10 langkah untuk membuat fitur import pada saat melakukan transaction.

Berikut step by stepnya:

Step #1 – Buat Model Transaction

Silahkan buat file bernama Transaction_model.php dan simpan pada direktori app/Models.

Berikut kodenya:

<?php namespace App\Models;
use CodeIgniter\Model;
 
class Transaction_model extends Model
{
    protected $table = 'transactions';
     
    public function getTransaction($id = false)
    {
        if($id === false){
            return $this->table('transactions')
                        ->select('products.product_name, transactions.*')
                        ->join('products', 'products.product_id = transactions.product_id')
                        ->get()
                        ->getResultArray();
        } else {
            return $this->table('transactions')
                        ->select('products.product_name, transactions.*')
                        ->join('products', 'products.product_id = transactions.product_id')
                        ->where('transactions.product_id', $id)
                        ->get()
                        ->getRowArray();
        }  
    }
}
?>

Simpan.

Penjelasan:

Pada query di atas adalah query untuk memanggil data transaction dan join ke table product.

Kenapa mesti join?

Sebab kita perlu mengambil data nama product berdasarkan product_id yang ada di field table transaction.

Step #2 – Buat Controller Transaction

Silahkan buat file bernama Transaction.php dan simpan pada direktori app/Controllers.

Berikut kodenya:

<?php namespace App\Controllers;
 
use CodeIgniter\Controller;
use App\Models\Product_model;
use App\Models\Transaction_model;

class Transaction extends Controller
{
    protected $helpers = [];

    public function __construct()
    {
        helper(['form']);
        $this->transaction_model = new Transaction_model();
        $this->product_model = new Product_model();
    }

    public function index()
    {
        $data['transactions'] = $this->transaction_model->getTransaction();
        echo view('transaction/index', $data);
    }
}
?>

Simpan.

Step #3 – Buat Halaman Index View Transaction

Pertama-tama silahkan buat folder bernama transaction di direktori app/Views.

Kemudian buat file bernama index.php.

Lalu ketik kode berikut:

<?php echo view('_partials/header'); ?>
<?php echo view('_partials/sidebar'); ?>

<div class="content-wrapper">
    <div class="content-header">
        <div class="container-fluid">
            <div class="row mb-2">
                <div class="col-sm-6">
                    <h1 class="m-0 text-dark">Transactions</h1>
                </div>
                <div class="col-sm-6">
                    <ol class="breadcrumb float-sm-right">
                        <li class="breadcrumb-item"><a href="#">Home</a></li>
                        <li class="breadcrumb-item active">Transactions</li>
                    </ol>
                </div>
            </div>
        </div>
    </div>

    <div class="content">
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-12">
                    <div class="card">
                        <div class="card-header">
                            List Transaction
                            <div class="btn-group float-right">
                            <a href="<?php echo base_url('transaction/import'); ?>" class="btn btn-primary btn-sm">Import</a>
                            <a href="<?php echo base_url('transaction/export'); ?>" class="btn btn-success btn-sm">Export</a>
                            </div>
                        </div>
                        <div class="card-body">
                        
                            <?php
                            if(!empty(session()->getFlashdata('success'))){ ?>
                            <div class="alert alert-success">
                                <?php echo session()->getFlashdata('success');?>
                            </div>     
                            <?php } ?>

                            <?php if(!empty(session()->getFlashdata('info'))){ ?>
                            <div class="alert alert-info">
                                <?php echo session()->getFlashdata('info');?>
                            </div>
                            <?php } ?>

                            <?php if(!empty(session()->getFlashdata('warning'))){ ?>
                            <div class="alert alert-warning">
                                <?php echo session()->getFlashdata('warning');?>
                            </div>
                            <?php } ?>

                            <div class="table-responsive">
                                <table class="table table-bordered table-hovered">
                                    <thead>
                                        <tr>
                                            <th>No</th>
                                            <th>Product</th>
                                            <th>Date</th>
                                            <th>Price</th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        <?php foreach($transactions as $key => $row){ ?>
                                        <tr>
                                            <td><?php echo $key + 1; ?></td>
                                            <td><?php echo $row['product_name']; ?></td>
                                            <td><?php echo date('d-m-Y', strtotime($row['trx_date'])); ?></td>
                                            <td><?php echo "Rp. ".number_format($row['trx_price']); ?></td>
                                        </tr>
                                        <?php } ?>
                                    </tbody>
                                </table>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<?php echo view('_partials/footer'); ?>

Simpan.

Step #4 – Testing Halaman Index View Transaction

Silahkan ketik command berikut jika Anda belum menjalankannya:

php spark serve

Kemudian ketik URL berikut ini:

localhost:8080/transaction

Jika berjalan dengan baik, berikut tampilannya:

sistem informasi penjualan codeigniter 4 import export - 1

Step #5 – Tambahkan Function Insert di Model Transaction

Tambahkan function insertTransaction() di bawah ini pada file app/Models/Transaction_model.php.

public function insertTransaction($data)
{
    return $this->db->table($this->table)->insert($data);
}

Kemudian simpan.

Step #6 – Tambahkan Function Get Price di Model Product

Tambahkan function getPrice() di bawah ini pada file app/Models/Product_model.php.

public function getPrice($id)
{
    return $this->db->table($this->table)->getWhere(['product_id' => $id])->getRowArray();
}

Kemudian simpan.

Penjelasan:

Function ini dibutuhkan untuk mendapatkan data harga dari suatu product berdasarkan product_id.

Step #7 – Tambahkan Function Import, Proses Import dan GetTrxPrice di Controller Transaction

Tambahkan function import(), proses_import() dan getTrxPrice(param) di bawah ini pada file app/Controllers/Transaction.php.

public function import()
{
    echo view('transaction/import');
}

public function proses_import()
{
    $validation =  \Config\Services::validation();

    $file = $this->request->getFile('trx_file');

    $data = array(
        'trx_file'           => $file,
    );

    if($validation->run($data, 'transaction') == FALSE){

        session()->setFlashdata('errors', $validation->getErrors());
        return redirect()->to(base_url('transaction/import'));
    
    } else {

        // ambil extension dari file excel
        $extension = $file->getClientExtension();
        
        // format excel 2007 ke bawah
        if('xls' == $extension){
            $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
        // format excel 2010 ke atas
        } else {
            $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
        }
        
        $spreadsheet = $reader->load($file);
        $data = $spreadsheet->getActiveSheet()->toArray();

        foreach($data as $idx => $row){
            
            // lewati baris ke 0 pada file excel
            // dalam kasus ini, array ke 0 adalahpara title
            if($idx == 0) {
                continue;
            }
            
            // get product_id from excel
            $product_id     = $row[0];
            // get trx_date from excel
            $trx_date       = $row[1];
            // tampilkan harga product berdasarkan product_id menggunakan function getTrxPrice()
            $trx_price      = $this->getTrxPrice($row[0]);

            $data = [
                "product_id"    => $product_id,
                "trx_date"      => date('Y-m-d', strtotime($trx_date)),
                "trx_price"     => $trx_price
            ];

            $simpan = $this->transaction_model->insertTransaction($data);
        }

        if($simpan)
        {
            session()->setFlashdata('success', 'Imported Transaction successfully');
            return redirect()->to(base_url('transaction')); 
        }
    }
}

public function getTrxPrice($product_id)
{
    $price = $this->product_model->getPrice($product_id);
    $data = $price['product_price'];
    return $data;
}

Simpan.

Step #8 – Buat Data Dummy Pada File Excel

Pada saat membuat data dummy, Anda harus memperhatikan field product_id yang tersedia pada table products di database ci4_sip.

Contohnya saya memiliki product_id di table product 10 dan 11.

Perhatikan gambar di bawah ini:

sistem informasi penjualan codeigniter 4 import export - 2

Maka saat membuat data dummy tepat pada kolom product_id di file excel, saya mesti menyesuaikan dengan product_id yang ada di database.

Perhatikan gambar berikut ini:

sistem informasi penjualan codeigniter 4 import export - 3

Jika tidak sama, akan muncul pesan error.

Step #9 – Tambahkan Halaman Import di View Transaction

Silahkan buat file bernama import.php dan simpan di app/Views/transaction.

Kemudian ketik kode berikut ini:

<?php echo view('_partials/header'); ?>
<?php echo view('_partials/sidebar'); ?>

<div class="content-wrapper">
    <div class="content-header">
        <div class="container-fluid">
            <div class="row mb-2">
                <div class="col-sm-6">
                    <h1 class="m-0 text-dark">Import Transaction</h1>
                </div>
                <div class="col-sm-6">
                    <ol class="breadcrumb float-sm-right">
                        <li class="breadcrumb-item"><a href="#">Home</a></li>
                        <li class="breadcrumb-item active">Import Transaction</li>
                    </ol>
                </div>
            </div>
        </div>
    </div>

    <div class="content">
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-12">
                    <?php echo form_open_multipart('transaction/proses_import'); ?>
                    <div class="card">
                        <div class="card-body">
                            <?php 
                            $errors = session()->getFlashdata('errors');
                            if(!empty($errors)){ ?>
                                <div class="alert alert-danger" role="alert">
                                    Whoops! Ada kesalahan saat input data, yaitu:
                                    <ul>
                                    <?php foreach ($errors as $error) : ?>
                                        <li><?= esc($error) ?></li>
                                    <?php endforeach ?>
                                    </ul>
                                </div>
                            <?php } ?>

                            <div class="form-group">
                                <?php 
                                    echo form_label('File Excel');
                                    $trx_file = [
                                        'type'  => 'file',
                                        'name'  => 'trx_file',
                                        'id'    => 'trx_file',
                                        'class' => 'form-control'
                                    ];
                                    echo form_upload($trx_file); 
                                ?>
                            </div>
                        </div>
                        <div class="card-footer">
                            <a href="<?php echo base_url('transaction'); ?>" class="btn btn-outline-info">Back</a>
                            <button type="submit" class="btn btn-primary float-right">Import</button>
                        </div>
                    </div>
                    <?php echo form_close(); ?>
                </div>
            </div>
        </div>
    </div>
</div>
<?php echo view('_partials/footer'); ?>

Simpan.

Step #10 – Testing Halaman Import View Transaction

Silahkan import file excel yang sudah Anda buat sebelumnya.

Jika terjadi kesalahan validasi, begini hasilnya:

sistem informasi penjualan codeigniter 4 import export - 4

Jika berhasil, maka data akan ditampilkan pada halaman index seperti gambar di bawah ini:

sistem informasi penjualan codeigniter 4 import export - 5

***

Alhamdulillah membuat fitur import sudah selesai.

… eits, tunggu dulu. Masih ada langkah berikutnya.

Siapkan cemilan yang banyak ya… J

Membuat Fitur Export Transaction

Ada 3 langkah untuk membuat fitur export pada saat melakukan transaction.

Berikut step by stepnya:

Step #1 – Use Class yang Dibutuhkan

Saya lebih menyukai menggunakan use untuk memanggil class yang dibutuhkan untuk export.

Silahkan modifikasi file Transaction.php yang ada di dalam file app/Controllers.

Tambahkan kode berikut:

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

Simpan.

Step #2 – Tambahkan Function Export di Controller Transaction

Masih memodifikasi file Transaction.php yang ada di dalam file app/Controllers untuk menambahkan function Export.

Tambahkan kode berikut:

public function export()
{
    // ambil data transaction dari database
    $transactions = $this->transaction_model->getTransaction();
    // panggil class Sreadsheet baru
    $spreadsheet = new Spreadsheet;
    // Buat custom header pada file excel
    $spreadsheet->setActiveSheetIndex(0)
                ->setCellValue('A1', 'No')
                ->setCellValue('B1', 'Product')
                ->setCellValue('C1', 'Date')
                ->setCellValue('D1', 'Price');
    // define kolom dan nomor
    $kolom = 2;
    $nomor = 1;
    // tambahkan data transaction ke dalam file excel
    foreach($transactions as $data) {

        $spreadsheet->setActiveSheetIndex(0)
                    ->setCellValue('A' . $kolom, $nomor)
                    ->setCellValue('B' . $kolom, $data['product_name'])
                    ->setCellValue('C' . $kolom, date('j F Y', strtotime($data['trx_date'])))
                    ->setCellValue('D' . $kolom, "Rp. ".number_format($data['trx_price']));

        $kolom++;
        $nomor++;

    }
    // download spreadsheet dalam bentuk excel .xlsx
    $writer = new Xlsx($spreadsheet);

    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="Laporan_Transaction.xlsx"');
    header('Cache-Control: max-age=0');

    $writer->save('php://output');
}

Simpan.

Step #3 – Testing Export di Halaman Index Transaction

Silahkan ketik button export pada halaman index transaction.

Jika berjalan dengan lancar, berikut tampilannya.

sistem informasi penjualan codeigniter 4 import export - 6

Silahkan download file.

sistem informasi penjualan codeigniter 4 import export - 7

Gambar.

***

Akhirnya selesai juga part ke 6 – membahas fitur import dan export menggunakan PhpSpreadSheet.

Syukur Alhamdulillah.

Download Full Source Code

Silahkan download full source code sistem informasi penjualan dengan Codeigniter 4 part 6 – membuat fitur import dan export pada link di bawah ini:

Download Source Code

Pengantar Sistem Informasi Penjualan dengan Codeigniter 4 – Fitur Import dan Export

Jika Anda merasa ini sudah selesai, tunggu dulu …

Insya Allah masih ada part selanjutnya yang akan saya bahas.

Di part selanjutnya saya akan membahas tentang Membuat grafik penjualan per bulan dan latest transaction.

Jika dalam mempraktikkan kode part ini ada error, silahkan bertanya melalui kolom komentar.

Selamat belajar …

Ilmu Coding Ilmucoding.com - Merupakan situs yang membantu Anda belajar coding lebih mudah, nyaman, interaktif dan profesional. Belajar sekarang di ilmu coding. GRATIS

4 Replies to “Sistem Informasi Penjualan dengan Codeigniter 4 Part #6 – Import Export”

  1. Mas, Kalau Load LIbraries di CodeIgniter3 kan sperti ini yaa $this->load->library(‘Excel’); //load librari excel ..
    kalau di CI4 piye yaaa ?

    1. Ada 2 cara yang diajarkan di dokumentasi. Pertama buat variabel untuk menampung library. Taro aja di function atau constructor. Contoh saya mau panggil library pagination. Kodenya seperti ini:

      $pager = \Config\Services::pager();
  2. Anehnya ci 4 saya versi 4.0.4 sudah install phpspreadsheet pake composer masih ga ke autoload gitu. Solusinya apa ya?

    1. Pada tutorial ini memang sengaja tidak autoload. Alasannya karena tidak semua controller membutuhkannya.

Leave a Reply

Your email address will not be published. Required fields are marked *

Jika terbantu dengan artikel ini, silahkan share, beri komentar dan "klik" 1 kali pada iklan ya.