/** * 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); }
/** * 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) { } }