= '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 = <<= '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 = <<= '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 = << $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 = <<bind_param('ssiissdddi', ...$params); // $stmt->execute(); } // $desired = 655476.19; // $subset = subsetSum($bonds, $desired); // echo "done"; // // $subsetSum = array_sum($subset); // echo "
subset sum: $subsetSum";