2017-08-04 16:28:16 +02:00
< ? php
include_once __DIR__ . '/../../core.php' ;
2019-11-15 12:41:52 +01:00
use Modules\Anagrafiche\Anagrafica ;
2019-11-15 15:11:20 +01:00
use Modules\Fatture\Fattura ;
2017-08-04 16:28:16 +02:00
2019-07-25 12:54:28 +02:00
$module = Modules :: get ( 'Prima nota' );
2019-04-11 16:04:08 +02:00
2019-07-25 12:54:28 +02:00
$variables = Modules :: get ( 'Fatture di vendita' ) -> getPlaceholders ( $id_documento );
2019-12-11 16:49:37 +01:00
$movimenti = [];
2019-07-25 12:54:28 +02:00
// Registrazione da remoto
$id_records = get ( 'id_records' );
if ( ! empty ( $id_records )) {
$id_records = str_replace ( ';' , ',' , $id_records );
if ( get ( 'origine' ) == 'fatture' ) {
$id_documenti = $id_records ;
} else {
$id_scadenze = $id_records ;
2019-04-11 16:04:08 +02:00
}
2019-07-25 12:54:28 +02:00
}
2019-04-11 16:04:08 +02:00
2019-07-25 15:06:07 +02:00
// ID predefiniti
2019-07-31 18:22:35 +02:00
$dir = 'uscita' ; // Le scadenze normali hanno solo direzione in uscita
2019-07-25 15:06:07 +02:00
$singola_scadenza = get ( 'single' ) != null ;
2019-07-31 18:22:35 +02:00
$is_insoluto = get ( 'is_insoluto' ) != null ;
2019-07-25 15:06:07 +02:00
2019-07-25 12:54:28 +02:00
$id_documenti = $id_documenti ? : get ( 'id_documenti' );
$id_documenti = $id_documenti ? explode ( ',' , $id_documenti ) : [];
2019-07-25 15:06:07 +02:00
$id_scadenze = $id_scadenze ? : get ( 'id_scadenze' );
$id_scadenze = $id_scadenze ? explode ( ',' , $id_scadenze ) : [];
// Scadenze
foreach ( $id_scadenze as $id_scadenza ) {
2019-07-31 18:22:35 +02:00
$scadenza = $dbo -> fetchOne ( 'SELECT *, SUM(da_pagare - pagato) AS rata FROM co_scadenziario WHERE id=' . prepare ( $id_scadenza ));
2019-07-25 15:48:28 +02:00
if ( ! empty ( $scadenza [ 'iddocumento' ])) {
2019-07-25 15:06:07 +02:00
$id_documenti [] = $scadenza [ 'iddocumento' ];
continue ;
}
2019-07-31 18:22:35 +02:00
$scadenza [ 'rata' ] = abs ( $scadenza [ 'rata' ]);
2019-07-25 15:06:07 +02:00
$descrizione_conto = ( $dir == 'entrata' ) ? 'Riepilogativo clienti' : 'Riepilogativo fornitori' ;
$conto = $dbo -> fetchOne ( 'SELECT id FROM co_pianodeiconti3 WHERE descrizione = ' . prepare ( $descrizione_conto ));
$id_conto_controparte = $conto [ 'id' ];
$righe_documento = [];
$righe_documento [] = [
2019-11-22 17:15:17 +01:00
'iddocumento' => null ,
2019-07-25 15:06:07 +02:00
'id_scadenza' => $scadenza [ 'id' ],
2019-07-31 18:22:35 +02:00
'id_conto' => null ,
2019-07-25 15:06:07 +02:00
'dare' => ( $dir == 'entrata' ) ? 0 : $scadenza [ 'rata' ],
'avere' => ( $dir == 'entrata' ) ? $scadenza [ 'rata' ] : 0 ,
];
$righe_documento [] = [
2019-11-22 17:15:17 +01:00
'iddocumento' => null ,
2019-07-25 15:06:07 +02:00
'id_scadenza' => $scadenza [ 'id' ],
2019-07-31 18:22:35 +02:00
'id_conto' => $id_conto_controparte ,
2019-07-25 15:06:07 +02:00
'dare' => ( $dir == 'entrata' ) ? $scadenza [ 'rata' ] : 0 ,
'avere' => ( $dir == 'entrata' ) ? 0 : $scadenza [ 'rata' ],
];
2019-07-31 18:22:35 +02:00
// Se è un insoluto, inverto i valori
if ( $is_insoluto ) {
foreach ( $righe_documento as $key => $value ) {
$tmp = $value [ 'avere' ];
$righe_documento [ $key ][ 'avere' ] = $righe_documento [ $key ][ 'dare' ];
$righe_documento [ $key ][ 'dare' ] = $tmp ;
}
}
2019-12-11 16:49:37 +01:00
$movimenti = array_merge ( $movimenti , $righe_documento );
2019-07-25 15:06:07 +02:00
}
// Fatture
2019-07-25 12:54:28 +02:00
$numeri = [];
2019-07-25 15:06:07 +02:00
$counter = 0 ;
2019-10-30 17:10:04 +01:00
$id_documenti = array_unique ( $id_documenti );
2019-11-22 17:15:17 +01:00
$id_anagrafica_movimenti = null ;
2019-07-25 12:54:28 +02:00
foreach ( $id_documenti as $id_documento ) {
$fattura = Fattura :: find ( $id_documento );
2019-11-15 12:41:52 +01:00
$tipo = $fattura -> tipo ;
2019-07-25 12:54:28 +02:00
$dir = $fattura -> direzione ;
2019-02-14 01:40:54 +01:00
2019-07-25 15:06:07 +02:00
// Inclusione delle sole fatture in stato Emessa, Parzialmente pagato o Pagato
if ( ! in_array ( $fattura -> stato -> descrizione , [ 'Emessa' , 'Parzialmente pagato' , 'Pagato' ])) {
++ $counter ;
continue ;
}
2019-11-15 15:11:20 +01:00
2019-11-22 17:33:30 +01:00
if ( empty ( $id_anagrafica_movimenti )) {
2019-11-22 17:15:17 +01:00
$id_anagrafica_movimenti = $fattura -> idanagrafica ;
2019-11-22 17:33:30 +01:00
} elseif ( $fattura -> idanagrafica != $id_anagrafica_movimenti ) {
2019-11-22 17:15:17 +01:00
$id_anagrafica_movimenti = null ;
2019-11-15 12:41:52 +01:00
}
2019-07-25 15:06:07 +02:00
2019-07-25 12:54:28 +02:00
$numeri [] = ! empty ( $fattura [ 'numero_esterno' ]) ? $fattura [ 'numero_esterno' ] : $fattura [ 'numero' ];
2019-04-11 16:04:08 +02:00
2019-12-11 18:12:53 +01:00
$nota_credito = $tipo -> reversed ;
2017-08-04 16:28:16 +02:00
2019-07-25 12:54:28 +02:00
// Predisposizione prima riga
$conto_field = 'idconto_' . ( $dir == 'entrata' ? 'vendite' : 'acquisti' );
2020-03-03 10:33:32 +01:00
$id_conto_aziendale = $fattura -> pagamento [ $conto_field ] ? : setting ( 'Conto aziendale predefinito' );
2017-08-04 16:28:16 +02:00
2019-07-25 12:54:28 +02:00
// Predisposizione conto crediti clienti
$conto_field = 'idconto_' . ( $dir == 'entrata' ? 'cliente' : 'fornitore' );
$id_conto_controparte = $fattura -> anagrafica [ $conto_field ];
2017-08-04 16:28:16 +02:00
2019-07-25 12:54:28 +02:00
// Lettura delle scadenza della fattura
2019-11-22 17:15:17 +01:00
$scadenze = $dbo -> fetchArray ( 'SELECT id, ABS(da_pagare - pagato) AS rata, iddocumento FROM co_scadenziario WHERE iddocumento=' . prepare ( $id_documento ) . ' AND ABS(da_pagare) > ABS(pagato) ORDER BY YEAR(scadenza) ASC, MONTH(scadenza) ASC' );
2017-08-04 16:28:16 +02:00
2019-07-25 12:54:28 +02:00
// Selezione prima scadenza
if ( $singola_scadenza && ! empty ( $scadenze )) {
$scadenze = [ $scadenze [ 0 ]];
}
2017-08-04 16:28:16 +02:00
2019-07-25 12:54:28 +02:00
$righe_documento = [];
2019-11-22 17:15:17 +01:00
// Riga controparte
foreach ( $scadenze as $scadenza ) {
$righe_documento [] = [
'iddocumento' => $scadenza [ 'iddocumento' ],
'id_scadenza' => $scadenza [ 'id' ],
'id_conto' => $id_conto_controparte ,
2019-12-11 18:12:53 +01:00
'dare' => (( $dir == 'entrata' && ! $nota_credito && ! $is_insoluto ) || ( $dir == 'uscita' && ( $nota_credito || $is_insoluto ))) ? 0 : $scadenza [ 'rata' ],
'avere' => (( $dir == 'entrata' && ! $nota_credito && ! $is_insoluto ) || ( $dir == 'uscita' && ( $nota_credito || $is_insoluto ))) ? $scadenza [ 'rata' ] : 0 ,
2019-11-22 17:15:17 +01:00
];
}
2019-07-25 12:54:28 +02:00
// Riga aziendale
$totale = sum ( array_column ( $scadenze , 'rata' ));
2019-11-15 18:05:48 +01:00
2019-07-25 12:54:28 +02:00
if ( $totale != 0 ) {
2019-11-19 14:39:25 +01:00
if ( $nota_credito ) {
2019-11-22 17:15:17 +01:00
$totale_rata = - $totale ;
2019-11-19 14:39:25 +01:00
} else {
2019-11-22 17:15:17 +01:00
$totale_rata = $totale ;
2019-11-15 18:05:48 +01:00
}
2019-11-22 17:15:17 +01:00
$righe_documento [] = [
'iddocumento' => $scadenze [ 0 ][ 'iddocumento' ],
2019-07-25 15:06:07 +02:00
'id_scadenza' => $scadenze [ 0 ][ 'id' ],
2019-07-31 18:22:35 +02:00
'id_conto' => $id_conto_aziendale ,
2019-11-22 17:15:17 +01:00
'dare' => ( $dir == 'entrata' ) ? $totale_rata : 0 ,
'avere' => ( $dir == 'entrata' ) ? 0 : $totale_rata ,
2019-07-25 12:54:28 +02:00
];
}
2019-12-11 16:49:37 +01:00
$movimenti = array_merge ( $movimenti , $righe_documento );
2019-07-25 12:54:28 +02:00
}
2019-11-22 17:15:17 +01:00
/*
2019-10-30 17:10:04 +01:00
$k = 0 ;
2019-11-02 15:41:04 +01:00
foreach ( $righe_azienda as $key => $riga_azienda ) {
if ( $righe_azienda [ $key ][ 'id_conto' ] != $righe_azienda [ $key - 1 ][ 'id_conto' ]) {
++ $k ;
2019-10-30 17:10:04 +01:00
}
2019-11-22 17:15:17 +01:00
$riga_documento [ $k ][ 'iddocumento' ] = $riga_azienda [ 'iddocumento' ];
$riga_documento [ $k ][ 'id_scadenza' ] = $riga_azienda [ 'id_scadenza' ];
2019-10-30 17:10:04 +01:00
$riga_documento [ $k ][ 'id_conto' ] = $riga_azienda [ 'id_conto' ];
$riga_documento [ $k ][ 'dare' ] += $riga_azienda [ 'dare' ];
$riga_documento [ $k ][ 'avere' ] += $riga_azienda [ 'avere' ];
2019-11-22 17:15:17 +01:00
$righe = array_merge ( $righe , $righe_azienda );
} */
// Inverto dare e avere per importi negativi
2019-12-11 16:49:37 +01:00
foreach ( $movimenti as $key => $value ) {
if ( $movimenti [ $key ][ 'dare' ] < 0 || $movimenti [ $key ][ 'avere' ] < 0 ) {
$tmp = abs ( $movimenti [ $key ][ 'dare' ]);
$movimenti [ $key ][ 'dare' ] = abs ( $movimenti [ $key ][ 'avere' ]);
$movimenti [ $key ][ 'avere' ] = $tmp ;
2019-11-15 18:05:48 +01:00
}
}
2019-07-25 12:54:28 +02:00
// Descrizione
$numero_scadenze = count ( $id_scadenze );
$numero_documenti = count ( $id_documenti );
if ( $numero_documenti + $numero_scadenze > 1 ) {
2019-11-22 17:15:17 +01:00
if ( ! empty ( $id_anagrafica_movimenti )) {
$an = Anagrafica :: find ( $id_anagrafica_movimenti );
2019-11-15 12:41:52 +01:00
$descrizione = 'Pag. fatture ' . $an -> ragione_sociale . ' num. ' . implode ( ', ' , $numeri );
2019-11-15 15:11:20 +01:00
} else {
2019-11-15 12:41:52 +01:00
$descrizione = 'Pag. fatture num. ' . implode ( ', ' , $numeri );
}
2019-07-25 12:54:28 +02:00
} elseif ( $numero_documenti == 1 ) {
$numero_fattura = ! empty ( $fattura [ 'numero_esterno' ]) ? $fattura [ 'numero_esterno' ] : $fattura [ 'numero' ];
2019-04-19 17:42:16 +02:00
2019-07-25 12:54:28 +02:00
$tipo_fattura = $fattura -> isNota () ? $tipo -> descrizione : tr ( 'Fattura' );
2019-07-04 09:20:02 +02:00
2019-07-25 12:54:28 +02:00
if ( ! empty ( $is_insoluto )) {
$operation = tr ( 'Registrazione insoluto' );
} else {
$operation = tr ( 'Pag.' );
2017-08-04 16:28:16 +02:00
}
2018-05-11 14:48:46 +02:00
2019-07-25 12:54:28 +02:00
$descrizione = tr ( '_OP_ _DOC_ num. _NUM_ del _DATE_ (_NAME_)' , [
'_OP_' => $operation ,
'_DOC_' => strtolower ( $tipo_fattura ),
'_NUM_' => $numero_fattura ,
'_DATE_' => Translator :: dateToLocale ( $fattura [ 'data' ]),
'_NAME_' => $fattura -> anagrafica [ 'ragione_sociale' ],
]);
} elseif ( $numero_scadenze == 1 ) {
$descrizione = tr ( 'Pag. _OP_ del _DATE_' , [
'_OP_' => $scadenza [ 'descrizione' ],
'_DATE_' => Translator :: dateToLocale ( $scadenza [ 'scadenza' ]),
]);
}
2019-07-25 15:06:07 +02:00
if ( ! empty ( $id_records ) && get ( 'origine' ) == 'fatture' && ! empty ( $counter )) {
$descrizione_stati = [];
$stati = $database -> fetchArray ( " SELECT * FROM `co_statidocumento` WHERE descrizione IN ('Emessa', 'Parzialmente pagato', 'Pagato') ORDER BY descrizione " );
foreach ( $stati as $stato ) {
$descrizione_stati [] = '<i class="' . $stato [ 'icona' ] . '"></i> <small>' . $stato [ 'descrizione' ] . '</small>' ;
}
echo '
< div class = " alert alert-info " >
< p > '.tr(' Solo le fatture in stato _STATE_ possono essere registrate contabilmente ignorate ' , [
2019-07-31 18:22:35 +02:00
'_STATE_' => implode ( ', ' , $descrizione_stati ),
]) . ' .</ p >
2019-07-25 15:06:07 +02:00
< p >< b > '.tr(' Sono state ignorate _NUM_ fatture ' , [
2019-07-31 18:22:35 +02:00
'_NUM_' => $counter ,
]) . ' .</ b ></ p >
2019-07-25 15:06:07 +02:00
</ div > ' ;
}
2019-07-25 12:54:28 +02:00
echo '
< form action = " '.ROOTDIR.'/controller.php?id_module='. $module->id .' " method = " post " id = " add-form " >
< input type = " hidden " name = " op " value = " add " >
< input type = " hidden " name = " backto " value = " record-edit " >
< input type = " hidden " name = " crea_modello " id = " crea_modello " value = " 0 " >
2019-07-31 18:22:35 +02:00
< input type = " hidden " name = " idmastrino " id = " idmastrino " value = " 0 " >
< input type = " hidden " name = " is_insoluto " value = " '. $is_insoluto .' " > ' ;
2019-07-25 12:54:28 +02:00
echo '
2018-05-04 17:57:46 +02:00
< div class = " row " >
< div class = " col-md-12 " >
2020-01-09 18:33:01 +01:00
{[ " type " : " select " , " label " : " '.tr('Modello prima nota').' " , " id " : " modello_primanota " , " values " : " query=SELECT idmastrino AS id, nome AS descrizione, descrizione as causale FROM co_movimenti_modelli GROUP BY idmastrino " ]}
2018-05-04 17:57:46 +02:00
</ div >
</ div >
2017-08-04 16:28:16 +02:00
< div class = " row " >
< div class = " col-md-4 " >
2019-07-25 12:54:28 +02:00
{[ " type " : " date " , " label " : " '.tr('Data movimento').' " , " name " : " data " , " required " : 1 , " value " : " -now- " ]}
2017-08-04 16:28:16 +02:00
</ div >
< div class = " col-md-8 " >
2019-07-25 12:54:28 +02:00
{[ " type " : " text " , " label " : " '.tr('Causale').' " , " name " : " descrizione " , " id " : " desc " , " required " : 1 , " value " : '.json_encode($descrizione).' ]}
2017-08-04 16:28:16 +02:00
</ div >
2019-07-25 12:54:28 +02:00
</ div > ' ;
2017-08-04 16:28:16 +02:00
2019-07-31 18:22:35 +02:00
include $structure -> filepath ( 'movimenti.php' );
2017-08-04 16:28:16 +02:00
2019-07-25 12:54:28 +02:00
echo '
2017-08-04 16:28:16 +02:00
<!-- PULSANTI -->
< div class = " row " >
< div class = " col-md-12 text-right " >
2019-07-25 12:54:28 +02:00
< button type = " button " class = " btn btn-default " id = " btn_crea_modello " >
< i class = " fa fa-plus " ></ i > '.tr(' Aggiungi e crea modello ').'
</ button >
< button type = " submit " class = " btn btn-primary " id = " add-submit " >
< i class = " fa fa-plus " ></ i > '.tr(' Aggiungi ').'
</ button >
2017-08-04 16:28:16 +02:00
</ div >
</ div >
2019-07-25 12:54:28 +02:00
</ form > ' ;
?>
< script type = " text/javascript " >
var variables = < ? php echo json_encode ( $variables ); ?> ;
var nuovo_modello = " <?php echo tr('Aggiungi e crea modello'); ?> " ;
var modifica_modello = " <?php echo tr('Aggiungi e modifica modello'); ?> " ;
2017-08-04 16:28:16 +02:00
2019-08-01 10:08:34 +02:00
$ ( document ) . ready ( function ( e ) {
2020-02-05 12:40:44 +01:00
$ ( " #modals > div #add-form " ) . on ( " submit " , function ( e ) {
2019-11-22 17:15:17 +01:00
return controllaConti ();
2019-07-25 12:54:28 +02:00
});
2020-02-05 12:40:44 +01:00
$ ( '#modals > div #modello_primanota' ) . change ( function () {
2019-07-25 12:54:28 +02:00
if ( $ ( this ) . val () != '' ) {
$ ( '#btn_crea_modello' ) . html ( '<i class="fa fa-edit"></i> ' + modifica_modello );
2020-02-05 12:40:44 +01:00
$ ( '#modals > div #idmastrino' ) . val ( $ ( this ) . val ());
2019-07-25 12:54:28 +02:00
} else {
$ ( '#btn_crea_modello' ) . html ( '<i class="fa fa-plus"></i> ' + nuovo_modello );
2020-02-05 12:40:44 +01:00
$ ( '#modals > div #idmastrino' ) . val ( 0 );
2019-07-25 12:54:28 +02:00
}
2017-08-04 16:28:16 +02:00
2019-07-25 12:54:28 +02:00
var idmastrino = $ ( this ) . val ();
var replaced = 0 ;
if ( idmastrino != '' ) {
var causale = $ ( this ) . find ( 'option:selected' ) . data ( 'causale' );
if ( $ ( '#iddocumento' ) . val () != '' ) {
for ( i in variables ) {
if ( causale . includes ( '{' + i + '}' )) {
replaced ++ ;
causale = causale . replace ( '{' + i + '}' , variables [ i ]);
}
2017-08-04 16:28:16 +02:00
}
2019-07-25 12:54:28 +02:00
} else {
for ( i in variables ) {
causale = causale . replace ( '{' + i + '}' , '_' );
2017-08-04 16:28:16 +02:00
}
2019-07-25 12:54:28 +02:00
}
2017-08-04 16:28:16 +02:00
2019-07-25 12:54:28 +02:00
// aggiornava erroneamente anche la causale ed eventuale numero di fattura e data
if ( replaced > 0 || $ ( '#iddocumento' ) . val () == '' ) {
2020-02-05 12:40:44 +01:00
$ ( '#modals > div #desc' ) . val ( causale );
2017-08-04 16:28:16 +02:00
}
2019-07-25 12:54:28 +02:00
$ . get ( globals . rootdir + '/ajax_complete.php?op=get_conti&idmastrino=' + idmastrino , function ( data ) {
var conti = data . split ( ',' );
2020-02-16 16:46:36 +01:00
// Reinizializzazione di tutti i superselect nel caso di modelli con più di 2 conti
$ ( '.select2-container' ) . remove ();
2019-07-25 12:54:28 +02:00
for ( i = 0 ; i < conti . length ; i ++ ) {
var conto = conti [ i ] . split ( ';' );
// Sostituzione conto cliente/fornitore
if ( conto [ 0 ] == - 1 ) {
if ( $ ( '#iddocumento' ) . val () != '' ) {
var option = $ ( " <option selected></option> " ) . val ( variables [ 'conto' ]) . text ( variables [ 'conto_descrizione' ]);
2020-02-16 16:46:36 +01:00
// Creazione riga aggiuntiva da modello se le 2 iniziali non sono abbastanza
if ( $ ( '#modals > div #conto' + i ) . length == 0 ) {
$new_tr = $ ( '#modals > div table.scadenze > tbody tr' ) . last () . html ();
$ ( '#modals > div table.scadenze > tbody' ) . append ( '<tr>' + $new_tr + '</tr>' );
$ ( '#modals > div table.scadenze > tbody tr' ) . last () . find ( 'select' ) . attr ( 'id' , 'conto' + i ) . attr ( 'name' , 'idconto[' + i + ']' );
}
2020-03-03 10:33:32 +01:00
2020-02-16 16:46:36 +01:00
$ ( '#modals > div #conto' + i ) . append ( option );
2019-04-11 16:04:08 +02:00
}
2019-07-25 12:54:28 +02:00
} else {
var option = $ ( " <option selected></option> " ) . val ( conto [ 0 ]) . text ( conto [ 1 ]);
2020-02-16 16:46:36 +01:00
// Creazione riga aggiuntiva da modello se le 2 iniziali non sono abbastanza
if ( $ ( '#modals > div #conto' + i ) . length == 0 ) {
$new_tr = $ ( '#modals > div table.scadenze > tbody tr' ) . last () . html ();
$ ( '#modals > div table.scadenze > tbody' ) . append ( '<tr>' + $new_tr + '</tr>' );
$ ( '#modals > div table.scadenze > tbody tr' ) . last () . find ( 'select' ) . attr ( 'id' , 'conto' + i ) . attr ( 'name' , 'idconto[' + i + ']' );
}
$ ( '#modals > div #conto' + i ) . append ( option );
2019-04-11 16:04:08 +02:00
}
}
2020-02-16 16:46:36 +01:00
start_superselect ();
$ ( '#modals > div select.superselectajax' ) . trigger ( 'change' );
2019-07-25 12:54:28 +02:00
});
}
});
2020-02-05 12:40:44 +01:00
$ ( '#modals > div #btn_crea_modello' ) . click ( function () {
$ ( '#modals > div #crea_modello' ) . val ( " 1 " );
$ ( '#modals > div #add-form' ) . submit ();
2019-07-25 12:54:28 +02:00
});
});
</ script >