Code Factory Workshop (Batch #06) – Kolaborasi AngulasJS dan Yii Framework Part #2

Code Factory Workshop (Batch #06) - Kolaborasi AngulasJS dan Yii Framework

Code Factory | JavaScript akhir-akhir ini menjadi bahasa pemrograman yang semakin populer, ditandai dengan banyaknya pengguna dan framework yang bermunculan. Salah satu framework yang sedang naik daun adalah AngularJS. Untuk itu kali ini Code Factory akan mengadakan Workshop tentang membuat aplikasi menggunakan AngularJS sebagai frontend dan Yii2 sebegai backend.

 

 

Jadwal

  • Tanggal: Sabtu, 4 Juni 2016
  • Pukul: 08:30 s.d. 15:00
  • Peserta: 20 Orang
  • Lokasi: Gedung Bapel (DAC-Solution) – Jl. Karet Hijau no. 29, Beji – Depok

Investasi

  • Umum – Rp. 100.000,-
  • Rekomendasi PHP Indonesia – Rp. 75.000,- silakan menghubungi salah satu admin PHP Indonesia untuk mendapatkan rekomendasi.

Pembayaran biaya bisa dilakukan dengan cara transfer ke rekening

  • BCA: 421.281.0537
  • Mandiri: 90.000.27352.211
  • A.n. Nilam Savitri.

Dan kemudian mengirimkan konfirmasi pembayaran melalui

  • Email ke firman.syaefullah@dac-solution.com, atau
  • atau WA ke nomor 0811-820-3-820

Fasilitas

Peserta akan mendapatkan kesempatan walk-in interview dan penempatan kerja sebagai programmer/

Pendaftaran

Silakan isi form ini https://goo.gl/forms/e2dRXJuH3J.

Perlengkapan

Peserta WAJIB membawa laptop sendiri

Code Factory Workshop (Batch #05) – Kolaborasi AngulasJS dan Yii Framework

Code Factory Workshop (Batch #05) - Kolaborasi AngulasJS dan Yii Framework

Code Factory | JavaScript akhir-akhir ini menjadi bahasa pemrograman yang semakin populer, ditandai dengan banyaknya pengguna dan framework yang bermunculan. Salah satu framework yang sedang naik daun adalah AngularJS. Untuk itu kali ini Code Factory akan mengadakan Workshop tentang membuat aplikasi menggunakan AngularJS sebagai frontend dan Yii2 sebegai backend.

 

 

Jadwal

  • Tanggal: Sabtu, 14 Mei 2016
  • Pukul: 08:30 s.d. 15:00
  • Peserta: 20 Orang
  • Lokasi: Gedung Bapel (DAC-Solution) – Jl. Karet Hijau no. 29, Beji – Depok

Investasi

  • Umum – Rp. 100.000,-
  • Rekomendasi PHP Indonesia – Rp. 75.000,- silakan menghubungi salah satu admin PHP Indonesia untuk mendapatkan rekomendasi.

Pembayaran biaya bisa dilakukan dengan cara transfer ke rekening

  • BCA: 421.281.0537
  • Mandiri: 90.000.27352.211
  • A.n. Nilam Savitri.

Dan kemudian mengirimkan konfirmasi pembayaran melalui

  • Email ke firman.syaefullah@dac-solution.com, atau
  • atau WA ke nomor 0811-820-3-820

Fasilitas

Peserta akan mendapatkan kesempatan walk-in interview dan penempatan kerja sebagai programmer/

Pendaftaran

Silakan isi form ini https://goo.gl/forms/e2dRXJuH3J.

Perlengkapan

Peserta WAJIB membawa laptop sendiri

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2

Code Factory Sistem Inventory atau Aplikasi Persediaan Barang adalah salah satu aplikasi yang sangat umum namun cukup menantang terutama bagi para programmer pemula yang sedang mengasah skill programming-nya. Implementasi paling sederhana dari aplikasi ini biasanya hanya melibatkan data barang dan transaksinya. Namun bisa kita tambah scope atau rung lingkupnya dengan melibatkan transaksi multi gudang, kategori barang, proses approval, dan sebagainya. Pada tutorial kali ini, kita akan membangun sebuah aplikasi yang sederhana saja, yaitu hanya melibatkan data barang dan transaksi saja, agar cukup mudah dipahami para programmer pemula.

Aplikasi ini akan kita bangun menggunakan framework Yii versi 2.0 dan database MySQL. Yii2 dipilih karena merupakan salah satu framework yang cukup populer, sedangkan MySQL dipilih karena kemudahan penggunaannya. 

Tutorial ini akan kita bagi menjadi 5 (lima) bagian, sehingga lebih mudah bagi teman-teman untuk mempelajari dan memahaminya. 5 (lima) bagian tersebut antara lain,

  1. Bagian #1 akan membahas cara instalalsi Yii2 untuk memulai project ini.
  2. Bagian #2 akan membahas desain database dan penggunaan fitur migration.
  3. Bagian #3 akan membahas CRUD untuk master barang.
  4. Bagian #4 akan membahas CRUD untuk transaksi barang menggunakan form master-detail.
  5. Bagian #5 akan membahas pembuatan Laporan Kartu Stok.

Mudah-mudahan tutorial ini dapat membantu teman-teman yang sedang belajar membuat aplikasi inventory, khususnya yang menggunakan Yii Framework. Source code aplikasi ini dapat dilihat di GitHub, silakan digunakan untuk keperluan pembelajaran saja. Dan jika teman-teman ingin menggunakan source code tersebut untuk keperluan komersil, diwajibkan untuk mendapatkan izin tertulis dari penulis.

 

 

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 – Part #5

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Laporan Kartu Stock Card Report

Code Factory Sistem Inventory atau Aplikasi Persediaan Barang adalah salah satu aplikasi yang umum dan cukup menantang terutama bagi para programmer pemula yang sedang mengasah skill programming-nya. Artikel ini merupakan lanjutan dari artikel keempat yang membahas Pembuatan Form Transaksi Barang dan merupakan bagian terakhir dari serial artikel Aplikasi Persediaan Barang Menggunakan Yii2. Artikel ini membahas pembuatan laporan kartu stok yang merupakan laporan yang wajib tersedia dalam sebuah aplikasi inventory, dan kita buat sederhana saja sehingga akan cukup mudah dipahami para programmer pemula.

Modifikasi ItemController

Kartu Stok pada dasarnya adalah daftar transaksi masing-masing barang, dengan mencantumkan jumlah masuk, jumlah keluar, dan saldo barang yang tersedia. dengan begitu kita bisa melihat pergerakan dan perubahan stok dari barang bersangkutan. Untuk mencapai hal ini, kita cukup melakukan join terhadap table barang (items) dan table transaksi (transactions dan transaction_details) untuk mendapatkan laporan yang kita inginkan.

Untuk itu kita bisa melakukan query dan memberikan hasil query tersebut ke view agar dapat ditampilkan dalam bentuk GridView. Untuk itu kita lakukan modifikasi terhadap fungsi actionView yang ada di dalam class ItemController. Dengan mengubah actionView, maka setiap kali kita membuka/melihat detil informasi barang maka di bawahnya akan terlihat history transaksinya. Perubahannya adalah sebagai berikut,

/**
 * Displays a single Items model.
 * @param integer $id
 * @return mixed
 */
public function actionView($id)
{
    // query kartu stok
    $sql_list = "
        SELECT t.id AS trans_id
        , t.trans_code AS trans_code
        , t.trans_date AS trans_date
        , a.id AS detail_id, a.item_id AS item_id
        , trim(concat(t.remarks,' - ',a.remarks)) AS remarks
        , b.code AS item_code, b.name AS item_name
        , CASE 
            WHEN t.type_id=1 THEN a.quantity 
            WHEN t.type_id=2 THEN -a.quantity 
            ELSE 0 END 
          AS quantity
        , @sal := @sal + CASE 
            WHEN t.type_id=1 THEN a.quantity 
            WHEN t.type_id=2 THEN -a.quantity 
            ELSE 0 END 
          AS saldo
        FROM transactions t
        JOIN transaction_details a ON t.id = a.trans_id
        JOIN items b ON a.item_id = b.id
        JOIN ( SELECT @sal:=0 ) v
        WHERE b.id = :id
        ORDER BY t.trans_date, t.id, a.id
    ";
    // query total data di kartu stok
    $sql_count = "
        SELECT count(*) 
        FROM transactions t
        JOIN transaction_details a ON t.id = a.trans_id
        JOIN items b ON a.item_id = b.id
        ORDER BY t.trans_date, t.id, a.id;
    ";
    // count data
    $count = Yii::$app->db->createCommand($sql_count, [':id' => $id])->queryScalar();
    // data provider untuk ditampilkan di view
    $dataProvider = new SqlDataProvider([
        'sql' => $sql_list,
        'params' => [':id' => $id],
        'totalCount' => $count,
        'pagination' => [
            'pageSize' => 20,
        ],
    ]);

    // render view
    return $this->render('view', [
        'model' => $this->findModel($id),
        'dataProvider' => $dataProvider,
    ]);
}

Jika teman-teman perhatikan, dalam query di atas terdapat variable @sal yang kita gunakan untuk men-generate kolom saldo berdasarkan perhitungan penambahan/pengurangan transaksi barang. Dalam query tersebut juga terdapat klausa CASE yang berfungsi sebagai logika percabangan untuk membedakan transaksi barang masuk dan barang keluar, karena barang masuk harus menambah saldo, sedangkan barang keluar harus mengurangi saldo.

Modifikasi View Barang

Dan untuk menampilkannya, caranya cukup mudah, yaitu langsung saja kita tambahkan code GridView di bawah DetailView yang sebelumnya sudah ada di dalam file view.php menjadi seperti di bawah ini

<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'code',
        'name',
        'quantity',
        'remarks',
    ],
]) ?>

<h3>Stock Card</h3>
<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        'trans_code',
        'trans_date',
        'item_code',
        'item_name',
        'quantity',
        'saldo',
        'remarks',
    ],
]); ?>

