Closed interduo closed 5 years ago
Ta płatność:
MariaDB [lmsdb]> SELECT * FROM billtech_payments WHERE id=4634;
+------+-----+------------+--------+-------+-----------------+------------------+------------+--------+--------+
| id | ten | customerid | amount | title | document_number | reference_number | cdate | closed | cashid |
+------+-----+------------+--------+-------+-----------------+------------------+------------+--------+--------+
| 4634 | | 3528 | 58.00 | | saldo-20190719 | 20190719-813207 | 1563560722 | 1 | NULL |
+------+-----+------------+--------+-------+-----------------+------------------+------------+--------+--------+
1 row in set (0.00 sec)
W tym polu jest cashid = NULL i tutaj pewnie jest błąd?
Wpis który powinien zostać usunięty:
MariaDB [lmsdb]> SELECT * FROM cash WHERE id='413480';
+--------+------------+------+--------+-------+-------+------------+-------------------+-------+--------+----------+----------+
| id | time | type | userid | value | taxid | customerid | comment | docid | itemid | importid | sourceid |
+--------+------------+------+--------+-------+-------+------------+-------------------+-------+--------+----------+----------+
| 413480 | 1563560722 | 100 | NULL | 58.00 | NULL | 3528 | BillTech Payments | NULL | 0 | NULL | NULL |
+--------+------------+------+--------+-------+-------+------------+-------------------+-------+--------+----------+----------+
1 row in set (0.00 sec)
U @olimplan jest błąd:
PHP Fatal error: Uncaught Error: Class 'BillTechPaymentCashImportHandler' not found in /var/www/lms.git/lib/LMSPluginManager/LMSPlugin.php:134
Stack trace:
#0 /var/www/lms.git/lib/LMSPluginManager/LMSPlugin.php(108): LMSPlugin->dispatcher('cashimport_afte...', Array)
#1 /var/www/lms.git/vendor/phine/observer/src/lib/Phine/Observer/Subject.php(177): LMSPlugin->receiveUpdate(Object(LMSPluginManager))
#2 /var/www/lms.git/lib/LMSPluginManager/LMSPluginManager.php(166): Phine\Observer\Subject->notifyObservers()
#3 /var/www/lms.git/lib/LMS.class.php(191): LMSPluginManager->executeHook('cashimport_afte...', Array)
#4 /var/www/lms.git/lib/LMSManagers/LMSCashManager.php(405): LMS->executeHook('cashimport_afte...', Array)
#5 /var/www/lms.git/lib/LMS.class.php(488): LMSCashManager->CashImportCommit()
#6 /var/www/lms.git/bin/lms-cashimport.php(170): LMS->CashImportCommit()
#7 {main}
thrown in /var/www/lms.git/lib/LMSPluginManager/LMSPlugin.php on line 134
Ja u siebie nie widzę tego ale zapewne obu nas dotyczy.
PHP Fatal error: Uncaught Error: Class 'BillTechPaymentCashImportHandler' not found in /var/www/lms.git/lib/LMSPluginManager/LMSPlugin.php:134 Stack trace:
0 /var/www/lms.git/lib/LMSPluginManager/LMSPlugin.php(108): LMSPlugin->dispatcher('cashimport_afte...', Array)
1 /var/www/lms.git/vendor/phine/observer/src/lib/Phine/Observer/Subject.php(177): LMSPlugin->receiveUpdate(Object(LMSPluginManager))
2 /var/www/lms.git/lib/LMSPluginManager/LMSPluginManager.php(166): Phine\Observer\Subject->notifyObservers()
3 /var/www/lms.git/lib/LMS.class.php(191): LMSPluginManager->executeHook('cashimport_afte...', Array)
4 /var/www/lms.git/lib/LMSManagers/LMSCashManager.php(405): LMS->executeHook('cashimport_afte...', Array)
5 /var/www/lms.git/lib/LMS.class.php(488): LMSCashManager->CashImportCommit()
6 /var/www/lms.git/bin/lms-cashimport.php(170): LMS->CashImportCommit()
7 {main}
thrown in /var/www/lms.git/lib/LMSPluginManager/LMSPlugin.php on line 134
Coś tu chyba jest namieszane w instalacji wtyczki. Upewnijcie się, że wszystkie pliki są na miejscu.
U mnie się to nie pokazuje na instancji ale cashimport nie usuwa wpłat tymczasowych.
Czy dostarczone przeze mnie informacje są wystarczające do odwzorowania problemu u Ciebie na instancji testowej?
To są dwa, nie powiązane problemy. Czy w tabelce billtech_payments
jakikolwiek wiersz ma w kolumnie cashid
inną wartość niż NULL?
Tylko jeden:
MariaDB [lmsdb]> SELECT * FROM billtech_payments WHERE cashid IS NOT NULL;
+------+-----+------------+--------+-------+-----------------+------------------+------------+--------+--------+
| id | ten | customerid | amount | title | document_number | reference_number | cdate | closed | cashid |
+------+-----+------------+--------+-------+-----------------+------------------+------------+--------+--------+
| 4640 | | 51 | 30.00 | | saldo-20190723 | 20190723-522265 | 1563861790 | 0 | 45932 |
+------+-----+------------+--------+-------+-----------------+------------------+------------+--------+--------+
Spróbuj proszę przetestować rozliczanie tej konkretnej wpłaty. Np. ustawić cdate = 1561269790.
@MKaciuba czy u was na instancji testowej jest odwzorowywalny ten błąd?
@MKaciuba czy u was na instancji testowej jest odwzorowywalny ten błąd?
nie.
Spróbuj proszę przetestować rozliczanie tej konkretnej wpłaty. Np. ustawić cdate = 1561269790.
Gdzie mam to cdate ustawić? I jaki test wykonać?
Mam plik importu z banku mogę wyłuskać tą pojedyńczą wpłatę i testować.
UPDATE billtech_payments SET cdate= 1561269790 WHERE id = 4640;
Po chwili płatność powinna być rozliczona a wpis w cash powinien zniknąć. Chcę ustalić czy problem leży w tym, że nie działa $LMS->DelBalance($payment['cashid']);
czy w tym, że do tabelki billtech_payments nie zapisują się cashid.
MariaDB [lmsdb]> SELECT * FROM billtech_payments WHERE id = 4640;
+------+-----+------------+--------+-------+-----------------+------------------+------------+--------+--------+
| id | ten | customerid | amount | title | document_number | reference_number | cdate | closed | cashid |
+------+-----+------------+--------+-------+-----------------+------------------+------------+--------+--------+
| 4640 | | 51 | 30.00 | | saldo-20190723 | 20190723-522265 | 1561269790 | 1 | NULL |
+------+-----+------------+--------+-------+-----------------+------------------+------------+--------+--------+
1 row in set (0.00 sec)
A wpis tymczasowy w tabeli cash o treści nadal jest.
Ok, czy zniknął cash z id 45932?
Ok, czy zniknął cash z id 45932?
Nie
Ok czyli problem leży w $LMS->DelBalance($payment['cashid']);
Mi kasowanie z GUI LMS działa a widzę że korzysta z tej samej funkcji.
Jeszcze jedno, żeby się upewnić. Wejdź proszę w zakładkę Płatności BillTech, znajdź tę płatność i oznacz ją najpierw jako nierozliczoną --> powinien powstać nowy wpis w cash. Zanotuj cashid z tabelki billtech_payments a następnie ustaw płatność jako rozliczoną. Czy wtedy wiersz z cash znika?
Na liście mam tą płatność jako szarą (mimo że wpis w tabeli cash jest). Po kliknięciu przycisku dodaje się nowa, płatność nadal jest w tabelce jako rozliczona. Każde kolejne kliknięcie przycisku dodaje nową płatność tymczasową.
To, że zostaje szara jest normalne bo po prostu natychmiast zostaje ponownie rozliczona (nadal jest przeterminowana). Dziwne natomiast jest to, że wiersz cash nie znika. Czy możesz przetestować działanie $LMS->DelBalance()
w izolacji? Np. wybrać wiersz z cash
, który ma być usunięty np. 4634 i dodać w BillTechPaymentsUpdater na samym początku metody checkForUpdate taki kawałek kodu:
$LMS->DelBalance(4634);
Ew. po prostu z poziomu zakładki Historia operacji.
Już pisałem - z historii operacji działa ponieważ kasujemy wpłaty tymczasowe z tego miejsca.
4634 to id płatności w tabeli billtech a nie płatności tymczasowej w tabeli cash.
Ok zaraz spróbuję to potestować.
Dodanie tego kodu kasuje wpis w tabeli cash.
https://github.com/BillTechPL/lms-billtech-plugin/commit/5bbc8d64e1e17f5556561ebbba09dd7954219108
SHOW CREATE TABLE cashimport;
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| cashimport | CREATE TABLE `cashimport` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` int(11) NOT NULL DEFAULT '0',
`value` decimal(9,2) NOT NULL DEFAULT '0.00',
`customer` text COLLATE utf8_polish_ci NOT NULL,
`description` text COLLATE utf8_polish_ci NOT NULL,
`customerid` int(11) NOT NULL DEFAULT '0',
`hash` varchar(50) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
`closed` tinyint(1) NOT NULL DEFAULT '0',
`sourceid` int(11) DEFAULT NULL,
`sourcefileid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `hash` (`hash`),
KEY `customerid` (`customerid`),
KEY `sourcefileid` (`sourcefileid`),
KEY `sourceid` (`sourceid`)
) ENGINE=InnoDB AUTO_INCREMENT=99346 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
To nie to?
Mógłbyś sprawdzić jaka jest wartość $payment['cashid']
w https://github.com/BillTechPL/lms-billtech-plugin/blob/master/BillTechPaymentsUpdater.php#L75?
4640
To nie jest $payment['id']
?
To jest ID płatności z tabeli billtech_payments zamiast ID z tabeli cash.
Czy na 100% wypisałeś $payment['cashid']
?
Wypiszesz proszę $payment['cashid']
zamiast $payment['id']
?
Nie myślę już. To znak że już muszę kończyć pracę. Jutro to skończymy. Na tą chwilę robię cashimport = false.
46297
Nie działa odrozliczanie tylko w tym wpisie któremu zmieniłem cdate. Odrozliczenie wpłaty powoduje dodanie wpisu billtech. Rozliczenie wpłaty nie powoduje usunięcia tego wpisu.
@interduo Mógłbyś zajrzeć jeszcze do logów czy nie ma tam jakichś błędów SQL? ew. zobacz czy https://github.com/BillTechPL/lms-billtech-plugin/commit/1848393515dd71e05baabef728c1847c883bcea2 coś zmienia.
@MKaciuba słabo. Bardzo.
W tabeli billtech_payments w kolumnie cashid pojawiają się nieprawidłowe ID (niezawsze).
Czy wiesz jaki jest tego skutek? Podpowiedź: https://github.com/lmsgit/lms/blob/master/doc/lms.mysql#L1086-L1097
@interduo potrzebuję trochę więcej informacji. Kiedy pojawiają się nieprawidłowe ID. Co dokładnie oznacza nieprawidłowe?
Już to rozkminiliśmy:
Problem leży tutaj: https://github.com/lmsgit/lms/blob/master/lib/LMSDB_driver_mysqli.class.php#L354-L357 Brakuje tutaj w kodzie tej funkcji zmiennej table (MySQL tego nie obsługuje).
W związku z tym proponuję zastąpić tą funkcję bezpośrednim zapytaniem do bazy tam gdzie występuje ta funkcja GetLastInsertID zanim nie zostanie to poprawione w repozytorium LMS.
Np. funkcja GetLastInsertID zwraca ostatnie id z tabeli logmessages zamiast id z tabeli cash.
W związku z czym GetLastID() w kodzie wtyczki zwracało nie to czego oczekujemy. np w tabeli billtech_payments było np. 44601 co w tabeli cash było wpisem z 20XX roku.
Musimy teraz przez to wyciągnąć stare backupy i przywrócić brakujące wpisy z wielu tabel co zapewne będzie kosztować nas wiele pracy.
Na początek przed wywołaniem metody DelBalance() proponuję warunek czy id jest wpłatą BillTechową czyli czy wpis zawiera comment = "BillTech Payments" w tabeli cash.
Chilek:
Przed chwilą puściłem do 'master', 'stable' i 'stable-1.11.23' zmianę, która z LMSFinanceManager::AddBalance(...) zwróci id ostatnio wstawionego rekordu do cash lub wartość pustą o ile to nie powiodło się. Powinno załatwić Wasz scenariusz.
@interduo przetestujesz https://github.com/lmsgit/lms/commit/66b5be7d9a4061e4c09c5d5f8cfc733ca8a64696 + https://github.com/BillTechPL/lms-billtech-plugin/commit/4d5a43dbccea203b970606e39884ef6d12cab16d
Dopisz proszę warunek, żeby kasował tylko wpłaty w których jest w cash.comment = 'BillTech Payments'.
To trochę bez sensu. Jeśli id będą prawidłowe to ten warunek nie będzie miał znaczenia.
Lepiej dwa razy sprawdzić coś przed usunięciem.
Z Twojego punktu widzenia to bez sensu. Z mojego nie - ponieważ nie wiesz ile zamieszania to spowodowało. Nie chcę przerabiać tego samego problemu z innego powodu.
Dasz radę dodać? Wykonam wtedy test ponownie.
Jeśli chcesz, to dodaj sobie na czas testów taki warunek w swoim kodzie.
A jeśli znów z jakiegoś powodu nie będą prawidłowe?
Oczekuję dodatkowego zabezpieczenia w kodzie, by taka sytuacja nie miała okazji się nawet powtórzyć przy tak newralgicznej czynności. Pal licho o powód bo piłeczkę można odbijać.
Nie działa automatyczne kasowanie wpłat tymczasowych z komentarzem "BillTech Payments" z tabeli cash podczas czynności:
Te wpłaty na liście płatności są zaznaczone jako rozliczone (szare).