-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhinnat_cron.php
executable file
·329 lines (273 loc) · 12.1 KB
/
hinnat_cron.php
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
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
<?php
// Kutsutaanko CLI:stä
$php_cli = FALSE;
if (php_sapi_name() == 'cli') {
$php_cli = TRUE;
}
date_default_timezone_set('Europe/Helsinki');
// Kutsutaanko CLI:stä
if (!$php_cli) {
die ("Tätä scriptiä voi ajaa vain komentoriviltä!\n");
}
if (trim($argv[1]) == '') {
die ("Et antanut lähettävää yhtiötä!\n");
}
if (trim($argv[2]) == '') {
die ("Et antanut vastaanottavaa yhtiötä!\n");
}
if (trim($argv[3]) == '') {
die ("Et antanut lähettävän yhtiön toimittajatunnusta!\n");
}
if (trim($argv[4]) == '') {
die ("Et antanut vastaanottavan yhtiön asiakastunnusta!\n");
}
// lisätään includepathiin pupe-root
ini_set("include_path", ini_get("include_path").PATH_SEPARATOR.dirname(__FILE__));
error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set("memory_limit", "2G");
// otetaan tietokanta connect ja funktiot
require "inc/connect.inc";
require "inc/functions.inc";
// Logitetaan ajo
cron_log();
$lock_params = array(
"locktime" => 5400,
);
// Sallitaan vain yksi instanssi tästä skriptistä kerrallaan
pupesoft_flock($lock_params);
$mista_yhtio = mysqli_escape_string(trim($argv[1]));
$mihin_yhtio = mysqli_escape_string(trim($argv[2]));
$mista_yhtion_toimittajan_tunnus = mysqli_escape_string(trim($argv[3]));
$mihin_yhtion_asiakkaan_tunnus = mysqli_escape_string(trim($argv[4]));
$yhtiorow = hae_yhtion_parametrit($mista_yhtio);
$mihin_yhtiorow = hae_yhtion_parametrit($mihin_yhtio);
// Haetaan kukarow
$query = "SELECT *
FROM kuka
WHERE yhtio = '{$mista_yhtio}'
AND kuka = 'admin'";
$kukares = pupe_query($query);
if (mysqli_num_rows($kukares) != 1) {
exit("VIRHE: Admin käyttäjä ei löydy!\n");
}
$kukarow = mysqli_fetch_assoc($kukares);
// Haetaan timestamp
$datetime_checkpoint_res = t_avainsana("HINNAT_CRON");
if (mysqli_num_rows($datetime_checkpoint_res) != 1) {
exit("VIRHE: Timestamp ei löydy avainsanoista!\n");
}
$datetime_checkpoint_row = mysqli_fetch_assoc($datetime_checkpoint_res);
$datetime_checkpoint = $datetime_checkpoint_row['selite']; // Mikä tilanne on jo käsitelty
$datetime_checkpoint_uusi = date('Y-m-d H:i:s'); // Timestamp nyt
$query = "SELECT *
FROM asiakas
WHERE yhtio = '{$mista_yhtio}'
AND tunnus = $mihin_yhtion_asiakkaan_tunnus";
$asiakasres = pupe_query($query);
if (mysqli_num_rows($asiakasres) != 1) {
exit("VIRHE: Asiakas ei löydy!\n");
}
$asiakasrow = mysqli_fetch_assoc($asiakasres);
$laskurow = array(
'liitostunnus' => $mihin_yhtion_asiakkaan_tunnus,
'valkoodi' => $asiakasrow['valkoodi'],
'maa' => $asiakasrow['maa'],
'ytunnus' => $asiakasrow['ytunnus'],
'yhtio_toimipaikka' => $asiakasrow['toimipaikka']
);
$tuotteet = $ryhmat = array();
$query = "SELECT group_concat(parent.tunnus) tunnukset
FROM puun_alkio
JOIN dynaaminen_puu AS node ON (puun_alkio.yhtio = node.yhtio and puun_alkio.laji = node.laji and puun_alkio.puun_tunnus = node.tunnus)
JOIN dynaaminen_puu AS parent ON (parent.yhtio = node.yhtio AND parent.laji = node.laji AND parent.lft <= node.lft AND parent.rgt >= node.lft AND parent.lft > 0)
WHERE puun_alkio.yhtio = '{$mista_yhtio}'
AND puun_alkio.laji = 'ASIAKAS'
AND puun_alkio.liitos = '{$asiakasrow['tunnus']}'";
$result2 = pupe_query($query);
$puun_tunnukset = mysqli_fetch_assoc($result2);
$asiakkaan_puiden_tunnukset = $puun_tunnukset !== NULL ? " OR asiakas_segmentti IN ({$puun_tunnukset['tunnukset']})" : "";
// Haetaan muuttuneet asiakashinnat
$query = "SELECT hinta, ryhma, tuoteno, laji
FROM asiakashinta
WHERE yhtio = '{$mista_yhtio}'
AND ((asiakas = {$asiakasrow['tunnus']} and asiakas != 0)
OR (ytunnus = '{$asiakasrow['ytunnus']}' and ytunnus != '')
OR (asiakas_ryhma = '{$asiakasrow['ryhma']}' and asiakas_ryhma != '')
OR (piiri = '{$asiakasrow['piiri']}' and piiri != '')
{$asiakkaan_puiden_tunnukset})
AND (tuoteno IN (SELECT tuoteno FROM tuotteen_toimittajat WHERE yhtio = '{$mihin_yhtio}' AND liitostunnus = {$mista_yhtion_toimittajan_tunnus}) or tuoteno = '')
AND minkpl < 2
AND (
(alkupvm > LEFT('{$datetime_checkpoint}', 10) AND alkupvm <= CURRENT_DATE) OR
(loppupvm < CURRENT_DATE AND LEFT('{$datetime_checkpoint}', 10) <= loppupvm) OR
muutospvm >= '{$datetime_checkpoint}'
)";
$asiakashinta_res = pupe_query($query);
while ($asiakashinta_row = mysqli_fetch_assoc($asiakashinta_res)) {
if ($asiakashinta_row['ryhma'] != "") {
$ryhmat[$asiakashinta_row['ryhma']] = 0;
}
elseif ($asiakashinta_row['tuoteno'] != "") {
$tuotteet[$asiakashinta_row['tuoteno']] = 0;
}
}
// Haetaan muuttuneet asiakasalennukset
$query = "SELECT ryhma, tuoteno
FROM asiakasalennus
WHERE yhtio = '{$mista_yhtio}'
AND ((asiakas = {$asiakasrow['tunnus']} and asiakas != 0)
OR (ytunnus = '{$asiakasrow['ytunnus']}' and ytunnus != '')
OR (asiakas_ryhma = '{$asiakasrow['ryhma']}' and asiakas_ryhma != '')
OR (piiri = '{$asiakasrow['piiri']}' and piiri != '')
{$asiakkaan_puiden_tunnukset})
AND (tuoteno IN (SELECT tuoteno FROM tuotteen_toimittajat WHERE yhtio = '{$mihin_yhtio}' AND liitostunnus = {$mista_yhtion_toimittajan_tunnus}) or tuoteno = '')
AND minkpl < 2
AND (
(alkupvm > LEFT('{$datetime_checkpoint}', 10) AND alkupvm <= CURRENT_DATE) OR
(loppupvm < CURRENT_DATE AND LEFT('{$datetime_checkpoint}', 10) <= loppupvm) OR
muutospvm >= '{$datetime_checkpoint}'
)";
$asiakasalennus_res = pupe_query($query);
while ($asiakasalennus_row = mysqli_fetch_assoc($asiakasalennus_res)) {
if ($asiakasalennus_row['ryhma'] != "") {
$ryhmat[$asiakasalennus_row['ryhma']] = 0;
}
elseif ($asiakasalennus_row['tuoteno'] != "") {
$tuotteet[$asiakasalennus_row['tuoteno']] = 0;
}
}
// Haetaan muuttuneet hinnastohinnat
$query = "SELECT tuoteno
FROM hinnasto
WHERE yhtio = '{$mista_yhtio}'
AND minkpl < 2
AND tuoteno IN (SELECT tuoteno FROM tuotteen_toimittajat WHERE yhtio = '{$mihin_yhtio}' AND liitostunnus = {$mista_yhtion_toimittajan_tunnus})
AND (
(alkupvm > LEFT('{$datetime_checkpoint}', 10) AND alkupvm <= CURRENT_DATE) OR
(loppupvm < CURRENT_DATE AND LEFT('{$datetime_checkpoint}', 10) <= loppupvm) OR
muutospvm >= '{$datetime_checkpoint}'
)";
$hinnasto_res = pupe_query($query);
while ($hinnasto_row = mysqli_fetch_assoc($hinnasto_res)) {
$tuotteet[$hinnasto_row['tuoteno']] = 0;
}
// Käydään läpi kaikki muuttuneet alennusryhmät, lisätään niiden tuotteet tuote arrayseen
foreach ($ryhmat as $ryhma => $devnull) {
$query = "SELECT tuoteno
FROM tuote
WHERE yhtio = '{$mista_yhtio}'
AND status != 'P'
AND tuotetyyppi NOT in ('A','B')
AND aleryhma = '{$ryhma}'
AND tuoteno IN (SELECT tuoteno FROM tuotteen_toimittajat WHERE yhtio = '{$mihin_yhtio}' AND liitostunnus = {$mista_yhtion_toimittajan_tunnus})";
$ryhmares = pupe_query($query);
while ($ryhmarow = mysqli_fetch_assoc($ryhmares)) {
$tuotteet[$ryhmarow['tuoteno']] = 0;
}
}
// Vapautetaan muistia
unset($ryhmat);
// Haetaan kaikki muuttuneet tuotteet ja lisätään ne arrayseen
$query = "SELECT *
FROM tuote
WHERE yhtio = '{$mista_yhtio}'
AND status != 'P'
AND tuotetyyppi NOT in ('A','B')
AND muutospvm >= '{$datetime_checkpoint}'
AND tuoteno IN (SELECT tuoteno FROM tuotteen_toimittajat WHERE yhtio = '{$mihin_yhtio}' AND liitostunnus = {$mista_yhtion_toimittajan_tunnus})
ORDER BY muutospvm, tuoteno";
$tuoteres = pupe_query($query);
while ($tuoterow = mysqli_fetch_assoc($tuoteres)) {
$tuotteet[$tuoterow['tuoteno']] = 0;
}
// Loopataan läpi kaikki muuttuneet tuotteet
foreach ($tuotteet as $tuoteno => $devnull) {
// Haetaan tuotteen tiedot $mista_yhtio
$query = "SELECT *
FROM tuote
WHERE yhtio = '{$mista_yhtio}'
AND tuoteno = '{$tuoteno}'";
$tuoteres = pupe_query($query);
$tuoterow = mysqli_fetch_assoc($tuoteres);
// alvillinen -> alviton
// alv pois
if ($yhtiorow['alv_kasittely'] == '' and $mihin_yhtiorow['alv_kasittely'] == 'o') {
$tuoterow['myyntihinta'] = round($tuoterow['myyntihinta'] / (1+$tuoterow['alv']/100), $mihin_yhtiorow['hintapyoristys']);
}
// alviton -> alvillinen
// lisätään alv
elseif ($yhtiorow['alv_kasittely'] == 'o' and $mihin_yhtiorow['alv_kasittely'] == '') {
$tuoterow['myyntihinta'] = round($tuoterow['myyntihinta'] * (1+$tuoterow['alv']/100), $mihin_yhtiorow['hintapyoristys']);
}
// Päivitetään myyntihinta $mihin_yhtio
$query = "UPDATE tuote SET
myyntihinta = '{$tuoterow['myyntihinta']}'
WHERE yhtio = '{$mihin_yhtio}'
AND tuoteno = '{$tuoteno}'";
pupe_query($query);
// Haetaan tuotteen toimittajan liitos $mihin_yhtio
$query = "SELECT tunnus
FROM tuotteen_toimittajat
WHERE yhtio = '{$mihin_yhtio}'
AND tuoteno = '{$tuoteno}'
AND liitostunnus = {$mista_yhtion_toimittajan_tunnus}";
$mihin_tuoteres = pupe_query($query);
while ($mihin_tuoterow2 = mysqli_fetch_assoc($mihin_tuoteres)) {
// Lasketaan ja päivitetään ostohinta
list($hinta, $netto, $ale, $alehinta_alv, $alehinta_val) = alehinta($laskurow, $tuoterow, 1, '', '', array());
for ($alepostfix = 1; $alepostfix <= $yhtiorow['myynnin_alekentat']; $alepostfix++) {
$hinta *= (1 - $ale["ale{$alepostfix}"] / 100);
}
// Päivitetään ostohinta
$query = "UPDATE tuotteen_toimittajat SET
ostohinta = '{$hinta}'
WHERE yhtio = '{$mihin_yhtio}'
AND tunnus = '{$mihin_tuoterow2['tunnus']}'";
pupe_query($query);
}
}
// Haetaan saldot tuotteille, joille on tehty tietyn ajan sisällä tilausrivi tai tapahtuma
$query = "(SELECT DISTINCT tapahtuma.tuoteno
FROM tapahtuma
JOIN tuote ON (tuote.yhtio = tapahtuma.yhtio
AND tuote.tuoteno = tapahtuma.tuoteno
AND tuote.status != 'P'
AND tuote.tuotetyyppi NOT in ('A','B')
AND tuote.tuoteno != ''
AND tuote.ei_saldoa = '')
WHERE tapahtuma.yhtio = '{$mista_yhtio}'
AND tapahtuma.tuoteno IN (SELECT tuoteno FROM tuotteen_toimittajat WHERE yhtio = '{$mihin_yhtio}' AND liitostunnus = {$mista_yhtion_toimittajan_tunnus})
AND tapahtuma.laadittu >= '{$datetime_checkpoint}')
UNION
(SELECT DISTINCT tilausrivi.tuoteno
FROM tilausrivi
JOIN tuote ON (tuote.yhtio = tilausrivi.yhtio
AND tuote.tuoteno = tilausrivi.tuoteno
AND tuote.status != 'P'
AND tuote.tuotetyyppi NOT in ('A','B')
AND tuote.tuoteno != ''
AND tuote.ei_saldoa = '')
WHERE tilausrivi.yhtio = '{$mista_yhtio}'
AND tilausrivi.tyyppi NOT IN ('D','O')
AND tilausrivi.tuoteno IN (SELECT tuoteno FROM tuotteen_toimittajat WHERE yhtio = '{$mihin_yhtio}' AND liitostunnus = {$mista_yhtion_toimittajan_tunnus})
AND tilausrivi.laadittu >= '{$datetime_checkpoint}')";
$result = pupe_query($query);
while ($row = mysqli_fetch_assoc($result)) {
list($saldo, $hyllyssa, $myytavissa, $devnull) = saldo_myytavissa($row['tuoteno']);
$query = "UPDATE tuotteen_toimittajat SET
tehdas_saldo = '{$myytavissa}'
WHERE yhtio = '{$mihin_yhtio}'
AND tuoteno = '{$row['tuoteno']}'
AND liitostunnus = {$mista_yhtion_toimittajan_tunnus}";
pupe_query($query);
}
// Kun kaikki onnistui, päivitetään lopuksi timestamppi talteen
$query = "UPDATE avainsana SET
selite = '{$datetime_checkpoint_uusi}'
WHERE yhtio = '{$mista_yhtio}'
AND laji = 'HINNAT_CRON'";
pupe_query($query);
if (mysqli_affected_rows($link) != 1) {
echo "Timestamp päivitys epäonnistui!\n";
}