Berikut ini salah satu contoh penampakan kartu stok-nya.

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Laporan Kartu Stock Card Report

Simpulan dan Saran

Sesuai dengan judulnya, aplikasi ini masih sangat sederhana. Banyak ide yang bisa dikembangkan dari aplikasi ini, misalkan

  • Dukungan transaksi multi-warehouse.
  • Penambahan laporan-laporan periodik, seperti laporan mutasi stok bulanan, dan sebagainya.
  • Integrasi dengan aplikasi Point of Sales.

Dan masih banyak ide-ide lain yang bisa kita kembangkan.

Mudah-mudahan tutorial ini dapat membantu teman-teman yang sedang belajar membuat aplikasi inventory, khususnya yang menggunakan Yii Framework. Source code aplikasi ini dapat dilihat di GitHub, silakan digunakan untuk keperluan pembelajaran saja. Jika teman-teman ingin menggunakan source code tersebut untuk keperluan komersil, diwajibkan untuk mendapatkan izin tertulis dari penulis.

 

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 – Part #4

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Transaksi Master Detail

Code Factory Sistem Inventory atau Aplikasi Persediaan Barang adalah salah satu aplikasi yang umum dan cukup menantang terutama bagi para programmer pemula yang sedang mengasah skill programming-nya. Artikel ini merupakan lanjutan dari artikel ketiga yang membahas Pembuatan Form Master Barang. Artikel ini akan melanjutkan pembuatan form transaksi dengan desain master-detail menggunakan bantun extension dynamic-form, dan kita buat sederhana saja sehingga akan cukup mudah dipahami para programmer pemula.

