Esempio n. 1
0
 /**
  * Alternative handler for bca_parse_select_range_form.
  */
 protected function bcaParseSelectRangeForm()
 {
     // BCA memiliki keunikan dalam pencarian mutasi rekening.
     // Untuk harian, hanya bisa 31 hari terakhir dari hari ini.
     // Setelah itu adalah keseluruhan dari awal sampai akhir hari 2 bulan
     // lalu, dan 1 bulan lalu.
     // Ribet amat, yak.
     // 31 hari terakhir itu berarti total hari dari sekarang adalah 31 hari.
     // artinya ada jeda 30 hari antara hari ini dengan hari terakhir.
     // Bila hari ini adalah 2 Februari 2016, maka jika hari terakhir itu
     // 1 Januari 2016, maka tidak valid. tapi jika 2 januari 2016, maka
     // valid.
     $form = $this->configuration('temporary][form');
     $fields = $form->preparePostForm('value(submit1)');
     // Cari tahu rekening.
     $options_rekening = $this->html->find('select[name=value(D1)] > option')->getElements();
     $fields['value(D1)'] = $this->bcaSelectAccountGetValueFromOptionsElement($options_rekening);
     $type = null;
     // daily, monthly.
     // Check apakah ini revisit.
     $is_revisit = $this->configuration('temporary][revisit_account_statement_page');
     if ($is_revisit) {
         // Copot bulan selanjutnya.
         $_month = key($this->range);
         $month = array_shift($this->range);
         reset($this->range);
         // Jika month adalah bulan ini, maka gunakan pencarian tipe harian.
         // Jika month adalah bulan kemarin, maka gunakan pencarian tipe bulanan.
         $now_month = date('Y-m');
         $last_month = Range::getPrevMonth($now_month);
         if ($_month == $now_month) {
             $type = 'daily';
         } elseif ($_month == $last_month) {
             $type = 'monthly';
         }
     } else {
         // Bukan revisit, maka:
         $limit = new \DateTime('31 days ago');
         if ($this->range->isSameDay($limit, 'start') || $this->range->comparison($limit, '<', 'start')) {
             $type = 'daily';
             $month = $this->range;
         } else {
             $type = 'monthly';
             // Set over range.
             $this->configuration('temporary][over_range', true);
             // Set need to filter.
             $this->configuration('temporary][filter_transaction', true);
             // Simpan original range, karena akan dipecah.
             $this->configuration('temporary][range', $this->range);
             // Atur ulang range.
             $this->range = $this->range->splitPerMonth();
             $_month = key($this->range);
             reset($this->range);
             // Copot bulan pertama.
             $month = array_shift($this->range);
             // $month bisa merupakan start_date di tanggal 13 dan end date
             // di tanggal 31. tapi karena bca selalu di tanggal awal, maka:
             // Rebuild ulang, agar tanggal awal menjadi 1 dan tanggal akhir
             // menjadi last (28/29/30/31.
             $month = Range::create("first day of {$_month} ~ last day of {$_month}");
         }
     }
     // Simpan informasi $month, diperlukan untuk
     // method ::bcaConvertDateTransaction()
     $this->configuration('temporary][month', $month);
     // Positioning.
     switch ($type) {
         case 'daily':
             // Pilih field "Mutasi Harian".
             $fields['value(r1)'] = '1';
             unset($fields['value(x)']);
             $fields['value(startDt)'] = $month->format(self::BCA_DATE_FORMAT_DAILY_DATE, 'start');
             $fields['value(startMt)'] = $month->format(self::BCA_DATE_FORMAT_DAILY_MONTH, 'start');
             $fields['value(startYr)'] = $month->format(self::BCA_DATE_FORMAT_DAILY_YEAR, 'start');
             $fields['value(endDt)'] = $month->format(self::BCA_DATE_FORMAT_DAILY_DATE, 'end');
             $fields['value(endMt)'] = $month->format(self::BCA_DATE_FORMAT_DAILY_MONTH, 'end');
             $fields['value(endYr)'] = $month->format(self::BCA_DATE_FORMAT_DAILY_YEAR, 'end');
             $fields['value(fDt)'] = '';
             $fields['value(tDt)'] = '';
             break;
         case 'monthly':
             // Isi field r1
             // Pilih field "Mutasi Bulanan".
             $fields['value(r1)'] = '2';
             // Isi field x
             // Harusnya sudah ada variable $_month (string) dan
             // $month (object Range).
             $now_month = date('Y-m');
             $last_month = Range::getPrevMonth($now_month);
             $two_last_month = Range::getPrevMonth($last_month);
             if ($last_month == $_month) {
                 $fields['value(x)'] = '1';
             } elseif ($two_last_month == $_month) {
                 $fields['value(x)'] = '2';
             }
             // Isi field fDt & tDt.
             $fields['value(fDt)'] = $month->format(self::BCA_DATE_FORMAT, 'start');
             $fields['value(tDt)'] = $month->format(self::BCA_DATE_FORMAT, 'end');
             // Anomali BCA.
             // Kasus seperti ini: milih request bulan desember 2015
             // lalu oleh javascriptnya BCA dimodifikasi menjadi tanggal masa
             // depan yakni menjadi 01122016 ~ 31122016. dan saat disubmit
             // ternyata post fieldnya bener-bener tanggal masa depan yakni
             // 01122016 ~ 31122016. Tapi respon yang muncul tetap ke desember
             // 2015 (01122015 ~ 31122015). Hadeh, ke-tidakkonsisten-an ini
             // mengganggu coding.
             // Hack dimulai:
             // Modifikasi, tahun apapun menjadi tahun saat ini.
             $fields['value(fDt)'] = substr($fields['value(fDt)'], 0, -4) . date('Y');
             $fields['value(tDt)'] = substr($fields['value(tDt)'], 0, -4) . date('Y');
             unset($fields['value(startDt)']);
             unset($fields['value(endDt)']);
             unset($fields['value(startMt)']);
             unset($fields['value(endMt)']);
             unset($fields['value(startYr)']);
             unset($fields['value(endYr)']);
             break;
         default:
             // Do something.
             break;
     }
     // Set ke menu.
     $this->configuration("menu][bca_account_statement_page_view][fields", $fields);
 }
