244 lines
6.3 KiB
PHP
Executable File
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";
|