Extension Tambahan

Untuk memudahkan kita membangun user interface yang cukup nyaman maka kita memerlukan dua buah extension tambahan, yaitu datepicker untuk memilih tanggal, dan dynamic-form untuk form CRUD master-detail. Gunakan perintah composer berikut ini untuk instalasi-nya.

composer require kartik-v/yii2-widget-datepicker "*"
composer require wbraganca/yii2-dynamicform "*"

[collapsed title=Instalasi Extension]Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Instalasi Extension

Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Instalasi Extension[/collapsed]

Generate CRUD Menggunakan Gii

Silakan generate CRUD untuk Table Transactions dan TransactionDetails dengan cara yang sama seperti saat membuat form master barang.

[collapsed title=Generate CRUD Transactions] Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD Transactions Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD Transactions Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD Transactions [/collapsed] [collapsed title=Generate CRUD TransactionDetails] Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD TransactionDetails Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD TransactionDetails Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD TransactionDetails [/collapsed]

Modifikasi List Transaksi Barang

Hasil generate CRUD dari Yii sangat membantu kita mempercepat proses pengerjaan aplikasi ini, namun masih perlu beberapa penyesuaian dari code standard Gii yang dihasilkan,

'columns' => [
    ['class' => 'yii\grid\SerialColumn'],
    'id',
    'trans_code',
    'trans_date',
    'type_id',
    'remarks',
    ['class' => 'yii\grid\ActionColumn'],
],

Kita dapat menghapus field id yang hanya field identity sehingga tidak penting untuk ditampilkan. Kita juga dapat mengubah field type_id menjadi type.name agar data yang ditampilkan adalah nama jenis transaksinya dan bukan angka id-nya sehingga hasilnya menjadi seperti di bawah ini

'columns' => [
    ['class' => 'yii\grid\SerialColumn'],
    'trans_code',
    'trans_date',
    'type.name',
    'remarks',
    ['class' => 'yii\grid\ActionColumn'],
],

[collapsed title=GridView Transaksi]Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP GridView Transaksi tanpa Filter Dropdown[/collapsed]

Hasilnya cukup user-friendly. Namun sayangnya dengan cara di atas, kita tidak bisa melakukan filter terhadap jenis transaksi. Oleh karena itu kita perlu melakukan perubahan agar filter terhadap jenis transaksi barang kita kita lakukan, filter menggunakan dropdown list. Pertama yang kita lakukan adalah mengambil data semua jenis transaksi yang ada di dalam database menggunakan code berikut,

$typeList = ArrayHelper::map(TransactionTypes::find()->asArray()->all(), 'id', 'name');

Kemudian ubah setting column type.name di GridView dengan menambahkan atribut setting filter dan value barupa Closure yang bentuknya spesifik untuk GridView, sehingga menjadi seperti di bawah ini

'columns' => [
    ['class' => 'yii\grid\SerialColumn'],
    'trans_code',
    'trans_date',
    [   'attribute' => 'type_id', 
        'filter' => $typeList, 
        'label' => 'Transaction Type', 
        'value' => function ($model, $index, $widget) { return $model->type->name; }
    ],
    'remarks',
    ['class' => 'yii\grid\ActionColumn'],
],

