BillTechPL / lms-billtech-plugin

Other
6 stars 7 forks source link

Nie działa kasowanie tymczasowych wpłat BillTech Payments #22

Closed interduo closed 5 years ago

interduo commented 5 years ago

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).

interduo commented 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)
interduo commented 5 years ago

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.

michal-kaciuba commented 5 years ago

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.

interduo commented 5 years ago

U mnie się to nie pokazuje na instancji ale cashimport nie usuwa wpłat tymczasowych.

interduo commented 5 years ago

Czy dostarczone przeze mnie informacje są wystarczające do odwzorowania problemu u Ciebie na instancji testowej?

michal-kaciuba commented 5 years ago

To są dwa, nie powiązane problemy. Czy w tabelce billtech_payments jakikolwiek wiersz ma w kolumnie cashid inną wartość niż NULL?

interduo commented 5 years ago

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 |
+------+-----+------------+--------+-------+-----------------+------------------+------------+--------+--------+
michal-kaciuba commented 5 years ago

Spróbuj proszę przetestować rozliczanie tej konkretnej wpłaty. Np. ustawić cdate = 1561269790.

interduo commented 5 years ago

@MKaciuba czy u was na instancji testowej jest odwzorowywalny ten błąd?

michal-kaciuba commented 5 years ago

@MKaciuba czy u was na instancji testowej jest odwzorowywalny ten błąd?

nie.

interduo commented 5 years ago

Spróbuj proszę przetestować rozliczanie tej konkretnej wpłaty. Np. ustawić cdate = 1561269790.

Gdzie mam to cdate ustawić? I jaki test wykonać?

interduo commented 5 years ago

Mam plik importu z banku mogę wyłuskać tą pojedyńczą wpłatę i testować.

michal-kaciuba commented 5 years ago

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.

interduo commented 5 years ago
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)
interduo commented 5 years ago

A wpis tymczasowy w tabeli cash o treści nadal jest.

michal-kaciuba commented 5 years ago

Ok, czy zniknął cash z id 45932?

interduo commented 5 years ago

Ok, czy zniknął cash z id 45932?

Nie

michal-kaciuba commented 5 years ago

Ok czyli problem leży w $LMS->DelBalance($payment['cashid']);

interduo commented 5 years ago

Mi kasowanie z GUI LMS działa a widzę że korzysta z tej samej funkcji.

michal-kaciuba commented 5 years ago

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?

interduo commented 5 years ago

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ą.

michal-kaciuba commented 5 years ago

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.

interduo commented 5 years ago

Już pisałem - z historii operacji działa ponieważ kasujemy wpłaty tymczasowe z tego miejsca.

interduo commented 5 years ago

4634 to id płatności w tabeli billtech a nie płatności tymczasowej w tabeli cash.

Ok zaraz spróbuję to potestować.

interduo commented 5 years ago

Dodanie tego kodu kasuje wpis w tabeli cash.

interduo commented 5 years ago

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)
interduo commented 5 years ago

To nie to?

michal-kaciuba commented 5 years ago

Mógłbyś sprawdzić jaka jest wartość $payment['cashid'] w https://github.com/BillTechPL/lms-billtech-plugin/blob/master/BillTechPaymentsUpdater.php#L75?

interduo commented 5 years ago

4640

michal-kaciuba commented 5 years ago

To nie jest $payment['id']?

interduo commented 5 years ago

To jest ID płatności z tabeli billtech_payments zamiast ID z tabeli cash.

michal-kaciuba commented 5 years ago

Czy na 100% wypisałeś $payment['cashid']?

michal-kaciuba commented 5 years ago

Wypiszesz proszę $payment['cashid'] zamiast $payment['id']?

interduo commented 5 years ago

Nie myślę już. To znak że już muszę kończyć pracę. Jutro to skończymy. Na tą chwilę robię cashimport = false.

interduo commented 5 years ago

46297

interduo commented 5 years ago

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.

michal-kaciuba commented 5 years ago

@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.

interduo commented 5 years ago

@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

michal-kaciuba commented 5 years ago

@interduo potrzebuję trochę więcej informacji. Kiedy pojawiają się nieprawidłowe ID. Co dokładnie oznacza nieprawidłowe?

interduo commented 5 years ago

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.

interduo commented 5 years ago

Np. funkcja GetLastInsertID zwraca ostatnie id z tabeli logmessages zamiast id z tabeli cash.

interduo commented 5 years ago

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.

interduo commented 5 years ago

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.

michal-kaciuba commented 5 years ago

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

interduo commented 5 years ago

Dopisz proszę warunek, żeby kasował tylko wpłaty w których jest w cash.comment = 'BillTech Payments'.

michal-kaciuba commented 5 years ago

To trochę bez sensu. Jeśli id będą prawidłowe to ten warunek nie będzie miał znaczenia.

interduo commented 5 years ago

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.

interduo commented 5 years ago

Dasz radę dodać? Wykonam wtedy test ponownie.

michal-kaciuba commented 5 years ago

Jeśli chcesz, to dodaj sobie na czas testów taki warunek w swoim kodzie.

interduo commented 5 years ago

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ć.