Panowie potrzebuję jakiejś świeżej głowy do rozwiązania tego problemu ponieważ, nie wiem już jak się do tego zabrać. Próbowałem różnych rozwiązań ale niestety nie udało mi się tego dokonać aktualnie.
Krótko opisując temat. Mam sobie widok w którym matchuje sobie lewą stronę z prawą. Matchowanie może zachodzić jeden do jeden, wiele do jeden i wiele do wiele. I teraz przejdźmy do kodu:
Prawa strona ma większą wartość niż lewa:
$tickets = [
[
'issue_id' => 'ZAKUPY-1070',
'amount' => '100'
],
[
'issue_id' => 'ZAKUPY-1043',
'amount' => '100'
]
];
$invoices = [
[
'document_id' => '12998638134790357761.1',
'amount' => '150'
],
[
'document_id' => '12998638134790357761.2',
'amount' => '100'
]
];
$result = [
[
'issue_id' => 'ZAKUPY-1070',
'document_id' => '12998638134790357761.1',
'issue_amount' => '100.0000',
'document_amount' => '100.0000'
],
[
'issue_id' => 'ZAKUPY-1043',
'document_id' => '12998638134790357761.1',
'issue_amount' => '50.0000',
'document_amount' => '50.0000'
],
[
'issue_id' => 'ZAKUPY-1070',
'document_id' => '12998638134790357761.2',
'issue_amount' => '0.0000',
'document_amount' => '0.0000'
],
[
'issue_id' => 'ZAKUPY-1043',
'document_id' => '12998638134790357761.2',
'issue_amount' => '50.0000',
'document_amount' => '50.0000'
]
];
Lewa strona ma większą wartość niż prawa:
$tickets = [
[
'issue_id' => 'ZAKUPY-1070',
'amount' => '150'
],
[
'issue_id' => 'ZAKUPY-1043',
'amount' => '100'
]
];
$invoices = [
[
'document_id' => '12998638134790357761.1',
'amount' => '100'
],
[
'document_id' => '12998638134790357761.2',
'amount' => '100'
]
];
$result = [
[
'issue_id' => 'ZAKUPY-1070',
'document_id' => '12998638134790357761.1',
'issue_amount' => '100.0000',
'document_amount' => '100.0000'
],
[
'issue_id' => 'ZAKUPY-1043',
'document_id' => '12998638134790357761.1',
'issue_amount' => '0.0000',
'document_amount' => '0.0000'
],
[
'issue_id' => 'ZAKUPY-1070',
'document_id' => '12998638134790357761.2',
'issue_amount' => '50.0000',
'document_amount' => '50.0000'
],
[
'issue_id' => 'ZAKUPY-1043',
'document_id' => '12998638134790357761.2',
'issue_amount' => '50.0000',
'document_amount' => '50.0000'
]
];
Obie strony są równe:
$tickets = [
[
'issue_id' => 'ZAKUPY-1070',
'amount' => '120'
],
[
'issue_id' => 'ZAKUPY-1043',
'amount' => '80'
]
];
$invoices = [
[
'document_id' => '12998638134790357761.1',
'amount' => '80'
],
[
'document_id' => '12998638134790357761.2',
'amount' => '120'
]
];
$result = [
[
'issue_id' => 'ZAKUPY-1070',
'document_id' => '12998638134790357761.1',
'issue_amount' => '80.0000',
'document_amount' => '80.0000'
],
[
'issue_id' => 'ZAKUPY-1043',
'document_id' => '12998638134790357761.1',
'issue_amount' => '0.0000',
'document_amount' => '0.0000'
],
[
'issue_id' => 'ZAKUPY-1070',
'document_id' => '12998638134790357761.2',
'issue_amount' => '40.0000',
'document_amount' => '40.0000'
],
[
'issue_id' => 'ZAKUPY-1043',
'document_id' => '12998638134790357761.2',
'issue_amount' => '80.0000',
'document_amount' => '80.0000'
]
];
Obecnie stanałem na rozwiązaniu:
$ticketsSummary = 0;
foreach ($tickets as $ticket) {
$baseTickets[$ticket['issue_id']] = $ticket;
$ticketsSummary += $ticket['amount'];
}
$invoicesSummary = 0;
foreach ($invoices as $invoice) {
$baseInvoices[$invoice['document_id']] = $invoice;
$invoicesSummary += $invoice['amount'];
}
foreach ($invoices as $invoice) {
foreach ($tickets as $ticket) {
if (!isset($invoiceAmountCounter[$invoice['document_id']])) { $invoiceAmountCounter[$invoice['document_id']] = 0;
}
$invoiceAmountCounter[$invoice['document_id']] =
$invoiceAmountCounter[$invoice['document_id']] + $ticket['amount'];
if ($invoiceAmountCounter[$invoice['document_id']] >= $baseInvoices[$invoice['document_id']]['amount']) {
$ticket['amount'] = $ticket['amount'] - ($invoiceAmountCounter[$invoice['document_id']] -
$baseInvoices[$invoice['document_id']]['amount']);
$ticket['amount'] = $ticket['amount'] < 0 ? 0 : $ticket['amount'];
}
$result[] = [
'issue_id' => $ticket['issue_id'],
'document_id' => $invoice['document_id'],
'document_amount' => $ticket['amount'],
'issue_amount' => $ticket['amount'],
];
}
}
Problem rozwiązany:
$right = $invoices;
$rightColIndex = 0;
$results = [];
foreach ($tickets as $leftPos) {
$ticketSum = 0;
while (isset($right[$rightColIndex]) && $leftPos['amount'] > $ticketSum) {
$rightPos = $right[$rightColIndex];
$ticketSum += $rightPos['amount'];
$results[] = [
'document_id' => $rightPos['document_id'],
'issue_id' => $leftPos['issue_id'],
'issue_amount' => $rightPos['amount'],
'document_amount' => $rightPos['amount'],
];
$rightColIndex++;
}
if ($ticketSum > $leftPos['amount']) {
$rightColIndex--;
$diffAmount = $ticketSum - $leftPos['amount'];
$results[count($results) - 1]['document_amount'] = $right[$rightColIndex]['amount'] - $diffAmount; $results[count($results) - 1]['issue_amount'] = $right[$rightColIndex]['amount'] - $diffAmount;
$right[$rightColIndex]['amount'] = $diffAmount;
}
}
Ten post edytował rad11 9.10.2018, 07:31:29