[collapsed title=GridView Transaksi dengan Filter Dropdown]Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP GridView Transaksi dengan Filter Dropdown[/collapsed]

Modifikasi Form Transaksi Barang

Form input transaksi barang melibatkan dua buah table yaitu transactions dan transaction_details sehingga kita memerlukan extension dynamic-form untuk membuatnya. Instalasi dengan menggunakan perintah composer di bawah ini.

composer require wbraganca/yii2-dynamicform "*"

Yang perlu kita lakukan kemudian adalah

  • Membuat class Model untuk memudahkan kita membuat beberapa row TransactionDetails dalam satu baris code saja.
  • Modifikasi ActionCreate di TransactionController untuk proses pembuatan transaksi baru
  • Modifikasi ActionUpdate di TransactionController untuk proses pembuatan transaksi yang sudah ada di database
  • Modifikasi ActionDelete di TransactionController untuk proses penghapusan transaksi
  • Modifikasi form untuk Create dan Update.

Class Model

Class Model ini merupakan turunan dari class yii\base\Model namun kita menambahkan sebuah function createMultiple untuk memudahkan kita membuat beberapa row TransactionDetails berdasarkan isi dari variable POST menggunakan satu baris code saja. 

[collapsed title=Class Model]

namespace app\models;

use Yii;
use yii\helpers\ArrayHelper;

class Model extends \yii\base\Model
{
    /**
     * Creates and populates a set of models.
     * @param string $modelClass
     * @param array $multipleModels
     * @return array
     */
    public static function createMultiple($modelClass, $multipleModels = [])
    {
        $model    = new $modelClass;
        $formName = $model->formName();
        $post     = Yii::$app->request->post($formName);
        $models   = [];

        if (! empty($multipleModels)) {
            $keys = array_keys(ArrayHelper::map($multipleModels, 'id', 'id'));
            $multipleModels = array_combine($keys, $multipleModels);
        }

        if ($post && is_array($post)) {
            foreach ($post as $i => $item) {
                if (isset($item['id']) && !empty($item['id']) && isset($multipleModels[$item['id']])) {
                    $models[] = $multipleModels[$item['id']];
                } else {
                    $models[] = new $modelClass;
                }
            }
        }

        unset($model, $formName, $post);
        return $models;
    }
}

[/collapsed]

Modifikasi ActionCreate

Saat melakukan proses penyimpanan data transaksi baru ke database, kita mengikuti algoritma berikut ini,

  • Load master record
  • Load semua detail records
  • Assign foreign key field di detail records
  • Validate master record
  • Validate detail record
  • Jika validasi berhasil
    • Mulai transaksi database
    • Simpan master record
    • Simpan detail record satu-persatu
    • Jika berhasil semua, commit
    • Jika gagal rollback
    • Tampilkan hasilnya

[collapsed title=ActionCreate]

/**
 * Creates a new Transactions model.
 * If creation is successful, the browser will be redirected to the 'view' page.
 * @return mixed
 */
public function actionCreate()
{
    $model = new Transactions();
    $details = [ new TransactionDetails ];

    // proses isi post variable 
    if ($model->load(Yii::$app->request->post())) {
        $details = Model::createMultiple(TransactionDetails::classname());
        Model::loadMultiple($details, Yii::$app->request->post());

        // assign default transaction_id
        foreach ($details as $detail) {
            $detail->trans_id = 0;
        }

        // ajax validation
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = Response::FORMAT_JSON;
            return ArrayHelper::merge(
                ActiveForm::validateMultiple($details),
                ActiveForm::validate($model)
            );
        }

        // validate all models
        $valid1 = $model->validate();
        $valid2 = Model::validateMultiple($details);
        $valid = $valid1 && $valid2;

        // jika valid, mulai proses penyimpanan
        if ($valid) {
            // mulai database transaction
            $transaction = \Yii::$app->db->beginTransaction();
            try {
                // simpan master record                   
                if ($flag = $model->save(false)) {
                    // kemudian simpan detail records
                    foreach ($details as $detail) {
                        $detail->trans_id = $model->id;
                        if (! ($flag = $detail->save(false))) {
                            $transaction->rollBack();
                            break;
                        }
                    }
                }
                if ($flag) {
                    // sukses, commit database transaction
                    // kemudian tampilkan hasilnya
                    $transaction->commit();
                    return $this->redirect(['view', 'id' => $model->id]);
                } else {
                    return $this->render('create', [
                        'model' => $model,
                        'details' => $details,
                    ]);
                }
            } catch (Exception $e) {
                // penyimpanan galga, rollback database transaction
                $transaction->rollBack();
                throw $e;
            }
        } else {
            return $this->render('create', [
                'model' => $model,
                'details' => $details,
                'error' => 'valid1: '.print_r($valid1,true).' - valid2: '.print_r($valid2,true),
            ]);
        }

    } else {
        // inisialisai id 
        // diperlukan untuk form master-detail
        $model->id = 0;
        // render view
        return $this->render('create', [
            'model' => $model,
            'details' => $details,
        ]);
    }
}

[/collapsed]

