2020-02-17 18:43:49 +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-02-18 18:53:28 +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-17 18:43:49 +01:00
2021-02-18 09:57:35 +01:00
use Modules\Articoli\Articolo as ArticoloOriginale ;
2021-02-18 18:48:44 +01:00
use Modules\Contratti\Components\Articolo ;
use Modules\Contratti\Components\Riga ;
2020-02-17 19:11:40 +01:00
use Modules\Contratti\Contratto ;
2020-02-17 18:43:49 +01:00
use Modules\Fatture\Fattura ;
use Modules\Fatture\Tipo ;
2020-02-17 19:11:40 +01:00
use Plugins\PianificazioneFatturazione\Pianificazione ;
2020-02-17 18:43:49 +01:00
include_once __DIR__ . '/../../core.php' ;
2021-02-18 09:57:35 +01:00
include_once __DIR__ . '/../modutil.php' ;
2020-02-17 18:43:49 +01:00
$operazione = filter ( 'op' );
// Pianificazione fatturazione
switch ( $operazione ) {
case 'add' :
$contratto = Contratto :: find ( $id_record );
2021-02-18 18:48:44 +01:00
if ( post ( 'scadenza' ) == 'Mensile' ) {
2021-02-18 09:57:35 +01:00
$timeing = '+1 month' ;
}
2021-02-18 18:48:44 +01:00
if ( post ( 'scadenza' ) == 'Bimestrale' ) {
2021-02-18 09:57:35 +01:00
$timeing = '+2 month' ;
}
2021-02-18 18:48:44 +01:00
if ( post ( 'scadenza' ) == 'Trimestrale' ) {
2021-02-18 09:57:35 +01:00
$timeing = '+3 month' ;
}
2021-02-18 18:48:44 +01:00
if ( post ( 'scadenza' ) == 'Quadrimestrale' ) {
2021-02-18 09:57:35 +01:00
$timeing = '+4 month' ;
}
2021-02-18 18:48:44 +01:00
if ( post ( 'scadenza' ) == 'Semestrale' ) {
2021-02-18 09:57:35 +01:00
$timeing = '+6 month' ;
}
2021-02-18 18:48:44 +01:00
if ( post ( 'scadenza' ) == 'Annuale' ) {
2021-02-18 09:57:35 +01:00
$timeing = '+12 month' ;
}
2020-02-17 18:43:49 +01:00
$selezioni = collect ( post ( 'selezione_periodo' ));
$periodi = post ( 'periodo' );
$numero_fatture = 0 ;
2021-02-18 09:57:35 +01:00
$date_pianificazioni = [];
$pianificazioni = [];
2020-02-17 18:43:49 +01:00
foreach ( $selezioni as $key => $selezione ) {
2021-04-02 09:58:11 +02:00
$date = new DateTime ( $periodi [ $key ]);
if ( post ( 'cadenza_fatturazione' ) == 'Inizio' ) {
$date -> modify ( 'first day of this month' );
} elseif ( post ( 'cadenza_fatturazione' ) == 'Giorno' && ! empty ( post ( 'giorno_fisso' ))) {
$date -> modify ( 'last day of this month' );
$last_day = $date -> format ( 'd' );
$day = post ( 'giorno_fisso' ) > $last_day ? $last_day : post ( 'giorno_fisso' );
// Correzione data
$date -> setDate ( $date -> format ( 'Y' ), $date -> format ( 'm' ), $day );
2021-02-18 09:57:35 +01:00
}
// Comversione della data in stringa standard
$data_scadenza = $date -> format ( 'Y-m-d' );
2020-02-17 18:43:49 +01:00
++ $numero_fatture ;
// Creazione pianificazione
2021-02-18 09:57:35 +01:00
$pianificazione = Pianificazione :: build ( $contratto , $data_scadenza );
$date_pianificazioni [] = $data_scadenza ;
$pianificazioni [ $numero_fatture ] = $pianificazione -> id ;
2020-02-17 18:43:49 +01:00
}
if ( $numero_fatture > 0 ) {
$righe_contratto = $contratto -> getRighe ();
2021-02-18 09:57:35 +01:00
$subtotale = [];
2020-02-17 18:43:49 +01:00
// Creazione nuove righe
$qta = post ( 'qta' );
2021-02-18 18:48:44 +01:00
foreach ( $righe_contratto as $r ) {
2021-02-18 09:57:35 +01:00
$qta_evasa = $r -> qta_evasa ;
$data_scadenza = '' ;
$inizio = $date_pianificazioni [ 0 ];
2021-02-18 18:48:44 +01:00
$fine = date ( 'Y-m-d' , strtotime ( $inizio . ' -1 days' ));
$fine = date ( 'Y-m-d' , strtotime ( $fine . ' ' . $timeing ));
2020-02-17 19:11:40 +01:00
for ( $rata = 1 ; $rata <= $numero_fatture ; ++ $rata ) {
2021-02-18 18:48:44 +01:00
if ( $qta_evasa < $r -> qta ) {
$qta_riga = ( $qta [ $r -> id ] <= ( $r -> qta - $qta_evasa ) ? $qta [ $r -> id ] : ( $r -> qta - $qta_evasa ));
2021-02-18 09:57:35 +01:00
$descrizione = post ( 'descrizione' )[ $r -> id ];
$descrizione = variables ( $descrizione , $inizio , $fine )[ 'descrizione' ];
$inizio = $fine ;
2021-02-18 18:48:44 +01:00
$fine = date ( 'Y-m-d' , strtotime ( $timeing , strtotime ( $inizio )));
$inizio = date ( 'Y-m-d' , strtotime ( $inizio . ' +1 days' ));
2021-02-18 09:57:35 +01:00
$prezzo_unitario = ( $r -> subtotale / $r -> qta );
2021-02-18 18:48:44 +01:00
if ( ! empty ( $r -> idarticolo )) {
2021-02-18 09:57:35 +01:00
$articolo = ArticoloOriginale :: find ( $r -> idarticolo );
$riga = Articolo :: build ( $contratto , $articolo );
2021-02-18 18:48:44 +01:00
} else {
2021-02-18 09:57:35 +01:00
$riga = Riga :: build ( $contratto );
}
2021-02-18 18:48:44 +01:00
2021-02-18 09:57:35 +01:00
$riga -> descrizione = $descrizione ;
$riga -> setPrezzoUnitario ( $prezzo_unitario , $r -> idiva );
$riga -> qta = $qta_riga ;
$riga -> idpianificazione = $pianificazioni [ $rata ];
$riga -> save ();
$qta_evasa += $qta_riga ;
2021-04-02 09:58:11 +02:00
$pianificata [] = $pianificazioni [ $rata ];
2021-04-12 15:51:27 +02:00
} else {
2021-04-02 09:58:11 +02:00
$non_pianificata [] = $pianificazioni [ $rata ];
2021-02-18 09:57:35 +01:00
}
2020-02-17 18:43:49 +01:00
}
2021-02-18 09:57:35 +01:00
$r -> delete ();
2020-02-17 18:43:49 +01:00
}
2021-04-02 09:58:11 +02:00
$tot_non_pianificati = implode ( ', ' , array_unique ( array_diff ( $non_pianificata , $pianificata )));
2021-04-12 15:51:27 +02:00
if ( ! empty ( $tot_non_pianificati )) {
2021-04-02 09:58:11 +02:00
$dbo -> query ( 'DELETE FROM `co_fatturazione_contratti` WHERE `id` IN (' . $tot_non_pianificati . ')' );
}
2020-02-17 18:43:49 +01:00
}
break ;
2020-02-27 16:19:07 +01:00
2020-02-25 18:36:57 +01:00
case 'reset' :
$dbo -> query ( 'DELETE FROM `co_fatturazione_contratti` WHERE `idcontratto`=' . prepare ( $id_record ));
2021-11-03 14:16:45 +01:00
$dbo -> query ( 'DELETE FROM `co_righe_contratti` WHERE `idpianificazione` IS NOT NULL' );
2020-02-25 18:36:57 +01:00
flash () -> info ( tr ( 'Pianificazione rimossa' ));
break ;
2020-02-17 18:43:49 +01:00
case 'add_fattura' :
2020-04-20 11:23:01 +02:00
$id_rata = post ( 'rata' );
2021-04-20 18:26:22 +02:00
$accodare = post ( 'accodare' );
2020-04-20 11:23:01 +02:00
$pianificazione = Pianificazione :: find ( $id_rata );
$contratto = $pianificazione -> contratto ;
2020-02-17 18:43:49 +01:00
$data = post ( 'data' );
$id_segment = post ( 'id_segment' );
$tipo = Tipo :: find ( post ( 'idtipodocumento' ));
2021-04-20 18:26:22 +02:00
if ( ! empty ( $accodare )) {
$documento = $dbo -> fetchOne ( 'SELECT co_documenti.id FROM co_documenti INNER JOIN co_statidocumento ON co_documenti.idstatodocumento = co_statidocumento.id WHERE co_statidocumento.descrizione = \'Bozza\' AND idanagrafica = ' . prepare ( $contratto -> idanagrafica ));
$id_documento = $documento [ 'id' ];
}
2020-02-17 18:43:49 +01:00
// Creazione fattura
2021-04-20 18:26:22 +02:00
if ( empty ( $id_documento )) {
$fattura = Fattura :: build ( $contratto -> anagrafica , $tipo , $data , $id_segment );
2021-04-26 09:16:16 +02:00
} else {
2021-04-20 18:26:22 +02:00
$fattura = Fattura :: find ( $id_documento );
}
2020-02-17 20:21:18 +01:00
$fattura -> note = post ( 'note' );
$fattura -> save ();
2020-02-17 18:43:49 +01:00
2020-11-13 15:27:07 +01:00
$id_conto = post ( 'id_conto' );
2020-02-17 18:43:49 +01:00
// Copia righe
$righe = $pianificazione -> getRighe ();
foreach ( $righe as $riga ) {
$copia = $riga -> copiaIn ( $fattura , $riga -> qta );
2020-11-13 15:27:07 +01:00
$copia -> id_conto = $id_conto ;
$copia -> save ();
2020-02-17 18:43:49 +01:00
}
// Salvataggio fattura nella pianificazione
$pianificazione -> fattura () -> associate ( $fattura );
$pianificazione -> save ();
break ;
}