244 lines
6.3 KiB
PHP
Executable File

<?php
require_once('fixed/config/go_con.php');
ini_set('memory_limit', '512M');
$invoicesSumQuery = <<<SQL
SELECT SUM(invoices_details_has_how_pay.pay) AS sum
FROM invoices_details_has_how_pay
INNER JOIN invoices_details
ON invoices_details_has_how_pay.invoices_details_id = invoices_details.id
WHERE
invoices_details_has_how_pay.date_time >= '2023-04-01 00:00:00' AND
invoices_details_has_how_pay.date_time < '2023-07-01 00:00:00' AND
invoices_status_id = 1 AND
invoices_details_has_how_pay.how_pay_id IN (1,2,3,4,5,6,7,8,9,10)
SQL;
$result = mysqli_query($db, $invoicesSumQuery);
$sum = mysqli_fetch_assoc($result);
if (!$sum) {
die('sum could not be calculated');
}
$sum = $sum['sum'];
$bondsSumQuery = <<<SQL
SELECT SUM(bonds_details_has_how_pay.pay) AS sum
FROM bonds_details_has_how_pay
INNER JOIN bonds_details
ON bonds_details_has_how_pay.bonds_details_id = bonds_details.id
WHERE
bonds_details_has_how_pay.date_time >= '2023-04-01 00:00:00' AND
bonds_details_has_how_pay.date_time < '2023-07-01 00:00:00' AND
bonds_status_id = 1 AND
branch_id IN (2,3,4,5,6,7,8,10,11,12)
SQL;
$result = mysqli_query($db, $bondsSumQuery);
$sum = mysqli_fetch_assoc($result);
if (!$sum) {
die('sum could not be calculated');
}
$sum = $sum['sum'];
function inSubsetSum(array $a, float $t, array &$memo = []) : ?array {
$s = array_reduce($memo, function (?float $carry, array $value) {
return $carry + $value[1];
});
if ($s === $t) {
return $memo;
}
if ($s >= $t) {
return null;
}
$len = count($a);
$keys = array_keys($a);
for ($i = 0; $i < $len; ++$i) {
$k = $keys[$i];
$v = $a[$k];
$rem = array_slice($a, $i + 1, null, true);
$memo = array_merge($memo, [[$k, $v]]);
$res = inSubsetSum($rem, $t, $memo);
if ($res !== null) {
return $res;
}
}
return null;
}
function subsetSum(array $a, float $t) : ?array {
$subset = inSubsetSum($a, $t);
$result = [];
foreach ($subset as $_ => [$k, $v]) {
$result[$k] = $v;
}
return $result;
}
$bondsPayQuery = <<<SQL
SELECT
bonds.id AS bonds_id,
bonds.tretment_id AS tretment_id,
bonds.bonds_type_type_id AS bonds_type_type_id,
bonds_details.branch_id AS branch_id,
bonds_details_has_how_pay.pay AS pay,
bonds_details_has_how_pay.how_pay_id AS how_pay_id,
bonds_details_has_how_pay.date_time AS date_time
FROM bonds_details_has_how_pay
INNER JOIN bonds_details
ON bonds_details_has_how_pay.bonds_details_id = bonds_details.id
INNER JOIN bonds
ON bonds_details.bonds_id = bonds.id
WHERE
bonds_details_has_how_pay.date_time >= '2023-04-01 00:00:00' AND
bonds_details_has_how_pay.date_time < '2023-07-01 00:00:00' AND
bonds_status_id = 1 AND
branch_id IN (2,3,4,5,6,7,8,10,11,12)
ORDER BY bonds_details_has_how_pay.date_time
SQL;
$result = mysqli_query($db, $bondsPayQuery);
echo mysqli_error($db);
$bonds = [];
while ($bond = mysqli_fetch_assoc($result)) {
$key = $bond['bonds_id'];
if (array_key_exists($key, $bonds)) {
$bonds[$key]['pay'] += floatval($bond['pay']);
} else {
$bonds[$key]['pay'] = floatval($bond['pay']);
}
$bonds[$key]['bonds_id'] = $bond['bonds_id'];
$bonds[$key]['tretment_id'] = $bond['tretment_id'];
$bonds[$key]['bonds_type_type_id'] = $bond['bonds_type_type_id'];
$bonds[$key]['branch_id'] = $bond['branch_id'];
$bonds[$key]['how_pay_id'] = $bond['how_pay_id'];
$bonds[$key]['date_time'] = $bond['date_time'];
}
$sum = 0.0;
$desiredBonds = 140390.26;
$subset = [];
$reached_desired = false;
foreach ($bonds as $key => $bond) {
if ($sum == $desiredBonds) {
$reached_desired = true;
break;
} else if ($sum < $desiredBonds) {
$sum += $bond['pay'];
$subset[$key] = $bond;
continue;
}
break;
}
$year = '23';
$letter = 'B';
// MAX(id) Q1 = 232
// MAX(id) Q2 = 644
$branchData = [
'2' => ['1501', 20],
'3' => ['0701', 41],
'4' => ['2901', 11],
'5' => ['0602', 60],
'6' => ['KM01', 100],
'7' => ['VS01', 0],
'8' => ['VS02', 0],
'9' => ['PT07', 0],
'12' => ['2902', 0],
'13' => ['1502', 0],
];
$sahabiBonds = <<<SQL
CREATE TABLE IF NOT EXISTS `sahabi_bonds` (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
bonds_id INT NOT NULL,
branch_id INT NOT NULL,
tretment_id INT NOT NULL,
bonds_type_type_id INT NOT NULL,
number VARCHAR(14) NOT NULL,
date_time DATETIME NOT NULL,
price_no_vat DECIMAL(10, 2) NOT NULL,
vat DECIMAL(10, 2) NOT NULL,
total DECIMAL(10, 2) NOT NULL,
how_pay_id INT NOT NULL
) ENGINE=INNODB;
SQL;
// $result = mysqli_query($db, $sahabiBonds);
echo mysqli_error($db);
// $subset = array_reverse($subset, true);
foreach ($subset as $id => $bond) {
$bData = &$branchData[$bond['branch_id']];
$branchCode = $bData[0];
$bData[1] += 1;
$invoiceNumber = $bData[1];
$number = "{$year}{$letter}{$branchCode}";
$number .= str_pad("$invoiceNumber", 7, '0', STR_PAD_LEFT);
$noVat = $bond['pay'] / 1.15;
$vat = $bond['pay'] - $noVat;
$params = [
$bond['bonds_id'],
$bond['branch_id'],
$bond['tretment_id'],
$bond['bonds_type_type_id'],
$number,
$bond['date_time'],
$noVat,
$vat,
$bond['pay'],
$bond['how_pay_id'],
];
$insertQuery = <<<SQL
INSERT INTO `sahabi_bonds` (
bonds_id,
branch_id,
tretment_id,
bonds_type_type_id,
number,
date_time,
price_no_vat,
vat,
total,
how_pay_id
) VALUES (
?,
?,
?,
?,
?,
?,
?,
?,
?,
?
);
SQL;
$stmt = mysqli_prepare($db, $insertQuery);
$stmt->bind_param('ssiissdddi', ...$params);
// $stmt->execute();
}
// $desired = 655476.19;
// $subset = subsetSum($bonds, $desired);
// echo "done";
//
// $subsetSum = array_sum($subset);
// echo "<br>subset sum: $subsetSum";