~eventum-developers/eventum/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
<?php
/**
 * Abstract class representing a customer
 *
 * @author Bryan Alsdorf <balsdorf@gmail.com>
 */
abstract class Customer
{
    /**
     * Holds the parent CRM object.
     *
     * @var CRM
     */
    protected $crm;

    /**
     * Holds the database connection this object should use.
     *
     * @var MDB2_Driver_Common
     */
    protected $connection;

    /**
     * The ID of the customer this object represents
     *
     * @var string
     */
    protected $customer_id;

    /**
     * The name of the customer this object represents
     *
     * @var string
     */
    protected $name;

    /**
     * The country of the customer this object represents
     *
     * @var string
     */
    protected $country;


    /**
     * The account manager
     *
     * @var string
     */
    protected $account_manager;

    /**
     * Constructs the customer object and loads customer and support option data.
     *
     * @param CRM $crm
     * @param string $customer_id
     * @throws CustomerNotFoundException
     * @see Customer::load();
     */
    function __construct(CRM &$crm, $customer_id)
    {
        $this->crm =& $crm;
        $this->connection =& $crm->getConnection();
        $this->customer_id = $customer_id;

        // attempt to load the data
        $this->load();
    }


    /**
     * Loads customer information into the object.
     *
     * @throws CustomerNotFoundException
     */
    abstract protected function load();


    /**
     * Returns an array of contracts for this customer.
     *
     * @param   mixed Options An array of options that determine which contracts should be returned.
     * @return  Contract[] An array of Contract objects
     */
    abstract public function getContracts($options = array());


    /**
     * Returns an array of contact objects for this customer.
     *
     * @return  Contact[] An array of Contact objects
     */
    abstract public function getContacts();

    /**
     * Returns various settings used when creating an issue
     *
     * @return array
     */
    abstract public function getSettings();

    /**
     * Returns an array of details about this customer
     *
     * @return  array
     */
    abstract public function getDetails();

    /**
     * Returns a message to be displayed to a customer on the top of the issue creation page.
     *
     * @return string
     */
    abstract public function getNewIssueMessage();


//
//    /**
//     * Method used to get the overall statistics of issues in the system for a
//     * given customer.
//     *
//     * @param   mixed $contract_ids
//     * @return  array The customer related issue statistics
//     */
//    abstract public function getOverallStats($contract_ids);

    public function getCustomerID()
    {
        return $this->customer_id;
    }

    public function getName()
    {
        return $this->name;
    }

    public function getAccountManager()
    {
        // TODO: Figure out what this should return. Name, email, user ID, etc?
        return $this->account_manager;
    }

    /**
     * String representation of this object
     *
     * @return string
     */
    public function __toString()
    {
        return "ID: " . $this->customer_id . "\n" .
            "Name: " . $this->name . "\n";
    }


    /**
     * Returns any notes for for the specified customer.
     *
     * @return  array An array containing the note details.
     */
    function getNoteDetails()
    {
        $stmt = "SELECT
                    cno_id,
                    cno_prj_id,
                    cno_customer_id,
                    cno_note
                FROM
                    " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "customer_note
                WHERE
                    cno_customer_id = '" . Misc::escapeString($this->customer_id) . "'";
        $res = DB_Helper::getInstance()->getRow($stmt, DB_FETCHMODE_ASSOC);
        if (PEAR::isError($res)) {
            Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
            return array();
        } else {
            return $res;
        }
    }


    /**
     * Method used to get the list of technical account managers for
     * a given customer ID.
     *
     * @return  array The list of account managers
     */
    public function getEventumAccountManagers()
    {
        $stmt = "SELECT
                    cam_usr_id,
                    usr_email,
                    cam_type
                 FROM
                    " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "customer_account_manager,
                    " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "user
                 WHERE
                    cam_usr_id=usr_id AND
                    cam_prj_id=? AND
                    cam_customer_id=?";
        $res = DB_Helper::getInstance()->getAll($stmt, DB_FETCHMODE_ASSOC, array($this->crm->getProjectID(),
            $this->customer_id));
        if (PEAR::isError($res)) {
            Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
            return array();
        } else {
            if (empty($res)) {
                return array();
            } else {
                return $res;
            }
        }
    }
}


class CustomerNotFoundException extends CRMException
{
    public function __construct($customer_id, Exception $previous=null) {
        parent::__construct("Customer '" . $customer_id . "' not found", 0, $previous);
    }
}