1. Import

This commit is contained in:
2026-03-29 10:34:57 +02:00
parent b0e00c1259
commit a1129565af
4899 changed files with 3007593 additions and 0 deletions

View File

@@ -0,0 +1,343 @@
<?php
define("LOG_NAME", "finalize_job");
include_once("../tools/edi.inc.php");
mysql_select_db("phoenix", $mysql_db) or die (mysql_error($mysql_db));
$hq_prefixes = array(
11 => "ST",
// 11 => "STS",
4 => "STH",
8 => "STL",
7 => "STE",
99 => "STL"
);
$jb_idA = array();
$tr_sortA = array();
//$fake_id = 90000001;
//********************************************************************************
// Einzelaufträge nach Kurier-Zuteilung (scan.php) generieren
function finalize_jobs()
{
global $mysql_db, $hq_id, $hq_prefixes;
$sql_query = "SELECT COUNT(*) FROM tourarticle AS ta, tourarticleprocess AS tp" .
" WHERE tratp_type = 412 AND trat_state != 2 AND ta.trat_id = tp.trat_id AND tratp_state = 1 AND trat_serialno LIKE '" . $hq_prefixes[$hq_id] . "0%'";
writeLog($sql_query);
$row = get_first_row($sql_query);
writeLog("new tracking ids with type '412': " . $row[0]);
$sql_query = "SELECT COUNT(*) FROM tourarticle AS ta, tourarticleprocess AS tp" .
" WHERE tratp_type = 411 AND trat_state != 2 AND ta.trat_id = tp.trat_id AND tratp_state = 1 AND trat_serialno LIKE '" . $hq_prefixes[$hq_id] . "0%'";
writeLog($sql_query);
$row = get_first_row($sql_query);
writeLog("new tracking ids with type '411': " . $row[0]);
// $sql_query = "SELECT COUNT(*) FROM job, tour WHERE jb_status = 998 AND job.jb_id = tour.jb_id AND tr_sort > 1 AND tr_ware_from_to = 0";
// $res = mysql_query($sql_query, $mysql_db) or die ($sql_query . ": " . mysql_error($mysql_db));
// $row = mysql_fetch_row($res);
// $dirty_addresses = $row[0];
// mysql_free_result($res);
// if ($dirty_addresses > 0):
// exec_query("DELETE tourarticleprocess FROM job, tourarticle, tourarticleprocess WHERE jb_status = 998 AND hq_id = " . $hq_id . " AND job.jb_id = tourarticle.jb_id AND tratp_type = 411 AND tourarticle.trat_id = tourarticleprocess.trat_id;");
// exec_query("UPDATE job SET jb_status = 999 WHERE jb_status = 998 AND hq_id = " . $hq_id);
// else:
$sql_query = "SELECT jb_id FROM job WHERE jb_status = 998 AND hq_id = " . $hq_id;
$res = mysql_query($sql_query, $mysql_db) or die ($sql_query . ": " . mysql_error($mysql_db));
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)):
finalize_job($row["jb_id"]);
endwhile;
mysql_free_result($res);
// endif;
check_orphans();
get_prices();
}
function finalize_job($jb_id)
{
global $mysql_db, $jb_idA, $tr_sortA, $csc_id_payerA, $hq_id, $zipcodes;
$row1 = get_first_row("SELECT csc_id_payer FROM job WHERE jb_id = $jb_id");
$csc_id_payer = $row1[0];
$jb_ordertime = date("Y-m-d H:i:s");
$i = 1;
do {
$jb_ordertime_next = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") + $i++, date("Y")));
$ph_name = "";
$sql_query = "SELECT ph_name FROM phoenix.publicholiday WHERE hq_id = $hq_id AND ph_year = '" . substr($jb_ordertime_next, 0, 4) . "' AND ph_month = '" . substr($jb_ordertime_next, 5, 2) . "' AND ph_day = '" . substr($jb_ordertime_next, 8, 2) . "'";
$res1 = mysql_query($sql_query, $mysql_db) or die ($sql_query . ": " . mysql_error($mysql_db));
if ($row1 = mysql_fetch_row($res1)):
$ph_name = $row1[0];
endif;
mysql_free_result($res1);
} while ($ph_name != "" && $ph_name != "Samstag");
$tr_sort = 2;
writeLog("finalizing job: jb_id = '$jb_id'");
$sql_query = "SELECT tr.jb_id, tr.tr_sort, tr_comp, tr_person, tr_comp2, tr_hsno, tr_cs_freetext, trat_id, trat_serialno, ad_zipcode, ad_city, ad_street" .
" FROM tour AS tr, tourarticle AS ta, address AS ad" .
" WHERE tr.jb_id = $jb_id AND tr.jb_id = ta.jb_id AND tr.tr_sort = ta.tr_sort AND tr.tr_sort > 1 AND tr.ad_id = ad.ad_id" .
" ORDER BY jb_id, tr_sort";
//echo $sql_query . "\n";
$res = mysql_query($sql_query, $mysql_db) or die ($sql_query . ": " . mysql_error($mysql_db));
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)):
$cr_sid = trim($row["tr_cs_freetext"]); // $cr_sid = "S1999";
if ($cr_sid != "" && substr($cr_sid, -4) != "1555"):
$jb_id_new = get_job($csc_id_payer, $hq_id, $jb_ordertime, $cr_sid, false);
$tr_sort_new = $tr_sortA[$cr_sid]++;
else:
if (substr($cr_sid, -4) == "1555"):
$row1 = get_first_row("SELECT trat_serialno, tourarticle.trat_id FROM tourarticle, tourarticleprocess WHERE jb_id = $jb_id AND tr_sort = 1 AND trat_serialno = '" . $row["trat_serialno"] . "' AND tourarticle.trat_id = tourarticleprocess.trat_id AND tratp_type = '201'");
//writeLog(var_export($row1, true));
if ($row1[0] == $row["trat_serialno"] && substr($row['tr_comp'], 0, 1) != "!"):
exec_query ("INSERT INTO tourarticleprocess (trat_id, tratp_type, tratp_state, tratp_createtime, tratp_remark)" .
" VALUES (" . $row1[1] . ", '328', 1, '" . $jb_ordertime . "', '')");
$row['tr_comp'] = "!" . $row['tr_comp'];
$row['tr_cs_freetext'] = $zipcodes[$row['ad_zipcode']];
exec_query("UPDATE tour SET tr_comp = '" . $row['tr_comp'] . "', tr_cs_freetext = '" . $row['tr_cs_freetext'] . "' WHERE jb_id = $jb_id AND tr_sort = " . $row["tr_sort"]);
endif;
endif;
$jb_id_new = $jb_id;
$tr_sort_new = $tr_sort++;
endif;
//writeLog("rewriting station: " . $row["trat_serialno"] . ", jb_id/tr_sort old: $jb_id, " . $row["tr_sort"] . " -> new: " . $jb_id_new . ", " . $tr_sort_new);
exec_query("UPDATE tour SET jb_id = " . $jb_id_new . ", tr_sort = " . $tr_sort_new . " WHERE jb_id = $jb_id AND tr_sort = " . $row["tr_sort"]);
exec_query("UPDATE tourarticle SET jb_id = " . $jb_id_new . ", tr_sort = " . $tr_sort_new . " WHERE jb_id = $jb_id AND tr_sort = " . $row["tr_sort"]);
exec_query("UPDATE tourarticle SET jb_id = " . $jb_id_new . " WHERE jb_id = $jb_id AND tr_sort = 1 AND trat_serialno = '" . $row["trat_serialno"] . "'");
endwhile;
mysql_free_result($res);
// Nextdays nach 14:00 Uhr auf den nächsten Arbeitstag legen
foreach($jb_idA AS $cr_sid => $jb_id_newA) {
foreach($jb_id_newA AS $jb_id_new) {
$row1 = get_first_row("SELECT csc_id_payer FROM job WHERE jb_id = $jb_id_new");
if ($csc_id_payerA[$row1[0]] != 'STBX_SAME'):
write_tour($jb_id_new, $tr_sortA[$cr_sid]++, "Endstation", '2');
if (time() > mktime(14, 0, 0, date("m"), date("d"), date("Y")))
exec_query("UPDATE job SET jb_ordertime = '$jb_ordertime_next 08:00:00' WHERE jb_id = $jb_id_new");
endif;
sort_planTour($jb_id_new);
}
}
foreach($jb_idA AS $cr_sid => $jb_id_newA) {
foreach($jb_id_newA AS $jb_id_new) {
$row = get_first_row("SELECT cr_sid FROM job WHERE jb_id = $jb_id_new");
if ($row[0] == "S1999" || $row[0] == "H1999" || $row[0] == "L1999" || $row[0] == "E1888"):
writeLog("cancelling job because of cr_sid ='" . $row[0] . "': jb_id = '$jb_id_new', jb_status = 2, jb_storno = 2");
exec_query("UPDATE job SET jb_status = 2, jb_storno = 2, jb_finishtime = '" . date("Y-m-d H:i:s") . "' WHERE jb_id = $jb_id_new");
else:
writeLog("sending job to VPA: jb_id = '$jb_id_new', jb_status = 1");
exec_query("UPDATE job SET jb_status = 1 WHERE jb_id = $jb_id_new");
endif;
check_missing_scans($jb_id_new);
send_csv_mail($jb_id_new);
}
}
if ($tr_sort == 2):
// writeLog("finishing job: jb_id = '$jb_id'");
// exec_query("UPDATE job SET hq_id = 9999, jb_storno = 2, jb_status = 2 WHERE jb_id = $jb_id");
else:
writeLog("unassigned stations left: jb_id = '$jb_id'");
// Ereignis 411 löschen, falls schon geschrieben
writeLog("deleting event 411: jb_id = '$jb_id'");
exec_query("DELETE tourarticleprocess FROM tourarticle, tourarticleprocess WHERE jb_id = $jb_id AND tratp_type = 411 AND tourarticle.trat_id = tourarticleprocess.trat_id;");
exec_query("UPDATE job SET jb_status = 999 WHERE jb_id = $jb_id");
endif;
$jb_idA = array();
$tr_sortA = array();
}
function sort_planTour($jb_id_sort)
{
global $mysql_db, $end_start_zipcodes, $tr_sort_maxA;
$row = get_first_row("SELECT cr_sid FROM job WHERE jb_id = $jb_id_sort");
$end_coordinates = $end_start_zipcodes[$row[0]][0];
$start_coordinates = $end_start_zipcodes[$row[0]][1];
if ($row[0] == "S1999" || $row[0] == "H1999" || $row[0] == "L1999" || $row[0] == "E1888"):
writeLog("tour not planned: jb_id = '$jb_id_sort' because of cr_sid = '" . $row[0] . "'");
return;
endif;
writeLog("planning tour: jb_id = '$jb_id_sort', cr_sid = $row[0] ...");
XSplanTourJob($jb_id_sort, $end_coordinates, $start_coordinates);
writeLog("...finished: jb_id = '$jb_id_sort', cr_sid = $row[0]");
$trat_idA = array();
$sql_query = "SELECT tr_sort, trat_serialno FROM tourarticle WHERE jb_id = $jb_id_sort AND tr_sort > 1";
$res = mysql_query($sql_query) or die ($sql_query . ": " . mysql_error());
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)):
$trat_idA[$row["tr_sort"]] = $row["trat_serialno"];
endwhile;
mysql_free_result($res);
//print_r($trat_idA); die();
$row = get_first_row("SELECT csc_id_payer, hq_id, jb_ordertime, cr_sid, MAX(tr_sort) FROM job, tour WHERE job.jb_id = $jb_id_sort AND job.jb_id = tour.jb_id GROUP BY job.jb_id");
$csc_id_payer = $row[0];
$hq_id = $row[1];
$jb_ordertime = $row[2];
$cr_sid = $row[3];
$max_tr_sort = $row[4];
$tr_sort_old = $tr_sort_maxA[$hq_id] + 1;
$tr_sort_new = $tr_sort_maxA[$hq_id] + 1;
while ($tr_sort_old <= $max_tr_sort):
if ($tr_sort_new > $tr_sort_maxA[$hq_id]):
$jb_id_new = get_job($csc_id_payer, $hq_id, $jb_ordertime, $cr_sid, true);
$tr_sort_new = 2;
endif;
//writeLog("rewriting station: " . $trat_idA[$tr_sort_old] . ", jb_id/tr_sort old: $jb_id_sort/" . $tr_sort_old . " -> new: " . $jb_id_new . ", " . $tr_sort_new);
exec_query("UPDATE tour SET jb_id = " . $jb_id_new . ", tr_sort = " . $tr_sort_new . " WHERE jb_id = $jb_id_sort AND tr_sort = " . $tr_sort_old);
exec_query("UPDATE tourarticle SET jb_id = " . $jb_id_new . ", tr_sort = " . $tr_sort_new++ . " WHERE jb_id = $jb_id_sort AND tr_sort = " . $tr_sort_old);
exec_query("UPDATE tourarticle SET jb_id = " . $jb_id_new . " WHERE jb_id = $jb_id_sort AND tr_sort = 1 AND trat_serialno = '" . $trat_idA[$tr_sort_old++] . "'");
endwhile;
}
function get_job($csc_id_payer, $hq_id, $jb_ordertime, $cr_sid, $force_new = false)
{
global $mysql_db, $jb_idA, $tr_sortA, $csc_id_payerA;//, $fake_id;
if (!array_key_exists($cr_sid, $jb_idA) || $force_new):
$row1 = get_first_row("SELECT cr_id FROM couriervehicle WHERE crvh_sid = '$cr_sid'");
$cr_id = $row1[0];
// end customer Auftrag schreiben
exec_query("INSERT INTO job (hq_id, csc_id_payer, jb_payment, jb_ordertime, jb_reserv, cr_id, cr_sid, " .
"cr_id_order, jb_taketime, jb_status, jb_autoranking, jb_type, jb_incomplete, jb_globaljob, jb_tourname, emp_id, " .
"jb_fixprice, jb_totalprice, jb_postage, jb_invmode, jb_freetext_1, jb_locktime, jb_export_time) VALUES (" .
($hq_id != 99 ? $hq_id : 8) . ", $csc_id_payer, '0', '$jb_ordertime', '1', $cr_id, '$cr_sid', $cr_id, '', '997', '0', '1', '0', '0', '', '0', '0', '0'," .
"'0', '0', '', '9999-12-31 23:59:59', '9999-12-31 23:59:59')");
$jb_id_new = mysql_insert_id($mysql_db);
// $jb_id_new = $fake_id++;
$jb_idA[$cr_sid][] = $jb_id_new;
$tr_sortA[$cr_sid] = 2;
writeLog("creating job: jb_id = '" . $jb_id_new . "', cr_sid=" . $cr_sid);
// Station für Abholung in Niederlassung
write_tour($jb_id_new, 1, $csc_id_payerA[$csc_id_payer] , '1');
exec_query("INSERT INTO tourservice (jb_id, csc_id, tr_sort, srv_id, trs_srv_name, srvt_id, trs_srvt_name, trs_price, trs_discount) VALUES (" .
$jb_id_new . ", " . $csc_id_payer . ", '0', '0', 'Fixpreis', '0', '', '0', '0')");
else:
$jb_id_new = $jb_idA[$cr_sid][count($jb_idA[$cr_sid]) - 1];
endif;
return $jb_id_new;
}
function check_orphans()
{
global $mysql_db, $mailaddr;
$sql_query = "SELECT trat_serialno, hq_id FROM tourarticle AS ta, tourarticleprocess AS tp, job AS jb" .
" WHERE tratp_type = 412 AND trat_state != 2 AND ta.trat_id = tp.trat_id AND tratp_state = 1 AND trat_serialno LIKE 'ST%' AND ta.jb_id = jb.jb_id";
$res = mysql_query($sql_query, $mysql_db) or die ($sql_query . ": " . mysql_error($mysql_db));
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)):
exec_query("INSERT INTO phoenix_log.edi_status (ec_track_id, es_msg_no, es_ic_ref, es_date, es_status) VALUES ('" . $row["trat_serialno"] . "','0','0','" . date("Y-m-d H:i:s") . "', '0')");
exec_query("UPDATE tourarticle SET trat_state = 2 WHERE trat_serialno = '" . $row["trat_serialno"] . "'");
$mailObj = new htmlMimeMail();
$mailObj->setFrom($mailaddr[$row["hq_id"]]["from"]);
// $mailObj->setCc("leier@stadtbote.de");
$mailObj->setBcc($mailaddr[$row["hq_id"]]["bcc"]);
$mailObj->setSubject($row["trat_serialno"] . " - Paket ohne Auftrag");
$mailObj->setText(
"Ein Paket mit der Tracking-Nummer '" . $row["trat_serialno"] . "' wurde gescannt, obwohl kein elektronischer Auftrag vorliegt.\n\n".
"Dieses Paket kann nicht ausgeliefert werden, sondern wird mit dem nächsten Linienauftrag zurück geschickt.\n".
"Für diese Tracking-Nummer wird demnächst die Meldung 'Received shipment - did not receive paperwork' automatisch an Amazon gesendet.\n");
$mailResult = $mailObj->send($mailaddr[$row["hq_id"]]["sendto"], 'smtp');
writeLog("result of sending mail for track_id = '" . $row["trat_serialno"] . "': '" . $mailResult . "'");
endwhile;
mysql_free_result($res);
}
function check_missing_scans($jb_id)
{
global $mysql_db, $mailaddr;
$sql_query = "SELECT trat_serialno, hq_id FROM tourarticle AS ta, tourarticleprocess AS tp, job AS jb" .
" WHERE tratp_type = 411 AND ta.trat_id = tp.trat_id AND trat_serialno LIKE 'ST%' AND ta.jb_id = jb.jb_id AND (jb.jb_storno != 2 OR jb.jb_storno IS NULL) AND jb.jb_id = $jb_id";
$res = mysql_query($sql_query, $mysql_db) or die ($sql_query . ": " . mysql_error($mysql_db));
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)):
$mailObj = new htmlMimeMail();
$mailObj->setFrom($mailaddr[$row["hq_id"]]["from"]);
$mailObj->setBcc($mailaddr[$row["hq_id"]]["bcc"]);
$mailObj->setSubject($row["trat_serialno"] . " - Auftrag ohne Paket");
$mailObj->setText(
"Ein Paket mit der Tracking-Nummer '" . $row["trat_serialno"] . "' wurde in Auftrag " . $jb_id . " eingestellt, obwohl der Eingansscan fehlt.\n\n".
"Sollte der Scan irrtümlich fehlen, muss dieser manuell im System nachgetragen werden.\n".
"Ansonsten wird für diese Tracking-Nummer demnächst die Meldung 'Paperwork received - did not receive shipment' automatisch an Amazon gesendet.\n");
$mailResult = $mailObj->send($mailaddr[$row["hq_id"]]["sendto"], 'smtp');
writeLog("result of sending mail for track_id = '" . $row["trat_serialno"] . "': '" . $mailResult . "'");
endwhile;
mysql_free_result($res);
}
function get_prices() {
global $price_ranges, $hq_id, $hq_prefixes;
$pre_len = strlen($hq_prefixes[$hq_id]) + 2;
if (date("d") <= 15)
$last_inv_date = date("Y-m-d", mktime(0, 0, 0, date("m"), 1, date("Y")));
else
$last_inv_date = date("Y-m-d", mktime(0, 0, 0, date("m"), 16, date("Y")));
$last_inv_date = "2013-04-16";
$i = 0;
while ($i == 0 || $cur_date != $last_inv_date):
$cur_date = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") - $i++, date("Y")));
//echo $cur_date . "\n";
// Preise ermitteln und eintragen
foreach(array("('" . $hq_prefixes[$hq_id] . "01')", "('" . $hq_prefixes[$hq_id] . "02','" . $hq_prefixes[$hq_id] . "03')") AS $type_clause) {
$sql_query = //"SELECT count(*) AS cnt" .
//" FROM phoenix.tourarticle AS ta, phoenix.tourarticleprocess AS tp " .
//" WHERE ta.trat_id = tp.trat_id AND tp.tratp_type = '201' AND LEFT(tratp_createtime, 10) = '" . $cur_date . "' AND LEFT(trat_serialno, $pre_len) IN " . $type_clause;
"SELECT count(*) AS cnt" .
" FROM phoenix.tourarticle AS ta1, phoenix.tourarticleprocess AS tp1, phoenix.tourarticle AS ta2, phoenix.tourarticleprocess AS tp2" .
" WHERE ta1.trat_id = tp1.trat_id AND (tp1.tratp_type = '102' OR tp1.tratp_type = '101') AND ta2.trat_id = tp2.trat_id AND tp2.tratp_type = '201'" .
" AND ta1.trat_serialno = ta2.trat_serialno AND LEFT(tp1.tratp_createtime, 10) = '" . $cur_date . "' AND LEFT(ta1.trat_serialno, $pre_len) IN " . $type_clause;
$res = mysql_query($sql_query) or die ($sql_query . ": " . mysql_error());
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)):
//echo $row["cnt"] . "\n";
$es_amount = get_price($row["cnt"]);
$sql_query = //"SELECT trat_serialno" .
//" FROM phoenix.tourarticle AS ta, phoenix.tourarticleprocess AS tp " .
//" WHERE ta.trat_id = tp.trat_id AND tp.tratp_type = '201' AND LEFT(tratp_createtime, 10) = '" . $cur_date . "' AND LEFT(trat_serialno, $pre_len) IN " . $type_clause;
"SELECT ta1.trat_serialno" .
" FROM phoenix.tourarticle AS ta1, phoenix.tourarticleprocess AS tp1, phoenix.tourarticle AS ta2, phoenix.tourarticleprocess AS tp2" .
" WHERE ta1.trat_id = tp1.trat_id AND (tp1.tratp_type = '102' OR tp1.tratp_type = '101') AND ta2.trat_id = tp2.trat_id AND tp2.tratp_type = '201'" .
" AND ta1.trat_serialno = ta2.trat_serialno AND LEFT(tp1.tratp_createtime, 10) = '" . $cur_date . "' AND LEFT(ta1.trat_serialno, $pre_len) IN " . $type_clause;
$res1 = mysql_query($sql_query) or die ($sql_query . ": " . mysql_error());
while ($row1 = mysql_fetch_array($res1, MYSQL_ASSOC)):
exec_query("UPDATE phoenix_log.edi_status SET es_amount = $es_amount WHERE es_status IN (0,1) AND ec_track_id = '" . $row1["trat_serialno"] . "'");
endwhile;
endwhile;
mysql_free_result($res);
}
endwhile;
}
function write_tour($jb_id, $tr_sort, $tr_comp, $tr_ware_from_to)
{
global $hq_id, $ad_id_hqA, $csc_id_externA;
$tr_hsnoA = array (
11 => "10",
4 => "15",
8 => "69-71",
7 => "28",
99 => "69-71"
);
$cmp_nameA = array(
11 => "DKT / Amazon ",
4 => "Stadtbote GmbH / Amazon ",
8 => "Stadtbote GmbH / Amazon ",
7 => "Stadtbote GmbH / Amazon ",
99 => "Stadtbote GmbH / Amazon "
);
exec_query("INSERT INTO tour (jb_id, tr_sort, ad_id, tr_hsno, csc_id, tr_status, tr_comp, tr_comp2, tr_remark, tr_ware_from_to, tr_mediationarea_id) VALUES (" .
"$jb_id, $tr_sort, " . $ad_id_hqA[$hq_id] . ", '" . $tr_hsnoA[$hq_id] . "', " . $csc_id_externA[$hq_id] . ", 0, '" . $cmp_nameA[$hq_id] . $tr_comp . "', '', '', $tr_ware_from_to, 0)");
writeLog("creating tourstop: jb_id = '$jb_id', tr_sort = '$tr_sort'");
}
?>