Esempio n. 2
0
 /**
  * Override parent::executeBefore()
  * Verifikasi kebutuhan sebelum melanjutkan execute.
  *
  * Catatan tentang validitas mutasi rekening di BNI.
  *
  *  - Tanggal transaksi paling lama yang bisa diambil adalah 6 bulan dari
  *    hari ini. Jika sekarang tanggal 25 januari 2016, maka bila start
  *    date 25-Jul-2015, error yang muncul adalah: "Tanggal Awal tidak boleh
  *    Melebihi 6 Bulan dari Tanggal Hari Ini" dan akan valid jika start_date
  *    24-Jul-2016.
  *
  *  - End date yang lewat dari hari ini, maka error yang muncul adalah:
  *    "Tanggal Akhir tidak boleh melebihi tanggal hari ini".
  *
  *  - Tiap sekali request, maka interval tidak boleh lebih 31 hari, jika
  *    lebih dari 31 hari, error yang muncul adalah: "Transaksi anda tidak
  *    dapat diproses. Periode tanggal yang anda pilih lebih dari 31 hari.
  *    Silahkan masukkan periode tanggal sesuai ketentuan.".
  *
  *  - Untuk support interval lebih dari 31 hari, maka module BNI melakukan
  *    split interval, kemudian melakukan request secara looping.
  *
  *  - Tanggal yang tidak valid (contoh 32-Jul-2015) atau format yang tidak
  *    valid (contoh 1-Aug-2015) maka error yang muncul adalah "Tanggal Akhir
  *    harus menggunakan format yang telah ditentukan dan tanggal yang
  *    valid".
  */
 protected function executeBefore()
 {
     parent::executeBefore();
     if (null === $this->username) {
         $this->log->error('Username belum didefinisikan.');
         throw new ExecuteException();
     }
     if (null === $this->password) {
         $this->log->error('Password belum didefinisikan.');
         throw new ExecuteException();
     }
     switch ($this->target) {
         case 'get_range_transaction':
             if (null === $this->range) {
                 $this->log->error('Range belum didefinisikan.');
                 throw new ExecuteException();
             }
             switch ($this->range) {
                 case 'now':
                 case 'today':
                 case 'last week':
                 case 'last month':
                     break;
                 default:
                     // Verifikasi rangenya.
                     $this->range = Range::create($this->range);
                     if (!$this->range->is_start_valid) {
                         $this->log->notice('Tanggal awal tidak valid. Tanggal otomatis diganti menjadi waktu saat ini.');
                     }
                     if (!$this->range->is_end_valid) {
                         $this->log->notice('Tanggal awal tidak valid. Tanggal otomatis diganti menjadi waktu saat ini.');
                     }
                     // Start date tidak boleh lebih dari 6 bulan sejak hari
                     // ini.
                     $oldest = new \DateTime('6 month ago');
                     // Masih kudu dikurangi satu hari lagi agar tidak
                     // error (lihat catatan pada doc comment fungsi ini).
                     $oldest->sub(new \DateInterval('P1D'));
                     if (!$this->range->isSameDay($oldest, 'start') && !$this->range->comparison($oldest, 'less', 'start')) {
                         $this->log->error('Tanggal Awal tidak boleh kurang dari 6 bulan lalu: {date}', ['date' => $oldest->format('Y-m-d')]);
                         throw new ExecuteException();
                     }
                     // End date tidak boleh lewat dari hari ini.
                     $now = new \DateTime();
                     if (!$this->range->isSameDay($now, 'end') && !$this->range->comparison($now, 'greater', 'end')) {
                         $this->log->error('Tanggal Akhir tidak boleh melebihi Tanggal Hari Ini.');
                         throw new ExecuteException();
                     }
             }
         case 'get_last_transaction':
             switch ($this->sort) {
                 case 'asc':
                 case 'desc':
                     break;
                 case 'ASC':
                 case 'ascending':
                 case 'ASCENDING':
                     $this->sort = 'asc';
                     break;
                 case 'descending':
                 case 'DESC':
                 case 'DESCENDING':
                     $this->sort = 'desc';
                     break;
                 default:
                     $this->sort = 'desc';
                     $this->log->notice('Transaksi otomatis diurut dengan pola descending.');
                     break;
             }
             break;
         default:
             // Do something.
             break;
     }
     switch ($this->target) {
     }
 }