Set quicksearch as default filter for invoces and purchase invoces
[tine20] / tine20 / Sales / Model / Invoice.php
1 <?php
2 /**
3  * Tine 2.0
4
5  * @package     Sales
6  * @subpackage  Model
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @author      Alexander Stintzing <a.stintzing@metaways.de>
9  * @copyright   Copyright (c) 2013 Metaways Infosystems GmbH (http://www.metaways.de)
10  */
11
12 /**
13  * class to hold Invoice data
14  *
15  * @package     Sales
16  * @subpackage  Model
17  */
18
19 class Sales_Model_Invoice extends Tinebase_Record_Abstract
20 {
21     /**
22      * holds the configuration object (must be declared in the concrete class)
23      *
24      * @var Tinebase_ModelConfiguration
25      */
26     protected static $_configurationObject = NULL;
27     
28     /**
29      * Holds the model configuration (must be assigned in the concrete class)
30      *
31      * @var array
32      */
33     protected static $_modelConfiguration = array(
34         'recordName'        => 'Invoice',
35         'recordsName'       => 'Invoices', // ngettext('Invoice', 'Invoices', n)
36         'hasRelations'      => TRUE,
37         'hasCustomFields'   => TRUE,
38         'hasNotes'          => TRUE,
39         'hasTags'           => TRUE,
40         'modlogActive'      => TRUE,
41         'hasAttachments'    => TRUE,
42         'createModule'      => TRUE,
43         'containerProperty' => NULL,
44
45         'titleProperty'     => 'fulltext', //array('%s - %s', array('number', 'title')),
46
47         'appName'           => 'Sales',
48         'modelName'         => 'Invoice',
49         
50         'filterModel' => array(
51             'contract' => array(
52                 'filter' => 'Tinebase_Model_Filter_ExplicitRelatedRecord',
53                 'label' => 'Contract', // _('Contract')
54                 'options' => array(
55                     'controller' => 'Sales_Controller_Contract',
56                     'filtergroup' => 'Sales_Model_ContractFilter',
57                     'own_filtergroup' => 'Sales_Model_InvoiceFilter',
58                     'own_controller' => 'Sales_Controller_Invoice',
59                     'related_model' => 'Sales_Model_Contract',
60                 ),
61                 'jsConfig' => array('filtertype' => 'sales.invoicecontract')
62             ),
63             'customer' => array(
64                 'filter' => 'Tinebase_Model_Filter_ExplicitRelatedRecord',
65                 'label' => 'Customer', // _('Customer')
66                 'options' => array(
67                     'controller' => 'Sales_Controller_Customer',
68                     'filtergroup' => 'Sales_Model_CustomerFilter',
69                     'own_filtergroup' => 'Sales_Model_InvoiceFilter',
70                     'own_controller' => 'Sales_Controller_Invoice',
71                     'related_model' => 'Sales_Model_Customer',
72                 ),
73                 'jsConfig' => array('filtertype' => 'sales.invoicecustomer')
74             ),
75         ),
76         
77         'fields'            => array(
78             'number' => array(
79                 'label' => 'Invoice Number', //_('Invoice Number')
80                 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => TRUE),
81                 'queryFilter' => TRUE,
82             ),
83             'description' => array(
84                 'label'   => 'Description', // _('Description')
85                 'queryFilter' => TRUE,
86             ),
87             'address_id'       => array(
88                 'label'      => 'Address',    // _('Address')
89                 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => FALSE),
90                 'type'       => 'record',
91                 'shy' => TRUE,
92                 'config' => array(
93                     'appName'     => 'Sales',
94                     'modelName'   => 'Address',
95                     'idProperty'  => 'id',
96                 )
97             ),
98             'fixed_address' => array(
99                 'label'      => 'Address',    // _('Address')
100                 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => TRUE),
101                 'label' => NULL
102             ),
103             'date' => array(
104                 'type' => 'date',
105                 'label'      => 'Date',    // _('Date')
106             ),
107             'start_date' => array(
108                 'type' => 'date',
109                 'label'      => 'Interval Begins',    // _('Interval Begins')
110             ),
111             'end_date' => array(
112                 'type' => 'date',
113                 'label'      => 'Interval Ends',    // _('Interval Ends')
114             ),
115             'credit_term' => array(
116                 'title' => 'Credit Term', // _('Credit Term')
117                 'type'  => 'integer',
118                 'default' => 10
119             ),
120             'costcenter_id' => array(
121                 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => TRUE, Zend_Filter_Input::DEFAULT_VALUE => NULL),
122                 'label' => 'Cost Center', //_('Cost Center')
123                 'type'  => 'record',
124                 'config' => array(
125                     'appName'     => 'Sales',
126                     'modelName'   => 'CostCenter',
127                     'idProperty'  => 'id'
128                 )
129             ),
130             'cleared' => array(
131                 'label' => 'Cleared', //_('Cleared')
132                 'default' => 'TO_CLEAR',
133                 'type' => 'keyfield',
134                 'name' => Sales_Config::INVOICE_CLEARED
135             ),
136             'type' => array(
137                 'label' => 'Type', //_('Type')
138                 'default' => 'INVOICE',
139                 'type' => 'keyfield',
140                 'name' => Sales_Config::INVOICE_TYPE
141             ),
142             'is_auto' => array(
143                 'type' => 'bool',
144                 'label' => NULL
145             ),
146             'price_net' => array(
147                 'label' => 'Price Net', // _('Price Net')
148                 'type'  => 'float',
149                 'specialType' => 'euMoney',
150                 'default' => 0,
151                 'inputFilters' => array('Zend_Filter_Empty' => 0),
152                 'shy' => TRUE,
153             ),
154             'price_tax' => array(
155                 'label' => 'Price Tax', // _('Price Tax')
156                 'type'  => 'float',
157                 'specialType' => 'euMoney',
158                 'default' => 0,
159                 'inputFilters' => array('Zend_Filter_Empty' => 0),
160                 'shy' => TRUE,
161             ),
162             'price_gross' => array(
163                 'label' => 'Price Gross', // _('Price Gross')
164                 'type'  => 'float',
165                 'specialType' => 'euMoney',
166                 'default' => 0,
167                 'inputFilters' => array('Zend_Filter_Empty' => 0),
168                 'shy' => TRUE,
169             ),
170             'sales_tax' => array(
171                 'label' => 'Sales Tax', // _('Sales Tax')
172                 'type'  => 'float',
173                 'specialType' => 'percent',
174                 'default' => 19,
175                 'inputFilters' => array('Zend_Filter_Empty' => 0),
176                 'shy' => TRUE,
177             ),
178             'positions' => array(
179                 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => TRUE, Zend_Filter_Input::DEFAULT_VALUE => NULL),
180                 'label'      => 'Positions', // _('Positions')
181                 'type'       => 'records',
182                 'config'     => array(
183                     'appName'     => 'Sales',
184                     'modelName'   => 'InvoicePosition',
185                     'refIdField'  => 'invoice_id',
186                     'paging'      => array('sort' => 'month', 'dir' => 'ASC'),
187                     'dependentRecords' => TRUE
188                 ),
189             ),
190             'contract' => array(
191                 'type' => 'virtual',
192                 'config' => array(
193                     'type' => 'relation',
194                     'label' => 'Contract',    // _('Contract')
195                     'config' => array(
196                         'appName'   => 'Sales',
197                         'modelName' => 'Contract',
198                         'type' => 'CONTRACT'
199                     )
200                 )
201             ),
202             'customer' => array(
203                 'type' => 'virtual',
204                 'config' => array(
205                     'type' => 'relation',
206                     'label' => 'Customer',    // _('Customer')
207                     'config' => array(
208                         'appName'   => 'Sales',
209                         'modelName' => 'Customer',
210                         'type' => 'CUSTOMER'
211                     )
212                 )
213             ),
214             'fulltext' => array(
215                 'type' => 'string',
216             )
217         )
218     );
219
220     /**
221      * sets the record related properties from user generated input.
222      *
223      * Input-filtering and validation by Zend_Filter_Input can enabled and disabled
224      *
225      * @param array $_data            the new data to set
226      * @throws Tinebase_Exception_Record_Validation when content contains invalid or missing data
227      **/
228     public function setFromArray(array $_data)
229     {
230         parent::setFromArray($_data);
231         $this->fulltext = $this->number . ' - ' . $this->description;
232     }
233
234     /**
235      * @see Tinebase_Record_Abstract
236      */
237     protected static $_relatableConfig = array(
238         array('relatedApp' => 'Sales', 'relatedModel' => 'Contract', 'config' => array(
239             array('type' => 'CONTRACT', 'degree' => 'sibling', 'text' => 'Contract', 'max' => '0:0'), // _('Contract')
240             ), 'defaultType' => 'CONTRACT'
241         ),
242         array('relatedApp' => 'Sales', 'relatedModel' => 'Customer', 'config' => array(
243             array('type' => 'CUSTOMER', 'degree' => 'sibling', 'text' => 'Customer', 'max' => '0:0'), // _('Customer')
244         ), 'defaultType' => 'CUSTOMER'
245             ),
246         array('relatedApp' => 'Sales', 'relatedModel' => 'Invoice', 'config' => array(
247             array('type' => 'REVERSAL', 'degree' => 'sibling', 'text' => 'Reversal Invoice', 'max' => '1:1'), // _('Reversal Invoice')
248             ), 'defaultType' => 'REVERSAL'
249         ),
250         array('relatedApp' => 'Timetracker', 'relatedModel' => 'Timeaccount', 'config' => array(
251             array('type' => 'INVOICE_ITEM', 'degree' => 'sibling', 'text' => 'Invoice Item', 'max' => '0:0'), // _('Invoice Item')
252             ), 'defaultType' => 'INVOICE_ITEM'
253         ),
254         array('relatedApp' => 'WebAccounting', 'relatedModel' => 'IPNet', 'config' => array(
255             array('type' => 'INVOICE_ITEM', 'degree' => 'sibling', 'text' => 'Invoice Item', 'max' => '0:0'), // _('Invoice Item')
256             ), 'defaultType' => 'INVOICE_ITEM'
257         ),
258         array('relatedApp' => 'WebAccounting', 'relatedModel' => 'StoragePath', 'config' => array(
259             array('type' => 'INVOICE_ITEM', 'degree' => 'sibling', 'text' => 'Invoice Item', 'max' => '0:0'), // _('Invoice Item')
260             ), 'defaultType' => 'INVOICE_ITEM'
261         ),
262         array('relatedApp' => 'WebAccounting', 'relatedModel' => 'BackupPath', 'config' => array(
263             array('type' => 'INVOICE_ITEM', 'degree' => 'sibling', 'text' => 'Invoice Item', 'max' => '0:0'), // _('Invoice Item')
264             ), 'defaultType' => 'INVOICE_ITEM'
265         ),
266         array('relatedApp' => 'WebAccounting', 'relatedModel' => 'CertificateDomain', 'config' => array(
267             array('type' => 'INVOICE_ITEM', 'degree' => 'sibling', 'text' => 'Invoice Item', 'max' => '0:0'), // _('Invoice Item')
268             ), 'defaultType' => 'INVOICE_ITEM'
269         ),
270         array('relatedApp' => 'WebAccounting', 'relatedModel' => 'DReg', 'config' => array(
271             array('type' => 'INVOICE_ITEM', 'degree' => 'sibling', 'text' => 'Invoice Item', 'max' => '0:0'), // _('Invoice Item')
272             ), 'defaultType' => 'INVOICE_ITEM'
273         ),
274         array('relatedApp' => 'WebAccounting', 'relatedModel' => 'MailAccount', 'config' => array(
275             array('type' => 'INVOICE_ITEM', 'degree' => 'sibling', 'text' => 'Invoice Item', 'max' => '0:0'), // _('Invoice Item')
276             ), 'defaultType' => 'INVOICE_ITEM'
277         ),
278     );
279 }