Display net price as well
[misc/hallinta-metro] / artikel.php
1 <?php
2
3 $style[] = <<<EOC
4 div#form_price {
5   padding-left: 10px;
6   padding-right: 10px;
7   font-size: 90%;
8   color: #555;
9 }
10 EOC;
11
12 $form = '
13 <div id="form_price">
14 <form>
15 <input id="form_artikel" name="artikel" type="hidden" />
16 <label for="form_datum">Rechnungsdatum</label><br>
17 <input id="form_datum" name="datum" size="8">&nbsp;<img class="calendar" src="images/icons/calendar.gif" onclick="calendar(\\\'form_datum\\\',event)" />
18 <br>
19 <label for="form_steuer">Steuersatz</label><br>
20 <input id="form_steuer" name="steuer" size="10">
21 <br>
22 <label for="form_preis">Preis</label><br>
23 <input id="form_preis" name="preis" size="10">
24 <div class="buttons" style="margin-top: 15px;">
25 <button onclick="return add_price(this);">Hinzufügen</button>
26 </div>
27 </form>
28 </div>
29 ';
30
31 $javascript = <<<EOC
32 var price_popup = false;
33 function price_popup_open()
34 {
35     if (!price_popup) {
36         var options = { hideOnClick: false, canDragFunc: true };
37         var content = 'CONTENT_FORM';
38
39         price_popup = new Rico.Popup(options, false, false);
40         price_popup.createWindow('<strong>Verbinden</strong>',content,'auto','130px');
41     }
42
43     price_popup.titleDiv.childNodes[0].innerHTML = 'Preis hinzufügen';
44
45     var form_id = document.getElementById('edit_id');
46     var artikel = document.getElementById('form_artikel');
47     artikel.value = form_id.value;
48
49     price_popup.openPopup(100,300);
50 }
51
52 function open_popup()
53 {
54     var eid = document.getElementById('edit_id');
55     if (!eid || !eid.value.length) return false;
56
57     price_popup_open();
58     return false;
59 }
60
61 function add_price_callback(data)
62 {
63     info('Preis gespeichert');
64 }
65
66 function add_price(obj)
67 {
68     price_popup.closePopup();
69
70     var datum = document.getElementById('form_datum');
71     if (!datum.value.length) {
72         error('Kein Rechnungsdatum angegeben');
73         return false;
74     }
75
76     var steuer = document.getElementById('form_steuer');
77     if (!steuer.value.length) {
78         error('Kein Steuersatz angegeben');
79         return false;
80     }
81
82     var preis = document.getElementById('form_preis');
83     if (!preis.value.length) {
84         error('Kein Preis angegeben');
85         return false;
86     }
87
88     var source = document.getElementById('source');
89     if (!source) return false;
90
91     var parms = 'source=' + source.innerHTML + '&callback=price&';
92     ajax_request('function', parms+Form.serialize(obj.form), add_price_callback);
93
94     preis.value = '';
95
96     return false;
97 }
98
99 EOC;
100
101 $jscode[] = str_replace('CONTENT_FORM', str_replace(array("\n"),
102                                                     array("\\\n"), $form), $javascript);
103
104
105 $buttons = <<<EOC
106 <p style="margin-top: 5px; margin-bottom: 4px; text-align: center;">
107 <button onclick="return open_popup()">Preis hinzufügen</button>
108 </p>
109 EOC;
110
111 $mask = array(
112               'table' => 'metro_artikel',
113               'title' => 'Artikelstammdaten',
114               'join' => array('metro_abteilung ON abteilung = metro_abteilung.id'),
115               'list' => array(
116                               'id' => array(
117                                             'name' => 'ID',
118                                             'visible' => false,
119                                             'sql' => 'metro_artikel.id',
120                                             ),
121                               'artnr' => array(
122                                             'name' => 'ArtNr',
123                                             'width' => 60,
124                                             ),
125                               'menge' => array(
126                                             'name' => 'Menge',
127                                             'width' => 60,
128                                             'specs' => "ClassName: 'alignrightpad'",
129                                             ),
130                               'bezeichnung' => array(
131                                             'name' => 'Bezeichnung',
132                                             'width' => 300,
133                                             'specs' => "filterUI: 't'",
134                                             ),
135                               'netto' => array(
136                                             'name' => 'netto',
137                                             'width' => 60,
138                                             'type' => 'number',
139                                             'specs' => "decPlaces: 2, ClassName: 'alignrightpad', filterUI: 't'",
140                                             'sql' => '(SELECT preis FROM metro_artikel_preis ' .
141                                                      'WHERE artikel = metro_artikel.id ORDER BY datum DESC LIMIT 1)',
142                                             ),
143                               'preis' => array(
144                                             'name' => 'Preis',
145                                             'width' => 60,
146                                             'type' => 'number',
147                                             'specs' => "decPlaces: 2, ClassName: 'alignrightpad', filterUI: 't'",
148                                             'sql' => '(SELECT preis * ((100 + steuersatz)/100) FROM metro_artikel_preis ' .
149                                                      'WHERE artikel = metro_artikel.id ORDER BY datum DESC LIMIT 1)',
150                                             ),
151                               'hersteller' => array(
152                                             'name' => 'Hersteller',
153                                             'width' => 100,
154                                             'specs' => "filterUI: 't'",
155                                             ),
156                               'abteilung' => array(
157                                             'name' => 'Abteilung',
158                                             'width' => 200,
159                                             'specs' => "filterUI: 's'",
160                                             'control' => "new Rico.TableColumn.lookup(".grid_lookup_sql('metro_abteilung','id','name').", 0, '')",
161                                             'visible' => false,
162                                             ),
163                               'gang' => array(
164                                             'name' => 'Gang',
165                                             'width' => 50,
166                                             'specs' => "ClassName: 'aligncenter', filterUI: 's'",
167                                             'visible' => false,
168                                             ),
169                               'vpe' => array(
170                                             'name' => 'Einheit',
171                                             'width' => 70,
172                                             'specs' => "ClassName: 'aligncenter', filterUI: 's'",
173                                             'control' => "new Rico.TableColumn.lookup(".grid_lookup_sql('metro_vpe','id','name').", 0, '')",
174                                             ),
175                               ),
176               'edit' => array(
177                               'artnr' => array(
178                                             'name' => 'Artikelnummer',
179                                             'type' => 'number',
180                                             'size' => 15,
181                                             'required' => true,
182                                             ),
183                               'abteilung' => array(
184                                             'name' => 'Abteilung',
185                                             'type' => 'select',
186                                             'options' => 'SELECT id,name AS text FROM metro_abteilung ORDER BY name',
187                                             'option_empty' => '-- select --',
188                                             'required' => true,
189                                             ),
190                               'vpe' => array(
191                                             'name' => 'Verpackungseinheit',
192                                             'type' => 'select',
193                                             'options' => 'SELECT id,name AS text FROM metro_vpe ORDER BY name',
194                                             'option_empty' => '-- select --',
195                                             'required' => true,
196                                             ),
197                               'menge' => array(
198                                             'name' => 'Menge',
199                                             'type' => 'text',
200                                             'size' => 15,
201                                             'null' => true,
202                                             ),
203                               'bezeichnung' => array(
204                                             'name' => 'Bezeichnung',
205                                             'type' => 'text',
206                                             'size' => 21,
207                                             'required' => true,
208                                             ),
209                               'hersteller' => array(
210                                             'name' => 'Hersteller',
211                                             'type' => 'text',
212                                             'size' => 21,
213                                             'null' => true,
214                                             ),
215                               'buttons' => array(
216                                             'type' => 'html',
217                                             'code' => $buttons,
218                                             'sql' => false,
219                                             ),
220                               ),
221               'callbacks' => array(
222                                    'price' => cb_price,
223                                 ),
224               );
225
226 function cb_price()
227 {
228   global $db;
229
230   if (empty($_POST['artikel']) || empty($_POST['datum']) || empty($_POST['preis']))
231     return array('error' => 'Nicht ausreichend Daten übermittelt');
232
233   $date = format_date($_POST['datum']);
234
235   $sql = sprintf("INSERT INTO metro_artikel_preis (artikel,preis,steuersatz,datum,sys_user,sys_edit) " .
236                  "VALUES (%d,%.3f,%d,'%s',%s,now())",
237                  $_POST['artikel'],
238                  $_POST['preis'],
239                  $_POST['steuer'],
240                  $date,
241                  $db->quote($_SESSION['sys']['login']), $row['id']);
242
243   $sth = $db->query($sql);
244
245   return true;
246 }
247
248 ?>