public function run($context) { $stock_count = 0; foreach ($context->stocks as $stock) { if ($stock->attivo == 0 || $stock->tipo != 'obbligazione') { // printf("%s stock %s is inactive or not a bond.\n", get_called_class(), $stock->isin); continue; } $bond = new Bond(); if (!$bond->find_by_id($stock->isin)) { // printf("%s bond %s does not exist.\n", get_called_class(), $stock->isin); continue; } if ($bond->scadenza < date('Y-m-d')) { $stock->attivo = 0; $stock->save(); $stock_count++; } // else // { // printf("%s bond %s expires in the future\n", get_called_class(), $stock->isin); // } } printf("%s deactivated %d stocks\n", get_called_class(), $stock_count); }
function populate_cedole() { $bond_factory = new Bond(); $today = date('Y-m-d'); // $bonds = $bond_factory->find_all(array('where_clause' => "`stacco` != '0000-00-00' AND `cadenza` > 0 AND `scadenza` > '{$today}'")); $bonds = $bond_factory->find_all(array('where_clause' => "`cadenza` > 0 AND `scadenza` > '{$today}'")); // print_r($bonds); foreach ($bonds as $bond) { if ($bond->stacco != '0000-00-00') { $s = strtotime($bond->stacco); $k = 1; } else { $s = strtotime($bond->scadenza); $k = -1; } $d = $today = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $c = 0; while ($d >= $today && $d <= $s) { $m = date('n', $s) + $c; $d = mktime(0, 0, 0, $m, date('d', $s), date('Y')); $cedola = new Cedola(array('isin' => $bond->isin, 'stacco' => date('Y-m-d', $d), 'tasso' => $bond->tasso)); $cedola->_force_create = TRUE; $cedola->_ignore = TRUE; $cedola->save(); $c += $k * $bond->cadenza; } } }
public function run($context) { $bond_count = 0; $yield_count = 0; $bond_factory = new Bond(); $today = date('Y-m-d'); foreach ($context->stocks as $stock) { if ($stock->tipo != 'obbligazione') { // printf("%s is not a bond, skipping\n", $stock->isin); continue; } // $bonds = $bond_factory->find_all(array('where_clause' => "`stacco` != '0000-00-00' AND `cadenza` > 0 AND `scadenza` > '{$today}'")); $bond = new Bond(); if (!$bond->find_by_id($stock->isin)) { // printf("%s does not have a bond, skipping\n", $stock->isin); continue; } // Cleanup yields beyond expiration $cedola_factory = new Cedola(); $cedole = $cedola_factory->find_all(array('where_clause' => "`isin` = '{$bond->isin}' " . "AND `stacco` > '{$bond->scadenza}'")); if (count($cedole) > 0) { foreach ($cedole as $cedola) { // printf("Deleting yield of stock %s beyond expiration %s\n", $stock->isin, $cedola->stacco); $cedola->delete(); } } // $bonds = $bond_factory->find_all(array('where_clause' => "`stacco` != '0000-00-00' AND `cadenza` > 0 AND `scadenza` > '{$today}'")); $bonds = $bond_factory->find_all(array('where_clause' => '`cadenza` > 0 ' . "AND `isin` = '{$stock->isin}' " . "AND `zero_coupon` = 0 " . "AND `scadenza` > '{$today}'")); if (count($bonds) < 1) { // printf("No valid bond found with isin %s\n", $stock->isin); continue; } $bond = $bonds[0]; if ($bond->stacco != '0000-00-00') { $s = strtotime($bond->stacco); $k = 1; } else { $s = strtotime($bond->scadenza); $k = -1; } $d = $today = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $c = 0; while ($d >= $today && $d <= $s) { $m = date('n', $s) + $c; $d = mktime(0, 0, 0, $m, date('d', $s), date('Y')); $cedola = new Cedola(array('isin' => $bond->isin, 'stacco' => date('Y-m-d', $d), 'tasso' => $bond->tasso)); $cedola->_force_create = TRUE; $cedola->_ignore = TRUE; $cedola->save(); $c += $k * $bond->cadenza; $yield_count++; // printf("Creating new yield of stock %s on %s\n", $stock->isin, $cedola->stacco); } $bond_count++; } printf("%s updated %d yields for %d bonds\n", get_called_class(), $yield_count, $bond_count); }
public function run($context) { $stock_factory = new Stock(); $stocks = $stock_factory->find_by_query('SELECT * FROM `creso_titoli` ' . 'LEFT JOIN `creso_obbligazioni` ON `creso_titoli`.`isin` = `creso_obbligazioni`.`isin` ' . 'WHERE ' . "`creso_titoli`.`tipo` = 'obbligazione' " . 'AND ' . "`creso_obbligazioni`.`emissione` = '0000-00-00' " . 'AND ' . '`creso_titoli`.`attivo` = 1 ' . 'LIMIT 1500'); $updated_count = 0; foreach ($stocks as $stock) { $bond = new Bond(); $bond->find_by_id($stock->isin); $bond->emissione = isin2emissione_ariva($stock->isin); if ($bond->emissione != '0000-00-00') { $bond->save(); $updated_count++; } } printf("%s updated %d bonds\n", get_called_class(), $updated_count); }
public function run($context) { $bond_count = 0; $bond_zero_stacco = 0; $bond_zero_emissione = 0; $bond_zero_tasso = 0; $bond_zero_stacco_emissione = 0; $bond_factory = new Bond(); foreach ($context->stocks as $stock) { if ($stock->tipo != 'obbligazione') { // printf("%s is not a bond, skipping\n", $stock->isin); continue; } // $bonds = $bond_factory->find_all(array('where_clause' => "`stacco` != '0000-00-00' AND `cadenza` > 0 AND `scadenza` > '{$today}'")); $bond = new Bond(); if (!$bond->find_by_id($stock->isin)) { // printf("%s does not have a bond, skipping\n", $stock->isin); continue; } if ($bond->zero_coupon == 1) { // printf("bond %s is a zero coupon\n", $bond->isin); continue; } if ($bond->tasso == 0) { // printf("bond %s has tasso set to 0\n", $bond->isin); $bond_zero_tasso++; } if ($bond->emissione == '0000-00-00' && $bond->stacco == '0000-00-00') { printf("bond %s has emissione and stacco set to 0000-00-00\n", $bond->isin); $bond_zero_stacco_emissione++; } else { if ($bond->stacco == '0000-00-00') { // printf("bond %s has stacco set to 0000-00-00\n", $bond->isin); $bond_zero_stacco++; } else { if ($bond->emissione == '0000-00-00') { // printf("bond %s has emissione set to 0000-00-00\n", $bond->isin); $bond_zero_emissione++; } } } $bond_count++; } printf("%s analyzed %d bonds, %d had zero tasso, %d zero stacco and emissione, %d zero stacco, %d zero emissione\n", get_called_class(), $bond_count, $bond_zero_tasso, $bond_zero_stacco_emissione, $bond_zero_stacco, $bond_zero_emissione); }
public function _index() { $bond_factory = new Bond(); $today = date('Y-m-d'); $bonds = $bond_factory->find_all(array('where_clause' => "`stacco` != '0000-00-00' AND `cadenza` > 0 AND `scadenza` > '{$today}'")); // print_r($bonds); $this->bonds = []; foreach ($bonds as $bond) { $bond->stock = new Stock(); $bond->stock->find_by_id($bond->isin); $s = strtotime($bond->stacco); if ($bond->cadenza < 12) { for ($c = 0; $c < 12; $c += $bond->cadenza) { $b = $c == 0 ? $bond : clone $bond; $m = (date('m', $s) + $c) % 12; $m = $m == 0 ? 12 : $m; $b->stacco = date('Y-m-d', mktime(0, 0, 0, $m, date('d', $s), date('Y'))); $this->bonds[] = $b; } } else { $bond->stacco = date('Y-m-d', mktime(0, 0, 0, date('m', $s), date('d', $s), date('Y'))); $this->bonds[] = $bond; } } function cmp_bond($a, $b) { return strtotime($a->stacco) - strtotime($b->stacco); } usort($this->bonds, 'cmp_bond'); // print_r($this->bonds); $this->bonds_by_month = array(); foreach ($this->bonds as $bond) { $s = strtotime($bond->stacco); $m = date('m', $s); if (!isset($this->bonds_by_month[$m])) { $this->bonds_by_month[$m] = array(); } $this->bonds_by_month[$m][] = $bond; } // print_r($this->bonds_by_month); }
/** * Action methods */ public function index() { $conn = $this->get_connection(); if (empty($_REQUEST['month-from'])) { $_REQUEST['month-from'] = date('Y-m-00'); } if (empty($_REQUEST['month-to'])) { // Default horizon is 6 months $_REQUEST['month-to'] = date('Y-m-d', mktime(0, 0, 0, date('m') + 6, 0, date('Y'))); } $portfolio_stock_factory = new PortfolioStock(); $stock_factory = new Stock(); $portfolio_stocks = $portfolio_stock_factory->find_by_query('SELECT `creso_portfolio`.`id`, `creso_portfolio`.`quantita`, `creso_portfolio`.`isin`, `creso_titoli`.`tipo`, `creso_titoli`.`title` ' . 'FROM `creso_portfolio` ' . 'LEFT JOIN `creso_titoli` ON `creso_portfolio`.`isin` = `creso_titoli`.`isin` ' . "WHERE `utente` = '{$conn->escape($_COOKIE['username'])}' " . (!empty($_REQUEST['mercato']) ? "AND `mercato` = '{$conn->escape($_REQUEST['mercato'])}' " : '') . (!empty($_REQUEST['tipo']) ? "AND `tipo` = '{$conn->escape($_REQUEST['tipo'])}' " : '') . (!empty($_REQUEST['divisa']) ? "AND `divisa` = '{$conn->escape($_REQUEST['divisa'])}' " : '') . 'ORDER BY ' . sprintf('`%s` %s ', $this->get_sort('isin'), $this->get_dir()) . "LIMIT {$conn->escape($this->get_start())}, {$conn->escape($this->get_limit())}"); $this->rimborsi = array(); if (count($portfolio_stocks) > 0) { $bond_factory = new Bond(); foreach ($portfolio_stocks as $item) { $item->stock = new Stock(); $item->stock->find_by_id($item->isin); switch ($item->stock->tipo) { case 'azione': break; case 'obbligazione': $bonds = $bond_factory->find_all(array('where_clause' => "`isin` = '{$item->isin}' " . "AND `scadenza` >= '{$conn->escape($_REQUEST['month-from'])}' " . "AND `scadenza` <= '{$conn->escape($_REQUEST['month-to'])}' ")); if (count($bonds) > 0) { $item->bond = $bonds[0]; $this->rimborsi[] = clone $item; } break; } } if (!function_exists('cmp_stock')) { function cmp_stock($a, $b) { return $a->bond->scadenza - $b->bond->scadenza; } } uasort($this->rimborsi, 'cmp_stock'); } }
function reinvest() { $conn = $this->get_connection(); if (!isset($_REQUEST['month-to'])) { $_REQUEST['month-to'] = date('Y-m-d', mktime(0, 0, 0, date('m') + self::DEFAULT_ROI_HORIZON_MONTHS, 0, date('Y'))); } $this->id = $id = $_REQUEST['isin'] = $_REQUEST['id']; $stock = new Stock(); if ($stock->find_by_id($id)) { $stock->has_one('bond'); } $bond_factory = new Bond(); $this->bonds = $bond_factory->find_all(array('where_clause' => "`cadenza` = {$conn->escape($stock->bond->cadenza)}" . " AND `scadenza` LIKE '%-{$conn->escape(strftime('%m', strtotime($stock->bond->scadenza)))}-%'" . " AND `scadenza` >= NOW()", 'limit' => is_numeric($_REQUEST['limit']) ? $_REQUEST['limit'] : 100)); $this->stock = $stock; $this->sorted_bonds = array(); foreach ($this->bonds as $bond) { $this->sorted_bonds[$bond->isin] = $bond; } $this->isins = array_map(function ($bond) { return $bond->isin; }, $this->bonds); $this->get_roi(); }
private function get_rimborsi() { $payments = array(); $conn = $this->get_connection(); $portfolio_stock_factory = new PortfolioStock(); $portfolio_stocks = $portfolio_stock_factory->find_by_query('SELECT `creso_portfolio`.`id`, `creso_portfolio`.`quantita`, `creso_portfolio`.`isin`, `creso_titoli`.`tipo`, `creso_titoli`.`title` ' . 'FROM `creso_portfolio` ' . 'LEFT JOIN `creso_titoli` ON `creso_portfolio`.`isin` = `creso_titoli`.`isin` ' . "WHERE `utente` = '{$conn->escape($_COOKIE['username'])}' " . (!empty($_REQUEST['mercato']) ? "AND `mercato` = '{$conn->escape($_REQUEST['mercato'])}' " : '') . (!empty($_REQUEST['tipo']) ? "AND `tipo` = '{$conn->escape($_REQUEST['tipo'])}' " : '') . (!empty($_REQUEST['divisa']) ? "AND `divisa` = '{$conn->escape($_REQUEST['divisa'])}' " : '') . (!empty($_REQUEST['isin']) ? "AND `creso_portfolio`.`isin` = '{$conn->escape($_REQUEST['isin'])}' " : '') . 'ORDER BY ' . sprintf('`%s` %s ', $this->get_sort('isin'), $this->get_dir()) . "LIMIT {$conn->escape($this->get_start())}, {$conn->escape($this->get_limit())}"); if (count($portfolio_stocks) == 0 && !empty($_REQUEST['isin'])) { $portfolio_stocks = $this->synthesize_portfolio_stocks(); } if (count($portfolio_stocks) > 0) { foreach ($portfolio_stocks as $portfolio_stock) { $stock = new Stock(); $stock->find_by_id($portfolio_stock->isin); if ($this->historiful) { $quantita_history = $this->backfill_with_historical_data($portfolio_stock); } switch ($stock->tipo) { case 'azione': break; case 'obbligazione': $bond_factory = new Bond(); $bonds = $bond_factory->find_all(array('where_clause' => "`isin` = '{$portfolio_stock->isin}' " . "AND `scadenza` >= '{$conn->escape($_REQUEST['month-from'])}' " . "AND `scadenza` <= '{$conn->escape($_REQUEST['month-to'])}' ")); if (count($bonds) > 0) { $bond = $bonds[0]; $payment = new Payment(); $q = $portfolio_stock->quantita; foreach ($quantita_history as $date => $quantita) { if ($date < $bond->scadenza) { break; } $q = $quantita; } $payment->stock = $stock; $payment->portfolio_stock = $portfolio_stock; $payment->bond = $bond; $payment->timestamp = strtotime($bond->scadenza); $payment->importo = $payment->bond->prezzo_rimborso * $q / 100; $payment->quantita = $q; $payment->tipo = 'rimborso'; $payments[] = $payment; } break; } } } return $payments; }
public static function refunds($isin, $month_from, $month_to) { $payments = array(); $conn = Db::get_connection(); $stock = new Stock(); if (!$stock->find_by_id($isin)) { return; } switch ($stock->tipo) { case 'azione': break; case 'obbligazione': $bond_factory = new Bond(); $bonds = $bond_factory->find_all(array('where_clause' => "`isin` = '{$conn->escape($isin)}' " . "AND `scadenza` >= '{$conn->escape($month_from)}' " . "AND `scadenza` <= '{$conn->escape($month_to)}' ")); if (count($bonds) > 0) { $bond = $bonds[0]; $payment = new Payment(); $payment->stock = $stock; $payment->bond = $bond; $payment->timestamp = strtotime($bond->scadenza); $payment->importo = $payment->bond->prezzo_rimborso; $payment->tipo = 'rimborso'; $payments[] = $payment; } break; } return $payments; }
/** * @fn edit * @short Edits an instrument * @details Action to edit details of an instrument, handles both the display of * the instrument to edit, as well as the postback action to save the model. */ public function edit() { if ($this->request->is_post()) { $this->stock = new Stock($_POST); $this->stock->save(); if ($this->stock->tipo == 'obbligazione') { $bond = new Bond(); $this->bond = new Bond($_POST); if (!$bond->find_by_id($this->stock->isin)) { $this->bond->_force_create = TRUE; } $this->bond->save(); } $this->expire_cached_page(array('controller' => 'json', 'action' => 'titoli')); $this->redirect_to(array('action' => 'browse', 'id' => $this->stock->isin)); } else { $this->stock = new Stock(); if (!$this->stock->find_by_id($_GET['id'])) { HTTP::error(404); } if ($this->stock->tipo == 'obbligazione') { $this->stock->has_one('bond'); } } }
public function run($context) { // printf("ISIN;Emissione;Scadenza;Cadenza;Stacco;Tasso\n"); $updated_count = 0; foreach ($context->stocks as $stock) { if ($stock->tipo != 'obbligazione' || !$stock->attivo) { continue; } // print_r($stock); $bond = new Bond(); if ($bond->find_by_id($stock->isin)) { if ($bond->scadenza != EPOCH_ZERO && $bond->emissione != EPOCH_ZERO && $bond->stacco != EPOCH_ZERO) { continue; } } // printf("%s;%s;%s;%s;%s;%s\n", // $bond->isin, // $bond->emissione, // $bond->scadenza, // $bond->cadenza, // $bond->stacco, // $bond->tasso // ); switch ($stock->mercato) { case "eurotlx": case "tlx": $params = isin2bond_tlx($stock->isin, $context->preferences->isin_lookup_eurotlx); break; } if ($params === FALSE) { continue; } $bond_new = new Bond($params); $bond_new->isin = $stock->isin; if (!empty($bond_new->scadenza) && $bond->scadenza != $bond_new->scadenza || !empty($bond_new->emissione) && $bond->emissione != $bond_new->emissione || !empty($bond_new->stacco) && $bond->stacco != $bond_new->stacco) { // printf("%s;%s;%s;%s;%s;%s\n", // $bond->isin, // $bond->emissione, // $bond->scadenza, // $bond->cadenza, // $bond->stacco, // $bond->tasso // ); // // printf("%s;%s;%s;%s;%s;%s\n\n", // $bond_new->isin, // $bond_new->emissione, // $bond_new->scadenza, // $bond_new->cadenza, // $bond_new->stacco, // $bond_new->tasso // ); // print_r($bond_new); $bond_new->_force_create = TRUE; $bond_new->_ignore = TRUE; $bond_new->save(); $updated_count++; } } printf("%s updated %d bonds\n", get_called_class(), $updated_count); }
<?php $bond = new Bond(); $bond->find_by_id($this->stock->isin); ?> <tr class="row1"> <th></th> <th>Evento</th> <th>Data</th> <th>Importo lordo</th> <th>Tasso</th> </tr> <tr class="row0"> <td class="cell10"><div class="vstrut17"></div></td> <td class="cell10">Emissione</td> <td class="cell10"><b><?php print $bond->emissione(); ?> </b></td> <td class="cell10"></td> <td class="cell10"></td> </tr> <tr class="row1"> <td class="cell10"><div class="vstrut17"></div></td> <td class="cell10">Scadenza</td> <td class="cell10"><b><?php print $bond->scadenza(); ?> </b></td>
public function test_cedole_within_no_cadenza() { $instance = new Bond(); $instance->cadenza = 0; $cedole = $instance->cedole_within('2016-07-17', '2016-12-31'); $this->assertEquals(0, count($cedole)); }
<?php ini_set('max_execution_time', 3000); require_once dirname(__FILE__) . "/lib.inc.php"; require_once dirname(__FILE__) . "/../include/db.inc.php"; require_once dirname(__FILE__) . "/../include/" . DB_ADAPTER . "_adapter.php"; require_once dirname(__FILE__) . "/../models/preference.php"; require_once dirname(__FILE__) . "/../models/bond.php"; require_once dirname(__FILE__) . "/../models/stock.php"; date_default_timezone_set('Europe/Rome'); echo "Reading preferences..."; $preference_factory = new Preference(); $preferences = $preference_factory->find_all()[0]; // print_r($preferences); echo "done\n"; $stock_factory = new Stock(); $stocks = $stock_factory->find_by_query('SELECT * FROM `creso_titoli` ' . 'LEFT JOIN `creso_obbligazioni` ON `creso_titoli`.`isin` = `creso_obbligazioni`.`isin` ' . 'WHERE ' . "`creso_titoli`.`tipo` = 'obbligazione' " . 'AND ' . "`creso_obbligazioni`.`emissione` = '0000-00-00' " . 'AND ' . '`creso_titoli`.`attivo` = 1 ' . 'LIMIT 1500'); printf("%d bonds found\n", count($stocks)); $updated_count = 0; foreach ($stocks as $stock) { // print_r($stock); $bond = new Bond(); $bond->find_by_id($stock->isin); // print_r($bond); $bond->emissione = isin2emissione_ariva($stock->isin); print_r($bond); if ($bond->emissione != '0000-00-00') { $bond->save(); $updated_count++; } } printf("%d updated bonds\n", $updated_count);
require_once dirname(__FILE__) . "/../models/bond.php"; require_once dirname(__FILE__) . "/../models/stock.php"; date_default_timezone_set('Europe/Rome'); echo "Reading preferences..."; $preference_factory = new Preference(); $preferences = $preference_factory->find_all()[0]; // print_r($preferences); echo "done\n"; $stock_factory = new Stock(); $stocks = $stock_factory->find_all(array('where_clause' => "`tipo`='obbligazione'", 'limit' => 1500)); foreach ($stocks as $stock) { if (!$stock->attivo) { continue; } // print_r($stock); $bond = new Bond(); if (!$bond->find_by_id($stock->isin)) { switch ($stock->mercato) { case "eurotlx": $bond = new Bond(isin2bond_tlx($stock->isin, $preferences->isin_lookup_eurotlx)); $bond->isin = $stock->isin; break; case "tlx": $bond = new Bond(isin2bond_tlx($stock->isin, $preferences->isin_lookup_eurotlx)); $bond->isin = $stock->isin; break; } print_r($bond); $bond->_force_create = TRUE; $bond->_ignore = TRUE; $bond->save();