Jacek Kowalski
2023-06-14 a708f018c174e39481a28a5aa25ece2be69a1f66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
 
namespace SIPL\UCRM\Holidays;
 
use Umulmrum\Holiday\Constant\HolidayType;
use Umulmrum\Holiday\Filter\IncludeTypeFilter;
use Umulmrum\Holiday\HolidayCalculator;
use Umulmrum\Holiday\Model\HolidayList;
 
class HolidaySkipper {
    protected UcrmHelper $helper;
    protected ?array $skipDays = null;
    protected ?HolidayList $holidays = null;
 
    function __construct(UcrmHelper $ucrmHelper) {
        $this->helper = $ucrmHelper;
    }
 
    protected function configure(array $years): void {
        $config = $this->helper->getConfig();
 
        if ($this->skipDays === NULL) {
            $skipDays = [];
            for ($i = 1; $i <= 7; $i++) {
                if ($config['holidays_weekday_' . $i]) {
                    $skipDays[] = (string)$i;
                }
            }
            $this->skipDays = $skipDays;
        }
        if ($this->holidays === NULL) {
            $holidays = new HolidayList();
            if ($config['holidays_region']) {
                $calculator = new HolidayCalculator();
                $holidays = $calculator->calculate($config['holidays_region'], $years);
                $holidays->filter(new IncludeTypeFilter(HolidayType::BANK | HolidayType::DAY_OFF));
            }
            $this->holidays = $holidays;
        }
    }
 
    function processInvoice(string $invoiceId): bool {
        $crm = $this->helper->getApi();
        $invoiceData = $crm->get('/invoices/' . $invoiceId);
        if ($invoiceData['status'] != 0) {
            // Ignore final invoices
            return FALSE;
        }
 
        $maturity = $invoiceData['maturityDays'];
        $changed = 0;
 
        $dueDate = \DateTime::createFromFormat(\DateTimeInterface::ATOM, $invoiceData['dueDate']);
        $dueDateYear = intval($dueDate->format('Y'));
        $this->configure([$dueDateYear, $dueDateYear + 1]);
 
        while (in_array($dueDate->format('N'), $this->skipDays) || $this->holidays->isHoliday($dueDate)) {
            $maturity += 1;
            $changed += 1;
            $dueDate->add(new \DateInterval('P1D'));
        }
 
        if ($changed) {
            $crm->patch(
                '/invoices/' . $invoiceId,
                [
                    'maturityDays' => $maturity,
                ]
            );
            echo 'Invoice ' . $invoiceId . ': maturity adjusted - added ' . $changed . ' day(s)' . "\n";
        } else {
            echo 'Invoice ' . $invoiceId . ': nothing to do' . "\n";
        }
 
        return $changed > 0;
    }
}