From 2e7d7aba67e7ae4a6721026b237df7ca11743b94 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Fri, 14 Feb 2020 13:12:02 +0100 Subject: [PATCH] Fatturazione bulk contratti e preventivi Fix aggiuntivi per la fatturazione bulk dei DDT. --- locale/catalog.pot | 2 +- locale/en_GB/en_GB.po | 2 +- modules/contratti/bulk.php | 108 ++++++++++++++++++++++++++++++++++++ modules/ddt/bulk.php | 45 ++++++++++----- modules/interventi/bulk.php | 2 +- modules/preventivi/bulk.php | 108 ++++++++++++++++++++++++++++++++++++ modules/ritenute/add.php | 2 +- 7 files changed, 250 insertions(+), 19 deletions(-) create mode 100644 modules/contratti/bulk.php create mode 100644 modules/preventivi/bulk.php diff --git a/locale/catalog.pot b/locale/catalog.pot index 07dde23bf..62b6e5601 100644 --- a/locale/catalog.pot +++ b/locale/catalog.pot @@ -4432,7 +4432,7 @@ msgid "Ddt eliminati!" msgstr "" #: modules/ddt/bulk.php:139 -msgid "Vuoi davvero creare una fattura per questi interventi?" +msgid "Vuoi davvero fatturare questi interventi?" msgstr "" #: modules/ddt/edit.php:59 modules/fatture/edit.php:72 diff --git a/locale/en_GB/en_GB.po b/locale/en_GB/en_GB.po index eabbdb50e..d5d2bd10e 100644 --- a/locale/en_GB/en_GB.po +++ b/locale/en_GB/en_GB.po @@ -4511,7 +4511,7 @@ msgid "Ddt eliminati!" msgstr "Ddt eliminated!" #: modules/ddt/bulk.php:139 -msgid "Vuoi davvero creare una fattura per questi interventi?" +msgid "Vuoi davvero fatturare questi interventi?" msgstr "Do you really want create a invoice for this interventions?" #: modules/ddt/edit.php:59 modules/fatture/edit.php:108 diff --git a/modules/contratti/bulk.php b/modules/contratti/bulk.php new file mode 100644 index 000000000..315410528 --- /dev/null +++ b/modules/contratti/bulk.php @@ -0,0 +1,108 @@ +first(); + + $stato_documenti_accodabili = Stato::where('descrizione', 'Bozza')->first(); + $accodare = post('accodare'); + + $data = date('Y-m-d'); + $id_segment = post('id_segment'); + + // Lettura righe selezionate + foreach ($id_records as $id) { + $documento_import = Contratto::find($id); + $anagrafica = $documento_import->anagrafica; + $id_anagrafica = $anagrafica->id; + + // Proseguo solo se i documenti scelti sono fatturabili + $righe = $documento_import->getRighe(); + if (!empty($righe)) { + ++$numero_totale; + + // Ricerca fattura per anagrafica tra le registrate + $fattura = $documenti->first(function ($item, $key) use ($id_anagrafica) { + return $item->anagrafica->id == $id_anagrafica; + }); + + // Ricerca fattura per anagrafica se l'impostazione di accodamento è selezionata + if (!empty($accodare) && empty($fattura)) { + $fattura = Fattura::where('idanagrafica', $id_anagrafica) + ->where('idstatodocumento', $stato_documenti_accodabili->id) + ->where('idtipodocumento', $tipo_documento->id) + ->first(); + + if (!empty($fattura)) { + $documenti->push($fattura); + } + } + + // Creazione fattura per anagrafica + if (empty($fattura)) { + $fattura = Fattura::build($anagrafica, $tipo_documento, $data, $id_segment); + $documenti->push($fattura); + } + + // Inserimento righe + foreach ($righe as $riga) { + $qta = $riga->qta_rimanente; + + if ($qta > 0) { + $copia = $riga->copiaIn($fattura, $qta); + + // Aggiornamento seriali dalla riga dell'ordine + if ($copia->isArticolo()) { + $copia->movimenta($copia->qta); + + $copia->serials = $riga->serials; + } + } + } + } + } + + if ($numero_totale > 0) { + flash()->info(tr('_NUM_ contratto fatturati!', [ + '_NUM_' => $numero_totale, + ])); + } else { + flash()->warning(tr('Nessun contratto fatturato!')); + } + break; +} + +$operations['crea_fattura'] = [ + 'text' => tr('Fattura documenti'), + 'data' => [ + 'title' => tr('Vuoi davvero fatturare questi documenti?'), + 'msg' => '{[ "type": "checkbox", "placeholder": "'.tr('Aggiungere alle fatture esistenti non ancora emesse?').'", "name": "accodare" ]}
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}', + 'button' => tr('Procedi'), + 'class' => 'btn btn-lg btn-warning', + 'blank' => false, + ], +]; + +return $operations; diff --git a/modules/ddt/bulk.php b/modules/ddt/bulk.php index 82eac450c..050d1f08e 100644 --- a/modules/ddt/bulk.php +++ b/modules/ddt/bulk.php @@ -4,18 +4,19 @@ include_once __DIR__.'/../../core.php'; use Modules\DDT\DDT; use Modules\Fatture\Fattura; +use Modules\Fatture\Stato; use Modules\Fatture\Tipo; if ($module['name'] == 'Ddt di vendita') { $dir = 'entrata'; - $module_name = 'Fatture di vendita'; + $module_fatture = 'Fatture di vendita'; } else { $dir = 'uscita'; - $module_name = 'Fatture di acquisto'; + $module_fatture = 'Fatture di acquisto'; } // Segmenti -$id_fatture = Modules::get($module_name)['id']; +$id_fatture = Modules::get($module_fatture)['id']; if (!isset($_SESSION['module_'.$id_fatture]['id_segment'])) { $segments = Modules::getSegments($id_fatture); $_SESSION['module_'.$id_fatture]['id_segment'] = isset($segments[0]['id']) ? $segments[0]['id'] : null; @@ -25,17 +26,19 @@ $id_segment = $_SESSION['module_'.$id_fatture]['id_segment']; switch (post('op')) { case 'crea_fattura': $documenti = collect(); - $id_documento_cliente = []; $numero_totale = 0; // Informazioni della fattura if ($dir == 'entrata') { - $tipo_documento = 'Fattura immediata di vendita'; + $descrizione_tipo = 'Fattura immediata di vendita'; } else { - $tipo_documento = 'Fattura immediata di acquisto'; + $descrizione_tipo = 'Fattura immediata di acquisto'; } - $tipo_documento = Tipo::where('descrizione', $tipo_documento)->first(); + $tipo_documento = Tipo::where('descrizione', $descrizione_tipo)->first(); + + $stato_documenti_accodabili = Stato::where('descrizione', 'Bozza')->first(); + $accodare = post('accodare'); $data = date('Y-m-d'); $id_segment = post('id_segment'); @@ -51,10 +54,24 @@ switch (post('op')) { if (!empty($righe)) { ++$numero_totale; - // Se non c'è già una fattura appena creata per questo cliente, creo una fattura nuova + // Ricerca fattura per anagrafica tra le registrate $fattura = $documenti->first(function ($item, $key) use ($id_anagrafica) { return $item->anagrafica->id == $id_anagrafica; }); + + // Ricerca fattura per anagrafica se l'impostazione di accodamento è selezionata + if (!empty($accodare) && empty($fattura)) { + $fattura = Fattura::where('idanagrafica', $id_anagrafica) + ->where('idstatodocumento', $stato_documenti_accodabili->id) + ->where('idtipodocumento', $tipo_documento->id) + ->first(); + + if (!empty($fattura)) { + $documenti->push($fattura); + } + } + + // Creazione fattura per anagrafica if (empty($fattura)) { $fattura = Fattura::build($anagrafica, $tipo_documento, $data, $id_segment); $documenti->push($fattura); @@ -62,7 +79,7 @@ switch (post('op')) { // Inserimento righe foreach ($righe as $riga) { - $qta = $riga['qta'] - $riga['qta_evasa']; + $qta = $riga->qta_rimanente; if ($qta > 0) { $copia = $riga->copiaIn($fattura, $qta); @@ -83,11 +100,9 @@ switch (post('op')) { } else { flash()->warning(tr('Nessun ddt fatturato!')); } - break; case 'delete-bulk': - foreach ($id_records as $id) { $dbo->query('DELETE FROM dt_ddt WHERE id = '.prepare($id).Modules::getAdditionalsQuery($id_module)); $dbo->query('DELETE FROM dt_righe_ddt WHERE idddt='.prepare($id).Modules::getAdditionalsQuery($id_module)); @@ -95,7 +110,6 @@ switch (post('op')) { } flash()->info(tr('Ddt eliminati!')); - break; } @@ -106,10 +120,11 @@ if (App::debug()) { } $operations['crea_fattura'] = [ - 'text' => tr('Crea fattura'), + 'text' => tr('Fattura documenti'), 'data' => [ - 'title' => tr('Vuoi davvero creare una fattura per questi interventi?'), - 'msg' => '
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}', + 'title' => tr('Vuoi davvero fatturare questi documenti?'), + 'msg' => '
{[ "type": "checkbox", "placeholder": "'.tr('Aggiungere alle fatture esistenti non ancora emesse?').'", "name": "accodare" ]} +
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}', 'button' => tr('Procedi'), 'class' => 'btn btn-lg btn-warning', 'blank' => false, diff --git a/modules/interventi/bulk.php b/modules/interventi/bulk.php index ac0833590..50213ea92 100644 --- a/modules/interventi/bulk.php +++ b/modules/interventi/bulk.php @@ -128,7 +128,7 @@ return [ ], 'crea_fattura' => [ - 'text' => tr('Crea fattura'), + 'text' => tr('Fattura documenti'), 'data' => [ 'title' => tr('Vuoi davvero generare le fatture per questi interventi?'), 'msg' => tr('Verranno fatturati gli interventi completati non inseriti in preventivi e contratti').'.
{[ "type": "checkbox", "placeholder": "'.tr('Aggiungere alle fatture esistenti non ancora emesse?').'", "name": "accodare" ]} diff --git a/modules/preventivi/bulk.php b/modules/preventivi/bulk.php new file mode 100644 index 000000000..93dd51643 --- /dev/null +++ b/modules/preventivi/bulk.php @@ -0,0 +1,108 @@ +first(); + + $stato_documenti_accodabili = Stato::where('descrizione', 'Bozza')->first(); + $accodare = post('accodare'); + + $data = date('Y-m-d'); + $id_segment = post('id_segment'); + + // Lettura righe selezionate + foreach ($id_records as $id) { + $documento_import = Preventivo::find($id); + $anagrafica = $documento_import->anagrafica; + $id_anagrafica = $anagrafica->id; + + // Proseguo solo se i documenti scelti sono fatturabili + $righe = $documento_import->getRighe(); + if (!empty($righe)) { + ++$numero_totale; + + // Ricerca fattura per anagrafica tra le registrate + $fattura = $documenti->first(function ($item, $key) use ($id_anagrafica) { + return $item->anagrafica->id == $id_anagrafica; + }); + + // Ricerca fattura per anagrafica se l'impostazione di accodamento è selezionata + if (!empty($accodare) && empty($fattura)) { + $fattura = Fattura::where('idanagrafica', $id_anagrafica) + ->where('idstatodocumento', $stato_documenti_accodabili->id) + ->where('idtipodocumento', $tipo_documento->id) + ->first(); + + if (!empty($fattura)) { + $documenti->push($fattura); + } + } + + // Creazione fattura per anagrafica + if (empty($fattura)) { + $fattura = Fattura::build($anagrafica, $tipo_documento, $data, $id_segment); + $documenti->push($fattura); + } + + // Inserimento righe + foreach ($righe as $riga) { + $qta = $riga->qta_rimanente; + + if ($qta > 0) { + $copia = $riga->copiaIn($fattura, $qta); + + // Aggiornamento seriali dalla riga dell'ordine + if ($copia->isArticolo()) { + $copia->movimenta($copia->qta); + + $copia->serials = $riga->serials; + } + } + } + } + } + + if ($numero_totale > 0) { + flash()->info(tr('_NUM_ preventivi fatturati!', [ + '_NUM_' => $numero_totale, + ])); + } else { + flash()->warning(tr('Nessun preventivi fatturato!')); + } + break; +} + +$operations['crea_fattura'] = [ + 'text' => tr('Fattura documenti'), + 'data' => [ + 'title' => tr('Vuoi davvero fatturare questi documenti?'), + 'msg' => '{[ "type": "checkbox", "placeholder": "'.tr('Aggiungere alle fatture esistenti non ancora emesse?').'", "name": "accodare" ]}
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module=\''.$id_fatture.'\' AND is_fiscale = 1 ORDER BY name", "value": "'.$id_segment.'" ]}', + 'button' => tr('Procedi'), + 'class' => 'btn btn-lg btn-warning', + 'blank' => false, + ], +]; + +return $operations; diff --git a/modules/ritenute/add.php b/modules/ritenute/add.php index c968f0bce..81e3a8388 100644 --- a/modules/ritenute/add.php +++ b/modules/ritenute/add.php @@ -14,7 +14,7 @@ include_once __DIR__.'/../../core.php';
- {[ "type": "number", "label": "", "name": "percentuale", "min-value": "1", "max-value": "100", "icon-after": "", "value": "100" ]} + {[ "type": "number", "label": "", "name": "percentuale", "min-value": "1", "max-value": "100", "icon-after": "", "value": "100" ]}