|
25 | 25 | */ |
26 | 26 | use Common\Components\Accounting; |
27 | 27 | use Intervention\Image\ImageManager; |
| 28 | +use Modules\Anagrafiche\Anagrafica; |
| 29 | +use Modules\Banche\Banca; |
28 | 30 | use Modules\Contratti\Contratto; |
29 | 31 | use Modules\DDT\DDT; |
30 | 32 | use Modules\Fatture\Fattura; |
@@ -481,3 +483,139 @@ function getImageManager() |
481 | 483 | { |
482 | 484 | return extension_loaded('gd') ? ImageManager::gd() : ImageManager::imagick(); |
483 | 485 | } |
| 486 | + |
| 487 | +/** |
| 488 | + * Determina la banca dell'azienda da utilizzare per il documento. |
| 489 | + * |
| 490 | + * @param \Modules\Anagrafiche\Anagrafica $azienda Anagrafica dell'azienda |
| 491 | + * @param int $id_pagamento ID del tipo di pagamento |
| 492 | + * @param string $conto Tipo di conto (vendite/acquisti) |
| 493 | + * @param string $direzione Direzione del documento (entrata/uscita) |
| 494 | + * @param \Modules\Anagrafiche\Anagrafica $anagrafica_controparte Anagrafica della controparte |
| 495 | + * |
| 496 | + * @return int|null ID della banca selezionata |
| 497 | + */ |
| 498 | +function getBancaAzienda($azienda, $id_pagamento, $conto, $direzione, $anagrafica_controparte) |
| 499 | +{ |
| 500 | + $database = database(); |
| 501 | + |
| 502 | + // Per i documenti di vendita, priorità alla banca dell'azienda |
| 503 | + // Per i documenti di acquisto, priorità alla banca del fornitore |
| 504 | + $anagrafica_principale = ($direzione == 'entrata') ? $azienda : $anagrafica_controparte; |
| 505 | + |
| 506 | + // Pulizia preventiva dei riferimenti a banche inesistenti nell'anagrafica |
| 507 | + cleanInvalidBankReferences($azienda); |
| 508 | + cleanInvalidBankReferences($anagrafica_controparte); |
| 509 | + |
| 510 | + // Per i documenti di vendita, verifica prima la banca predefinita per accrediti del cliente |
| 511 | + if ($direzione == 'entrata' && !empty($anagrafica_controparte->idbanca_vendite)) { |
| 512 | + $id_banca = $anagrafica_controparte->idbanca_vendite; |
| 513 | + |
| 514 | + // Verifica che la banca esista effettivamente |
| 515 | + $banca_esistente = Banca::find($id_banca); |
| 516 | + if (!$banca_esistente || $banca_esistente->deleted_at) { |
| 517 | + $id_banca = null; |
| 518 | + } |
| 519 | + |
| 520 | + // Se la banca del cliente è valida, la restituisce |
| 521 | + if ($id_banca) { |
| 522 | + return $id_banca; |
| 523 | + } |
| 524 | + } |
| 525 | + |
| 526 | + // 1. Banca predefinita dell'anagrafica principale per il tipo di operazione |
| 527 | + $id_banca = $anagrafica_principale->{"idbanca_{$conto}"}; |
| 528 | + |
| 529 | + // Verifica che la banca esista effettivamente |
| 530 | + if ($id_banca) { |
| 531 | + $banca_esistente = Banca::find($id_banca); |
| 532 | + if (!$banca_esistente || $banca_esistente->deleted_at) { |
| 533 | + $id_banca = null; |
| 534 | + } |
| 535 | + } |
| 536 | + |
| 537 | + // 2. Banca dell'azienda con conto corrispondente al tipo di pagamento (predefinita) |
| 538 | + if (empty($id_banca)) { |
| 539 | + $id_banca = getBancaByPagamento($database, $azienda->id, $id_pagamento, $conto, true); |
| 540 | + } |
| 541 | + |
| 542 | + // 3. Banca dell'azienda con conto corrispondente al tipo di pagamento (qualsiasi) |
| 543 | + if (empty($id_banca)) { |
| 544 | + $id_banca = getBancaByPagamento($database, $azienda->id, $id_pagamento, $conto, false); |
| 545 | + } |
| 546 | + |
| 547 | + // 4. Fallback: banca predefinita dell'azienda |
| 548 | + if (empty($id_banca)) { |
| 549 | + $banca_predefinita = Banca::where('id_anagrafica', $azienda->id) |
| 550 | + ->where('predefined', 1) |
| 551 | + ->whereNull('deleted_at') |
| 552 | + ->first(); |
| 553 | + $id_banca = $banca_predefinita?->id; |
| 554 | + } |
| 555 | + |
| 556 | + return $id_banca; |
| 557 | +} |
| 558 | + |
| 559 | +/** |
| 560 | + * Cerca una banca dell'azienda associata al tipo di pagamento. |
| 561 | + * |
| 562 | + * @param object $database Database object |
| 563 | + * @param int $id_anagrafica ID dell'anagrafica |
| 564 | + * @param int $id_pagamento ID del tipo di pagamento |
| 565 | + * @param string $conto Tipo di conto (vendite/acquisti) |
| 566 | + * @param bool $solo_predefinita Se true, cerca solo banche predefinite |
| 567 | + * |
| 568 | + * @return int|null ID della banca trovata |
| 569 | + */ |
| 570 | +function getBancaByPagamento($database, $id_anagrafica, $id_pagamento, $conto, $solo_predefinita) |
| 571 | +{ |
| 572 | + $where_predefined = $solo_predefinita ? 'AND `predefined`=1' : ''; |
| 573 | + |
| 574 | + $query = "SELECT `id` FROM `co_banche` |
| 575 | + WHERE `deleted_at` IS NULL |
| 576 | + {$where_predefined} |
| 577 | + AND `id_pianodeiconti3` = (SELECT idconto_{$conto} FROM `co_pagamenti` WHERE `id` = :id_pagamento) |
| 578 | + AND `id_anagrafica` = :id_anagrafica"; |
| 579 | + |
| 580 | + $result = $database->fetchOne($query, [ |
| 581 | + ':id_pagamento' => $id_pagamento, |
| 582 | + ':id_anagrafica' => $id_anagrafica, |
| 583 | + ]); |
| 584 | + |
| 585 | + return $result['id'] ?? null; |
| 586 | +} |
| 587 | + |
| 588 | +/** |
| 589 | + * Pulisce i riferimenti a banche inesistenti o eliminate dall'anagrafica. |
| 590 | + * |
| 591 | + * @param \Modules\Anagrafiche\Anagrafica $anagrafica Anagrafica da pulire |
| 592 | + * |
| 593 | + * @return void |
| 594 | + */ |
| 595 | +function cleanInvalidBankReferences($anagrafica) |
| 596 | +{ |
| 597 | + $changed = false; |
| 598 | + |
| 599 | + // Verifica idbanca_vendite |
| 600 | + if ($anagrafica->idbanca_vendite) { |
| 601 | + $banca = Banca::find($anagrafica->idbanca_vendite); |
| 602 | + if (!$banca || $banca->deleted_at) { |
| 603 | + $anagrafica->idbanca_vendite = null; |
| 604 | + $changed = true; |
| 605 | + } |
| 606 | + } |
| 607 | + |
| 608 | + // Verifica idbanca_acquisti |
| 609 | + if ($anagrafica->idbanca_acquisti) { |
| 610 | + $banca = Banca::find($anagrafica->idbanca_acquisti); |
| 611 | + if (!$banca || $banca->deleted_at) { |
| 612 | + $anagrafica->idbanca_acquisti = null; |
| 613 | + $changed = true; |
| 614 | + } |
| 615 | + } |
| 616 | + |
| 617 | + // Salva le modifiche se necessario |
| 618 | + if ($changed) { |
| 619 | + $anagrafica->save(); |
| 620 | + } |
| 621 | +} |
0 commit comments