2020-02-14 13:12:02 +01:00
< ? php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager : il software gestionale open source per l ' assistenza tecnica e la fatturazione
2021-01-20 15:08:51 +01:00
* Copyright ( C ) DevCode s . r . l .
2020-09-07 15:04:06 +02:00
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*/
2020-02-14 13:12:02 +01:00
include_once __DIR__ . '/../../core.php' ;
2021-12-21 15:51:40 +01:00
use Carbon\Carbon ;
2021-07-07 07:57:10 +02:00
use Modules\Articoli\Articolo as ArticoloOriginale ;
2020-02-14 13:12:02 +01:00
use Modules\Contratti\Contratto ;
2021-12-21 15:51:40 +01:00
use Modules\Contratti\Stato as StatoContratto ;
2020-02-14 13:12:02 +01:00
use Modules\Fatture\Fattura ;
use Modules\Fatture\Stato ;
use Modules\Fatture\Tipo ;
2021-12-21 15:51:40 +01:00
use Plugins\PianificazioneInterventi\Promemoria ;
2020-02-14 13:12:02 +01:00
$module_fatture = 'Fatture di vendita' ;
// Segmenti
$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 ;
}
$id_segment = $_SESSION [ 'module_' . $id_fatture ][ 'id_segment' ];
2021-04-28 15:29:47 +02:00
$idconto = setting ( 'Conto predefinito fatture di vendita' );
2021-09-22 11:56:38 +02:00
$idtipodocumento = $dbo -> selectOne ( 'co_tipidocumento' , [ 'id' ], [
'predefined' => 1 ,
'dir' => 'entrata' ,
])[ 'id' ];
2022-01-21 12:16:22 +01:00
$stati_completati = $dbo -> fetchOne ( 'SELECT GROUP_CONCAT(`descrizione` SEPARATOR ", ") AS stati_completati FROM `co_staticontratti` WHERE `is_completato` = 1' )[ 'stati_completati' ];
2021-09-22 11:56:38 +02:00
2020-02-14 13:12:02 +01:00
switch ( post ( 'op' )) {
case 'crea_fattura' :
$documenti = collect ();
$numero_totale = 0 ;
// Informazioni della fattura
2021-09-22 11:56:38 +02:00
$tipo_documento = Tipo :: where ( 'id' , post ( 'idtipodocumento' )) -> first ();
2020-02-14 13:12:02 +01:00
$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 ;
2021-05-05 17:57:55 +02:00
if ( ! $documento_import -> stato -> is_fatturabile ) {
2020-03-02 10:15:23 +01:00
break ;
}
2020-02-14 13:12:02 +01:00
// 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 );
2021-04-28 15:14:52 +02:00
//Fix per idconto righe fattura
$articolo = ArticoloOriginale :: find ( $copia -> idarticolo );
$copia -> id_conto = ( $articolo -> idconto_vendita ? $articolo -> idconto_vendita : $idconto );
2020-02-14 13:12:02 +01:00
// Aggiornamento seriali dalla riga dell'ordine
if ( $copia -> isArticolo ()) {
$copia -> serials = $riga -> serials ;
}
2021-09-02 16:27:38 +02:00
2021-09-01 11:56:12 +02:00
$copia -> save ();
2020-02-14 13:12:02 +01:00
}
}
}
}
if ( $numero_totale > 0 ) {
2021-12-21 15:51:40 +01:00
flash () -> info ( tr ( '_NUM_ contratti fatturati!' , [
'_NUM_' => $numero_totale ,
]));
} else {
flash () -> warning ( tr ( 'Nessun contratto fatturato!' ));
}
break ;
case 'renew_contratto' :
$numero_totale = 0 ;
// Lettura righe selezionate
foreach ( $id_records as $id ) {
$contratto = Contratto :: find ( $id );
2022-01-21 12:16:22 +01:00
$rinnova = ! empty ( $contratto -> data_accettazione ) && ! empty ( $contratto -> data_conclusione ) && $contratto -> data_accettazione != '0000-00-00' && $contratto -> data_conclusione != '0000-00-00' && $contratto -> stato -> is_completato && $contratto -> rinnovabile ;
2021-12-21 15:51:40 +01:00
if ( $rinnova ) {
$diff = $contratto -> data_conclusione -> diffAsCarbonInterval ( $contratto -> data_accettazione );
$new_contratto = $contratto -> replicate ();
2022-11-28 09:27:25 +01:00
$new_contratto -> numero = Contratto :: getNextNumero ( $contratto -> data_conclusione -> copy () -> addDays ( 1 ), $contratto -> id_segment );
2021-12-21 15:51:40 +01:00
$new_contratto -> idcontratto_prev = $contratto -> id ;
$new_contratto -> data_accettazione = $contratto -> data_conclusione -> copy () -> addDays ( 1 );
$new_contratto -> data_conclusione = $new_contratto -> data_accettazione -> copy () -> add ( $diff );
$new_contratto -> data_bozza = Carbon :: now ();
$stato = StatoContratto :: where ( 'descrizione' , '=' , 'Bozza' ) -> first ();
$new_contratto -> stato () -> associate ( $stato );
$new_contratto -> save ();
$new_idcontratto = $new_contratto -> id ;
// Correzioni dei prezzi per gli interventi
$dbo -> query ( 'DELETE FROM co_contratti_tipiintervento WHERE idcontratto=' . prepare ( $new_idcontratto ));
$dbo -> query ( 'INSERT INTO co_contratti_tipiintervento(idcontratto, idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico) SELECT ' . prepare ( $new_idcontratto ) . ', idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico FROM co_contratti_tipiintervento AS z WHERE idcontratto=' . prepare ( $contratto -> id ));
$new_contratto -> save ();
// Replico le righe del contratto
$righe = $contratto -> getRighe ();
foreach ( $righe as $riga ) {
$new_riga = $riga -> replicate ();
$new_riga -> qta_evasa = 0 ;
$new_riga -> idcontratto = $new_contratto -> id ;
$new_riga -> save ();
}
// Replicazione degli impianti
$impianti = $dbo -> fetchArray ( 'SELECT idimpianto FROM my_impianti_contratti WHERE idcontratto=' . prepare ( $contratto -> id ));
$dbo -> sync ( 'my_impianti_contratti' , [ 'idcontratto' => $new_idcontratto ], [ 'idimpianto' => array_column ( $impianti , 'idimpianto' )]);
// Replicazione dei promemoria
$promemoria = $dbo -> fetchArray ( 'SELECT * FROM co_promemoria WHERE idcontratto=' . prepare ( $contratto -> id ));
$giorni = $contratto -> data_conclusione -> diffInDays ( $contratto -> data_accettazione );
foreach ( $promemoria as $p ) {
$dbo -> insert ( 'co_promemoria' , [
'idcontratto' => $new_idcontratto ,
'data_richiesta' => date ( 'Y-m-d' , strtotime ( $p [ 'data_richiesta' ] . ' +' . $giorni . ' day' )),
'idtipointervento' => $p [ 'idtipointervento' ],
'richiesta' => $p [ 'richiesta' ],
'idimpianti' => $p [ 'idimpianti' ],
]);
$id_promemoria = $dbo -> lastInsertedID ();
$promemoria = Promemoria :: find ( $p [ 'id' ]);
$righe = $promemoria -> getRighe ();
foreach ( $righe as $riga ) {
$new_riga = $riga -> replicate ();
$new_riga -> id_promemoria = $id_promemoria ;
$new_riga -> save ();
}
// Copia degli allegati
$allegati = $promemoria -> uploads ();
foreach ( $allegati as $allegato ) {
$allegato -> copia ([
'id_module' => $id_module ,
'id_plugin' => Plugins :: get ( 'Pianificazione interventi' )[ 'id' ],
'id_record' => $id_promemoria ,
]);
}
}
// Cambio stato precedente contratto in concluso (non più pianificabile)
2022-01-21 12:16:22 +01:00
$dbo -> query ( 'UPDATE `co_contratti` SET `rinnovabile`= 0, `idstato`= (SELECT id FROM co_staticontratti WHERE descrizione = \'Concluso\') WHERE `id` = ' . prepare ( $contratto -> id ));
2021-12-21 15:51:40 +01:00
$numero_totale ++ ;
}
}
if ( $numero_totale > 0 ) {
flash () -> info ( tr ( '_NUM_ contratti rinnovati!' , [
2020-02-14 13:12:02 +01:00
'_NUM_' => $numero_totale ,
]));
} else {
2022-07-15 11:15:21 +02:00
flash () -> warning ( tr ( 'Nessun contratto rinnovato!' ));
2020-02-14 13:12:02 +01:00
}
break ;
}
$operations [ 'crea_fattura' ] = [
2020-11-12 17:11:09 +01:00
'text' => '<span><i class="fa fa-file-code-o"></i> ' . tr ( 'Fattura _TYPE_' , [ '_TYPE_' => strtolower ( $module [ 'name' ])]),
2020-02-14 13:12:02 +01:00
'data' => [
2020-11-12 17:11:09 +01:00
'title' => tr ( 'Fatturare i _TYPE_ selezionati?' , [ '_TYPE_' => strtolower ( $module [ 'name' ])]),
2021-09-22 11:56:38 +02:00
'msg' => '{[ "type": "checkbox", "label": "<small>' . tr ( 'Aggiungere alle fatture di vendita non ancora emesse?' ) . '</small>", "placeholder": "' . tr ( 'Aggiungere alle fatture esistenti non ancora emesse?' ) . ' " , " name " : " accodare " ]}<br>
2023-03-01 11:14:35 +01:00
{[ " type " : " select " , " label " : " '.tr('Sezionale').' " , " name " : " id_segment " , " required " : 1 , " ajax-source " : " segmenti " , " select-options " : '.json_encode(["id_module" => $id_fatture, ' is_sezionale ' => 1]).' , " value " : " '. $id_segment .' " , " select-options-escape " : true ]} < br >
2021-09-22 11:56:38 +02:00
{[ " type " : " select " , " label " : " '.tr('Tipo documento').' " , " name " : " idtipodocumento " , " required " : 1 , " values " : " query=SELECT id, CONCAT(codice_tipo_documento_fe, \ ' - \ ', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir = \ 'entrata \ ' ORDER BY codice_tipo_documento_fe " , " value " : " '. $idtipodocumento .' " ]} ' ,
2020-02-14 13:12:02 +01:00
'button' => tr ( 'Procedi' ),
'class' => 'btn btn-lg btn-warning' ,
'blank' => false ,
],
];
2021-12-21 15:51:40 +01:00
$operations [ 'renew_contratto' ] = [
'text' => '<span><i class="fa fa-refresh"></i> ' . tr ( 'Rinnova contratti' ) . '</span>' ,
'data' => [
'title' => tr ( 'Rinnovare i contratti selezionati?' ) . '</span>' ,
2022-07-15 11:15:21 +02:00
'msg' => '' . tr ( 'Un contratto è rinnovabile se presenta una data di accettazione e conclusione, se il rinnovo è abilitato dal plugin Rinnovi e se si trova in uno di questi stati: _STATE_LIST_' , [ '_STATE_LIST_' => $stati_completati ]),
2021-12-21 15:51:40 +01:00
'button' => tr ( 'Procedi' ),
'class' => 'btn btn-lg btn-warning' ,
'blank' => false ,
],
];
2020-02-14 13:12:02 +01:00
return $operations ;