Modifikasi ActionUpdate

Saat melakukan proses penyimpanan perubahan data transaksi ke database. Agak sedikit berbeda dengan proses pyimpanan transaksi baru, untuk proses edit, kita menghapus semua detail record yang sudah ada sebelumnya di database dan kemudian melakukan insert ulang sebagai record baru. Algoritma-nya adalah seperti berikut ini,

  • Load master record
  • Load semua detail records
  • Assign foreign key field di detail records
  • Validate master record
  • Validate detail record
  • Jika validasi berhasil
    • Mulai transaksi database
    • Simpan master record
    • Delete semua detail record yang sudah ada di database
    • Simpan detail record satu-persatu
    • Jika berhasil semua, commit
    • Jika gagal rollback
    • Tampilkan hasilnya

[collapsed title=ActionUpdate]

/**
 * Updates an existing Transactions model.
 * If update is successful, the browser will be redirected to the 'view' page.
 * @param integer $id
 * @return mixed
 */
public function actionUpdate($id)
{
    $model = $this->findModel($id);
    $details = $model->transactionDetails;

    if ($model->load(Yii::$app->request->post())) {

        $oldIDs = ArrayHelper::map($details, 'id', 'id');
        $details = Model::createMultiple(TransactionDetails::classname(), $details);
        Model::loadMultiple($details, Yii::$app->request->post());
        $deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($details, 'id', 'id')));

        // assign default transaction_id
        foreach ($details as $detail) {
            $detail->trans_id = $model->id;
        }

        // ajax validation
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = Response::FORMAT_JSON;
            return ArrayHelper::merge(
                ActiveForm::validateMultiple($details),
                ActiveForm::validate($model)
            );
        }

        // validate all models
        $valid1 = $model->validate();
        $valid2 = Model::validateMultiple($details);
        $valid = $valid1 && $valid2;

        // jika valid, mulai proses penyimpanan
        if ($valid) {
            // mulai database transaction
            $transaction = \Yii::$app->db->beginTransaction();
            try {
                // simpan master record                   
                if ($flag = $model->save(false)) {
                    // delete dahulu semua record yang ada
                    if (! empty($deletedIDs)) {
                        TransactionDetails::deleteAll(['id' => $deletedIDs]);
                    }
                    // kemudian, simpan details record
                    foreach ($details as $detail) {
                        $detail->trans_id = $model->id;
                        if (! ($flag = $detail->save(false))) {
                            $transaction->rollBack();
                            break;
                        }
                    }
                }
                if ($flag) {
                    // sukses, commit database transaction
                    // kemudian tampilkan hasilnya
                    $transaction->commit();
                    return $this->redirect(['view', 'id' => $model->id]);
                }
            } catch (Exception $e) {
                // penyimpanan galga, rollback database transaction
                $transaction->rollBack();
                throw $e;
            }
        } else {
            return $this->render('create', [
                'model' => $model,
                'details' => $details,
                'error' => 'valid1: '.print_r($valid1,true).' - valid2: '.print_r($valid2,true),
            ]);
        }
    }

    // render view
    return $this->render('update', [
        'model' => $model,
        'details' => (empty($details)) ? [new TransactionDetails] : $details
    ]);
}

[/collapsed]

Modifikasi ActionDelete

Pada saat menghapus data transaksi maka yang perlu kita lakukan adalah terlebih dahulu menghapus detail record sebelum menghapus master/parent record. Algoritma-nya adalah sebagai berikut

  • Mulai transaksi database
  • Delete semua detail record satu-persatu
  • Delete master record
  • Jika berhasil semua, commit
  • Jika gagal rollback
  • Tampilkan index transaksi barang

[collapsed title=ActionDelete]

/**
 * Deletes an existing Transactions model.
 * If deletion is successful, the browser will be redirected to the 'index' page.
 * @param integer $id
 * @return mixed
 */
public function actionDelete($id)
{
    $model = $this->findModel($id);
    $details = $model->transactionDetails;

    // mulai database transaction
    $transaction = \Yii::$app->db->beginTransaction();
    try {
        // pertama, delete semua detail records
        foreach ($details as $detail) {
            $detail->delete();
        }
        // kemudian, delete master record
        $model->delete();
        // sukses, commit transaction
        $transaction->commit();

    } catch (Exception $e) {
        // gagal, rollback database transaction
        $transaction->rollBack();
    }

    return $this->redirect(['index']);
}

[/collapsed]

Modifikasi create.php

​Kita perlu menambahkan variable $details agar dapat dikenali di dalam _form.php

​    <?= $this->render('_form', [
        'model' => $model,
        'details' => $details,
    ]) ?>

Modifikasi update.php

​Kita juga perlu menambahkan variable $details agar dapat dikenali di dalam _form.php

    <?= $this->render('_form', [
        'model' => $model,
        'details' => $details,
    ]) ?>

Modifikasi _form.php

​Code lengkapnya adalah seperti berikut ini

[collapsed title=Code HTML form transaksi]

