Projekt

Obecné

Profil

Stáhnout (17.4 KB) Statistiky
| Větev: | Tag: | Revize:
<?php

/*
* This file is part of open source system FreenetIS
* and it is release under GPLv3 licence.
*
* More info about licence can be found:
* http://www.gnu.org/licenses/gpl-3.0.html
*
* More info about project can be found:
* http://www.freenetis.org/
*/

namespace freenetis\service\core;

use AbstractService;
use Settings;
use security;

/**
* Service that handles FreenetIS database setup for organization such as
* an association.
*
* @author Ondřej Fibich <ondrej.fibich@gmail.com>
* @since 1.2
*/
class SetupService extends AbstractService
{

/**
* Creates service.
*
* @param \ServiceFactory $factory
*/
public function __construct(\ServiceFactory $factory)
{
parent::__construct($factory);
}

/**
* Setup database with provided data about association. After setup
* admin user account, association bank account, double-entry account,
* fees and basic settings are created or set and FreenetIS is ready
* to be used.
*
* @param \freenetis\service\core\AssociationSetupData $d data
* @throws Exception on any error
*/
public function association(AssociationSetupData $d)
{
// data
$town_model = new \Town_Model();
$street_model = new \Street_Model();

try
{
$town_model->transaction_start();

// set deduct day
Settings::set('deduct_day', max(1, min(31, $d->deduct_day)));

// first member is special, it represents association
$member = new \Member_Model();
$member->id = \Member_Model::ASSOCIATION;
$member->registration = NULL;
$member->name = $d->name;

// address
$town = $town_model->get_town($d->zip_code, $d->town, $d->quarter);

$street = $street_model->get_street($d->street, $town->id);

$address_point_model = new \Address_point_Model();

$address_point = $address_point_model->get_address_point(
$d->default_country, $town->id, $street->id,
$d->street_number
);

// address point doesn't exist exist, create it
if (!$address_point->id)
{
$address_point->save_throwable();
}

$member->address_point_id = $address_point->id;

$enum_type = new \Enum_type_Model();
$member->type = $enum_type->get_type_id('Honorary member');
$member->entrance_date = date('Y-m-d', $d->foundation);
$member->save_throwable();

// every member has its one primary user of type "member"
$user = new \User_Model();
$user->member_id = $member->id;
$user->name = $d->login;
$user->surname = $d->login;
$user->birthday = date('Y-m-d', $d->foundation);
$user->login = $d->login;
$user->password = sha1($d->password);
$user->type = \User_Model::MAIN_USER;
$user->application_password = security::generate_password();
$user->save_throwable();

// add user to access list as admin
$groups_aro_map = new \Groups_aro_map_Model();
$groups_aro_map->aro_id = $user->id;
$groups_aro_map->group_id = \Aro_group_Model::ADMINS;
$groups_aro_map->save_throwable();

// users telephone
$contact = new \Contact_Model();
$contact->type = \Contact_Model::TYPE_PHONE;
$contact->value = $d->phone;
$contact->save_throwable();

$contact->add($user);
$contact->save_throwable();

$phone_country = new \Country_Model($d->default_country);
$contact->add($phone_country);
$contact->save_throwable();
$contact->clear();

// users email
if (!empty($d->email))
{
$contact->type = \Contact_Model::TYPE_EMAIL;
$contact->value = $d->email;
$contact->save_throwable();
$contact->add($user);
$contact->save_throwable();
}

// association has at least one real bank account
$bank_account = new \Bank_account_Model();
$bank_account->name = $d->account_name;
$bank_account->member_id = $member->id;
$bank_account->account_nr = $d->account_nr;
$bank_account->bank_nr = $d->bank_nr;
$bank_account->IBAN = $d->IBAN;
$bank_account->SWIFT = $d->SWIFT;
$bank_account->save_throwable();

// these three double-entry accounts are related to one bank account
// through relation table double-entry bank account
$doubleentry_bank_account = new \Account_Model();
$doubleentry_bank_account->member_id = $member->id;
$doubleentry_bank_account->name = $d->account_name;
$doubleentry_bank_account->account_attribute_id = \Account_attribute_Model::BANK;
$doubleentry_bank_account->comment = __('Bank accounts');
$doubleentry_bank_account->add($bank_account);
$doubleentry_bank_account->save_throwable();

// double-entry account of bank fees
$bank_fees_account = new \Account_Model();
$bank_fees_account->member_id = $member->id;
$bank_fees_account->name = $d->account_name . ' - ' . __('Bank fees');
$bank_fees_account->account_attribute_id = \Account_attribute_Model::BANK_FEES;
$bank_fees_account->comment = __('Bank fees');
$bank_fees_account->add($bank_account);
$bank_fees_account->save_throwable();

// double-entry account of bank interests
$bank_interests_account = new \Account_Model();
$bank_interests_account->member_id = $member->id;
$bank_interests_account->name = $d->account_name . ' - ' . __('Bank interests');
$bank_interests_account->account_attribute_id = \Account_attribute_Model::BANK_INTERESTS;
$bank_interests_account->comment = __('Bank interests');
$bank_interests_account->add($bank_account);
$bank_interests_account->save_throwable();

// other double entry accounts independent of bank account
// double-entry cash account
$cash_account = new \Account_Model();
$cash_account->member_id = $member->id;
$cash_account->name = __('Cash');
$cash_account->account_attribute_id = \Account_attribute_Model::CASH;
$cash_account->comment = __('Cash');
$cash_account->save_throwable();

// double-entry operating account
$operating_account = new \Account_Model();
$operating_account->member_id = $member->id;
$operating_account->name = __('Operating account');
$operating_account->account_attribute_id = \Account_attribute_Model::OPERATING;
$operating_account->comment = __('Operating account');
$operating_account->save_throwable();

// double-entry infrastructure account
$infrastructure_account = new \Account_Model();
$infrastructure_account->member_id = $member->id;
$infrastructure_account->name = __('Infrastructure account');
$infrastructure_account->account_attribute_id = \Account_attribute_Model::INFRASTRUCTURE;
$infrastructure_account->comment = __('Infrastructure account');
$infrastructure_account->save_throwable();

// double-entry account of purchasers
$purchasers_account = new \Account_Model();
$purchasers_account->member_id = $member->id;
$purchasers_account->name = __('Purchasers account');
$purchasers_account->account_attribute_id = \Account_attribute_Model::PURCHASERS;
$purchasers_account->comment = __('Purchasers account');
$purchasers_account->save_throwable();

// double-entry account of suppliers
$suppliers_account = new \Account_Model();
$suppliers_account->member_id = $member->id;
$suppliers_account->name = __('Suppliers account');
$suppliers_account->account_attribute_id = \Account_attribute_Model::SUPPLIERS;
$suppliers_account->comment = __('Suppliers account');
$suppliers_account->save_throwable();

// double-entry account of received member fees
$fees_account = new \Account_Model();
$fees_account->member_id = $member->id;
$fees_account->name = __('Received member fees');
$fees_account->account_attribute_id = \Account_attribute_Model::MEMBER_FEES;
$fees_account->comment = __('Received member fees');
$fees_account->save_throwable();

// interval of fee availability
$from = date('Y-m-d', $d->foundation);
$to = '9999-12-31 23:59:59';

// entrance fee
$entrance_fee = new \Fee_Model();
$entrance_fee->fee = $d->entrance_fee;
$entrance_fee->from = $from;
$entrance_fee->to = $to;
$entrance_fee->type_id = $enum_type->get_type_id('entrance fee');
$entrance_fee->save_throwable();

// default entrance fee
$default_entrance_fee = new \Members_fee_Model();
$default_entrance_fee->fee_id = $entrance_fee->id;
$default_entrance_fee->member_id = $member->id;
$default_entrance_fee->activation_date = $from;
$default_entrance_fee->deactivation_date = $to;
$default_entrance_fee->priority = 1;
$default_entrance_fee->save_throwable();

// regular member fee
$regular_member_fee = new \Fee_Model();
$regular_member_fee->fee = $d->regular_member_fee;
$regular_member_fee->from = $from;
$regular_member_fee->to = $to;
$regular_member_fee->type_id = $enum_type->get_type_id('regular member fee');
$regular_member_fee->save_throwable();

// default regular member fee
$default_regular_member_fee = new \Members_fee_Model();
$default_regular_member_fee->fee_id = $regular_member_fee->id;
$default_regular_member_fee->member_id = $member->id;
$default_regular_member_fee->activation_date = $from;
$default_regular_member_fee->deactivation_date = $to;
$default_regular_member_fee->priority = 1;
$default_regular_member_fee->save_throwable();

// transfer fee
$transfer_fee = new \Fee_Model();
$transfer_fee->fee = $d->transfer_fee;
$transfer_fee->from = $from;
$transfer_fee->to = $to;
$transfer_fee->type_id = $enum_type->get_type_id('transfer fee');
$transfer_fee->save_throwable();

// default transfer fee
$default_transfer_fee = new \Members_fee_Model();
$default_transfer_fee->fee_id = $transfer_fee->id;
$default_transfer_fee->member_id = $member->id;
$default_transfer_fee->activation_date = $from;
$default_transfer_fee->deactivation_date = $to;
$default_transfer_fee->priority = 1;
$default_transfer_fee->save_throwable();

// penalty
$penalty = new \Fee_Model();
$penalty->fee = $d->penalty;
$penalty->from = $from;
$penalty->to = $to;
$penalty->type_id = $enum_type->get_type_id('penalty');
$penalty->save_throwable();

// default transfer fee
$default_penalty = new \Members_fee_Model();
$default_penalty->fee_id = $penalty->id;
$default_penalty->member_id = $member->id;
$default_penalty->activation_date = $from;
$default_penalty->deactivation_date = $to;
$default_penalty->priority = 1;
$default_penalty->save_throwable();

// permament whitelist
$members_whitelist = new \Members_whitelist_Model();
$members_whitelist->member_id = $member->id;
$members_whitelist->permanent = 1;
$members_whitelist->since = date('Y-m-d');
$members_whitelist->until = '9999-12-31';
$members_whitelist->save_throwable();

// saves special (read-only) types of fee
$fee_model = new \Fee_Model();

foreach (\Fee_Model::$SPECIAL_TYPE_NAMES as $id => $name)
{
$fee_model->clear();
$fee_model->readonly = 1;
$fee_model->fee = 0;
$fee_model->from = $from;
$fee_model->to = $to;
$fee_model->type_id = $enum_type->get_type_id('regular member fee');
$fee_model->name = $name;
$fee_model->special_type_id = $id;
$fee_model->save_throwable();
}

// system settings
Settings::set('title', $d->title);
Settings::set('currency', $d->currency);
Settings::set('default_country', $d->default_country);
// set base domain
Settings::set('domain', $d->domain);
// set subdirectory
Settings::set('suffix', $d->suffix);
// remove index.php from urls
Settings::set('index_page', $d->index_page);

// commit changes
$town_model->transaction_commit();
}
catch (Exception $ex)
{
$town_model->transaction_rollback();
throw $ex;
}
}

}

