This commit is contained in:
Fabio Lovato 2018-02-12 10:50:51 +01:00
commit 3d2e1a7eb3
31 changed files with 698 additions and 328 deletions

View File

@ -80,7 +80,7 @@ if (!empty($module_query) && $module_query != 'menu' && $module_query != 'custom
unset($pieces[$cont - 1]);
}
$module_query = implode('ORDER', $pieces).' ORDER BY `'.$total['order_by'][$order['column']].'` '.$order['dir'];
$module_query = implode('ORDER', $pieces).' ORDER BY '.$total['order_by'][$order['column']].' '.$order['dir'];
}
// Calcolo di eventuali somme
@ -126,7 +126,7 @@ if (!empty($module_query) && $module_query != 'menu' && $module_query != 'custom
}
// Allineamento al centro se il valore della prima riga risulta relativo a date o icone
elseif (Translator::getFormatter()->isStandardDate($value) || preg_match('/^icontr(.+?)$/', $field)) {
elseif (Translator::getFormatter()->isStandardDate($value) || preg_match('/^icon_(.+?)$/', $field)) {
$align[$field] = 'text-center';
}
}
@ -162,7 +162,7 @@ if (!empty($module_query) && $module_query != 'menu' && $module_query != 'custom
}
// Icona
if (preg_match('/^colortr(.+?)$/', $field, $m)) {
if (preg_match('/^color_(.+?)$/', $field, $m)) {
$value = $r['color_title_'.$m[1]] ?: '';
$column['class'] = 'text-center small';

View File

@ -231,9 +231,9 @@ switch ($op) {
$filter[] = 'mg_articoli.id='.prepare($element);
}
$where[] = 'attivo=1';
$where[] = 'attivo = 1';
if (!empty($superselect['dir']) && $superselect['dir'] == 'entrata') {
//$where[] = 'qta>0';
//$where[] = '(qta > 0 OR servizio = 1)';
}
if (!empty($search)) {
@ -241,7 +241,6 @@ switch ($op) {
$search_fields[] = 'mg_articoli.codice LIKE '.prepare('%'.$search.'%');
}
$wh = '';
if (!empty($search_fields)) {
$where[] = '('.implode(' OR ', $search_fields).')';
}
@ -250,6 +249,7 @@ switch ($op) {
$where[] = '('.implode(' OR ', $filter).')';
}
$wh = '';
if (count($where) != 0) {
$wh = 'WHERE '.implode(' AND ', $where);
}

View File

@ -23,6 +23,10 @@
"type": "project",
"require": {
"php": ">=5.6",
"ext-mbstring": "*",
"ext-pdo_mysql": "*",
"aluguest/ical-easy-reader": "^1.5",
"danielstjules/stringy": "^3.1",
"ezyang/htmlpurifier": "^4.8",
@ -41,6 +45,9 @@
"symfony/translation": "^3.3",
"symfony/var-dumper": "^3.3"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.10"
},
"autoload": {
"psr-4": {
"": "src/"

View File

@ -40,6 +40,9 @@ menu:
api:
text: API
relativeUrl: api.html
contribuire:
text: Contribuire
relativeUrl: contributing.html
structure:
name: Approfondimenti
items:

View File

@ -1,3 +1,7 @@
---
currentMenu: contribuire
---
# Contribuire
Sei interessato a contribuire allo sviluppo di OpenSTAManger? Ottimo, sei il benvenuto!
@ -28,7 +32,7 @@ PHP CS Fixer viene utilizzato per formattare automaticamente il codice PHP e aum
La configurazione può essere trovata nel file [.php_cs](https://github.com/devcode-it/openstamanager/blob/master/.php_cs).
EditorConfig viene sfruttato per mantenere la consistenza nella formattazione di base dei diversi altri file utilizzati nel progetto.
La configurazione può essere trovata nel file [.php_cs](https://github.com/devcode-it/openstamanager/blob/master/.editorconfig).
La configurazione può essere trovata nel file [.editorconfig](https://github.com/devcode-it/openstamanager/blob/master/.editorconfig).
Maggiori informazioni sui plugin che permettono di integrare questi strumenti sono disponibili nei relativi siti.

View File

@ -1,84 +0,0 @@
---
currentMenu: contribuire
---
# Contribuire
Sei interessato a contribuire allo sviluppo di OpenSTAManger? Ottimo, sei il benvenuto!
Siamo entusiasti di ogni nuova contribuzione che otteniamo dalla nostra community.
Ci sono molti modi per contribuire: segnalare bug, richiedere miglioramenti, scrivere tutorial, migliorare la documentazione...
Non serve essere degli esperti programmatori per aiutarci! :smile_cat:
Leggi le seguenti sezioni per scoprire come ti consigliamo di procedere.
Se ti serve un aiuto, crea una issue su GitHub.
<!-- TOC depthFrom:2 depthTo:6 orderedList:false updateOnSave:true withLinks:true -->
- [Linee guida](#linee-guida)
- [Codice di condotta](#codice-di-condotta)
- [Stile del codice](#stile-del-codice)
- [Prima contribuzione](#prima-contribuzione)
- [Problemi di sicurezza](#problemi-di-sicurezza)
- [Segnalare un bug](#segnalare-un-bug)
- [Pull Request](#pull-request)
- [Community](#community)
<!-- /TOC -->
## Linee guida
Per migliorare il sistema con cui sviluppiamo il codice, abbiamo deciso di adottare alcune linee guida per facilitare la collaborazione tra più persone.
### Codice di condotta
Per il momento non abbiamo adottato un vero e proprio codice di condotta, ma ti chiediamo di essere il più civile possibile nel comunicare con gli altri per questo progetto.
### Stile del codice
Utilizziamo principalmente due strumenti per mantenere consistente nel tempo lo stile del codice:
- [PHP CS Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer)
- [EditorConfig](http://editorconfig.org>)
PHP CS Fixer viene utilizzato per formattare automaticamente il codice PHP e aumentare la sua comprensibilità.
La configurazione può essere trovata nel file [.php_cs](https://github.com/devcode-it/openstamanager/blob/master/.php_cs).
EditorConfig viene sfruttato per mantenere la consistenza nella formattazione di base dei diversi altri file utilizzati nel progetto.
La configurazione può essere trovata nel file [.php_cs](https://github.com/devcode-it/openstamanager/blob/master/.editorconfig).
Maggiori informazioni sui plugin che permettono di integrare questi strumenti sono disponibili nei relativi siti.
## Prima contribuzione
Sei insicuro su cosa potresti lavorare per contribuire al progetto?
Prova a dare un'occhiata alle issue sotto la label [nuovi contributori](https://github.com/devcode-it/openstamanager/labels/nuovi%20contributori), dove sono indicate le migliorie più semplici da applicare.
## Problemi di sicurezza
Se trovi un problema di sicurezza, NON aprire una issue. Inviaci un'email all'indirizzo `info at openstamanager dot com`.
Per capire se hai individuato un problema di sicurezza, prova a farti queste domande:
* Posso accedere a qualcosa a cui non dovrei avere accesso?
* Posso disabilitare qualcosa per altre persone?
Se la risposta a una di queste domande è positiva, allora probabilmente hai individuato un problema di sicurezza.
Considera però che anche in caso negativo potrebbe trattarsi di un problema di questo tipo, quindi se sei insicuro contattaci comunque via email.
## Segnalare un bug
Se hai individuato un bug e desideri segnalarlo, apri una nuova issue provando a mantenerti sulla base del [file di template su GitHub](https://github.com/devcode-it/openstamanager/blob/master/.github/ISSUE_TEMPLATE.md).
Se vuoi suggerire una miglioramento di qualche tipo oppure una nuova funzionalità, sentiti libero di aprire una issue apposita dove spieghi dettagliatamente la modifica che vorresti, la sua utilità e il suo funzionamento generale
## Pull Request
Se sei in grado di risolvere uno dei bug segnalati oppure vuoi completare una nuova funzionalità, apri una nuova Pull Request provando a mantenerti sulla base del [file di template su GitHub](https://github.com/devcode-it/openstamanager/blob/master/.github/PULL_REQUEST_TEMPLATE.md).
## Community
Siamo presenti su [Facebook](https://www.facebook.com/openstamanager), e il nostro forum ufficiale è disponibile all'indirizzo <http://www.openstamanager.com/forum/>.
Cerchiamo di essere disponibili quanto possibile, ma non sempre riusciamo a rispondere tempestivamente.

View File

@ -73,7 +73,7 @@ if (empty($records)) {
<a class="back-btn" href="controller.php?id_module='.$id_module.'"><i class="fa fa-chevron-left"></i> '.tr("Torna all'elenco").'</a>
</li>';
$plugins = $dbo->fetchArray('SELECT id, title FROM zz_plugins WHERE idmodule_to='.prepare($id_module)." AND position='tab' AND enabled = 1");
$plugins = $dbo->fetchArray('SELECT id, title FROM zz_plugins WHERE idmodule_to='.prepare($id_module)." AND position='tab' AND enabled = 1 ORDER BY zz_plugins.order DESC");
foreach ($plugins as $plugin) {
echo '

View File

@ -1,5 +1,7 @@
# Disable PHP rendering
php_flag engine off
## Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
<IfModule mod_php5.c>
php_flag engine off
</IfModule>
<IfModule mod_php7.c>
php_flag engine off
</IfModule>

View File

@ -12,7 +12,7 @@ function add_movimento_magazzino($idarticolo, $qta, $array = [], $descrizone = '
if (empty($qta)) {
return false;
}
//Info Articolo
$rs_art = $dbo->fetchArray("SELECT * FROM mg_articoli WHERE id='".$idarticolo."'");
@ -79,9 +79,9 @@ function add_movimento_magazzino($idarticolo, $qta, $array = [], $descrizone = '
$movimento = str_replace(['_NAME_', '_TYPE_', '_NUM_'], [$nome, $tipo, $numero], $movimento);
$new = ($qta > 0 ? '+' : '').$qta;
//Movimento il magazzino solo se l'articolo non è un servizio
if($rs_art[0]['servizio']==0){
if ($rs_art[0]['servizio'] == 0) {
// Movimentazione effettiva
if (empty($array['idintervento']) || empty($array['idautomezzo'])) {
$dbo->query('UPDATE mg_articoli SET qta = qta + '.$new.' WHERE id = '.prepare($idarticolo));

View File

@ -0,0 +1,134 @@
<?php
include_once __DIR__.'/../../../core.php';
#<form action="plugin_editor.php?id_plugin=$id_plugin$&id_module=$id_module$&id_parent=$id_parent$" method="post" role="form">
$idcontratto_riga = $get['idcontratto_riga'];
$qp = 'SELECT *, (SELECT data_conclusione FROM co_contratti WHERE id = '.$id_record.' ) AS data_conclusione, (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=co_righe_contratti.idtipointervento) AS tipointervento FROM co_righe_contratti WHERE id = '.$idcontratto_riga;
$rsp = $dbo->fetchArray($qp);
$data_richiesta = readDate($rsp[0]['data_richiesta']);
$orario_inizio = '09:00';
$orario_fine = '17:00';
echo '
<form id="add_form" action="'.$rootdir.'/editor.php?id_module='.Modules::get('Contratti')['id']."&id_record=".$id_record."&idcontratto_riga=".$idcontratto_riga.'" method="post">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="pianificazione">
<div class="row">
<div class="col-xs-12 col-md-7">
{[ "type": "select", "label": "'.tr('Tipo intervento').'", "name": "idtipointervento", "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "'.$rsp[0]['idtipointervento'].'", "extra": "disabled" ]}
</div>
<div class="col-xs-12 col-md-5">
{[ "type": "number", "label": "'.tr('Intervallo').'", "name": "intervallo", "class": "", "decimals": 0, "required": 1, "icon-after": "GG", "min-value": "1" ]}
</div>
</div>
<div class="row">
<div class="col-xs-12 col-md-12">
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "placeholder": "'.tr('Descrizione').'", "name": "richiesta", "extra": "readonly", "value": "'.$rsp[0]['richiesta'].'" ]}
</div>
</div>
<div class="row">
<!--div class="col-xs-12 col-md-8">
{[ "type": "checkbox", "label": "'.tr('Pianifica anche date passate').'", "name": "date_passate", "value": "0", "help": "", "placeholder": "'.tr('Pianificare promemoria anche con date precedenti ad oggi: ').date("d/m/Y").'" ]}
</div-->
';
?>
<div class="col-xs-12 col-md-7">
{[ "type": "select", "label": "<?php echo tr('Inizio pianificazione') ?>", "name": "parti_da_oggi", "values": "list= \"0\":\"<?php echo tr('Pianificare dal ').$data_richiesta ?>\", \"1\":\"<?php echo tr('Pianificare a partire da oggi ').date('d/m/Y') ?>\"", "value": "" ]}
</div>
<?php
echo '
<div class="col-xs-12 col-md-5">
{[ "type": "date", "label": "'.tr('Fine pianificazione <small>(Data conclusione contratto)</small>').'", "name": "data_conclusione", "extra": "readonly", "value": "'.$rsp[0]['data_conclusione'].'" ]}
</div>
</div>
<div class="row">
<div class="col-xs-12 col-md-4">
{[ "type": "checkbox", "label": "'.tr('Pianifica intervento').'", "name": "pianifica_intervento", "value": "0", "help": "", "placeholder": "'.tr('Pianificare anche gli interventi ').'" ]}
</div>
<div class="col-xs-12 col-md-4">
{[ "type": "select", "label": "'.tr('Tecnici').'", "multiple": "1", "name": "idtecnico[]", "required": 0, "ajax-source": "tecnici", "value": "", "extra": "disabled" ]}
</div>
<div class="col-xs-6 col-md-2">
{[ "type": "time", "label": "'.tr('Orario inizio').'", "name": "orario_inizio", "required": 0, "value": "'.$orario_inizio.'", "extra": "disabled" ]}
</div>
<div class="col-xs-6 col-md-2">
{[ "type": "time", "label": "'.tr('Orario fine').'", "name": "orario_fine", "required": 0, "value": "'.$orario_fine.'", "extra": "disabled" ]}
</div>
</div>
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary"><i class="fa fa-plus"></i> '.tr('Pianifica').'</button>
</div>
</div>
</form>';
echo '
<script src="'.$rootdir.'/lib/init.js"></script>';
echo '
<script>
$( document ).ready(function() {
$( "#pianifica_intervento" ).click(function() {
if ($(this).is(":checked")){
$("#idtecnico").removeAttr("disabled");
$("#orario_inizio").removeAttr("disabled");
$("#orario_fine").removeAttr("disabled");
}else{
$("#idtecnico").prop("disabled", true);
$("#orario_inizio").prop("disabled", true);
$("#orario_fine").prop("disabled", true);
}
});
});
</script>';

View File

@ -31,6 +31,170 @@ switch (filter('op')) {
redirect($rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'#tab_'.$id_plugin);
break;
//pianificazione
case 'pianificazione':
$idcontratto_riga = filter('idcontratto_riga');
$intervallo = filter('intervallo');
$parti_da_oggi = post('parti_da_oggi');
if (!empty($idcontratto_riga) and !empty($intervallo) ){
$qp = 'SELECT *, (SELECT idanagrafica FROM co_contratti WHERE id = '.$id_record.' ) AS idanagrafica, (SELECT data_conclusione FROM co_contratti WHERE id = '.$id_record.' ) AS data_conclusione, (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=co_righe_contratti.idtipointervento) AS tipointervento FROM co_righe_contratti WHERE id = '.$idcontratto_riga;
$rsp = $dbo->fetchArray($qp);
$idtipointervento = $rsp[0]['idtipointervento'];
$idsede = $rsp[0]['idsede'];
$richiesta = $rsp[0]['richiesta'];
//mi serve per la pianificazione interventi
$idanagrafica = $rsp[0]['idanagrafica'];
$data_conclusione = $rsp[0]['data_conclusione'];
$data_richiesta = $rsp[0]['data_richiesta'];
//se voglio pianificare anche le date precedenti ad oggi (parto da questo promemoria)
if ($parti_da_oggi){
//oggi
$min_date = date('Y-m-d');
}else{
$min_date = date('Y-m-d', strtotime($data_richiesta));
}
//inizio controllo data_conclusione, data valida e maggiore della $min_date
if ( (date('Y', strtotime($data_conclusione)) > 1970) and (date('Y-m-d', strtotime($min_date)) < date('Y-m-d', strtotime($data_conclusione))) ) {
//Ciclo partendo dalla data_richiesta fino all data conclusione del contratto
while ( date('Y-m-d', strtotime($data_richiesta)) < date('Y-m-d', strtotime($data_conclusione)) ){
//calcolo nuova data richiesta
$data_richiesta = date('Y-m-d', strtotime($data_richiesta. " + ".intval($intervallo)." days") );
//controllo nuova data richiesta --> solo date maggiori o uguali di [oggi o data richiesta iniziale] ma che non superano la data di fine del contratto
if ( (date('Y-m-d', strtotime($data_richiesta)) >= $min_date ) and (date('Y-m-d', strtotime($data_richiesta)) <= date('Y-m-d', strtotime($data_conclusione))) ){
//Controllo che non esista già un promemoria idcontratto, idtipointervento e data_richiesta.
if ( count($dbo->fetchArray("SELECT id FROM co_righe_contratti WHERE data_richiesta = '".$data_richiesta."' AND idtipointervento = '".$idtipointervento."' AND idcontratto = '".$id_record."' ")) == 0 ){
$query = 'INSERT INTO `co_righe_contratti`(`idcontratto`, `idtipointervento`, `data_richiesta`, `richiesta`, `idsede`) VALUES('.prepare($id_record).', '.prepare($idtipointervento).', '.prepare($data_richiesta).', '.prepare($richiesta).', '.prepare($idsede).')';
if ($dbo->query($query)) {
$idriga = $dbo->lastInsertedID();
$_SESSION['infos'][] = tr('Promemoria intervento pianificato!');
//pianificare anche l' intervento?
if ($post['pianifica_intervento']){
/*$orario_inizio = post('orario_inizio');
$orario_fine = post('orario_fine');*/
//$idanagrafica = 2;
//intervento sempre nello stato "In programmazione"
$idstatointervento = 'WIP';
//calcolo codice intervento
$formato = get_var('Formato codice intervento');
$template = str_replace('#', '%', $formato);
$rs = $dbo->fetchArray('SELECT codice FROM in_interventi WHERE codice=(SELECT MAX(CAST(codice AS SIGNED)) FROM in_interventi) AND codice LIKE '.prepare($template).' ORDER BY codice DESC LIMIT 0,1');
$codice = get_next_code($rs[0]['codice'], 1, $formato);
if (empty($codice)) {
$rs = $dbo->fetchArray('SELECT codice FROM in_interventi WHERE codice LIKE '.prepare($template).' ORDER BY codice DESC LIMIT 0,1');
$codice = get_next_code($rs[0]['codice'], 1, $formato);
}
// Creo intervento
$dbo->insert('in_interventi', [
'idanagrafica' => $idanagrafica,
'idclientefinale' => post('idclientefinale') ?: 0,
'idstatointervento' => $idstatointervento,
'idtipointervento' => $idtipointervento,
'idsede' => $idsede ?: 0,
'idautomezzo' => $idautomezzo ?: 0,
'codice' => $codice,
'data_richiesta' => $data_richiesta,
'richiesta' => $richiesta,
]);
$idintervento = $dbo->lastInsertedID();
$idtecnici = post('idtecnico');
//aggiungo i tecnici
foreach ($idtecnici as $idtecnico) {
add_tecnico($idintervento, $idtecnico, $data_richiesta.' '.post('orario_inizio'), $data_richiesta.' '.post('orario_fine'), $id_record);
}
//collego l'intervento ai promemoria
$dbo->query('UPDATE co_righe_contratti SET idintervento='.prepare($idintervento).' WHERE id='.prepare($idriga));
// $_SESSION['infos'][] = tr('Intervento '.$codice.' pianificato correttamente.');
$_SESSION['infos'][] = tr('Interventi pianificati correttamente.');
}
//fine if pianificazione intervento
}else{
$_SESSION['errors'][] = tr('Errore durante esecuzione query di pianificazione. #'.$idcontratto_riga);
}
}else{
$_SESSION['warnings'][] = tr("Esiste già un promemoria pianificato per il ".readDate($data_richiesta).".");
}
}
//fine controllo nuova data richiesta
}
//fine ciclo while
}else{
$_SESSION['errors'][] = tr('Nessuna data di conclusione del contratto oppure quest\'ultima è già trascorsa, impossibile pianificare nuovi promemoria.');
}
//fine controllo data_conclusione
}else{
$_SESSION['errors'][] = tr('Errore durante la pianificazione. #'.$idcontratto_riga);
}
redirect($rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'#tab_'.$id_plugin);
break;
}
// Righe già inserite
@ -84,27 +248,44 @@ if (count($rsp) != 0) {
'_NUM_' => $rsp2[0]['codice'],
'_DATE_' => Translator::dateToLocale($rsp2[0]['data']),
]));
$disabled = 'disabled';
} else {
$info_intervento = '- '.('Nessuno').' -';
$disabled = '';
}
if (date('Y', strtotime($records[0]['data_conclusione']))<1971){
$records[0]['data_conclusione'] = '';
}
echo '
<tr>
<td>'.Translator::dateToLocale($rsp[$i]['data_richiesta']).'</td>
<td>'.Translator::dateToLocale($rsp[$i]['data_richiesta']).'<!--br><small>'.Translator::dateToLocale($records[0]['data_conclusione']).'</small--></td>
<td>'.$rsp[$i]['tipointervento'].'</td>
<td>'.nl2br($rsp[$i]['richiesta']).'</td>
<td>'.$info_intervento.'</td>
<td>'.$info_sede.'</td>
<td align="right">';
echo '
<button type="button" class="btn btn-warning btn-sm" title="Pianifica altri promemoria..." data-toggle="tooltip" onclick="launch_modal(\'Pianifica altri promemoria\', \''.$rootdir.'/modules/contratti/plugins/addpianficazione.php?id_module='.Modules::get('Contratti')['id'].'&id_plugin='.Plugins::get('Pianificazione interventi')['id'].'&ref=interventi_contratti&id_record='.$id_record.'&idcontratto_riga='.$rsp[$i]['id'].'\');"'.( ( !empty($pianificabile) and strtotime($records[0]['data_conclusione'])) ? '' : ' disabled').'><i class="fa fa-clock-o"></i></button>';
echo '
<button type="button" '.$disabled.' class="btn btn-primary btn-sm '.$disabled.' " title="Pianifica intervento ora..." data-toggle="tooltip" onclick="launch_modal(\'Pianifica intervento\', \''.$rootdir.'/add.php?id_module='.Modules::get('Interventi')['id'].'&ref=interventi_contratti&idcontratto='.$id_record.'&idcontratto_riga='.$rsp[$i]['id'].'\');"'.(!empty($pianificabile) ? '' : ' disabled').'><i class="fa fa-calendar"></i></button>';
if (empty($rsp[$i]['idintervento'])) {
echo '
<button type="button" class="btn btn-primary btn-sm" title="Pianifica ora..." data-toggle="tooltip" onclick="launch_modal(\'Pianifica intervento\', \''.$rootdir.'/add.php?id_module='.Modules::get('Interventi')['id'].'&ref=interventi_contratti&idcontratto='.$id_record.'&idcontratto_riga='.$rsp[$i]['id'].'\');"'.(!empty($pianificabile) ? '' : ' disabled').'><i class="fa fa-calendar"></i></button>';
echo '
<button type="button" '.$disabled.' title="Elimina promemoria..." class="btn btn-danger btn-sm ask '.$disabled.' " data-op="depianifica" data-id="'.$rsp[$i]['id'].'">
<i class="fa fa-trash"></i>
</button>';
echo '
<button type="button" class="btn btn-danger btn-sm ask" data-op="depianifica" data-id="'.$rsp[$i]['id'].'">
<i class="fa fa-trash"></i>
</button>';
}
echo '
</td>
</tr>';

View File

@ -170,7 +170,7 @@ switch (post('op')) {
$rs = $dbo->fetchArray($query);
foreach ($rs as $value) {
$non_rimovibili = seriali_non_rimuovibili('id_riga_documenti', $value['id'], $dir);
$non_rimovibili = seriali_non_rimuovibili('id_riga_documento', $value['id'], $dir);
if (!empty($non_rimovibili)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');
@ -293,14 +293,14 @@ switch (post('op')) {
$idanagrafica = $rs[0]['idanagrafica'];
$data = $rs[0]['data'];
$codice = $rs[0]['codice'];
//Fatturo le ore di lavoro raggruppate per costo orario
$rst = $dbo->fetchArray('SELECT SUM( ROUND( TIMESTAMPDIFF( MINUTE, orario_inizio, orario_fine ) / 60, '.get_var('Cifre decimali per quantità').' ) ) AS tot_ore, SUM(prezzo_ore_consuntivo) AS tot_prezzo_ore_consuntivo, prezzo_ore_unitario FROM in_interventi_tecnici WHERE idintervento='.prepare($idintervento).' GROUP BY prezzo_ore_unitario');
//Aggiunta riga intervento sul documento
for( $i=0; $i<sizeof($rst); $i++ ){
for ($i = 0; $i < sizeof($rst); ++$i) {
$ore = $rst[$i]['tot_ore'];
// Calcolo iva
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
$rs = $dbo->fetchArray($query);
@ -320,7 +320,7 @@ switch (post('op')) {
$query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare(get_var("Percentuale ritenuta d'acconto"));
$rs = $dbo->fetchArray($query);
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, `order`) VALUES('.prepare($id_record).', '.prepare($idintervento).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', 'ore', ".prepare($ore).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
$dbo->query($query);
}

View File

@ -7,6 +7,7 @@ $dir = $rs[0]['dir'];
$tipodoc = $rs[0]['descrizione'];
$_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
$_SESSION['superselect']['ddt'] = $dir;
?>
<form action="" class="text-right" method="post" id="form-copy">
@ -17,20 +18,54 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
<form action="" method="post" role="form">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="update">
<input type="hidden" name="id_record" value="<?php echo $id_record ?>">
<input type="hidden" name="id_record" value="<?php echo $id_record; ?>">
<!-- INTESTAZIONE -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Intestazione') ?></h3>
<h3 class="panel-title"><?php echo tr('Intestazione'); ?></h3>
</div>
<div class="panel-body">
<?php
if ($dir == 'entrata') {
$rs2 = $dbo->fetchArray('SELECT piva, codice_fiscale, citta, indirizzo, cap, provincia FROM an_anagrafiche WHERE idanagrafica='.prepare($records[0]['idanagrafica']));
$campi_mancanti = [];
if ($rs2[0]['piva'] == '') {
if ($rs2[0]['codice_fiscale'] == '') {
array_push($campi_mancanti, 'codice fiscale');
}
}
if ($rs2[0]['citta'] == '') {
array_push($campi_mancanti, 'citta');
}
if ($rs2[0]['indirizzo'] == '') {
array_push($campi_mancanti, 'indirizzo');
}
if ($rs2[0]['cap'] == '') {
array_push($campi_mancanti, 'C.A.P.');
}
if (sizeof($campi_mancanti) > 0) {
echo "<div class='alert alert-warning'><i class='fa fa-warning'></i> Prima di procedere alla stampa completa i seguenti campi dell'anagrafica:<br/><b>".implode(', ', $campi_mancanti).'</b><br/>
'.Modules::link('Anagrafiche', $records[0]['idanagrafica'], tr('Vai alla scheda anagrafica'), null).'</div>';
}
}
?>
<div class="pull-right">
<button type="button" class="btn btn-primary" onclick="if( confirm('Duplicare questa fattura?') ){ $('#form-copy').submit(); }"><i class="fa fa-copy"></i> <?php echo tr('Duplica fattura'); ?></button>
<button type="submit" class="btn btn-success"><i class="fa fa-check"></i> <?php echo tr('Salva modifiche'); ?></button>
</div>
<div class="clearfix"></div>
<div class="row">
@ -42,7 +77,7 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
</div>';
$label = tr('Numero secondario');
} else {
$label = tr('Numero fattura');
$label = tr('Numero fattura');
}
?>
<div class="col-md-3">
@ -109,7 +144,7 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
<div class="row">
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Tipo fattura'); ?>", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, descrizione FROM co_tipidocumento WHERE dir='<?php echo $dir ?>'", "value": "$idtipodocumento$" ]}
{[ "type": "select", "label": "<?php echo tr('Tipo fattura'); ?>", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, descrizione FROM co_tipidocumento WHERE dir='<?php echo $dir; ?>'", "value": "$idtipodocumento$" ]}
</div>
<div class="col-md-3">
@ -120,7 +155,7 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
$ajaxsource = 'conti-acquisti';
}
?>
{[ "type": "select", "label": "<?php echo tr('Conto'); ?>", "name": "idconto", "required": 1, "value": "$idconto$", "ajax-source": "<?php echo $ajaxsource ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Conto'); ?>", "name": "idconto", "required": 1, "value": "$idconto$", "ajax-source": "<?php echo $ajaxsource; ?>" ]}
</div>
<div class="col-md-3">
@ -191,13 +226,13 @@ $da_pagare = $rs3[0]['da_pagare'];
if (($n2 <= 0 && $records[0]['stato'] == 'Emessa') || $differenza != 0) {
?>
<a class="btn btn-sm btn-primary" href="javascript:;" onclick="launch_modal( 'Aggiungi prima nota', '<?php echo $rootdir ?>/add.php?id_module=<?php echo Modules::get('Prima nota')['id'] ?>&iddocumento=<?php echo $id_record ?>&dir=<?php echo $dir ?>', 1 );"><i class="fa fa-euro"></i> Aggiungi prima nota...</a><br><br>
<a class="btn btn-sm btn-primary" href="javascript:;" onclick="launch_modal( 'Aggiungi prima nota', '<?php echo $rootdir; ?>/add.php?id_module=<?php echo Modules::get('Prima nota')['id']; ?>&iddocumento=<?php echo $id_record; ?>&dir=<?php echo $dir; ?>', 1 );"><i class="fa fa-euro"></i> <?php echo tr('Aggiungi prima nota'); ?>...</a><br><br>
<?php
}
if ($records[0]['stato'] == 'Pagato') {
?>
<a class="btn btn-sm btn-primary" href="javascript:;" onclick="if( confirm('Se riapri questa fattura verrà azzerato lo scadenzario e la prima nota. Continuare?') ){ $.post( '<?php echo $rootdir ?>/editor.php?id_module=<?php echo Modules::get($name)['id'] ?>&id_record=<?php echo $id_record ?>', { id_module: '<?php echo Modules::get($name)['id'] ?>', id_record: '<?php echo $id_record ?>', op: 'reopen' }, function(){ location.href='<?php echo $rootdir ?>/editor.php?id_module=<?php echo Modules::get($name)['id'] ?>&id_record=<?php echo $id_record ?>'; } ); }" title="Aggiungi prima nota"><i class="fa fa-folder-open"></i> Riapri fattura...</a>
<a class="btn btn-sm btn-primary" href="javascript:;" onclick="if( confirm('Se riapri questa fattura verrà azzerato lo scadenzario e la prima nota. Continuare?') ){ $.post( '<?php echo $rootdir; ?>/editor.php?id_module=<?php echo Modules::get($name)['id']; ?>&id_record=<?php echo $id_record; ?>', { id_module: '<?php echo Modules::get($name)['id']; ?>', id_record: '<?php echo $id_record; ?>', op: 'reopen' }, function(){ location.href='<?php echo $rootdir; ?>/editor.php?id_module=<?php echo Modules::get($name)['id']; ?>&id_record=<?php echo $id_record; ?>'; } ); }" title="Aggiungi prima nota"><i class="fa fa-folder-open"></i> <?php echo tr('Riapri fattura'); ?>...</a>
<?php
}
?>
@ -206,7 +241,7 @@ if ($records[0]['stato'] == 'Pagato') {
<div class="row">
<div class="col-md-3">
{[ "type": "number", "label": "<?php echo tr('Sconto incondizionato') ?>", "name": "sconto_generico", "value": "$sconto_globale$", "help": "<?php echo tr('Sconto complessivo della fattura.'); ?>", "icon-after": "choice|untprc|$tipo_sconto_globale$"<?php
{[ "type": "number", "label": "<?php echo tr('Sconto incondizionato'); ?>", "name": "sconto_generico", "value": "$sconto_globale$", "help": "<?php echo tr('Sconto complessivo della fattura.'); ?>", "icon-after": "choice|untprc|$tipo_sconto_globale$"<?php
if ($records[0]['stato'] == 'Emessa') {
echo ', "disabled" : 1';
}
@ -250,14 +285,14 @@ if ($records[0]['stato'] == 'Emessa') {
if ($records[0]['stato'] != 'Pagato' && $records[0]['stato'] != 'Emessa') {
if ($dir == 'entrata') {
// Lettura interventi non rifiutati, non fatturati e non collegati a preventivi o contratti
$qi = 'SELECT id FROM in_interventi WHERE idanagrafica='.prepare($records[0]['idanagrafica'])." AND NOT idstatointervento='DENY' AND id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_righe_contratti WHERE idintervento IS NOT NULL)";
$interventi = $dbo->fetchNum($qi);
$int_query = 'SELECT COUNT(*) AS tot FROM in_interventi WHERE idanagrafica='.prepare($records[0]['idanagrafica'])." AND NOT idstatointervento='DENY' AND id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_righe_contratti WHERE idintervento IS NOT NULL)";
$interventi = $dbo->fetchArray($int_query)[0]['tot'];
// Se non trovo niente provo a vedere se ce ne sono per clienti terzi
if (empty($interventi)) {
// Lettura interventi non rifiutati, non fatturati e non collegati a preventivi o contratti (clienti terzi)
$qi = 'SELECT id FROM in_interventi WHERE idclientefinale='.prepare($records[0]['idanagrafica'])." AND NOT idstatointervento='DENY' AND id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_righe_contratti WHERE idintervento IS NOT NULL)";
$interventi = $dbo->fetchNum($qi);
$int_query = 'SELECT COUNT(*) AS tot FROM in_interventi WHERE idclientefinale='.prepare($records[0]['idanagrafica'])." AND NOT idstatointervento='DENY' AND id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_righe_contratti WHERE idintervento IS NOT NULL)";
$interventi = $dbo->fetchArray($int_query)[0]['tot'];
}
echo '
@ -266,16 +301,16 @@ if ($records[0]['stato'] != 'Pagato' && $records[0]['stato'] != 'Emessa') {
</a>';
// Lettura preventivi accettati, in attesa di conferma o in lavorazione
$qp = 'SELECT id FROM co_preventivi WHERE idanagrafica='.prepare($records[0]['idanagrafica'])." AND id NOT IN (SELECT idpreventivo FROM co_righe_documenti WHERE NOT idpreventivo=NULL) AND idstato IN( SELECT id FROM co_statipreventivi WHERE descrizione='Accettato' OR descrizione='In lavorazione' OR descrizione='In attesa di conferma')";
$preventivi = $dbo->fetchNum($qp);
$prev_query = 'SELECT COUNT(*) AS tot FROM co_preventivi WHERE idanagrafica='.prepare($records[0]['idanagrafica'])." AND id NOT IN (SELECT idpreventivo FROM co_righe_documenti WHERE NOT idpreventivo=NULL) AND idstato IN( SELECT id FROM co_statipreventivi WHERE descrizione='Accettato' OR descrizione='In lavorazione' OR descrizione='In attesa di conferma')";
$preventivi = $dbo->fetchArray($prev_query)[0]['tot'];
echo '
<a class="btn btn-sm btn-primary'.(!empty($preventivi) ? '' : ' disabled').'" data-href="'.$rootdir.'/modules/fatture/add_preventivo.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="modal" data-title="Aggiungi preventivo" data-target="#bs-popup">
<i class="fa fa-plus"></i> Preventivo
</a>';
// Lettura contratti accettati, in attesa di conferma o in lavorazione
$qc = 'SELECT id FROM co_contratti WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND id NOT IN (SELECT idcontratto FROM co_righe_documenti WHERE NOT idcontratto=NULL) AND idstato IN( SELECT id FROM co_staticontratti WHERE fatturabile = 1) AND NOT EXISTS (SELECT id FROM co_righe_documenti WHERE co_righe_documenti.idcontratto = co_contratti.id)';
$contratti = $dbo->fetchNum($qc);
$contr_query = 'SELECT COUNT(*) AS tot FROM co_contratti WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND id NOT IN (SELECT idcontratto FROM co_righe_documenti WHERE NOT idcontratto=NULL) AND idstato IN( SELECT id FROM co_staticontratti WHERE fatturabile = 1) AND NOT EXISTS (SELECT id FROM co_righe_documenti WHERE co_righe_documenti.idcontratto = co_contratti.id)';
$contratti = $dbo->fetchArray($contr_query)[0]['tot'];
echo '
<a class="btn btn-sm btn-primary'.(!empty($contratti) ? '' : ' disabled').'" data-href="'.$rootdir.'/modules/fatture/add_contratto.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="modal" data-title="Aggiungi contratto" data-target="#bs-popup">
@ -283,8 +318,8 @@ if ($records[0]['stato'] != 'Pagato' && $records[0]['stato'] != 'Emessa') {
</a>';
// Lettura ddt
$qd = 'SELECT id FROM dt_ddt WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND idstatoddt IN (SELECT id FROM dt_statiddt WHERE descrizione IN(\'Bozza\', \'Parzialmente fatturato\')) AND idtipoddt=(SELECT id FROM dt_tipiddt WHERE dir='.prepare($dir).') AND dt_ddt.id IN (SELECT idddt FROM dt_righe_ddt WHERE dt_righe_ddt.idddt = dt_ddt.id AND (qta - qta_evasa) > 0)';
$ddt = $dbo->fetchNum($qd);
$ddt_query = 'SELECT COUNT(*) AS tot FROM dt_ddt WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND idstatoddt IN (SELECT id FROM dt_statiddt WHERE descrizione IN(\'Bozza\', \'Parzialmente fatturato\')) AND idtipoddt=(SELECT id FROM dt_tipiddt WHERE dir='.prepare($dir).') AND dt_ddt.id IN (SELECT idddt FROM dt_righe_ddt WHERE dt_righe_ddt.idddt = dt_ddt.id AND (qta - qta_evasa) > 0)';
$ddt = $dbo->fetchArray($ddt_query)[0]['tot'];
echo '
<a class="btn btn-sm btn-primary'.(!empty($ddt) ? '' : ' disabled').'" data-href="'.$rootdir.'/modules/fatture/add_ddt.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="modal" data-title="Aggiungi ddt" data-target="#bs-popup">
<i class="fa fa-plus"></i> Ddt
@ -292,7 +327,12 @@ if ($records[0]['stato'] != 'Pagato' && $records[0]['stato'] != 'Emessa') {
}
// Lettura articoli
$articoli = $dbo->fetchNum('SELECT * FROM mg_articoli WHERE qta > 0');
$art_query = 'SELECT COUNT(*) AS tot FROM mg_articoli WHERE attivo = 1';
if ($dir == 'entrata') {
$art_query .= ' AND (qta > 0 OR servizio = 1)';
}
$articoli = $dbo->fetchArray($art_query)[0]['tot'];
echo '
<a class="btn btn-sm btn-primary'.(!empty($articoli) ? '' : ' disabled').'" data-href="'.$rootdir.'/modules/fatture/add_articolo.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="modal" data-title="Aggiungi articolo" data-target="#bs-popup">
<i class="fa fa-plus"></i> Articolo
@ -302,7 +342,7 @@ if ($records[0]['stato'] != 'Pagato' && $records[0]['stato'] != 'Emessa') {
<a class="btn btn-sm btn-primary" data-href="'.$rootdir.'/modules/fatture/add_riga.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="modal" data-title="Aggiungi riga" data-target="#bs-popup">
<i class="fa fa-plus"></i> Riga generica
</a>';
echo '
<a class="btn btn-sm btn-primary" data-href="'.$rootdir.'/modules/fatture/add_descrizione.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="modal" data-title="Aggiungi descrizione" data-target="#bs-popup">
<i class="fa fa-plus"></i> Descrizione
@ -314,42 +354,23 @@ if ($records[0]['stato'] != 'Pagato' && $records[0]['stato'] != 'Emessa') {
<div class="pull-right">
<!-- Stampe -->
<?php
//stampa solo per fatture di vendita
if ($dir == 'entrata') {
$rs2 = $dbo->fetchArray('SELECT piva, codice_fiscale, citta, indirizzo, cap, provincia FROM an_anagrafiche WHERE idanagrafica='.prepare($records[0]['idanagrafica']));
$campi_mancanti = [];
if ($rs2[0]['piva'] == '') {
if ($rs2[0]['codice_fiscale'] == '') {
array_push($campi_mancanti, 'codice fiscale');
}
}
if ($rs2[0]['citta'] == '') {
array_push($campi_mancanti, 'citta');
}
if ($rs2[0]['indirizzo'] == '') {
array_push($campi_mancanti, 'indirizzo');
}
if ($rs2[0]['cap'] == '') {
array_push($campi_mancanti, 'C.A.P.');
}
if ($dir == 'entrata') {
if (sizeof($campi_mancanti) > 0) {
echo "<div class='alert alert-warning'><i class='fa fa-warning'></i> Prima di procedere alla stampa completa i seguenti campi dell'anagrafica:<br/><b>".implode(', ', $campi_mancanti).'</b><br/>
'.Modules::link('Anagrafiche', $records[0]['idanagrafica'], tr('Vai alla scheda anagrafica'), null).'</div>';
} else {
if ($records[0]['descrizione_tipodoc'] == 'Fattura accompagnatoria di vendita') {
?>
<a class="btn btn-info btn-sm pull-right" href="<?php echo $rootdir ?>/pdfgen.php?ptype=fatture_accompagnatorie&iddocumento=<?php echo $id_record ?>" target="_blank"><i class="fa fa-print"></i> Stampa fattura</a>
<?php
} else {
?>
<a class="btn btn-info btn-sm pull-right" href="<?php echo $rootdir ?>/pdfgen.php?ptype=fatture&iddocumento=<?php echo $id_record ?>" target="_blank"><i class="fa fa-print"></i> Stampa fattura</a>
<?php
}
}
}
if (sizeof($campi_mancanti) > 0) {
/*echo "<div class='alert alert-warning'><i class='fa fa-warning'></i> Prima di procedere alla stampa completa i seguenti campi dell'anagrafica:<br/><b>".implode(', ', $campi_mancanti).'</b><br/>
'.Modules::link('Anagrafiche', $records[0]['idanagrafica'], tr('Vai alla scheda anagrafica'), null).'</div>';*/
echo '<a class="btn btn-info btn-sm pull-right disabled" class="disabled" ><i class="fa fa-print"></i> Stampa fattura</a>';
} else {
if ($records[0]['descrizione_tipodoc'] == 'Fattura accompagnatoria di vendita') {
?>
<a class="btn btn-info btn-sm pull-right" href="<?php echo $rootdir; ?>/pdfgen.php?ptype=fatture_accompagnatorie&iddocumento=<?php echo $id_record; ?>" target="_blank"><i class="fa fa-print"></i> Stampa fattura</a>
<?php
} else {
?>
<a class="btn btn-info btn-sm pull-right" href="<?php echo $rootdir; ?>/pdfgen.php?ptype=fatture&iddocumento=<?php echo $id_record; ?>" target="_blank"><i class="fa fa-print"></i> Stampa fattura</a>
<?php
}
}
}
?>
</div>
@ -368,7 +389,7 @@ include $docroot.'/modules/fatture/row-list.php';
</div>
</div>
{( "name": "filelist_and_upload", "id_module": "<?php echo $id_module ?>", "id_record": "<?php echo $id_record ?>" )}
{( "name": "filelist_and_upload", "id_module": "<?php echo $id_module; ?>", "id_record": "<?php echo $id_record; ?>" )}
<script type="text/javascript">
$('#idanagrafica').change( function(){

View File

@ -563,7 +563,7 @@ switch (post('op')) {
if (directory($docroot.'/files/interventi')) {
if (post('firma_base64') != '') {
// Salvataggio firma
$firma_file = 'firma_'.time().'.png';
$firma_file = 'firma_'.time().'.jpg';
$firma_nome = post('firma_nome');
$data = explode(',', post('firma_base64'));

View File

@ -49,7 +49,7 @@ if (get('anteprima') !== null) {
}
?>
<form class="canvas" action="<?php echo $rootdir ?>/editor.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>" method="post" id="form-firma">
<form class="canvas" action="<?php echo $rootdir; ?>/editor.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>" method="post" id="form-firma">
<input type="hidden" name="op" value="firma">
<input type="hidden" name="backto" value="record-edit">
@ -90,7 +90,9 @@ if (get('anteprima') !== null) {
saveButton = document.querySelector("[data-action=save]"),
canvas = document.getElementById("canvas");
var signaturePad = new SignaturePad(canvas);
var signaturePad = new SignaturePad(canvas, {
backgroundColor: 'rgb(255,255,255)'
});
function resizeCanvas() {
image_data = signaturePad.toDataURL();
@ -115,7 +117,7 @@ if (get('anteprima') !== null) {
if (signaturePad.isEmpty()) {
alert("Please provide signature first.");
} else {
image_data = signaturePad.toDataURL();
image_data = signaturePad.toDataURL("image/jpeg", 100);
$('#firma_base64').val(image_data);
}
});

View File

@ -0,0 +1,67 @@
<?php
include_once __DIR__.'/../../core.php';
switch (post('op')) {
case 'export-bulk':
$dir = DOCROOT.'/files/export_interventi/';
directory($dir.'tmp/');
// Rimozione dei contenuti precedenti
$files = glob($dir.'/*.zip');
foreach ($files as $file) {
delete($file);
}
// Selezione delle fatture da stampare
$records = $dbo->fetchArray('SELECT in_interventi.id, in_interventi.codice, data_richiesta, ragione_sociale FROM in_interventi INNER JOIN an_anagrafiche ON in_interventi.idanagrafica=an_anagrafiche.idanagrafica WHERE in_interventi.id IN('.implode(',', $id_records).')');
if (!empty($records)) {
foreach ($records as $r) {
//$numero = !empty($r['numero_esterno']) ? $r['numero_esterno'] : $r['numero'];
$numero = $r['codice'];
$numero = str_replace(['/', '\\'], '-', $numero);
// Gestione della stampa
$rapportino_nome = sanitizeFilename($numero.' '.date('Y_m_d', strtotime($r['data_richiesta'])).' '.$r['ragione_sociale'].'.pdf');
$filename = slashes($dir.'tmp/'.$rapportino_nome);
$_GET['idintervento'] = $r['id']; // Fix temporaneo per la stampa
$idintervento = $r['id']; // Fix temporaneo per la stampa
//$ptype = ($r['descrizione'] == 'Fattura accompagnatoria di vendita') ? 'fatture_accompagnatorie' : 'fatture';
$ptype = 'interventi';
require DOCROOT.'/pdfgen.php';
}
$dir = slashes($dir);
$file = slashes($dir.'interventi_'.time().'.zip');
// Creazione zip
if (extension_loaded('zip')) {
create_zip($dir.'tmp/', $file);
// Invio al browser dello zip
download($file);
// Rimozione dei contenuti
delete($dir.'tmp/');
}
}
break;
}
return [
'export-bulk' => [
'text' => tr('Esporta stampe'),
'data' => [
'msg' => tr('Vuoi davvero esportare tutte le stampe in un archivio?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
],
];

View File

@ -189,12 +189,12 @@ switch (post('op')) {
}
}
break;
case 'adddescrizione':
if (!empty($id_record)) {
$descrizione = post('descrizione');
$query = 'INSERT INTO or_righe_ordini(idordine, descrizione, is_descrizione) VALUES('.prepare($id_record).', '.prepare($descrizione).', 1)';
if ($dbo->query($query)) {
$_SESSION['infos'][] = tr('Riga descrittiva aggiunta!');
}
@ -287,10 +287,10 @@ switch (post('op')) {
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
$desc_iva = $rs[0]['descrizione'];
if($is_descrizione==0){
if ($is_descrizione == 0) {
// Modifica riga generica sul documento
$query = 'UPDATE or_righe_ordini SET idiva='.prepare($idiva).', desc_iva='.prepare($rs[0]['descrizione']).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', qta='.prepare($qta).' WHERE id='.prepare($idriga);
}else{
} else {
$query = 'UPDATE or_righe_ordini SET descrizione='.prepare($descrizione).' WHERE id='.prepare($idriga);
}
if ($dbo->query($query)) {
@ -313,7 +313,7 @@ switch (post('op')) {
$rs = $dbo->fetchArray($query);
foreach ($rs as $value) {
$non_rimovibili = seriali_non_rimuovibili('id_riga_documenti', $value['id'], $dir);
$non_rimovibili = seriali_non_rimuovibili('id_riga_documento', $value['id'], $dir);
if (!empty($non_rimovibili)) {
$_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!');

56
modules/partitario/edit.php Normal file → Executable file
View File

@ -11,11 +11,11 @@ $n1 = sizeof($rs1);
// Livello 1
for ($x = 0; $x < $n1; ++$x) {
$totale_attivita = 0.00;
$totale_passivita = 0.00;
$totale_attivita = [];
$totale_passivita = [];
$costi = 0.00;
$ricavi = 0.00;
$costi = [];
$ricavi = [];
if ($rs1[$x]['descrizione'] == 'Economico') {
echo "<hr><h2 class=\"pull-left\">Conto economico</h2>\n";
@ -54,7 +54,7 @@ for ($x = 0; $x < $n1; ++$x) {
echo " <table class='table table-striped table-hover table-condensed' style='margin-bottom:0;'>\n";
for ($z = 0; $z < $n3; ++$z) {
$totale_conto_liv3 = 0.00;
$totale_conto_liv3 = [];
echo " <tr><td>\n";
@ -102,7 +102,7 @@ for ($x = 0; $x < $n1; ++$x) {
echo ' <div id="conto_'.$rs3[$z]['id']."\" style=\"display:none;\">\n";
if (sizeof($rs) > 0) {
$totale_conto_liv3 = 0.00;
$totale_conto_liv3 = [];
echo " <table class='table table-bordered table-hover table-condensed table-striped'>\n";
echo " <tr><th>Causale</th>\n";
@ -117,7 +117,7 @@ for ($x = 0; $x < $n1; ++$x) {
if ($rs[$i]['iddocumento'] != '') {
$module = ($rs[$i]['dir'] == 'entrata') ? Modules::get('Fatture di vendita')['id'] : Modules::get('Fatture di acquisto')['id'];
echo "<a data-toggle='modal' data-title='Dettagli movimento...' data-target='#bs-popup' class='clickable' data-href='".$rootdir.'/modules/partitario/dettagli_movimento.php?id_movimento='.$rs[$i]['id'].'&id_conto='.$rs[$i]['idconto'].'&id_module='.$module."' >".$rs[$i]['descrizione']."</a>\n";
// echo " <a href='".$rootdir.'/editor.php?id_module='.$module.'&id_record='.$rs[$i]['iddocumento']."'>".$rs[$i]['descrizione']."</a>\n";
// echo " <a href='".$rootdir.'/editor.php?id_module='.$module.'&id_record='.$rs[$i]['iddocumento']."'>".$rs[$i]['descrizione']."</a>\n";
} else {
echo ' <span>'.$rs[$i]['descrizione']."</span>\n";
}
@ -137,9 +137,9 @@ for ($x = 0; $x < $n1; ++$x) {
echo " <td></td></tr>\n";
if ($rs1[$x]['descrizione'] == 'Patrimoniale') {
$totale_conto_liv3 += $rs[$i]['totale'];
$totale_conto_liv3[] = $rs[$i]['totale'];
} else {
$totale_conto_liv3 -= $rs[$i]['totale'];
$totale_conto_liv3[] = -$rs[$i]['totale'];
}
}
@ -150,9 +150,9 @@ for ($x = 0; $x < $n1; ++$x) {
echo " </td>\n";
if ($rs1[$x]['descrizione'] == 'Patrimoniale') {
$totale_conto_liv3 += $rs[$i]['totale'];
$totale_conto_liv3[] = $rs[$i]['totale'];
} else {
$totale_conto_liv3 -= $rs[$i]['totale'];
$totale_conto_liv3[] = -$rs[$i]['totale'];
}
}
echo " </td></tr>\n";
@ -160,16 +160,16 @@ for ($x = 0; $x < $n1; ++$x) {
// Somma dei totali
if ($rs1[$x]['descrizione'] == 'Patrimoniale') {
if ($totale_conto_liv3 > 0) {
$totale_attivita += $totale_conto_liv3;
if (sum($totale_conto_liv3) > 0) {
$totale_attivita[] = abs(sum($totale_conto_liv3));
} else {
$totale_passivita += $totale_conto_liv3;
$totale_passivita[] = abs(sum($totale_conto_liv3));
}
} else {
if ($totale_conto_liv3 > 0) {
$totale_ricavi += $totale_conto_liv3;
if (sum($totale_conto_liv3) > 0) {
$totale_ricavi[] = abs(sum($totale_conto_liv3));
} else {
$totale_costi += $totale_conto_liv3;
$totale_costi[] = abs(sum($totale_conto_liv3));
}
}
echo " </table>\n";
@ -178,7 +178,7 @@ for ($x = 0; $x < $n1; ++$x) {
echo " </td>\n";
echo " <td width='100' align='right' valign='top'>\n";
echo Translator::numberToLocale($totale_conto_liv3)." &euro;\n";
echo Translator::numberToLocale(sum($totale_conto_liv3))." &euro;\n";
echo " </td></tr>\n";
} // Fine livello3
@ -193,9 +193,9 @@ for ($x = 0; $x < $n1; ++$x) {
if ($rs1[$x]['descrizione'] == 'Patrimoniale') {
// Riepilogo
$attivita = abs($totale_attivita);
$passivita = abs($totale_passivita);
$utile_perdita = abs($totale_ricavi) - abs($totale_costi);
$attivita = abs(sum($totale_attivita));
$passivita = abs(sum($totale_passivita));
$utile_perdita = abs(sum($totale_ricavi)) - abs(sum($totale_costi));
if ($utile_perdita < 0) {
$pareggio1 = $attivita + abs($utile_perdita);
$pareggio2 = abs($passivita);
@ -230,7 +230,7 @@ for ($x = 0; $x < $n1; ++$x) {
echo " <p align='right'><big>Perdita d'esercizio:</big></p>\n";
echo "</th>\n";
echo "<td align='right'>\n";
echo " <p align='right'><big>".Translator::numberToLocale($utile_perdita)." &euro;</big></p>\n";
echo " <p align='right'><big>".Translator::numberToLocale(sum($utile_perdita))." &euro;</big></p>\n";
echo "</td>\n";
echo "<td></td>\n";
echo "<td></td><td></td></tr>\n";
@ -239,7 +239,7 @@ for ($x = 0; $x < $n1; ++$x) {
echo " <p align='right'><big>Utile:</big></p>\n";
echo "</th>\n";
echo "<td align='right'>\n";
echo " <p align='right'><big>".Translator::numberToLocale($utile_perdita)." &euro;</big></p>\n";
echo " <p align='right'><big>".Translator::numberToLocale(sum($utile_perdita))." &euro;</big></p>\n";
echo "</td></tr>\n";
}
@ -248,7 +248,7 @@ for ($x = 0; $x < $n1; ++$x) {
echo " <p align='right'><big>Totale a pareggio:</big></p>\n";
echo "</th>\n";
echo "<td align='right'>\n";
echo " <p align='right'><big>".Translator::numberToLocale($pareggio1)." &euro;</big></p>\n";
echo " <p align='right'><big>".Translator::numberToLocale(sum($pareggio1))." &euro;</big></p>\n";
echo "</td>\n";
echo "<td></td>\n";
@ -257,13 +257,13 @@ for ($x = 0; $x < $n1; ++$x) {
echo " <p align='right'><big>Totale a pareggio:</big></p>\n";
echo "</th>\n";
echo "<td align='right'>\n";
echo " <p align='right'><big>".Translator::numberToLocale($pareggio2)." &euro;</big></p>\n";
echo " <p align='right'><big>".Translator::numberToLocale(sum($pareggio2))." &euro;</big></p>\n";
echo "</td></tr>\n";
echo '</table>';
} else {
echo "<p align='right'><big><b>RICAVI:</b> ".Translator::numberToLocale($totale_ricavi)." &euro;</big></p>\n";
echo "<p align='right'><big><b>COSTI:</b> ".Translator::numberToLocale(abs($totale_costi))." &euro;</big></p>\n";
echo "<p align='right'><big><b>UTILE/PERDITA:</b> ".Translator::numberToLocale($totale_ricavi - abs($totale_costi))." &euro;</big></p>\n";
echo "<p align='right'><big><b>RICAVI:</b> ".Translator::numberToLocale(sum($totale_ricavi))." &euro;</big></p>\n";
echo "<p align='right'><big><b>COSTI:</b> ".Translator::numberToLocale(sum(abs($totale_costi)))." &euro;</big></p>\n";
echo "<p align='right'><big><b>UTILE/PERDITA:</b> ".Translator::numberToLocale(sum($totale_ricavi) - sum(abs($totale_costi)))." &euro;</big></p>\n";
}
}

View File

@ -38,8 +38,8 @@ $d1 = new DateTime($start);
$d2 = new DateTime($end);
$count = $d1->diff($d2)->m + ($d1->diff($d2)->y * 12) + 1;
$fatturato = $dbo->fetchArray("SELECT SUM(subtotale - sconto) AS totale, YEAR(co_documenti.data) AS year, MONTH(co_documenti.data) AS month FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id WHERE co_tipidocumento.dir='entrata' AND co_tipidocumento.descrizione!='Bozza' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY YEAR(co_documenti.data), MONTH(co_documenti.data) ORDER BY YEAR(co_documenti.data) ASC, MONTH(co_documenti.data) ASC');
$acquisti = $dbo->fetchArray("SELECT SUM(subtotale - sconto) AS totale, YEAR(co_documenti.data) AS year, MONTH(co_documenti.data) AS month FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id WHERE co_tipidocumento.dir='uscita' AND co_tipidocumento.descrizione!='Bozza' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY YEAR(co_documenti.data), MONTH(co_documenti.data) ORDER BY YEAR(co_documenti.data) ASC, MONTH(co_documenti.data) ASC');
$fatturato = $dbo->fetchArray("SELECT SUM(co_righe_documenti.subtotale - co_righe_documenti.sconto) AS totale, YEAR(co_documenti.data) AS year, MONTH(co_documenti.data) AS month FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id WHERE co_tipidocumento.dir='entrata' AND co_tipidocumento.descrizione!='Bozza' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY YEAR(co_documenti.data), MONTH(co_documenti.data) ORDER BY YEAR(co_documenti.data) ASC, MONTH(co_documenti.data) ASC');
$acquisti = $dbo->fetchArray("SELECT SUM(co_righe_documenti.subtotale - co_righe_documenti.sconto) AS totale, YEAR(co_documenti.data) AS year, MONTH(co_documenti.data) AS month FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id WHERE co_tipidocumento.dir='uscita' AND co_tipidocumento.descrizione!='Bozza' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY YEAR(co_documenti.data), MONTH(co_documenti.data) ORDER BY YEAR(co_documenti.data) ASC, MONTH(co_documenti.data) ASC');
$month = intval($d1->format('m')) - 1;
for ($i = 0; $i < $count; ++$i) {
@ -111,9 +111,9 @@ $(document).ready(function() {
</script>';
// Clienti top
$clienti = $dbo->fetchArray("SELECT SUM(subtotale - sconto) AS totale, (SELECT COUNT(*) FROM co_documenti WHERE co_documenti.idanagrafica =an_anagrafiche.idanagrafica) AS qta, an_anagrafiche.idanagrafica, an_anagrafiche.ragione_sociale FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_tipidocumento.dir='entrata' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY an_anagrafiche.idanagrafica ORDER BY SUM(subtotale - sconto) DESC LIMIT 15');
$clienti = $dbo->fetchArray("SELECT SUM(co_righe_documenti.subtotale - co_righe_documenti.sconto) AS totale, (SELECT COUNT(*) FROM co_documenti WHERE co_documenti.idanagrafica =an_anagrafiche.idanagrafica) AS qta, an_anagrafiche.idanagrafica, an_anagrafiche.ragione_sociale FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_tipidocumento.dir='entrata' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end).' GROUP BY an_anagrafiche.idanagrafica ORDER BY SUM(subtotale - sconto) DESC LIMIT 15');
$totale = $dbo->fetchArray("SELECT SUM(subtotale - sconto) AS totale FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id WHERE co_tipidocumento.dir='entrata' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end));
$totale = $dbo->fetchArray("SELECT SUM(co_righe_documenti.subtotale - co_righe_documenti.sconto) AS totale FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id WHERE co_tipidocumento.dir='entrata' AND co_documenti.data BETWEEN ".prepare($start).' AND '.prepare($end));
echo '
<div class="row">

View File

@ -86,7 +86,7 @@
},
"scripts": {
"gulp": "gulp",
"release-OSM": "yarn run develop-OSM && gulp release",
"release-OSM": "yarn run develop-OSM && php composer.phar install --no-dev && gulp release",
"develop-OSM": "yarn install && yarn run install-OSM && yarn run assets-OSM",
"install-OSM": "php composer.phar update",
"assets-OSM": "yarn upgrade && yarn run build-OSM",

View File

@ -6,7 +6,7 @@ $default_header$
<br>
<div class="row">
<!-- Dati Fattura -->
<!-- Dati Ddt -->
<div class="col-xs-6">
<div class="text-center" style="height:5mm;">
<b>$tipo_doc$</b>
@ -61,7 +61,7 @@ $default_header$
<td class="border-full" style="height:20mm;">
<p class="small-bold">'.tr('Spett.le', [], ['upper' => true]).'</p>
<p>$c_ragionesociale$</p>
<p>$c_indirizzo$ $c_citta_full$</p>
<p>$c_indirizzo$<br>$c_citta_full$</p>
</td>
</tr>

View File

@ -65,7 +65,7 @@ $default_header$
<td colspan=2 class="border-full" style="height:20mm;">
<p class="small-bold">'.tr('Spett.le', [], ['upper' => true]).'</p>
<p>$c_ragionesociale$</p>
<p>$c_indirizzo$ $c_citta_full$</p>
<p>$c_indirizzo$<br>$c_citta_full$</p>
</td>
</tr>

View File

@ -33,19 +33,7 @@ $keys = [];
// Predisposizione delle informazioni delle anagrafiche per la sostituzione automatica
foreach ($replace as $prefix => $values) {
// Individuazione dei campi minimi
$values = (array) $values;
if ($prefix == 'c_') {
$keys = array_keys($values);
}
// Se l'azienda predefinita non è impostata
if (empty($values) && $prefix == 'f_') {
$values = [];
foreach ($keys as $key) {
$values[$key] = '';
}
}
// Rinominazione dei campi
foreach ($rename as $key => $value) {
@ -53,11 +41,6 @@ foreach ($replace as $prefix => $values) {
unset($values[$key]);
}
// Salvataggio dei campi come variabili PHP
foreach ($values as $key => $value) {
${$prefix.$key} = $value;
}
// Eventuali estensioni dei contenuti
$citta = '';
if (!empty($values['cap'])) {
@ -72,23 +55,37 @@ foreach ($replace as $prefix => $values) {
$values['citta_full'] = $citta;
// Completamento dei campi minimi
if ($key == 'c_') {
$keys = array_unique(array_merge($keys, array_keys($values)));
$replace[$prefix] = $values;
// Individuazione dei campi minimi
$keys = array_merge($keys, array_keys($values));
}
$keys = array_unique($keys);
foreach ($replace as $prefix => $values) {
// Impostazione di default per le informazioni mancanti
foreach ($keys as $key) {
if (!isset($values[$key])) {
$values[$key] = '';
}
}
// Aggiunta delle informazioni per la sostituzione automatica
// Salvataggio dei campi come variabili PHP e aggiunta delle informazioni per la sostituzione automatica
foreach ($values as $key => $value) {
${$prefix.$key} = $value;
$replaces[$prefix.$key] = $value;
}
}
// Valori aggiuntivi per la sostituzione
$replaces = array_merge($replaces, [
'default_header' => include DOCROOT.'/templates/base/header.php',
'default_footer' => include DOCROOT.'/templates/base/footer.php',
'docroot' => DOCROOT,
'rootdir' => ROOTDIR,
'footer' => !empty($footer) ? $footer : '',
'dicitura_fissa_fattura' => get_var('Dicitura fissa fattura'),
'default_header' => include DOCROOT.'/templates/base/header.php',
'default_footer' => include DOCROOT.'/templates/base/footer.php',
]);
unset($replace);

View File

@ -24,7 +24,7 @@ echo "
<th class='text-center' style='width:50%'>".tr('Descrizione', [], ['upper' => true])."</th>
<th class='text-center' style='width:10%'>".tr('Q.tà', [], ['upper' => true])."</th>
<th class='text-center' style='width:15%'>".tr('Prezzo unitario', [], ['upper' => true])."</th>
<th class='text-center' style='width:15%'>".tr('Imponibile', [], ['upper' => true])."</th>
<th class='text-center' style='width:15%'>".tr('Importo', [], ['upper' => true])."</th>
<th class='text-center' style='width:10%'>".tr('IVA', [], ['upper' => true]).' (%)</th>
</tr>
</thead>

View File

@ -4,30 +4,51 @@ echo '
$default_header$
<br>
<div class="text-center" style="height:5mm;">
<b>$tipo_doc$</b>
</div>
<div class="row">
<table class="table table-bordered">
<tr>
<td class="border-full text-center">
<p class="small-bold">'.tr('Nr. documento', [], ['upper' => true]).'</p>
<p>$numero_doc$</p>
</td>
<!-- Dati Ordine -->
<div class="col-xs-6">
<div class="text-center" style="height:5mm;">
<b>$tipo_doc$</b>
</div>
<td class="border-right border-bottom border-top text-center">
<p class="small-bold">'.tr('Data documento', [], ['upper' => true]).'</p>
<p>$data$</p>
</td>
<table class="table table-bordered">
<tr>
<td class="border-full text-center">
<p class="small-bold">'.tr('Nr. documento', [], ['upper' => true]).'</p>
<p>$numero_doc$</p>
</td>
<td class="border-right border-bottom border-top text-center">
<p class="small-bold">'.tr('Pagamanto', [], ['upper' => true]).'</p>
<p>$pagamento$</p>
</td>
<td class="border-right border-bottom border-top text-center">
<p class="small-bold">'.tr('Data documento', [], ['upper' => true]).'</p>
<p>$data$</p>
</td>
<td class="border-right border-bottom border-top center text-center">
<p class="small-bold">'.tr('Foglio', [], ['upper' => true]).'</p>
<p>{PAGENO}/{nb}</p>
</td>
</tr>
</table>';
<td class="border-right border-bottom border-top text-center">
<p class="small-bold">'.tr('Pagamento', [], ['upper' => true]).'</p>
<p>$pagamento$</p>
</td>
<td class="border-right border-bottom border-top center text-center">
<p class="small-bold">'.tr('Foglio', [], ['upper' => true]).'</p>
<p>{PAGENO}/{nb}</p>
</td>
</tr>
</table>
</div>
<!-- Dati Cliente/Fornitore -->
<div class="col-xs-5 col-xs-offset-1">
<table class="table" style="width:100%;margin-top:5mm;">
<tr>
<td class="border-full" style="height:20mm;">
<p class="small-bold">'.tr('Spett.le', [], ['upper' => true]).'</p>
<p>$c_ragionesociale$</p>
<p>$c_indirizzo$<br> $c_citta_full$</p>
</td>
</tr>
</table>
</div>
</div>';

View File

@ -2,7 +2,7 @@
include_once __DIR__.'/../../core.php';
$module_name = 'Preventivi';
$module_name = 'Ordini';
// Lettura info fattura
$records = $dbo->fetchArray('SELECT *, (SELECT descrizione FROM or_tipiordine WHERE or_tipiordine.id=idtipoordine) AS tipo_doc, (SELECT descrizione FROM co_pagamenti WHERE id=idpagamento) AS tipo_pagamento FROM or_ordini WHERE id='.prepare($idordine));

View File

@ -1,5 +1,5 @@
<?php
return [
'header-height' => 55,
'header-height' => 65,
];

View File

@ -51,11 +51,11 @@ if (get('lev') == '3') {
<col width='80'><col width='452'><col width='80'><col width='80'>
<tbody>\n";
// Inizializzo saldo finale
$saldo_finale = 0;
// Inizializzo saldo finale
$saldo_finale = [];
// Calcolo saldo iniziale
$rs = $dbo->fetchArray('SELECT SUM(totale) AS totale FROM co_movimenti WHERE idconto="'.$idconto.'" AND data < "'.$_SESSION['period_start'].'"');
// Calcolo saldo iniziale
$rs = $dbo->fetchArray('SELECT SUM(totale) AS totale FROM co_movimenti WHERE idconto="'.$idconto.'" AND data < "'.$_SESSION['period_start'].'"');
$saldo_iniziale = $rs[0]['totale'];
$saldo_finale = $saldo_iniziale;
@ -82,19 +82,19 @@ if (get('lev') == '3') {
$body .= " <tr><td class='br bb padded text-center'>".Translator::dateToLocale($rs[$i]['data'])."</td><td class='br bb padded'>".$rs[$i]['descrizione']."</td><td class='br bb padded text-right'>".$dare."</td><td class='bb padded text-right'>".$avere."</td></tr>\n";
$saldo_finale += $rs[$i]['totale'];
$saldo_finale[] = $rs[$i]['totale'];
}
if ($saldo_finale < 0) {
if ( sum($saldo_finale) < 0) {
$dare = '';
$avere = abs($saldo_finale);
$avere = abs( sum($saldo_finale) );
} else {
$dare = abs($saldo_finale);
$dare = abs( sum($saldo_finale) );
$avere = '';
}
// Mostro il saldo finale
$body .= " <tr><td class='br bb padded'></td><td class='br bb padded'><b>SALDO FINALE</b></td><td class='br bb padded text-right'><b>".Translator::numberToLocale(abs($dare))."</b></td><td class='bb padded text-right'><b>".Translator::numberToLocale(abs($avere))."</b></td></tr>\n";
// Mostro il saldo finale
$body .= " <tr><td class='br bb padded'></td><td class='br bb padded'><b>SALDO FINALE</b></td><td class='br bb padded text-right'><b>".Translator::numberToLocale( abs( sum($dare) ) )."</b></td><td class='bb padded text-right'><b>".Translator::numberToLocale( abs( sum($avere) ) )."</b></td></tr>\n";
$body .= " </tbody>
</table>\n";
@ -106,37 +106,38 @@ elseif (get('lev') == '2') {
<col width='80'><col width='452'><col width='80'><col width='80'>
<tbody>\n";
// Ciclo fra i sotto-conti di livello 2
$rs3 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2="'.$idconto.'"');
// Ciclo fra i sotto-conti di livello 2
$rs3 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2="'.$idconto.'"');
for ($z = 0; $z < sizeof($rs3); ++$z) {
$v_dare = [];
$v_avere = [];
// Inizializzo saldo finale
$saldo_finale = 0;
$saldo_finale = [];
// Calcolo saldo iniziale
$rs = $dbo->fetchArray('SELECT SUM(totale) AS totale FROM co_movimenti WHERE idconto="'.$rs3[$z]['id'].'" AND data < "'.$_SESSION['period_start'].'"');
// Calcolo saldo iniziale
$rs = $dbo->fetchArray('SELECT SUM(totale) AS totale FROM co_movimenti WHERE idconto="'.$rs3[$z]['id'].'" AND data < "'.$_SESSION['period_start'].'"');
$saldo_iniziale = $rs[0]['totale'];
$saldo_finale = $saldo_iniziale;
$saldo_finale[] = $saldo_iniziale;
if ($saldo_iniziale < 0) {
$dare = '';
$avere = abs($saldo_iniziale);
if ( $saldo_iniziale < 0) {
$v_avere[] = abs( $saldo_iniziale );
} else {
$dare = abs($saldo_iniziale);
$avere = '';
$v_dare[] = abs( $saldo_iniziale );
}
$rs = $dbo->fetchArray('SELECT * FROM co_movimenti WHERE idconto="'.$rs3[$z]['id'].'" AND data >= "'.$_SESSION['period_start'].'" AND data <= "'.$_SESSION['period_end'].'" ORDER BY data ASC');
for ($i = 0; $i < sizeof($rs); ++$i) {
if ($rs[$i]['totale'] >= 0) {
$dare += abs($rs[$i]['totale']);
$v_dare[] = abs($rs[$i]['totale']);
} else {
$avere += abs($rs[$i]['totale']);
$v_avere[] = abs($rs[$i]['totale']);
}
}
$totale = $dare - $avere;
$totale = sum($v_dare) - sum($v_avere);
if ($totale >= 0) {
$dare = Translator::numberToLocale(abs($totale));
@ -146,8 +147,8 @@ elseif (get('lev') == '2') {
$avere = Translator::numberToLocale(abs($totale));
}
// Mostro il saldo finale del conto di livello 3
$body .= " <tr><td class='br bb padded'></td><td class='br bb padded'>".$rs3[$z]['numero'].' '.$rs3[$z]['descrizione']."</td><td class='br bb padded text-right'>".$dare."</td><td class='bb padded text-right'>".$avere."</td></tr>\n";
// Mostro il saldo finale del conto di livello 3
$body .= " <tr><td class='br bb padded'></td><td class='br bb padded'>".$rs3[$z]['numero'].' '.$rs3[$z]['descrizione']."</td><td class='br bb padded text-right'>".$dare."</td><td class='bb padded text-right'>".$avere."</td></tr>\n";
}
$body .= " </tbody>
@ -156,73 +157,73 @@ elseif (get('lev') == '2') {
// Stampa completa bilancio
elseif (get('lev') == '1') {
$ricavi = 0;
$costi = 0;
$totale_attivita = 0;
$totale_passivita = 0;
$ricavi = [];
$costi = [];
$totale_attivita = [];
$totale_passivita = [];
$body .= "<table style='table-layout:fixed; border-bottom:1px solid #777; border-right:1px solid #777; border-left:1px solid #777;' cellpadding='0' cellspacing='0'>
<col width='80'><col width='452'><col width='80'><col width='80'>
<tbody>\n";
// Ciclo fra il conto principale scelto (Economico o Patrimoniale)
$rs1 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti1 WHERE id="'.$idconto.'" ORDER BY numero DESC');
// Ciclo fra il conto principale scelto (Economico o Patrimoniale)
$rs1 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti1 WHERE id="'.$idconto.'" ORDER BY numero DESC');
for ($x = 0; $x < sizeof($rs1); ++$x) {
// Ciclo fra i sotto-conti di livello 1
$rs2 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti2 WHERE idpianodeiconti1="'.$rs1[$x]['id'].'"');
$rs2 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti2 WHERE idpianodeiconti1="'.$rs1[$x]['id'].'"');
for ($y = 0; $y < sizeof($rs2); ++$y) {
$body .= " <tr><th class='bb padded' colspan='4'><b>".$rs2[$y]['numero'].' '.$rs2[$y]['descrizione']."</b></th></tr>\n";
// Ciclo fra i sotto-conti di livello 2
$rs3 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2="'.$rs2[$y]['id'].'"');
// Ciclo fra i sotto-conti di livello 2
$rs3 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2="'.$rs2[$y]['id'].'"');
for ($z = 0; $z < sizeof($rs3); ++$z) {
$dare = 0;
$avere = 0;
$v_dare = [];
$v_avere = [];
$rs = $dbo->fetchArray('SELECT * FROM co_movimenti WHERE idconto="'.$rs3[$z]['id'].'" AND data >= "'.$_SESSION['period_start'].'" AND data <= "'.$_SESSION['period_end'].'" ORDER BY data ASC');
for ($i = 0; $i < sizeof($rs); ++$i) {
if ($rs[$i]['totale'] >= 0) {
$dare += abs($rs[$i]['totale']);
$v_dare[] = abs($rs[$i]['totale']);
} else {
$avere += abs($rs[$i]['totale']);
$v_avere[] = abs($rs[$i]['totale']);
}
}
$totale = $dare - $avere;
$totale = sum($v_dare) - sum($v_avere);
if ($totale >= 0) {
$dare = abs($totale);
$avere = 0;
$totale_attivita += $dare;
$costi += abs($dare);
$totale_attivita[] = $dare;
$costi[] = abs($dare);
} else {
$dare = 0;
$avere = abs($totale);
$totale_passivita += $avere;
$ricavi += abs($avere);
$totale_passivita[] = $avere;
$ricavi[] = abs($avere);
}
// Mostro il saldo finale del conto di livello 3
$body .= " <tr><td class='br bb padded'></td><td class='br bb padded'>".$rs3[$z]['numero'].' '.$rs3[$z]['descrizione']."</td><td class='br bb padded text-right'>".Translator::numberToLocale(abs($dare))."</td><td class='bb padded text-right'>".Translator::numberToLocale(abs($avere))."</td></tr>\n";
// Mostro il saldo finale del conto di livello 3
$body .= " <tr><td class='br bb padded'></td><td class='br bb padded'>".$rs3[$z]['numero'].' '.$rs3[$z]['descrizione']."</td><td class='br bb padded text-right'>".Translator::numberToLocale(abs($dare))."</td><td class='bb padded text-right'>".Translator::numberToLocale(abs($avere))."</td></tr>\n";
}
}
}
// Stampa "Costi/Ricavi" se conto economico
if ($rs1[0]['descrizione'] == 'Economico') {
$body .= " <tr><th colspan='3' class='br bb padded'>RICAVI</th><th align='right' class='bb padded'>".Translator::numberToLocale($ricavi)."</th></tr>\n";
$body .= " <tr><th colspan='3' class='br bb padded'>COSTI</th><th align='right' class='bb padded'>".Translator::numberToLocale($costi)."</th></tr>\n";
$body .= " <tr><th colspan='3' class='br padded'>UTILE</th><th class='padded' align='right'>".Translator::numberToLocale($ricavi - $costi)."</th></tr>\n";
$body .= " <tr><th colspan='3' class='br bb padded'>RICAVI</th><th align='right' class='bb padded'>".Translator::numberToLocale( sum($ricavi) )."</th></tr>\n";
$body .= " <tr><th colspan='3' class='br bb padded'>COSTI</th><th align='right' class='bb padded'>".Translator::numberToLocale( sum($costi) )."</th></tr>\n";
$body .= " <tr><th colspan='3' class='br padded'>UTILE</th><th class='padded' align='right'>".Translator::numberToLocale( sum($ricavi) - sum($costi) )."</th></tr>\n";
}
// Stampa "Attività/Passività" se stato patrimoniale
else {
$costi = 0;
$ricavi = 0;
$costi = [];
$ricavi = [];
// Ciclo fra il conto economico per calcolare l'utile o la perdita
$rs1 = $dbo->fetchArray('SELECT id, numero, descrizione FROM co_pianodeiconti1 WHERE NOT id="'.$idconto.'" ORDER BY numero DESC');
@ -237,29 +238,29 @@ elseif (get('lev') == '1') {
for ($z = 0; $z < sizeof($rs3); ++$z) {
// Inizializzo saldo finale
$saldo_finale = 0;
$saldo_finale = [];
// Calcolo saldo iniziale
$rs = $dbo->fetchArray('SELECT SUM(totale) AS totale FROM co_movimenti WHERE idconto="'.$rs2[$y]['id'].'" AND data < "'.$_SESSION['period_start'].'"');
$dare = 0;
$avere = 0;
$dare = [];
$avere = [];
$rs = $dbo->fetchArray('SELECT * FROM co_movimenti WHERE idconto="'.$rs3[$z]['id'].'" AND data >= "'.$_SESSION['period_start'].'" AND data <= "'.$_SESSION['period_end'].'" ORDER BY data ASC');
for ($i = 0; $i < sizeof($rs); ++$i) {
if ($rs[$i]['totale'] >= 0) {
$dare += abs($rs[$i]['totale']);
$dare[] = abs($rs[$i]['totale']);
} else {
$avere += abs($rs[$i]['totale']);
$avere[] = abs($rs[$i]['totale']);
}
}
$totale = $dare - $avere;
$totale = sum($dare) - sum($avere);
if ($totale >= 0) {
$costi += abs($totale);
$costi[] = abs($totale);
} else {
$ricavi += abs($totale);
$ricavi[] = abs($totale);
}
}
}
@ -269,9 +270,9 @@ elseif (get('lev') == '1') {
$body .= " </table>\n";
// Tabella di riepilogo finale
$totale_attivita = abs($totale_attivita);
$totale_passivita = abs($totale_passivita);
$utile_perdita = abs($ricavi) - abs($costi);
$totale_attivita = abs( sum($totale_attivita) );
$totale_passivita = abs( sum($totale_passivita) );
$utile_perdita = abs( sum($ricavi) ) - abs( sum($costi) );
if ($utile_perdita < 0) {
$pareggio1 = $totale_attivita + abs($utile_perdita);

View File

@ -3,7 +3,10 @@
include_once __DIR__.'/info.php';
// Retrocompatibilità con le stampe gestite da HTML2PDF
$replaces['pagination'] = str_replace(['{PAGENO}', '{nb}'], ['[[page_cu]]', '[[page_nb]]'], $replaces['pagination']);
$replaces['default_header'] = str_replace(['{PAGENO}', '{nb}'], ['[[page_cu]]', '[[page_nb]]'], $replaces['default_header']);
$replaces['footer'] = str_replace(['{PAGENO}', '{nb}'], ['[[page_cu]]', '[[page_nb]]'], $replaces['footer']);
$replaces['default_footer'] = str_replace(['{PAGENO}', '{nb}'], ['[[page_cu]]', '[[page_nb]]'], $replaces['default_footer']);
$prefixes = [
'c_',

View File

@ -86,6 +86,7 @@ if (!empty($interventi)) {
$int = array_merge($int, get_costi_intervento($int['id']));
$int['sconto'] = ($int['manodopera_addebito'] - $int['manodopera_scontato']) + ($int['viaggio_addebito'] - $int['viaggio_scontato']);
$int['subtotale'] = $int['manodopera_scontato'] + $int['viaggio_scontato'];
$sconto[] = $int['sconto_globale'];
echo '
<tr>
@ -205,7 +206,7 @@ if (!empty($interventi)) {
// Articoli per intervento
foreach ($interventi as $int) {
$righe = $dbo->fetchArray("SELECT *, (SELECT codice FROM mg_articoli WHERE id=idarticolo) AS codice, (SELECT CONCAT_WS(serial, 'SN: ', ', ') FROM mg_prodotti WHERE mg_articoli_interventi.idarticolo = mg_prodotti.id_articolo) AS serials FROM `mg_articoli_interventi` WHERE idintervento =".prepare($int['id']).' ORDER BY idarticolo ASC');
$righe = $dbo->fetchArray("SELECT *, (SELECT codice FROM mg_articoli WHERE id=idarticolo) AS codice, (SELECT CONCAT_WS(serial, 'SN: ', ', ') FROM mg_prodotti WHERE mg_articoli_interventi.idarticolo = mg_prodotti.id_articolo AND mg_prodotti.id_riga_intervento = mg_articoli_interventi.idintervento) AS serials FROM `mg_articoli_interventi` WHERE idintervento =".prepare($int['id']).' ORDER BY idarticolo ASC');
foreach ($righe as $r) {
echo '

View File

@ -7,3 +7,13 @@ ALTER TABLE `zz_files` ADD `id_plugin` int(11) AFTER `id_module`;
-- Aggiunto valore NULL a idarticolo in co_righe2_contratti
-- ALTER TABLE `co_righe2_contratti` CHANGE `idarticolo` `idarticolo` int(11);
-- UPDATE `co_righe2_contratti` SET `idarticolo` = NULL WHERE `idarticolo` = 0;
-- Aggiornamento ORDER BY nei moduli Fatture, DDT, Ordini, Preventivi, Contratti e Interventi
UPDATE `zz_views` SET `order_by` = 'CAST(numero_esterno AS UNSIGNED)' WHERE `name` = 'Numero' AND `id_module` IN (SELECT `id` FROM `zz_modules` WHERE `name` IN ('Fatture di vendita', 'Fatture di acquisto', 'Ordini cliente', 'Ordini fornitore', 'Ddt di vendita', 'Ddt di acquisto'));
UPDATE `zz_views` SET `order_by` = 'CAST(in_interventi.codice AS UNSIGNED)' WHERE `name` = 'Numero' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi');
UPDATE `zz_views` SET `order_by` = 'CAST(numero AS UNSIGNED)' WHERE `name` = 'Numero' AND `id_module` IN (SELECT `id` FROM `zz_modules` WHERE `name` IN ('Ordini Preventivi', 'Contratti'));
-- Query per ignorare i punti nella ricerca in Ragione sociale
-- UPDATE `zz_views` SET `search_inside` = CONCAT('REPLACE(', `query`, ', ''.'', '''') LIKE |search|') WHERE `name` = 'Ragione sociale';