<div class="transactions-form">

    <?php $form = ActiveForm::begin(['id' => 'transactions-form']); ?>

    <div class="row">
        <div class="col-sm-4 col-md-6">
		    <?= $form->field($model, 'trans_code')->textInput(['maxlength' => true]) ?>
        </div>
        <div class="col-sm-4 col-md-3">
		    <?php 
				echo '<label class="control-label" for="transactions-trans_date">Transaction Date</label>';
				echo DatePicker::widget([
					'id' => 'transactions-trans_date',
				    'name' => 'Transactions[trans_date]',
				    'type' => DatePicker::TYPE_COMPONENT_APPEND,
				    'value' => date('Y-m-d'),
				    'pluginOptions' => [
				        'autoclose'=>true,
				        'format' => 'yyyy-mm-dd'
				    ]
				]);
		    ?>
        </div>
        <div class="col-sm-4 col-md-3">
		    <?= $form->field($model, 'type_id')->dropDownList(
		        ArrayHelper::map(TransactionTypes::find()->all(), 'id', 'name'),  
		        ['prompt'=>'* Pilih Transaksis *']                          
		    ); ?>
        </div>
        <div class="col-sm-12 col-md-12">
		    <?= $form->field($model, 'remarks')->textInput(['maxlength' => true]) ?>
        </div>
    </div><!-- .row -->

    <div class="panel panel-default">
        <div class="panel-heading"><h4><i class="glyphicon glyphicon-th-list"></i> Transaction Details</h4></div>
        <div class="panel-body">
             <?php DynamicFormWidget::begin([
                'widgetContainer' => 'dynamicform_wrapper',  // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
                'widgetBody' => '.container-items',          // required: css class selector
                'widgetItem' => '.item',                     // required: css class
                'limit' => 999,                                // the maximum times, an element can be cloned (default 999)
                'min' => 1,                                  // 0 or 1 (default 1)
                'insertButton' => '.add-item',               // css class
                'deleteButton' => '.remove-item',            // css class
                'model' => $details[0],
                'formId' => 'transactions-form',
                'formFields' => [
                    'trans_id',
                    'item_id',
                    'quantity',
                    'remarks',
                ],
            ]); ?>

            <div class="container-items"><!-- widgetContainer -->
            <?php foreach ($details as $i => $detail): ?>
                <div class="item row">
                    <?php
                        // necessary for update action.
                        if (! $detail->isNewRecord) {
                            echo Html::activeHiddenInput($detail, "[{$i}]id");
                        }
                    ?>
                    <div class="col-sm-8 col-md-4">
					    <?= $form->field($detail, "[{$i}]item_id")->dropDownList(
					        ArrayHelper::map(Items::find()->all(), 'id', 'name'),  // Flat array ('id'=>'label')
					        ['prompt'=>'* Pilih Barang *']                          // options
					    ); ?>
                    </div>
                    <div class="col-sm-4 col-md-2">
                        <?= $form->field($detail, "[{$i}]quantity")->textInput(['maxlength' => true]) ?>
                    </div>
                    <div class="col-sm-10 col-md-5">
                    	<?= $form->field($detail, "[{$i}]remarks")->textInput(['maxlength' => true]) ?>
                    </div>
                    <div class="col-sm-2 col-md-1 item-action">
                    	<div class="pull-right">
	                        <button type="button" class="add-item btn btn-success btn-xs">
	                        	<i class="glyphicon glyphicon-plus"></i></button> 
	                        <button type="button" class="remove-item btn btn-danger btn-xs">
	                        	<i class="glyphicon glyphicon-minus"></i></button>
                    	</div>
                    </div>
                </div><!-- .row -->

            <?php endforeach; ?>
            </div>

            <?php DynamicFormWidget::end(); ?>
        </div>
    </div>


    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>

[/collapsed]

[collapsed title=Form Transaksi Barang]Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 Form Transaksi Barang Dynamic-Form[/collapsed]

Membuat View Transaksi Barang

Untuk menampilkan data master-detail, maka kita harus record master dan semua record detail yang berelasi, sehingga kita perlu mengubah ActionView menjadi seperti ini

[collapsed title=Code ActionView]

/**
 * Displays a single Transactions model.
 * @param integer $id
 * @return mixed
 */
public function actionView($id)
{
    return $this->render('view', [
        'model' => $this->findModel($id),
        'details' => $this->findDetails($id),
    ]);
}

/**
 * Finds the Transactions model based on its primary key value.
 * If the model is not found, a 404 HTTP exception will be thrown.
 * @param integer $id
 * @return Transactions the loaded model
 * @throws NotFoundHttpException if the model cannot be found
 */
protected function findModel($id)
{
    if (($model = Transactions::findOne($id)) !== null) {
        return $model;
    } else {
        throw new NotFoundHttpException('The requested page does not exist.');
    }
}

/**
 * Finds the TransactionDetails model based on its foreign key value.
 * @param integer $id
 * @return data provider TransactionDetails for GridView 
 */