/**
* Data required for association setup.
*/
class AssociationSetupData {

/**
* Day in month of deduct (from 1 up to 31).
*
* @var int
*/
public $deduct_day;

/**
* Organization name.
*
* @var string
*/
public $name;

/**
* Date of foundation of organization.
*
* @var date
*/
public $foundation;

/**
* Address - town name.
*
* @var string
*/
public $town;

/**
* Address - town quarter name.
*
* @var string
*/
public $quarter;

/**
* Address - street name.
*
* @var string
*/
public $street;

/**
* Address - country number ID.
*
* @var int
*/
public $default_country;

/**
* Address - street number.
*
* @var string
*/
public $street_number;

/**
* Address - ZIP code.
*
* @var string
*/
public $zip_code;

/**
* Admin account username.
*
* @var string
*/
public $login;

/**
* Admin account password.
*
* @var string
*/
public $password;

/**
* Organization phone.
*
* @var string
*/
public $phone;

/**
* Organization e-mail.
*
* @var string
*/
public $email;

/**
* Organization bank account name.
*
* @var string
*/
public $account_name;

/**
* Organization bank account - account number.
*
* @var integer
*/
public $account_nr;

/**
* Organization bank account - bank number.
*
* @var integer
*/
public $bank_nr;

/**
* Organization bank account - IBAN.
*
* @var string
*/
public $IBAN;

/**
* Organization bank account - SWIFT.
*
* @var string
*/
public $SWIFT;

/**
* Entrance member fee amount - must be higher or equal zero.
*
* @var double
*/
public $entrance_fee;

/**
* Regular month member fee amount - must be higher or equal zero.
*
* @var double
*/
public $regular_member_fee;

/**
* Transfer fee amount - ust be higher or equal zero.
* Transfer fee that is charged for each member transaction to association.
*
* @var double
*/
public $transfer_fee;

/**
* Penalty fee amount - must be higher or equal zero. Penalty fee is charged
* for invalid made bank transaction made by member.
*
* @var string
*/
public $penalty;

/**
* System title.
*
* @var string
*/
public $title;

/**
* System currency.
*
* @var string
*/
public $currency;

/**
* System install domain name e.g. !freenetis.tlgh-free.cz".
*
* @var string
*/
public $domain;

/**
* System install URL suffix e.g. "/freenetis-main/". Allows to tun multiple
* FreenetIS installations on a single domain but commonly it is just "/".
*
* @var string
*/
public $suffix;

/**
* Is index.php part of each URL (.httaccess server support required for
* disabling this option).
*
* @var boolean
*/
public $index_page;

/**
* Set values of abject from associative array.
*
* @param array $values associative properties array
* @throws \InvalidArgumentException on invalid values or unknown property
*/
public function set_values($values)
{
if (empty($values) || !is_array($values))
{
throw new \InvalidArgumentException('values must be assoc array');
}
foreach ($values as $key => $value)
{
if (!property_exists($this, $key))
{
throw new \InvalidArgumentException('unknown property ' . $key);
}
$this->{$key} = $value;
}
}

}
(4-4/4)