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
2024-03-22 15:52:24 +01:00
use Models\Module ;
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 = [];
2022-01-27 15:16:05 +01:00
$pianificata = [];
$non_pianificata = [];
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 ];
2022-01-13 17:57:20 +01:00
$fine = date ( 'Y-m-d' , strtotime ( $inizio . ' ' . $timeing ));
$fine = date ( 'Y-m-d' , strtotime ( $fine . ' -1 days' ));
2023-08-04 14:54:28 +02:00
if ( $cadenza_fatturazione == 'Fine' ) {
$fine = Carbon\Carbon :: parse ( $fine ) -> endOfMonth () -> format ( 'Y-m-d' );
}
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 ];
2021-12-21 10:38:43 +01:00
$descrizione = variables ( $descrizione , $inizio , $fine , $rata , $numero_fatture )[ 'descrizione' ];
2021-02-18 09:57:35 +01:00
$inizio = $fine ;
2021-02-18 18:48:44 +01:00
$inizio = date ( 'Y-m-d' , strtotime ( $inizio . ' +1 days' ));
2021-02-18 09:57:35 +01:00
2022-01-13 17:57:20 +01:00
$fine = date ( 'Y-m-d' , strtotime ( $inizio . ' ' . $timeing ));
$fine = date ( 'Y-m-d' , strtotime ( $fine . ' -1 days' ));
2023-08-04 14:54:28 +02:00
if ( $cadenza_fatturazione == 'Fine' ) {
$fine = Carbon\Carbon :: parse ( $fine ) -> endOfMonth () -> format ( 'Y-m-d' );
2022-11-25 11:54:40 +01:00
}
2023-08-04 14:54:28 +02:00
$prezzo_unitario = setting ( 'Utilizza prezzi di vendita comprensivi di IVA' ) ? ((( $r -> subtotale - $r -> sconto ) + $r -> iva ) / $r -> qta ) : (( $r -> subtotale - $r -> sconto ) / $r -> qta );
2021-02-18 09:57:35 +01:00
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 );
2024-07-01 13:03:31 +02:00
$riga -> original_id = $r -> id ;
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 );
2024-06-20 12:04:51 +02:00
$riga -> costo_unitario = $r -> costo_unitario ;
2024-01-15 15:30:45 +01:00
$riga -> setSconto ( $r -> tipo_sconto == 'PRC' ? $r -> sconto_percentuale : $r -> sconto_unitario , $r -> tipo_sconto );
2021-02-18 09:57:35 +01:00
$riga -> qta = $qta_riga ;
2024-04-08 15:44:33 +02:00
$riga -> setProvvigione ( $r -> provvigione_percentuale ? : $r -> provvigione_unitaria , $r -> tipo_provvigione );
2021-02-18 09:57:35 +01:00
$riga -> idpianificazione = $pianificazioni [ $rata ];
$riga -> save ();
$qta_evasa += $qta_riga ;
2022-03-28 11:26:27 +02:00
$pianificata [] = $pianificazioni [ $rata ];
2021-04-12 15:51:27 +02:00
} else {
2022-03-28 11:26:27 +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 ));
2022-03-28 11:26:27 +02:00
$dbo -> query ( 'UPDATE `co_righe_contratti` SET `idpianificazione`=NULL WHERE `idpianificazione` IS NOT NULL AND `idcontratto`=' . prepare ( $id_record ));
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 )) {
2024-04-18 17:44:05 +02:00
$documento = $dbo -> fetchOne ( 'SELECT `co_documenti`.`id` FROM `co_documenti` INNER JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id` LEFT JOIN `co_statidocumento_lang` ON (`co_statidocumento`.`id` = `co_statidocumento_lang`.`id_record` AND `co_statidocumento_lang`.`id_lang` = ' . prepare ( Models\Locale :: getDefault () -> id ) . ') WHERE `co_statidocumento`.`title` = \'Bozza\' AND `idanagrafica` = ' . prepare ( $contratto -> idanagrafica ));
2021-04-20 18:26:22 +02:00
$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 ();
2022-12-01 16:38:04 +01:00
flash () -> info ( tr ( 'Rata fatturata correttamente!' ));
database () -> commitTransaction ();
2024-06-11 16:58:27 +02:00
redirect ( base_path () . '/controller.php?id_module=' . Module :: where ( 'name' , 'Fatture di vendita' ) -> first () -> id . '&id_record=' . $fattura -> id );
2024-01-15 15:30:45 +01:00
exit ;
2022-11-30 16:58:03 +01:00
case 'add_fattura_multipla' :
$rate = post ( 'rata' );
$data = post ( 'data' );
$accodare = post ( 'accodare' );
$id_segment = post ( 'id_segment' );
$id_tipodocumento = post ( 'idtipodocumento' );
$tipo = Tipo :: find ( $id_tipodocumento );
foreach ( $rate as $i => $rata ) {
$id_rata = $rata ;
2023-08-04 14:54:28 +02:00
2022-11-30 16:58:03 +01:00
$pianificazione = Pianificazione :: find ( $id_rata );
$contratto = $pianificazione -> contratto ;
if ( ! empty ( $accodare )) {
$documento = $dbo -> fetchOne (
2024-04-18 17:44:05 +02:00
'SELECT `co_documenti`.`id` FROM `co_documenti` INNER JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id` LEFT JOIN `co_statidocumento_lang` ON (`co_statidocumento`.`id` = `co_statidocumento_lang`.`id_record` AND `co_statidocumento_lang`.`id_lang` = ' . prepare ( Models\Locale :: getDefault () -> id ) . ') WHERE `co_statidocumento_lang`.`title` = \'Bozza\' AND `idanagrafica` = ' . prepare ( $contratto -> idanagrafica )
2022-11-30 16:58:03 +01:00
);
$id_documento = $documento [ 'id' ];
}
// Creazione fattura
if ( empty ( $id_documento )) {
$fattura = Fattura :: build ( $contratto -> anagrafica , $tipo , $data , $id_segment );
} else {
$fattura = Fattura :: find ( $id_documento );
}
2023-08-04 14:54:28 +02:00
$fattura -> note = '' ;
2022-11-30 16:58:03 +01:00
$fattura -> save ();
$id_conto = post ( 'id_conto' );
// Copia righe
$righe = $pianificazione -> getRighe ();
foreach ( $righe as $riga ) {
$copia = $riga -> copiaIn ( $fattura , $riga -> qta );
$copia -> id_conto = $id_conto ;
$copia -> save ();
}
2023-08-04 14:54:28 +02:00
// Salvataggio fattura nella pianificazione
$pianificazione -> fattura () -> associate ( $fattura );
$pianificazione -> save ();
2022-11-30 16:58:03 +01:00
}
flash () -> info ( tr ( 'Rate fatturate correttamente!' ));
2022-12-01 16:38:04 +01:00
database () -> commitTransaction ();
2024-06-11 16:58:27 +02:00
redirect ( base_path () . '/controller.php?id_module=' . Module :: where ( 'name' , 'Fatture di vendita' ) -> first () -> id );
2024-01-15 15:30:45 +01:00
exit ;
2020-02-17 18:43:49 +01:00
}