protected function findDetails($id)
{
    $detailModel = new TransactionDetailsSearch();
    return $detailModel->search(['TransactionDetailsSearch'=>['trans_id'=>$id]]);
}

[/collapsed]

Dan jangan lupa mengubah view.php agar menampilkan data yang didapat dari controller. Kita akan menggunakan DetailView untuk master row, dan menggunakan GridView untuk menampilkan detail row.

[collapsed title=HTML Code View Transaksi]

<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'trans_code',
        [
            'attribute' => 'trans_date',
            'format' => [ 'date', 'php: d-M-Y' ],
            'labelColOptions' => [ 'style'=>'width:30%; text-align:right;' ]
        ],
        'type.name',
        'remarks',
    ],
]) ?>

<div class="item panel panel-info">
    <div class="panel-heading">
        <h3 class="panel-title pull-left"><i class="glyphicon glyphicon-barcode"></i> Transaction Line Item</h3>
        <div class="clearfix"></div>
    </div>
    <div class="panel-body">
        <?= GridView::widget([
            'dataProvider' => $details,
            'columns' => [
                ['class' => 'yii\grid\SerialColumn'],

                [
                    'attribute' => 'item_id',
                    'value' => 'item.code',
                    'header' => 'Item Code',
                ],
                [
                    'attribute' => 'item_id',
                    'value' => 'item.name',
                    'header' => 'Item Name',
                ],
                'quantity',
                'remarks',
            ],
        ]); ?>
    </div>
</div>

[/collapsed]

[collapsed title=Penampakan View Transaksi Barang]Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP View Transaction[/collapsed]

Simpulan

Mudah-mudahan tutorial ini dapat membantu teman-teman yang sedang belajar membuat aplikasi inventory, khususnya yang menggunakan Yii Framework. Source code aplikasi ini dapat dilihat di GitHub, silakan digunakan untuk keperluan pembelajaran saja.

.

 

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 – Part #3

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Master Barang (Items)

Code Factory Sistem Inventory atau Aplikasi Persediaan Barang adalah salah satu aplikasi yang umum dan cukup menantang terutama bagi para programmer pemula yang sedang mengasah skill programming-nya. Artikel kali ini akan membahas pengembangan CRUD untuk master data barang (items) setelah sebelumnya kita membahas persiapan database yang akan kita gunakan dalam Aplikasi Inventory ini. Kita akan memanfaatkan Gii Code Generator untuk mempercepat proses pengembangannya. Aplikasi yang akan kita bangun sederhana saja sehingga akan cukup mudah dipahami para programmer pemula.

(more…)

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 – Part #2

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Part #2

Code Factory | Selama proses pengembangan aplikasi database, struktur database yang digunakan juga ikut berubah dan berkembang seperti halnya kode sumber (source code) aplikasi kita. Misalnya, membuat tabel baru, menambahkan kolom baru, menambahkan indeks untuk meningkatkan kinerja query, dan sebagainya. Karena perubahan struktur database sering membutuhkan beberapa perubahan kode sumber, Yii menyediakan fitur migrasi database yang memungkinkan Anda untuk melacak perubahan database, melakukan upgrade struktur database, atau downgrade struktur database jika diperlukan. Referensi lengkap tentang migrasi database di Yii bisa dilihat di laman ini.

(more…)

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 – Part #1

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Part #1

Code Factory Sistem Inventory atau Aplikasi Persediaan Barang adalah salah satu aplikasi yang umum dan cukup menantang terutama bagi para programmer pemula yang sedang mengasah skill programming-nya. Aplikasi ini bisa kita buat sangat sederhana dengan hanya melibatkan data barang dan transaksinya, atau dibuat lebih rumit dengan melibatkan data gudang, kategori barang, proses approval, dan sebagainya. Artikel ini akan coba membahas aplikasi persediaan barang menggunakan framework Yii2. Aplikasi yang akan kita bangun sederhana saja agar mudah dipahami para programmer pemula.

Instalasi Apache, PHP, dan MySQL (atau MariaDB)

Yii2 membutuhkan minimal PHP versi 5.4 jadi sebelumnya kita harus pastikan bahwa sudah tersedia PHP 5.4 terinstall di laptop atau komputer kita. Dan karena kita akan membuat aplikasi database, maka pastikan juga laptop kita sudah terinstall database MySQL atau MariaDB. Untuk para pengguna Windows, disarankan menggunakan XAMPP minimal versi 1.8 untuk bisa menjalankan Yii2 ini, sedangkan pengguna Linux bisa menggunakan LAMP bawaan distro masing-masing. 

Instalasi Yii2 Menggunakan Composer

Instalasi Yii2 bisa dilakukan dengan 2 (dua) cara, yaitu menggunakan composer atau zip archive. Kedua cara instalasi tersebut sama mudahnya, namun composer memerlukan koneksi internet untuk berjalan. Untuk aplikasi ini kita akan menggunakan template basic yang lebih sederhana dan simple dibandingkan template advance. Perbedaan template basic dengan advance terletak pada struktur pengelolaan file saja, dan template advance ditujukan untuk project yang lebih kompleks. Dokumentasi Yii2 juga menerangkan langkah demi langkah instalasi template basic di laman ini

Jika composer belum terpasang di laptop silakan kunjungi laman getcomposer.org untuk mendapatkan petunjuk instalasi lengkapnya. Untuk pengguna Linux dan MacOS dapat menggunakan perintah command-line berikut ini:

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Sedangkan pengguna Windows dapat mengunduh (download) dan menjalankan Composer-Setup.exe. Silakan pelajari Dokumentasi Composer jika kamu mengalami masalah saat proses instalasi, atau mungkin sekedar ingin tahu lebih jauh tentang composer. 

Jika Composer sudah terpasang, maka jalankan perintah berikut ini untuk measang Yii2 di laptop kita.Pastikan menjalankan perintah ini di dalam folder yang bisa diakses via browser, misalkan di dalam folder htdocs instalasi xampp kamu.

composer global require "fxp/composer-asset-plugin:~1.0"
composer create-project --prefer-dist yiisoft/yii2-app-basic inventory

Perintah pertama tujuannya untuk memasang composer asset plugin yang memudahkan kita mengelola package yang tersedia di Composer. Perimtah ini cukup dilakukan sekali saja saat pertama kali memasang Yii. Sedangkan perintah kedua tujuannya untuk memasang Yii ke dalam folder inventory. Kita bisa mengganti nama folder tujuan menjadi apapun yang kita inginkan.

Note: During the installation Composer may ask for your Github login credentials. This is normal because Composer needs to get enough API rate-limit to retrieve the dependent package information from Github. For more details, please refer to the Composer documentation.

Instalasi Yii2 Menggunakan Zip Archive

Lakukan 3 (tiga) langkah berikut ini jika ingin memasang Yii Framework menggunakan arsip zip:

  1. Unduh (download) file arsip zip dari yiiframework.com.
  2. Extract file arsip yang berhasil diunduh ke dalam folder yang bisa diakses via browser, misalkan ke dalam folder htdocs instalasi xampp kamu..
  3. Buka dan ubah file config/web.php dengan mengubah setting cookieValidationKey, isilah dengan string apapun kesukaanmu (cookieValidationKey secara otomatis terisi jika kita melakukan instalsi menggunakan Composer):

    // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
    'cookieValidationKey' => 'enter your secret key here',

Memastikan Yii sudah terpasang

Untuk memastikan apakan Yii Framework sudah terpasang (installed) maka yang perlu kita lakukan adalah membuka browser. Dengan asumsi bahwa kita menginstall yii ke dalam folder inventory dan mengetikkan alamat berikut ini
http://localhost/inventory/web/

dan seharusnya halaman berikut akan muncul di browser.

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Part #1

 

.

Code Factory Workshop (Batch #03) – Membangun Aplikasi Inventory Menggunakan Yii2

Code Factory Workshop (Batch #03) - Membangun Aplikasi Inventory Menggunakan Yii2

Code Factory | Setelah sukses menyeleng-garakan Mini Workshop Batch #02 di tanggal 24 Oktober 2015, maka CodeFactory kembali akan menyelenggarakan batch #03 untuk materi Yii Framework. Mini Workshop kali ini akan lebih panjang waktunya dibandingkan workshop sebelumnya, karena workshop kali ini akan membahas studi kasus membangun sebuah Aplikasi Inventory Sederhana menggunakan Framework Yii2. Fitur yang akan dibangun akan meliputi Master Data Barang, Transaksi Barang, dan Laporan Stok Barang.

Jadwal

  • Tanggal: Sabtu, 5 Desember 2015
  • Pukul: 08:30 s.d. 15:00
  • Peserta: 30 Orang
  • Lokasi: Gedung Bapel (DAC-Solution) – Jl. Karet Hijau no. 29, Beji – Depok

Biaya

  • Umum – Rp. 50.000,-
  • Pelajar/Mahasiswa – Rp. 25.000,- silakan lampirkan kartu pelajar atau kartu mahasiswa yang masih berlaku saat komfirmasi pembayaran.
  • Rekomendasi PHP Indonesia – Rp. 30.000,- silakan menghubungi salah satu admin PHP Indonesia untuk mendapatkan rekomendasi.

Pembayaran biaya bisa dilakukan dengan cara transfer ke rekening

  • BCA: 421.281.0537
  • Mandiri: 90.000.27352.211
  • A.n. Nilam Savitri.

Dan kemudian mengirimkan konfirmasi pembayaran melalui

  • Email ke firman.syaefullah@dac-solution.com, atau
  • WA ke nomor 0812-9020-9901

Fasilitas

Para peserta akan mendapatkan fasilitas sebagai berikut

  • Sertifikat
  • Makan siang
  • Source code aplikasi

Pendaftaran

Silakan isi form ini http://goo.gl/forms/e2dRXJuH3J

 

Code Factory - Membangun Aplikasi PHP Profesional Menggunakan Yii Framework (Batch #03)

.