Merge branch 'master' into 2.4.2

This commit is contained in:
Thomas Zilio 2018-07-05 09:18:23 +02:00
commit 0103608070
293 changed files with 12388 additions and 6911 deletions

View File

@ -32,10 +32,9 @@
</Files>
# Disable indexing of php, html, htm, pdf files
ServerSignature Off
<IfModule mod_headers.c>
<FilesMatch "\.(php|html|htm|pdf|log)$">
Header set X-Robots-Tag: "noindex"
</FilesMatch>
Header set X-Robots-Tag: "noindex,nofollow"
</IfModule>
<IfModule mod_rewrite.c>
@ -58,6 +57,10 @@
RewriteRule ^node_modules/ - [F,L]
RewriteRule ^vendor/ - [F,L]
# Disable HTTP TRACE
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
# Prevent hacks
# proc/self/environ? no way!
RewriteCond %{QUERY_STRING} proc/self/environ [OR]

View File

@ -57,7 +57,7 @@ La documentazione ufficiale è disponibile all'indirizzo <https://devcode-it.git
L'installazione del gestionale richiede la presenza di un server web con abilitato il [DBMS MySQL](https://www.mysql.com) e il linguaggio di programmazione [PHP](http://php.net).
- PHP >= 5.6
- MySQL >= 5.0
- MySQL >= 5.6.5
Per ulteriori informazioni sui pacchetti che forniscono questi elementi di default, visitare la sezione [Installazione](https://devcode-it.github.io/openstamanager/installazione.html) della documentazione.

View File

@ -8,6 +8,7 @@ if (!empty($id_plugin)) {
$directory = '/plugins/'.$info['directory'];
$permesso = $info['idmodule_to'];
$id_module = $info['idmodule_to'];
} else {
$info = Modules::get($id_module);
@ -39,176 +40,40 @@ if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
else {
// UPLOAD
if (filter('op') == 'link_file' && !empty($_FILES) && !empty($_FILES['blob']['name'])) {
$nome = filter('nome_allegato');
$nome = !empty($nome) ? $nome : $_FILES['blob']['name'];
$src = $_FILES['blob']['tmp_name'];
$f = pathinfo($_FILES['blob']['name']);
/*
$allowed = [
// Image formats
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'gif' => 'image/gif',
'png' => 'image/png',
'bmp' => 'image/bmp',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'ico' => 'image/x-icon',
// Video formats
'asx' => 'video/asf',
'asf' => 'video/asf',
'wax' => 'video/asf',
'wmv' => 'video/asf',
'wmx' => 'video/asf',
'avi' => 'video/avi',
'divx' => 'video/divx',
'flv' => 'video/x-flv',
'mov' => 'video/quicktime',
'qt' => 'video/quicktime',
'mpg' => 'video/mpeg',
'mpeg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'mp4' => 'video/mp4',
'm4v' => 'video/mp4',
'ogv' => 'video/ogg',
'mkv' => 'video/x-matroska',
// Text formats
'txt' => 'text/plain',
'csv' => 'text/csv',
'tsv' => 'text/tab-separated-values',
'ics' => 'text/calendar',
'rtx' => 'text/richtext',
'css' => 'text/css',
'htm' => 'text/html',
'html' => 'text/html',
// Audio formats
'mp3' => 'audio/mpeg',
'm4a' => 'audio/mpeg',
'm4b' => 'audio/mpeg',
'mp' => 'audio/mpeg',
'm4b' => 'audio/mpeg',
'ra' => 'audio/x-realaudio',
'ram' => 'audio/x-realaudio',
'wav' => 'audio/wav',
'ogg' => 'audio/ogg',
'oga' => 'audio/ogg',
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'wma' => 'audio/wma',
'mka' => 'audio/x-matroska',
// Misc application formats
'rtf' => 'application/rtf',
'js' => 'application/javascript',
'pdf' => 'application/pdf',
'swf' => 'application/x-shockwave-flash',
'class' => 'application/java',
'tar' => 'application/x-tar',
'zip' => 'application/zip',
'gz' => 'application/x-gzip',
'gzip' => 'application/x-gzip',
'rar' => 'application/rar',
'7z' => 'application/x-7z-compressed',
// MS Office formats
'doc' => 'application/msword',
'pot' => 'application/vnd.ms-powerpoint',
'pps' => 'application/vnd.ms-powerpoint',
'ppt' => 'application/vnd.ms-powerpoint',
'wri' => 'application/vnd.ms-write',
'xla' => 'application/vnd.ms-excel',
'xls' => 'application/vnd.ms-excel',
'xlt' => 'application/vnd.ms-excel',
'xlw' => 'application/vnd.ms-excel',
'mdb' => 'application/vnd.ms-access',
'mpp' => 'application/vnd.ms-project',
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'docm' => 'application/vnd.ms-word.document.macroEnabled.12',
'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12',
'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
'sldm' => 'application/vnd.ms-powerpoint.slide.macroEnabled.12',
'onetoc' => 'application/onenote',
'onetoc2' => 'application/onenote',
'onetmp' => 'application/onenote',
'onepkg' => 'application/onenote',
// OpenOffice formats
'odt' => 'application/vnd.oasis.opendocument.text',
'odp' => 'application/vnd.oasis.opendocument.presentation',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
'odg' => 'application/vnd.oasis.opendocument.graphics',
'odc' => 'application/vnd.oasis.opendocument.chart',
'odb' => 'application/vnd.oasis.opendocument.database',
'odf' => 'application/vnd.oasis.opendocument.formula',
// WordPerfect formats
'wp' => 'application/wordperfect',
'wpd' => 'application/wordperfect',
];
if (in_array($f['extension'], array_keys($allowed))) {
*/
do {
$filename = random_string().'.'.$f['extension'];
} while (file_exists($upload_dir.'/'.$filename));
$upload = Uploads::upload($_FILES['blob'], [
'name' => filter('nome_allegato'),
'category' => filter('categoria'),
'id_module' => $id_module,
'id_plugin' => $id_plugin,
'id_record' => $id_record,
]);
// Creazione file fisico
if (move_uploaded_file($src, $upload_dir.'/'.$filename)) {
$dbo->insert('zz_files', [
'nome' => $nome,
'filename' => $filename,
'original' => $_FILES['blob']['name'],
'id_module' => $id_module,
'id_record' => $id_record,
]);
if (!empty($upload)) {
$_SESSION['infos'][] = tr('File caricato correttamente!');
} else {
$_SESSION['errors'][] = tr('Errore durante il caricamento del file!');
}
/*
} else {
$_SESSION['errors'][] = tr('Tipologia di file non permessa!');
}
*/
}
// DELETE
elseif (filter('op') == 'unlink_file' && filter('filename') !== null) {
$filename = filter('filename');
$name = Uploads::delete(filter('filename'), [
'id_module' => $id_module,
'id_plugin' => $id_plugin,
'id_record' => $id_record,
]);
$rs = $dbo->fetchArray('SELECT * FROM zz_files WHERE id_module='.prepare($id_module).' AND id='.prepare(filter('id')).' AND filename='.prepare($filename));
if (delete($upload_dir.'/'.$filename)) {
$query = 'DELETE FROM zz_files WHERE id_module='.prepare($id_module).' AND id='.prepare(filter('id')).' AND filename='.prepare($filename);
if ($dbo->query($query)) {
$_SESSION['infos'][] = tr('File _FILE_ eliminato!', [
'_FILE_' => '"'.$rs[0]['nome'].'"',
]);
}
} else {
$_SESSION['errors'][] = tr("Errore durante l'eliminazione del file _FILE_ in _DIR_!", [
'_FILE_' => '"'.$rs[0]['nome'].'"',
'_DIR_' => '"files/'.$module_dir.'/"',
if (!empty($name)) {
$_SESSION['infos'][] = tr('File _FILE_ eliminato!', [
'_FILE_' => '"'.$name.'"',
]);
} else {
$_SESSION['errors'][] = tr("Errore durante l'eliminazione del file!");
}
}
redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record);
redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.((!empty($options['id_plugin'])) ? '#tab_'.$options['id_plugin'] : ''));
}
} elseif (filter('op') == 'download_file') {
$rs = $dbo->fetchArray('SELECT * FROM zz_files WHERE id_module='.prepare($id_module).' AND id='.prepare(filter('id')).' AND filename='.prepare(filter('filename')));
@ -216,6 +81,7 @@ if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
download($upload_dir.'/'.$rs[0]['filename'], $rs[0]['original']);
} elseif (filter('op') == 'send-email') {
$template = Mail::getTemplate($post['template']);
$id_account = $template['id_smtp'];
// Elenco degli allegati
$attachments = [];
@ -231,7 +97,7 @@ if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
$attachments[] = [
'path' => $filename,
'name' => $print['title'],
'name' => $print['title'].'.pdf',
];
}
@ -264,7 +130,7 @@ if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
}
// Preparazione email
$mail = new Mail();
$mail = new Mail($id_account);
// Conferma di lettura
if (!empty($post['read_notify'])) {
@ -335,30 +201,20 @@ if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
}
if (Modules::getPermission($permesso) == 'r' || Modules::getPermission($permesso) == 'rw') {
// Inclusione di eventuale plugin personalizzato
if (!empty($info['script'])) {
// Inclusione di eventuale plugin personalizzato
if (file_exists(DOCROOT.'/modules/'.$info['module_dir'].'/plugins/custom/'.$info['script'])) {
include DOCROOT.'/modules/'.$info['module_dir'].'/plugins/custom/'.$info['script'];
} elseif (file_exists(DOCROOT.'/modules/'.$info['module_dir'].'/plugins/'.$info['script'])) {
include DOCROOT.'/modules/'.$info['module_dir'].'/plugins/'.$info['script'];
}
include App::filepath('modules/'.$info['module_dir'].'/plugins|custom|', $info['script']);
$dbo->query('COMMIT');
return;
}
// Caricamento helper modulo (verifico se ci sono helper personalizzati)
if (file_exists(DOCROOT.$directory.'/custom/modutil.php')) {
include_once DOCROOT.$directory.'/custom/modutil.php';
} elseif (file_exists(DOCROOT.$directory.'/modutil.php')) {
include_once DOCROOT.$directory.'/modutil.php';
}
include_once App::filepath($directory.'|custom|', 'modutil.php');
// Lettura risultato query del modulo
if (file_exists(DOCROOT.$directory.'/custom/init.php')) {
include DOCROOT.$directory.'/custom/init.php';
} elseif (file_exists(DOCROOT.$directory.'/init.php')) {
include DOCROOT.$directory.'/init.php';
}
include App::filepath($directory.'|custom|', 'init.php');
if (Modules::getPermission($permesso) == 'rw') {
// Esecuzione delle operazioni di gruppo
@ -367,23 +223,14 @@ if (Modules::getPermission($permesso) == 'r' || Modules::getPermission($permesso
$id_records = array_filter($id_records, function ($var) {return !empty($var); });
$id_records = array_unique($id_records);
$bulk = null;
if (file_exists(DOCROOT.$directory.'/custom/bulk.php')) {
$bulk = include DOCROOT.$directory.'/custom/bulk.php';
} elseif (file_exists(DOCROOT.$directory.'/bulk.php')) {
$bulk = include DOCROOT.$directory.'/bulk.php';
}
$bulk = (array) $bulk;
$bulk = include App::filepath($directory.'|custom|', 'bulk.php');
$bulk = empty($bulk) ? [] : $bulk;
if (in_array(post('op'), array_keys($bulk))) {
redirect(ROOTDIR.'/controller.php?id_module='.$id_module, 'js');
} else {
// Esecuzione delle operazioni del modulo
if (file_exists(DOCROOT.$directory.'/custom/actions.php')) {
include DOCROOT.$directory.'/custom/actions.php';
} elseif (file_exists(DOCROOT.$directory.'/actions.php')) {
include DOCROOT.$directory.'/actions.php';
}
include App::filepath($directory.'|custom|', 'actions.php');
// Operazioni generiche per i campi personalizzati
if (post('op') != null) {
@ -407,10 +254,10 @@ if (Modules::getPermission($permesso) == 'r' || Modules::getPermission($permesso
if (starts_with(post('op'), 'add')) {
foreach ($values as $key => $value) {
$dbo->insert('zz_field_record', [
'id_record' => $id_record,
'id_field' => $key,
'value' => $value,
]);
'id_record' => $id_record,
'id_field' => $key,
'value' => $value,
]);
}
}

13
add.php
View File

@ -38,6 +38,9 @@ echo '
echo '
<div class="hide" id="custom_fields_top-add">
<input type="hidden" name="id_module" value="'.$id_module.'">
<input type="hidden" name="id_plugin" value="'.$id_plugin.'">
{( "name": "custom_fields", "id_module": "'.$id_module.'", "id_plugin": "'.$id_plugin.'", "position": "top", "place": "add" )}
</div>
@ -72,17 +75,11 @@ $(document).ready(function(){
echo '
data.'.$key.' = "'.$value.'";';
}
if (file_exists($docroot.$directory.'/custom/actions.php')) {
$url = $rootdir.$directory.'/custom/actions.php';
} elseif (file_exists($docroot.$directory.'/actions.php')) {
$url = $rootdir.$directory.'/actions.php';
}
echo '
$("#form_'.$id_module.'-'.$id_plugin.'").find("form").ajaxForm({
url: "'.$url.'",
url: globals.rootdir + "/actions.php",
beforeSubmit: function(arr, $form, options) {
return $form.parsley().validate();
},
@ -91,7 +88,7 @@ $(document).ready(function(){
success: function(data){
data = data.trim();
if(data && !$("#'.$get['select'].'").val()) {
if(data && $("#'.$get['select'].'").val() !== undefined ) {
result = JSON.parse(data);
$("#'.$get['select'].'").selectSetNew(result.id, result.text);
}

View File

@ -45,5 +45,14 @@ switch (get('op')) {
$_SESSION[$array[0]][$array[1]] = $value;
}
break;
case 'list_attachments':
$id_module = get('id_module');
$id_record = get('id_record');
$id_plugin = get('id_plugin');
echo '{( "name": "filelist_and_upload", "id_module": "'.$id_module.'", "id_record": "'.$id_record.'", "id_plugin": "'.$id_plugin.'" )}';
break;
}

View File

@ -31,11 +31,7 @@ $results['summable'] = [];
if (!empty($result_query) && $result_query != 'menu' && $result_query != 'custom') {
// Conteggio totale
$count_query = 'SELECT COUNT(*) as `tot` FROM ('.$result_query.') AS `count`';
$count = $dbo->fetchArray($count_query);
if (!empty($count)) {
$results['recordsTotal'] = $count[0]['tot'];
}
$results['recordsTotal'] = $dbo->fetchNum($result_query);
// Filtri di ricerica
$search_filters = [];
@ -102,6 +98,7 @@ if (!empty($result_query) && $result_query != 'menu' && $result_query != 'custom
// Query effettiva
$query = str_replace_once('SELECT', 'SELECT SQL_CALC_FOUND_ROWS', $result_query);
$rs = $dbo->fetchArray($query);
// Conteggio dei record filtrati
@ -160,7 +157,7 @@ if (!empty($result_query) && $result_query != 'menu' && $result_query != 'custom
// Icona
if (preg_match('/^color_(.+?)$/', $field, $m)) {
$value = $r['color_title_'.$m[1]] ?: '';
$value = isset($r['color_title_'.$m[1]]) ? $r['color_title_'.$m[1]] : '';
$column['class'] = 'text-center small';
$column['data-background'] = $r[$field];
@ -186,7 +183,7 @@ if (!empty($result_query) && $result_query != 'menu' && $result_query != 'custom
// Colore del testo
if (!empty($column['data-background'])) {
$column['data-color'] = $column['data-color'] ?: color_inverse($column['data-background']);
$column['data-color'] = isset($column['data-color']) ? $column['data-color'] : color_inverse($column['data-background']);
}
// Link della colonna
@ -222,4 +219,5 @@ if (!empty($result_query) && $result_query != 'menu' && $result_query != 'custom
}
}
echo json_encode($results);
$rows = json_encode($results);
echo $rows;

View File

@ -46,7 +46,7 @@ try {
// Richiesta GET (ottenimento elementi)
case 'GET':
// Risorsa specificata
if (!empty($request)) {
if (count($request) > 1) {
$result = $api->retrieve($request);
}
@ -67,5 +67,14 @@ try {
$result = API::error('serverError');
}
json_decode($result);
// Impostazioni di Content-Type e Charset Header
if (json_last_error() == JSON_ERROR_NONE) {
header('Content-Type: application/json; charset=UTF-8');
} else {
header('Content-Type: text/plain; charset=UTF-8');
}
// Stampa dei risultati
echo $result;

View File

@ -364,6 +364,7 @@ span.form-control {
.info-box-text {
white-space: normal;
overflow: auto;
font-size: 12px;
}
.colorpicker,
@ -529,15 +530,17 @@ input.small-width {
}
}
@media screen and (max-width: 768px) {
@media screen and (max-width: 767px) {
.box-center,
.box-center-large {
width: 90%;
margin-top: 20px
}
.main-header .logo {
.main-header .logo {
display: none;
}
/*
.content-wrapper,
.right-side,
@ -583,6 +586,9 @@ input.small-width {
.callout a{
text-decoration: none;
}
.dropdown-menu{
min-width: 130px;
}
/*fix per tabs editor */
.nav-tabs-custom > .nav-tabs > li{
border-top: 3px solid #ddd;
@ -598,4 +604,20 @@ input.small-width {
.nav-tabs-custom > .nav-tabs > li{
margin-bottom:-1px;
margin-right: 0px;
}
}
.ui-autocomplete {
background: #f6f6f6;
border-color: #ccc;
border-color: rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
}
.parsley-errors-list{
color: red;
}

View File

@ -55,7 +55,8 @@
.skin-default .main-header .navbar .nav .open a:hover,
.skin-default .main-header .navbar .nav .open a:focus,
.skin-default .main-header .navbar .nav .active a,
.skin-default .main-header .navbar .nav .actual a {
.skin-default .main-header .navbar .nav .actual a,
.skin-default .main-header .navbar .nav .menu-open a {
background: rgba(0, 0, 0, 0.2);
color: #f6f6f6;
}
@ -132,7 +133,8 @@
.skin-default .sidebar-menu li:hover a,
.skin-default .sidebar-menu li.active a,
.skin-default .sidebar-menu li.actual a {
.skin-default .sidebar-menu li.actual a,
.skin-default .sidebar-menu li.menu-open a {
background: #222;
border-left-color: #222;
}
@ -195,20 +197,4 @@
.skin-default .panel-primary .panel-heading {
border-bottom: 2px solid #57a;
}
.skin-default .ui-autocomplete {
background: #f6f6f6;
border-color: #ccc;
border-color: rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
}
.skin-default .parsley-errors-list{
color: red;
}
}

View File

@ -1,44 +1,8 @@
$(document).ready(function () {
// Fix per il menu principale
var animationSpeed = 500;
$(document).off('click', '.sidebar li a')
.on('click', '.sidebar li a', function (e) {
//Get the clicked link and the next element
var $this = $(this);
var checkElement = $this.next();
//Check if the next element is a menu and is visible
if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible')) && (!$('body').hasClass('sidebar-collapse'))) {
//Close the menu
checkElement.slideUp(animationSpeed, function () {
checkElement.removeClass('menu-open');
});
checkElement.parent("li").removeClass("active");
}
//If the menu is not visible
else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {
//Get the parent menu
var parent = $this.parents('ul').first();
//Close all open menus within the parent
var ul = parent.find('ul:visible').slideUp(animationSpeed);
//Remove the menu-open class from the parent
ul.removeClass('menu-open');
//Get the parent li
var parent_li = $this.parent("li");
//Open the target menu and add the menu-open class
checkElement.slideDown(animationSpeed, function () {
//Add the class active to the parent li
checkElement.addClass('menu-open');
parent.find('li.active').removeClass('active');
parent_li.addClass('active');
});
}
//if this isn't a link, prevent the page from being redirected
if (checkElement.is('.treeview-menu') && $(e.target).is('.pull-right-container')) {
e.preventDefault();
}
});
$('.sidebar-menu').tree({
followLink: true,
});
// Pulsante per il ritorno a inizio pagina
var slideToTop = $("<div />");

17
bug.php
View File

@ -72,13 +72,8 @@ if (filter('op') == 'send') {
}
$pageTitle = tr('Bug');
$jscript_modules[] = App::getPaths()['js'].'/ckeditor/ckeditor.js';
if (file_exists($docroot.'/include/custom/top.php')) {
include $docroot.'/include/custom/top.php';
} else {
include $docroot.'/include/top.php';
}
include_once App::filepath('include|custom|', 'top.php');
if (empty($mail['from_address']) || empty($mail['server'])) {
echo '
@ -191,10 +186,8 @@ echo '
}
});
});
</script>';
</script>
if (file_exists($docroot.'/include/custom/bottom.php')) {
include $docroot.'/include/custom/bottom.php';
} else {
include $docroot.'/include/bottom.php';
}
<script type="text/javascript" charset="utf-8" src="'.App::getPaths()['js'].'/ckeditor/ckeditor.js'.'"></script>';
include_once App::filepath('include|custom|', 'bottom.php');

View File

@ -29,16 +29,18 @@
"filp/whoops": "^2.1",
"ifsnop/mysqldump-php": "^2.3",
"intervention/image": "^2.3",
"ircmaxell/password-compat": "^1.0",
"league/csv": "^8.2",
"maximebf/debugbar": "^1.15",
"monolog/monolog": "^1.22",
"mpdf/mpdf": "^7.0",
"paragonie/random_compat": "^2.0",
"mpdf/mpdf": "^7.1",
"mpociot/vat-calculator": "^2.3",
"phpmailer/phpmailer": "^6.0",
"respect/validation": "^1.1",
"spipu/html2pdf": "^5.0",
"symfony/filesystem": "^3.3",
"symfony/finder": "^3.3",
"symfony/polyfill-ctype": "^1.8",
"symfony/polyfill-php70": "^1.8",
"symfony/translation": "^3.3",
"symfony/var-dumper": "^3.3"
},

View File

@ -5,6 +5,7 @@ $db_host = '|host|';
$db_username = '|username|';
$db_password = '|password|';
$db_name = '|database|';
//$port = '|port|';
// Percorso della cartella di backup
$backup_dir = __DIR__.'/backup/';
@ -40,5 +41,6 @@ $formatter = [
// Ulteriori file CSS e JS da includere
$assets = [
'css' => [],
'print' => [],
'js' => [],
];

View File

@ -8,11 +8,7 @@ if (!empty($id_record) && !empty($id_module)) {
redirect(ROOTDIR.'/index.php');
}
if (file_exists($docroot.'/include/custom/top.php')) {
include $docroot.'/include/custom/top.php';
} else {
include $docroot.'/include/top.php';
}
include_once App::filepath('include|custom|', 'top.php');
// Lettura parametri iniziali del modulo
$module = Modules::get($id_module);
@ -89,8 +85,4 @@ redirectOperation($id_module, $id_record);
// Widget in basso
echo '{( "name": "widgets", "id_module": "'.$id_module.'", "position": "right", "place": "controller" )}';
if (file_exists($docroot.'/include/custom/bottom.php')) {
include $docroot.'/include/custom/bottom.php';
} else {
include $docroot.'/include/bottom.php';
}
include_once App::filepath('include|custom|', 'bottom.php');

View File

@ -1,8 +1,7 @@
<?php
// Impostazioni per la corretta interpretazione di UTF-8
header('Content-Type: text/html; charset=UTF-8');
ob_start();
// Rimozione header X-Powered-By
header_remove('X-Powered-By');
// Impostazioni di configurazione PHP
date_default_timezone_set('Europe/Rome');
@ -39,8 +38,8 @@ if (!empty($redirectHTTPS) && !isHTTPS(true)) {
exit();
}
// Forzamento del debug
// $debug = true;
// Forza l'abilitazione del debug
// $debug = App::debug(true);
// Logger per la segnalazione degli errori
$logger = new Monolog\Logger('Logs');
@ -65,7 +64,7 @@ if (!API::isAPIRequest()) {
// Impostazioni di debug
if (!empty($debug)) {
// Ignoramento degli avvertimenti e delle informazioni relative alla deprecazione di componenti
// Ignora gli avvertimenti e le informazioni relative alla deprecazione di componenti
error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~E_USER_DEPRECATED);
// File di log ordinato in base alla data
@ -95,7 +94,18 @@ if (empty($debug)) {
}
// Imposta il formato di salvataggio dei log
$monologFormatter = new Monolog\Formatter\LineFormatter('[%datetime%] %channel%.%level_name%: %message%'.PHP_EOL.'%extra% '.PHP_EOL);
$pattern = '[%datetime%] %channel%.%level_name%: %message%';
if (!empty($debug)) {
$pattern .= ' %context%';
}
$pattern .= PHP_EOL.'%extra% '.PHP_EOL;
$monologFormatter = new Monolog\Formatter\LineFormatter($pattern);
if (!empty($debug)) {
$monologFormatter->includeStacktraces(true);
}
foreach ($handlers as $handler) {
$handler->setFormatter($monologFormatter);
$logger->pushHandler(new FilterHandler($handler, [$handler->getLevel()]));
@ -127,7 +137,11 @@ $dbo = Database::getConnection();
// Controllo sulla presenza dei permessi di accesso basilari
$continue = $dbo->isInstalled() && !Update::isUpdateAvailable() && (Auth::check() || API::isAPIRequest());
if (!$continue && getURLPath() != slashes(ROOTDIR.'/index.php')) {
if (!empty($skip_permissions)) {
Permissions::skip();
}
if (!$continue && getURLPath() != slashes(ROOTDIR.'/index.php') && !Permissions::getSkip()) {
if (Auth::check()) {
Auth::logout();
}
@ -138,6 +152,9 @@ if (!$continue && getURLPath() != slashes(ROOTDIR.'/index.php')) {
// Operazione aggiuntive (richieste non API)
if (!API::isAPIRequest()) {
// Impostazioni di Content-Type e Charset Header
header('Content-Type: text/html; charset=UTF-8');
/*
// Controllo CSRF
if(!CSRF::getInstance()->validate()){
@ -161,38 +178,34 @@ if (!API::isAPIRequest()) {
// Registrazione globale del template per gli input HTML
register_shutdown_function('translateTemplate');
ob_start();
// Impostazione della sessione di base
$_SESSION['infos'] = array_unique((array) $_SESSION['infos']);
$_SESSION['warnings'] = array_unique((array) $_SESSION['warnings']);
$_SESSION['errors'] = array_unique((array) $_SESSION['errors']);
// Imposto il periodo di visualizzazione dei record dal 01-01-yyy al 31-12-yyyy
if (!empty($_GET['period_start'])) {
$_SESSION['period_start'] = $_GET['period_start'];
$_SESSION['period_end'] = $_GET['period_end'];
} elseif (!isset($_SESSION['period_start'])) {
$_SESSION['period_start'] = date('Y').'-01-01';
$_SESSION['period_end'] = date('Y').'-12-31';
}
$_SESSION['infos'] = isset($_SESSION['infos']) ? array_unique($_SESSION['infos']) : [];
$_SESSION['warnings'] = isset($_SESSION['warnings']) ? array_unique($_SESSION['warnings']) : [];
$_SESSION['errors'] = isset($_SESSION['errors']) ? array_unique($_SESSION['errors']) : [];
// Impostazione del tema grafico di default
$theme = !empty($theme) ? $theme : 'default';
$assets = App::getAssets();
// CSS di base del progetto
$css_modules = $assets['css'];
// JS di base del progetto
$jscript_modules = $assets['js'];
if ($continue) {
$id_module = filter('id_module');
$id_record = filter('id_record');
$id_plugin = filter('id_plugin');
$id_parent = filter('id_parent');
// Periodo di visualizzazione dei record
// Personalizzato
if (!empty($_GET['period_start'])) {
$_SESSION['period_start'] = $_GET['period_start'];
$_SESSION['period_end'] = $_GET['period_end'];
}
// Dal 01-01-yyy al 31-12-yyyy
elseif (!isset($_SESSION['period_start'])) {
$_SESSION['period_start'] = date('Y').'-01-01';
$_SESSION['period_end'] = date('Y').'-12-31';
}
$user = Auth::user();
if (!empty($id_module)) {
@ -200,6 +213,12 @@ if (!API::isAPIRequest()) {
$pageTitle = $module['title'];
// Segmenti
if (!isset($_SESSION['m'.$id_module]['id_segment'])) {
$segments = Modules::getSegments($id_module);
$_SESSION['m'.$id_module]['id_segment'] = isset($segments[0]['id']) ? $segments[0]['id'] : null;
}
Permissions::addModule($id_module);
}

View File

@ -21,7 +21,7 @@ currentMenu: installazione
L'installazione del gestionale richiede la presenza di un server web con abilitato il [DBMS MySQL](https://www.mysql.com) e il linguaggio di programmazione [PHP](http://php.net).
- PHP >= 5.6
- MySQL >= 5.0
- MySQL >= 5.6.5
Per ulteriori informazioni sui pacchetti che forniscono questi elementi di default, visitare la sezione [Installazione](https://devcode-it.github.io/openstamanager/installazione.html) della documentazione.

View File

@ -198,6 +198,8 @@ L'archivio scaricato deve contenere direttamente al proprio interno i contenuti
├── ... - File contententi il codice del modulo
└── MODULE
Alcuni esempi sulla struttura dei moduli personalizzati sono disponibili nella repository https://github.com/devcode-it/example (download effettuabile da [qui](http://openstamanager.com/download/plugin_di_esempio.zip)).
#### update/VERSIONE.sql
Il file `VERSIONE.sql` (dove VERSIONE sta per la versione del modulo con `_`[underscore] al posto di `.`[punto]) contiene le operazioni di installazione del modulo a livello del database, comprendenti la creazione delle tabelle di base del modulo e l'inserimento di ulteriori dati nelle altre tabelle.
@ -221,13 +223,13 @@ $dbo->query("DROP TABLE `tabella`");
Il file `MODULE` è infine il diretto responsabile dell'installazione del modulo poiché definisce tutti i valori caratteristici dello stesso; in caso di sua assenza la cartella compressa viene considerata non corretta.
```ini
module_name = "Nome del modulo"
module_version = "Versione del modulo"
module_directory = "Cartella di installazione del modulo"
module_options = "Operazione da eseguire all'apertura del modulo"
module_icon = "Icona del modulo (Font-Awesome)"
module_compatibility = "Compatibilità del modulo"
module_parent = "Genitore del modulo"
name = "Nome del modulo"
version = "Versione del modulo"
directory = "Cartella di installazione del modulo"
options = "Operazione da eseguire all'apertura del modulo"
icon = "Icona del modulo (Font-Awesome)"
compatibility = "Compatibilità del modulo"
parent = "Genitore del modulo"
```
## Moduli di base

View File

@ -8,11 +8,7 @@ if (empty($id_record) && !empty($id_module)) {
redirect(ROOTDIR.'/index.php');
}
if (file_exists($docroot.'/include/custom/top.php')) {
include $docroot.'/include/custom/top.php';
} else {
include $docroot.'/include/top.php';
}
include_once App::filepath('include|custom|', 'top.php');
// Lettura parametri iniziali del modulo
$module = Modules::get($id_module);
@ -103,7 +99,7 @@ if (empty($records)) {
{( "name": "button", "type": "email", "id_module": "'.$id_module.'", "id_record": "'.$id_record.'" )}
<a class="btn btn-success" id="save">
<i class="fa fa-check"></i> '.tr('Salva modifiche').'
<i class="fa fa-check"></i> '.tr('Salva').'
</a>
</div>
</div>
@ -128,6 +124,10 @@ if (empty($records)) {
}
});
if ($("#pulsanti").hasClass("affix")) {
$("#pulsanti").css("width", $("#tab_0").css("width"));
}
$("#pulsanti").on("affix.bs.affix", function(){
$("#pulsanti").css("width", $("#tab_0").css("width"));
});
@ -146,11 +146,7 @@ if (empty($records)) {
// Pulsanti personalizzati
ob_start();
if (file_exists($docroot.'/modules/'.$module_dir.'/custom/buttons.php')) {
include $docroot.'/modules/'.$module_dir.'/custom/buttons.php';
} elseif (file_exists($docroot.'/modules/'.$module_dir.'/buttons.php')) {
include $docroot.'/modules/'.$module_dir.'/buttons.php';
}
include Modules::filepath($id_module, 'buttons.php');
$buttons = ob_get_clean();
if (!empty($buttons)) {
@ -240,72 +236,71 @@ echo '
</a>';
echo '
<script>';
<script>';
// Se l'utente ha i permessi in sola lettura per il modulo, converto tutti i campi di testo in span
if ($module['permessi'] == 'r') {
?>
$(document).ready( function(){
$('input, textarea, select', 'section.content').attr('readonly', 'true');
$('select, input[type="checkbox"]').prop('disabled', true);
$('a.btn, button, input[type=button], input[type=submit]', 'section.content').hide();
$('a.btn-info, button.btn-info, input[type=button].btn-info', 'section.content').show();
});
<?php
} ?>
if (Modules::getPermission($id_module) == 'r' || !empty($block_edit)) {
$not = (Modules::getPermission($id_module) == 'r') ? '' : '.not(".unblockable")';
var content_was_modified = false;
echo '
$(document).ready(function(){
$("input, textarea, select", "section.content")'.$not.'.attr("readonly", "true");
$("select, input[type=checkbox]")'.$not.'.prop("disabled", true);
$("a.btn, button, input[type=button], input[type=submit]", "section.content")'.$not.'.hide();
$("a.btn-info, a.btn-warning, button.btn-info, button.btn-warning, input[type=button].btn-info", "section.content")'.$not.'.show();
});';
//controllo se digito qualche valore o cambio qualche select
$("input, textarea, select").bind("change paste keyup", function(event) {
if( event.keyCode >= 32 ){
content_was_modified = true;
}
});
}
?>
//tolgo il controllo se sto salvando
$(".btn-success, button[type=submit]").bind("click", function() {
content_was_modified = false;
});
var content_was_modified = false;
// questo controllo blocca il modulo vendita al banco, dopo la lettura con barcode, appare il messaggio di conferma
window.onbeforeunload = function(){
if(content_was_modified) {
return 'Uscire senza salvare?';
}
};
//controllo se digito qualche valore o cambio qualche select
$("input, textarea, select").bind("change paste keyup", function(event) {
if( event.keyCode >= 32 ){
content_was_modified = true;
}
});
//tolgo il controllo se sto salvando
$(".btn-success, button[type=submit]").bind("click", function() {
content_was_modified = false;
});
// questo controllo blocca il modulo vendita al banco, dopo la lettura con barcode, appare il messaggio di conferma
window.onbeforeunload = function(){
if(content_was_modified) {
return 'Uscire senza salvare?';
}
};
<?php
if ($advanced_sessions) {
?>
function getActiveUsers(){
$.getJSON('<?php echo ROOTDIR; ?>/call.php', {
id_module: <?php echo $id_module; ?>,
id_record: <?php echo $id_record; ?>
},
function(data) {
if (data.length != 0) {
$(".info-active").removeClass("hide");
$(".info-active .list").html("");
$.each( data, function( key, val ) {
$(".info-active .list").append("<li>"+val.username+"</li>");
});
}
else $(".info-active").addClass("hide");
});
}
function getActiveUsers(){
$.getJSON('<?php echo ROOTDIR; ?>/call.php', {
id_module: <?php echo $id_module; ?>,
id_record: <?php echo $id_record; ?>
},
function(data) {
if (data.length != 0) {
$(".info-active").removeClass("hide");
$(".info-active .list").html("");
$.each( data, function( key, val ) {
$(".info-active .list").append("<li>"+val.username+"</li>");
});
}
else $(".info-active").addClass("hide");
});
}
getActiveUsers();
getActiveUsers();
setInterval(getActiveUsers, <?php echo get_var('Timeout notifica di presenza (minuti)') * 1000; ?>);
setInterval(getActiveUsers, <?php echo get_var('Timeout notifica di presenza (minuti)') * 1000; ?>);
<?php
}
?>
</script>
</script>
<?php
if (file_exists($docroot.'/include/custom/bottom.php')) {
include $docroot.'/include/custom/bottom.php';
} else {
include $docroot.'/include/bottom.php';
}
include_once App::filepath('include|custom|', 'bottom.php');

View File

@ -121,7 +121,7 @@ gulp.task('srcCSS', function () {
gulp.src([
config.development + '/' + config.paths.css + '/themes/*.{css,scss,less,styl}',
config.main.bowerDirectory + '/adminlte/dist/css/skins/_all-skins.css',
config.main.bowerDirectory + '/admin-lte/dist/css/skins/_all-skins.css',
])
.pipe(gulpIf('*.scss', sass(), gulpIf('*.less', less(), gulpIf('*.styl', stylus()))))
.pipe(autoprefixer({
@ -208,16 +208,16 @@ gulp.task('chartjs', function () {
gulp.task('pdfjs', function () {
gulp.src([
config.main.bowerDirectory + '/pdfjs/web/**/*',
'!' + config.main.bowerDirectory + '/pdfjs/web/cmaps/*',
'!' + config.main.bowerDirectory + '/pdfjs/web/*.map',
'!' + config.main.bowerDirectory + '/pdfjs/web/*.pdf',
config.main.bowerDirectory + '/pdf/web/**/*',
'!' + config.main.bowerDirectory + '/pdf/web/cmaps/*',
'!' + config.main.bowerDirectory + '/pdf/web/*.map',
'!' + config.main.bowerDirectory + '/pdf/web/*.pdf',
])
.pipe(gulp.dest(config.production + '/pdfjs/web'));
gulp.src([
config.main.bowerDirectory + '/pdfjs/build/*',
'!' + config.main.bowerDirectory + '/pdfjs/build/*.map',
config.main.bowerDirectory + '/pdf/build/*',
'!' + config.main.bowerDirectory + '/pdf/build/*.map',
])
.pipe(gulp.dest(config.production + '/pdfjs/build'));
});
@ -265,6 +265,7 @@ gulp.task('release', function () {
'!./vendor/mpdf/mpdf/ttfonts/DejaVuinfo.txt',
'!./vendor/mpdf/mpdf/ttfonts/DejaVu*Condensed*',
'./vendor/maximebf/debugbar/src/DebugBar/Resources/vendor/*',
'./vendor/respect/validation/tests/*',
]);
// Impostazione dello zip

View File

@ -9,11 +9,11 @@ if (Auth::check()) {
</aside><!-- /.content-wrapper -->
<footer class="main-footer">
<a class="hidden-xs" href="https://www.openstamanager.com" title="'.tr("Il gestionale open source per l'assistenza tecnica e la fatturazione").'." target="_blank"><strong>'.tr('OpenSTAManager').'</strong></a>
<span class="pull-right hidden-xs">
<strong>'.tr('Versione').' '.$version.'</strong>
<strong>'.tr('Versione').'</strong> '.$version.'
<small class="text-muted">('.(!empty($revision) ? $revision : tr('In sviluppo')).')</small>
</span>
'.tr('OpenSTAManager').'
</footer>
<div class="modal fade" id="bs-popup" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="true"></div>
@ -28,12 +28,14 @@ if (Auth::check()) {
<script> setInterval("session_keep_alive()", 5*60*1000); </script>';
}
if (!empty($debug)) {
if (App::debug()) {
echo '
<!-- Fix per le icone di debug -->
<style>div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-copy-clipboard:before, div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-database:before, div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-duration:before, div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-memory:before, div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-row-count:before, div.phpdebugbar-widgets-sqlqueries span.phpdebugbar-widgets-stmt-id:before {
font-family: FontAwesome;
}</style>';
echo $debugbarRenderer->render();
}
$custom_css = get_var('CSS Personalizzato');
@ -42,10 +44,6 @@ if (Auth::check()) {
<style>'.$custom_css.'</style>';
}
if (!empty($debugbarRenderer)) {
echo $debugbarRenderer->render();
}
// Rimozione del messaggio automatico riguardante la modifica di valori nella pagina
echo '
<script>

View File

@ -1,5 +1,7 @@
<?php
$result['idarticolo'] = isset($result['idarticolo']) ? $result['idarticolo'] : null;
// Articolo
if (!isset($options['edit_articolo']) || !empty($options['edit_articolo'])) {
echo '

View File

@ -1,5 +1,7 @@
<?php
$result['id'] = isset($result['id']) ? $result['id'] : null;
/*
Form di inserimento riga documento
*/

View File

@ -12,66 +12,93 @@ $calcolo_ritenutaacconto = 0;
// Informazioni aggiuntive per Fatture
if ($module['name'] == 'Fatture di acquisto' || $module['name'] == 'Fatture di vendita') {
// Percentuale rivalsa INPS e Percentuale ritenuta d'acconto
if ($options['action'] == 'edit'){
if($options['dir'] == 'uscita'){
if ($options['action'] == 'edit') {
if ($options['dir'] == 'uscita') {
$show_idrivalsainps = 1;
$show_idritenutaacconto = 1;
$show_calcolo_ritenutaacconto = 1;
} elseif (($options['dir'] == 'entrata' && (get_var('Percentuale rivalsa INPS') != '' || get_var("Percentuale ritenuta d'acconto") != ''))) {
if (get_var('Percentuale rivalsa INPS') != '') {
$show_idrivalsainps = 1;
} else {
$show_idrivalsainps = 0;
}
if (get_var("Percentuale ritenuta d'acconto") != '') {
$show_idritenutaacconto = 1;
} else {
$show_idritenutaacconto = 0;
}
if (get_var("Percentuale ritenuta d'acconto") != '') {
$show_calcolo_ritenutaacconto = 1;
} else {
$show_calcolo_ritenutaacconto = 0;
}
}
else if (($options['dir'] == 'entrata' && ( get_var('Percentuale rivalsa INPS') != '' || get_var("Percentuale ritenuta d'acconto") != ''))) {
if( get_var('Percentuale rivalsa INPS') != '' ){ $show_idrivalsainps = 1; }else{ $show_idrivalsainps = 0; }
if( get_var("Percentuale ritenuta d'acconto") != '' ){ $show_idritenutaacconto = 1; }else{ $show_idritenutaacconto = 0; }
if( get_var("Percentuale ritenuta d'acconto") != '' ){ $show_calcolo_ritenutaacconto = 1; }else{ $show_calcolo_ritenutaacconto = 0; }
}
$idrivalsainps = $result['idrivalsainps'];
$idritenutaacconto = $result['idritenutaacconto'];
$calcolo_ritenutaacconto = $result['calcolo_ritenutaacconto'];
}
else if ($options['action'] == 'add'){
if($options['dir'] == 'uscita'){
} elseif ($options['action'] == 'add') {
if ($options['dir'] == 'uscita') {
$show_idrivalsainps = 1;
$show_idritenutaacconto = 1;
$show_calcolo_ritenutaacconto = 1;
$idrivalsainps = "";
$idritenutaacconto = "";
$idrivalsainps = '';
$idritenutaacconto = '';
$calcolo_ritenutaacconto = get_var("Metodologia calcolo ritenuta d'acconto predefinito");
}
else if ($options['dir'] == 'entrata' && $options['op']=='addriga' && ( get_var('Percentuale rivalsa INPS') != '' || get_var("Percentuale ritenuta d'acconto") != '')) {
if( get_var('Percentuale rivalsa INPS') != '' ){ $show_idrivalsainps = 1; }else{ $show_idrivalsainps = 0; }
if( get_var("Percentuale ritenuta d'acconto") != '' ){ $show_idritenutaacconto = 1; }else{ $show_idritenutaacconto = 0; }
if( get_var("Percentuale ritenuta d'acconto") != '' ){ $show_calcolo_ritenutaacconto = 1; }else{ $show_calcolo_ritenutaacconto = 0; }
} elseif ($options['dir'] == 'entrata' && $options['op'] == 'addriga' && (get_var('Percentuale rivalsa INPS') != '' || get_var("Percentuale ritenuta d'acconto") != '')) {
if (get_var('Percentuale rivalsa INPS') != '') {
$show_idrivalsainps = 1;
} else {
$show_idrivalsainps = 0;
}
if (get_var("Percentuale ritenuta d'acconto") != '') {
$show_idritenutaacconto = 1;
} else {
$show_idritenutaacconto = 0;
}
if (get_var("Percentuale ritenuta d'acconto") != '') {
$show_calcolo_ritenutaacconto = 1;
} else {
$show_calcolo_ritenutaacconto = 0;
}
$idrivalsainps = get_var('Percentuale rivalsa INPS');
$idritenutaacconto = get_var("Percentuale ritenuta d'acconto");
$calcolo_ritenutaacconto = get_var("Metodologia calcolo ritenuta d'acconto predefinito");
}
//Caso particolare per aggiunta articolo in fatture di vendita
else if($options['dir'] == 'entrata' && $options['op']=='addarticolo' && ( get_var('Percentuale rivalsa INPS') != '' || get_var("Percentuale ritenuta d'acconto") != '')){
if( get_var('Percentuale rivalsa INPS') != '' ){ $show_idrivalsainps = 1; }else{ $show_idrivalsainps = 0; }
if( get_var("Percentuale ritenuta d'acconto") != '' ){ $show_idritenutaacconto = 1; }else{ $show_idritenutaacconto = 0; }
if( get_var("Percentuale ritenuta d'acconto") != '' ){ $show_calcolo_ritenutaacconto = 1; }else{ $show_calcolo_ritenutaacconto = 0; }
$idrivalsainps = "";
// Caso particolare per aggiunta articolo in fatture di vendita
elseif ($options['dir'] == 'entrata' && $options['op'] == 'addarticolo' && (get_var('Percentuale rivalsa INPS') != '' || get_var("Percentuale ritenuta d'acconto") != '')) {
if (get_var('Percentuale rivalsa INPS') != '') {
$show_idrivalsainps = 1;
} else {
$show_idrivalsainps = 0;
}
if (get_var("Percentuale ritenuta d'acconto") != '') {
$show_idritenutaacconto = 1;
} else {
$show_idritenutaacconto = 0;
}
if (get_var("Percentuale ritenuta d'acconto") != '') {
$show_calcolo_ritenutaacconto = 1;
} else {
$show_calcolo_ritenutaacconto = 0;
}
$idrivalsainps = '';
$idritenutaacconto = get_var("Percentuale ritenuta d'acconto");
$calcolo_ritenutaacconto = get_var("Metodologia calcolo ritenuta d'acconto predefinito");
}
}
if($show_idrivalsainps==1 || $show_idritenutaacconto==1){
if ($show_idrivalsainps == 1 || $show_idritenutaacconto == 1) {
echo '
<div class="row">';
// Rivalsa INPS
if ( $show_idrivalsainps == 1 ) {
if ($show_idrivalsainps == 1) {
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Rivalsa INPS').'", "name": "idrivalsainps", "value": "'.$idrivalsainps.'", "values": "query=SELECT * FROM co_rivalsainps" ]}
@ -79,21 +106,21 @@ if ($module['name'] == 'Fatture di acquisto' || $module['name'] == 'Fatture di v
}
// Ritenuta d'acconto
if ( $show_idritenutaacconto == 1 ) {
if ($show_idritenutaacconto == 1) {
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr("Ritenuta d'acconto").'", "name": "idritenutaacconto", "value": "'.$idritenutaacconto.'", "values": "query=SELECT * FROM co_ritenutaacconto" ]}
</div>';
}
//Calcola ritenuta d'acconto su
if ( $show_calcolo_ritenutaacconto == 1 ) {
// Calcola ritenuta d'acconto su
if ($show_calcolo_ritenutaacconto == 1) {
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr("Calcola ritenuta d'acconto su").'", "name": "calcolo_ritenutaacconto", "value": "'.$calcolo_ritenutaacconto.'", "values": "list=\"Imponibile\":\"Imponibile\", \"Imponibile + rivalsa inps\":\"Imponibile + rivalsa inps\"", "required": "1" ]}
</div>';
}
echo '
</div>';
}

View File

@ -1,6 +1,6 @@
<?php
include_once __DIR__.'/../core.php';
include_once __DIR__.'/../../core.php';
$valid_config = isset($db_host) && isset($db_name) && isset($db_username) && isset($db_password);
@ -11,11 +11,7 @@ if (file_exists('config.inc.php') && $valid_config && $dbo->isConnected()) {
$pageTitle = tr('Configurazione');
if (file_exists($docroot.'/include/custom/top.php')) {
include_once $docroot.'/include/custom/top.php';
} else {
include_once $docroot.'/include/top.php';
}
include_once App::filepath('include|custom|', 'top.php');
// Controllo sull'esistenza di nuovi parametri di configurazione
if (post('db_host') !== null) {
@ -239,27 +235,42 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) {
return result;
});
$("#install").on("click", function(){
if($(this).closest("form").parsley().validate()){
prev_html = $("#install").html();
$("#install").html("<i class=\'fa fa-spinner fa-pulse fa-fw\'></i> '.tr('Attendere').'...");
$("#install").prop(\'disabled\', true);
$("#test").prop(\'disabled\', true);
$("#config-form").submit();
}
});
$("#test").on("click", function(){
if($(this).closest("form").parsley().validate()){
prev_html = $("#test").html();
$("#test").html("<i class=\'fa fa-spinner fa-pulse fa-fw\'></i> '.tr("Attendere").'...");
$("#test").prop(\'disabled\', true);
$("#test").html("<i class=\'fa fa-spinner fa-pulse fa-fw\'></i> '.tr('Attendere').'...");
$("#test").prop(\'disabled\', true);
$("#install").prop(\'disabled\', true);
$(this).closest("form").ajaxSubmit({
url: "'.$rootdir.'/index.php",
data: {
test: 1,
},
type: "post",
type: "post",
success: function(data){
data = parseFloat(data.trim());
$("#test").html(prev_html);
$("#test").prop(\'disabled\', false);
$("#test").prop(\'disabled\', false);
$("#install").prop(\'disabled\', false);
if(data == 0){
swal("'.tr('Errore della configurazione').'", "'.tr('La configurazione non è corretta').'.", "error");
} else if(data == 1){
swal("'.tr('Permessi insufficienti').'", "'.tr("L'utente non possiede permessi sufficienti per il corretto funzionamento del software").'.", "error");
swal("'.tr('Permessi insufficienti').'", "'.tr("L'utente non possiede permessi sufficienti per il testing della connessione. Potresti rilevare problemi in fase di installazione.").'.", "error");
} else {
swal("'.tr('Configurazione corretta').'", "'.tr('Ti sei connesso con successo al database').'. '.tr("Clicca su 'Installa' per proseguire").'.", "success");
}
@ -282,7 +293,6 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) {
<div class="box-body" id="smartwizard">';
// REQUISITI PER IL CORRETTO FUNZIONAMENTO
echo '
<ul>
<li><a href="#step-1">
@ -300,154 +310,12 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) {
<div id="steps">
<div id="step-1">
<p>'.tr('Benvenuto in <strong>OpenSTAManager</strong>!').'</p>
<p>'.tr("Prima di procedere alla configurazione e all'installazione del software, sono necessari alcuni accorgimenti per garantire il corretto funzionamento del gestionale").'. '.tr('Stai utilizzando la versione PHP _PHP_', [
'_PHP_' => phpversion(),
]).'.</p>
<hr>';
<div id="step-1">';
// REQUISITI PER IL CORRETTO FUNZIONAMENTO
include __DIR__.'/requirements.php';
// Estensioni di PHP
echo '
<div class="row">
<div class="col-md-6">
<p>'.tr('Le seguenti estensioni PHP devono essere abilitate dal file di configurazione _FILE_', [
'_FILE_' => '<b>php.ini</b>',
]).':</p>
<div class="list-group">';
$extensions = [
'zip' => tr("Necessario per l'utilizzo delle funzioni di aggiornamento automatico e backup, oltre che per eventuali moduli aggiuntivi"),
'pdo_mysql' => tr('Necessario per la connessione al database'),
'openssl' => tr('Utile per la generazione di chiavi complesse (facoltativo)'),
'intl' => tr('Utile per la gestione automatizzata della conversione numerica (facoltativo)'),
];
foreach ($extensions as $key => $value) {
$check = extension_loaded($key);
echo '
<div class="list-group-item">
<h4 class="list-group-item-heading">
'.$key;
if ($check) {
echo '
<span class="label label-success pull-right">
<i class="fa fa-check"></i>
</span>';
} else {
echo '
<span class="label label-danger pull-right">
<i class="fa fa-times"></i>
</span>';
}
echo '
</h4>
<p class="list-group-item-text">'.$value.'</p>
</div>';
}
echo '
</div>
<hr>
</div>';
// Impostazione di valore per PHP
echo '
<div class="col-md-6">
<p>'.tr('Le seguenti impostazioni PHP devono essere modificate nel file di configurazione _FILE_', [
'_FILE_' => '<b>php.ini</b>',
]).':</p>
<div class="list-group">';
$values = [
'display_errors' => true,
'upload_max_filesize' => '>16M',
'post_max_size' => '>16M',
];
foreach ($values as $key => $value) {
$ini = str_replace(['k', 'M'], ['000', '000000'], ini_get($key));
$real = str_replace(['k', 'M'], ['000', '000000'], $value);
if (starts_with($real, '>')) {
$check = $ini >= substr($real, 1);
} elseif (starts_with($real, '<')) {
$check = $ini <= substr($real, 1);
} else {
$check = ($real == $ini);
}
if (is_bool($value)) {
$value = !empty($value) ? 'On' : 'Off';
} else {
$value = str_replace(['>', '<'], '', $value);
}
echo '
<div class="list-group-item">
<h4 class="list-group-item-heading">
'.$key;
if ($check) {
echo '
<span class="label label-success pull-right">
<i class="fa fa-check"></i>
</span>';
} else {
echo '
<span class="label label-danger pull-right">
<i class="fa fa-times"></i>
</span>';
}
echo '
</h4>
<p class="list-group-item-text">'.tr('Valore consigliato').': '.$value.'</p>
</div>';
}
echo '
</div>
<hr>
</div>
</div>';
// Percorsi necessari
echo '
<div class="row">
<div class="col-md-12">
<p>'.tr('Le seguenti cartelle devono risultare scrivibili da parte del gestionale').':</p>
<div class="list-group">';
$dirs = [
'backup' => tr('Necessario per il salvataggio dei backup'),
'files' => tr('Necessario per il salvataggio di file inseriti dagli utenti'),
'logs' => tr('Necessario per la gestione dei file di log'),
];
foreach ($dirs as $key => $value) {
$check = is_writable($docroot.DIRECTORY_SEPARATOR.$key);
echo '
<div class="list-group-item">
<h4 class="list-group-item-heading">
'.$key;
if ($check) {
echo '
<span class="label label-success pull-right">
<i class="fa fa-check"></i>
</span>';
} else {
echo '
<span class="label label-danger pull-right">
<i class="fa fa-times"></i>
</span>';
}
echo '
</h4>
<p class="list-group-item-text">'.$value.'</p>
</div>';
}
echo '
</div>
<hr>
</div>
</div>
</div>';
// LICENZA
@ -477,13 +345,11 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) {
$username = !empty($db_username) ? $db_username : '';
$password = !empty($db_password) ? $db_password : '';
$name = !empty($db_name) ? $db_name : '';
$osm_password = !empty($_SESSION['osm_password']) ? $_SESSION['osm_password'] : '';
$osm_email = !empty($_SESSION['osm_email']) ? $_SESSION['osm_email'] : '';
// PARAMETRI
echo '
<div id="step-3">
<a href="http://www.openstamanager.com/contattaci/?subject=Assistenza%20installazione%20OSM" target="_blank" ><img class="pull-right" width="32" src="'.$img.'/help.png" alt="'.tr('Aiuto').'" title="'.tr('Contatta il nostro help-desk').'"/></a>
<a href="https://www.openstamanager.com/contattaci/?subject=Assistenza%20installazione%20OSM" target="_blank" ><img class="pull-right" width="32" src="'.$img.'/help.png" alt="'.tr('Aiuto').'" title="'.tr('Contatta il nostro help-desk').'"/></a>
<p>'.tr('Non hai ancora configurato OpenSTAManager').'.</p>
<p><small class="help-block">'.tr('Configura correttamente il software con i seguenti parametri (modificabili successivamente dal file _FILE_)', [
@ -492,13 +358,13 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) {
// Form dei parametri
echo '
<form action="?action=updateconfig&firstuse=true" method="post" id="config_form">
<form action="?action=updateconfig&firstuse=true" method="post" id="config-form">
<div class="row">';
// db_host
echo '
<div class="col-md-12">
{[ "type": "text", "label": "'.tr('Host del database').'", "name": "db_host", "placeholder": "'.tr("Indirizzo dell'host del database").'", "value": "'.$host.'", "help": "'.tr('Esempio').': localhost", "show-help": 1, "required": 1 ]}
{[ "type": "text", "label": "'.tr('Host del database').'", "name": "db_host", "placeholder": "'.tr("Indirizzo dell'host del database").'", "value": "'.$host.'", "help": "'.tr('Esempio').': localhost", "show-help": 0, "required": 1 ]}
</div>
</div>
@ -507,40 +373,22 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) {
// db_username
echo '
<div class="col-md-4">
{[ "type": "text", "label": "'.tr("Username dell'utente MySQL").'", "name": "db_username", "placeholder": "'.tr("Username dell'utente MySQL").'", "value": "'.$username.'", "help": "'.tr('Esempio').': root", "show-help": 1, "required": 1 ]}
{[ "type": "text", "label": "'.tr("Username dell'utente MySQL").'", "name": "db_username", "placeholder": "'.tr("Username dell'utente MySQL").'", "value": "'.$username.'", "help": "'.tr('Esempio').': root", "show-help": 0, "required": 1 ]}
</div>';
// db_password
echo '
<div class="col-md-4">
{[ "type": "password", "label": "'.tr("Password dell'utente MySQL").'", "name": "db_password", "placeholder": "'.tr("Password dell'utente MySQL").'", "value": "'.$password.'", "help": "'.tr('Esempio').': mysql", "show-help": 1 ]}
{[ "type": "password", "label": "'.tr("Password dell'utente MySQL").'", "name": "db_password", "placeholder": "'.tr("Password dell'utente MySQL").'", "value": "'.$password.'", "help": "'.tr('Esempio').': mysql", "show-help": 0 ]}
</div>';
// db_name
echo '
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('Nome del database').'", "name": "db_name", "placeholder": "'.tr('Nome del database').'", "value": "'.$name.'", "help": "'.tr('Esempio').': openstamanager", "show-help": 1, "required": 1 ]}
</div>
</div>
<div class="row">';
// Password utente admin
echo '
<div class="col-md-6">
{[ "type": "password", "label": "'.tr("Password dell'amministratore").'", "name": "osm_password", "placeholder": "'.tr('Scegli la password di amministratore').'", "value": "'.$osm_password.'", "help": "'.tr('Valore di default').': admin", "show-help": 1 ]}
</div>';
// Email utente admin
echo '
<div class="col-md-6">
{[ "type": "email", "label": "'.tr("Email dell'amministratore").'", "name": "osm_email", "placeholder": "'.tr("Digita l'indirizzo email dell'amministratore").'", "value": "'.$osm_email.'" ]}
{[ "type": "text", "label": "'.tr('Nome del database').'", "name": "db_name", "placeholder": "'.tr('Nome del database').'", "value": "'.$name.'", "help": "'.tr('Esempio').': openstamanager", "show-help": 0, "required": 1 ]}
</div>
</div>';
echo '
';
echo '
<!-- PULSANTI -->
<div class="row">
@ -553,13 +401,12 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) {
</button>
</div>
<div class="col-md-4 text-right">
<button type="submit" class="btn btn-success btn-block">
<button type="submit" id="install" class="btn btn-success btn-block">
<i class="fa fa-check"></i> '.tr('Installa').'
</button>
</div>
</div>
</form>
</div>
@ -568,10 +415,6 @@ if (empty($creation) && (!file_exists('config.inc.php') || !$valid_config)) {
</div>';
}
if (file_exists($docroot.'/include/custom/bottom.php')) {
include_once $docroot.'/include/custom/bottom.php';
} else {
include_once $docroot.'/include/bottom.php';
}
include_once App::filepath('include|custom|', 'bottom.php');
exit();

174
include/init/init.php Normal file
View File

@ -0,0 +1,174 @@
<?php
include_once __DIR__.'/../../core.php';
if (Update::isUpdateAvailable() || !$dbo->isInstalled()) {
return;
}
$has_azienda = $dbo->fetchNum("SELECT `an_anagrafiche`.`idanagrafica` FROM `an_anagrafiche`
LEFT JOIN `an_tipianagrafiche_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`an_tipianagrafiche_anagrafiche`.`idanagrafica`
LEFT JOIN `an_tipianagrafiche` ON `an_tipianagrafiche`.`idtipoanagrafica`=`an_tipianagrafiche_anagrafiche`.`idtipoanagrafica`
WHERE `an_tipianagrafiche`.`descrizione` = 'Azienda' AND `an_anagrafiche`.`deleted` = 0") != 0;
$has_user = $dbo->fetchNum('SELECT `id` FROM `zz_users`') != 0;
if ($has_azienda && $has_user) {
return;
}
$pageTitle = tr('Inizializzazione');
include_once App::filepath('include|custom|', 'top.php');
// Controllo sull'esistenza di nuovi parametri di configurazione
if (post('action') == 'init') {
// Azienda predefinita
if (!$has_azienda) {
Filter::set('post', 'op', 'add');
$id_module = Modules::get('Anagrafiche')['id'];
include DOCROOT.'/modules/anagrafiche/actions.php';
// Logo stampe
if (!empty($_FILES) && !empty($_FILES['blob']['name'])) {
$file = Uploads::upload($_FILES['blob'], [
'name' => 'Logo stampe',
'id_module' => $id_module,
'id_record' => $id_record,
]);
Settings::set('Logo stampe', $file);
}
}
// Utente amministratore
if (!$has_user) {
$admin = $dbo->selectOne('zz_groups', ['id'], [
'nome' => 'Amministratori',
]);
$dbo->insert('zz_users', [
'username' => post('admin_username'),
'password' => Auth::hashPassword(post('admin_password')),
'email' => post('admin_email'),
'idgruppo' => $admin['id'],
'idanagrafica' => isset($id_record) ? $id_record : 0,
'enabled' => 1,
]);
}
redirect(ROOTDIR, 'js');
exit();
}
$img = App::getPaths()['img'];
// Visualizzazione dell'interfaccia di impostazione iniziale, nel caso il file di configurazione sia mancante oppure i paramentri non siano sufficienti
echo '
<div class="box box-center-large box-warning">
<div class="box-header with-border text-center">
<img src="'.$img.'/logo.png" alt="'.tr('OSM Logo').'">
<h3 class="box-title">'.tr('OpenSTAManager').'</h3>
</div>
<div class="box-body">
<form action="" method="post" id="init-form" enctype="multipart/form-data">
<input type="hidden" name="action" value="init">';
if (!$has_user) {
echo '
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">'.tr('Amministrazione').'</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Username').'", "name": "admin_username", "value": "'.$osm_password.'", "placeholder": "'.tr("Digita l'username dell'amministratore").'", "required": 1 ]}
</div>
<div class="col-md-6">
{[ "type": "password", "label": "'.tr('Password').'", "name": "admin_password", "value": "'.$osm_password.'", "placeholder": "'.tr("Digita la password dell'amministratore").'", "required": 1 ]}
</div>
<div class="col-md-6">
{[ "type": "email", "label": "'.tr('Email').'", "name": "admin_email", "value": "'.$osm_email.'", "placeholder": "'.tr("Digita l'indirizzo email dell'amministratore").'" ]}
</div>
</div>
</div>
</div>';
}
if (!$has_azienda) {
echo '
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">'.tr('Azienda predefinita').'</h3>
</div>
<div class="panel-body">';
$idtipoanagrafica = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Azienda'")[0]['idtipoanagrafica'];
$readonly_tipo = true;
ob_start();
include DOCROOT.'/modules/anagrafiche/add.php';
$anagrafica = ob_get_clean();
echo str_replace('</form>', '', $anagrafica);
echo '
<div class="box box-success collapsed-box">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Logo stampe').'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-plus"></i>
</button>
</div>
</div>
<div class="box-body collapse">
<div class="col-md-12">
{[ "type": "file", "placeholder": "'.tr('File').'", "name": "blob" ]}
</div>
</div>
</div>';
echo '
</div>
</div>';
}
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-4">
<span>*<small><small>'.tr('Campi obbligatori').'</small></small></span>
</div>
<div class="col-md-4 text-right">
<button type="submit" id="config" class="btn btn-success btn-block">
<i class="fa fa-cog"></i> '.tr('Configura').'
</button>
</div>
</div>
</form>
</div>
</div>';
echo '
<script>
$(document).ready(function(){
$("button[type=submit]").not("#config").remove();
});
</script>
<script src="'.$rootdir.'/lib/functions.js"></script>
<script src="'.$rootdir.'/lib/init.js"></script>';
include_once App::filepath('include|custom|', 'bottom.php');
exit();

View File

@ -0,0 +1,187 @@
<?php
// Apache
$modules = [
'mod_rewrite' => tr('Fornisce un sistema di riscrittura URL basato su regole predefinite'),
];
$available_modules = apache_get_modules();
$apache = [];
foreach ($modules as $name => $description) {
$status = in_array($name, $available_modules);
$apache[] = [
'name' => $name,
'description' => $description,
'status' => $status,
'type' => tr('Modulo'),
];
}
// PHP
$settings = [
'zip' => [
'type' => 'ext',
'description' => tr('Permette di leggere e scrivere gli archivi compressi ZIP e i file al loro interno'),
],
'mbstring' => [
'type' => 'ext',
'description' => tr('Permette di gestire i caratteri dello standard UTF-8'),
],
'pdo_mysql' => [
'type' => 'ext',
'description' => tr('Permette di effettuare la connessione al database MySQL'),
],
'openssl' => [
'type' => 'ext',
'description' => tr("Permette l'utilizzo di funzioni crittografiche simmetriche e asimmetriche (facoltativo)"),
],
'intl' => [
'type' => 'ext',
'description' => tr("Permette l'automazione della conversione dei numeri (facoltativo)"),
],
'soap' => [
'type' => 'ext',
'description' => tr('Permette la comunicazione con servizi esterni, quali il database europeo delle Partite IVA (facoltativo)'),
],
'curl' => [
'type' => 'ext',
'description' => tr('Permette la comunicazione con servizi esterni, quali APILayer (facoltativo)'),
],
'display_errors' => [
'type' => 'value',
'description' => true,
],
'upload_max_filesize' => [
'type' => 'value',
'description' => '>16M',
],
'post_max_size' => [
'type' => 'value',
'description' => '>16M',
],
];
$php = [];
foreach ($settings as $name => $values) {
$description = $values['description'];
if ($values['type'] == 'ext') {
$status = extension_loaded($name);
} else {
$ini = str_replace(['k', 'M'], ['000', '000000'], ini_get($name));
$real = str_replace(['k', 'M'], ['000', '000000'], $description);
if (starts_with($real, '>')) {
$status = $ini >= substr($real, 1);
} elseif (starts_with($real, '<')) {
$status = $ini <= substr($real, 1);
} else {
$status = ($real == $ini);
}
if (is_bool($description)) {
$description = !empty($description) ? 'On' : 'Off';
} else {
$description = str_replace(['>', '<'], '', $description);
}
$description = tr('Valore consigliato: _VALUE_', [
'_VALUE_' => $description,
]);
}
$type = ($values['type'] == 'ext') ? tr('Estensione') : tr('Impostazione');
$php[] = [
'name' => $name,
'description' => $description,
'status' => $status,
'type' => $type,
];
}
// Percorsi di servizio
$dirs = [
'backup' => tr('Necessario per il salvataggio dei backup'),
'files' => tr('Necessario per il salvataggio di file inseriti dagli utenti'),
'logs' => tr('Necessario per la gestione dei file di log'),
];
$directories = [];
foreach ($dirs as $name => $description) {
$status = is_writable($docroot.DIRECTORY_SEPARATOR.$name);
$directories[] = [
'name' => $name,
'description' => $description,
'status' => $status,
'type' => tr('Cartella'),
];
}
$requirements = [
tr('Apache') => $apache,
tr('PHP (_VERSION_)', [
'_VERSION_' => phpversion(),
]) => $php,
tr('Percorsi di servizio') => $directories,
];
// Introduzione
echo '
<p>'.tr('Benvenuto in _NAME_!', [
'_NAME_' => '<strong>OpenSTAManager</strong>',
]).'</p>
<p>'.tr("Prima di procedere alla configurazione e all'installazione del software, sono necessari alcuni accorgimenti per garantire il corretto funzionamento del gestionale").'.</p>
<br>
<p>'.tr('Le estensioni e impostazioni PHP possono essere personalizzate nel file di configurazione _FILE_', [
'_FILE_' => '<b>php.ini</b>',
]).'.</p>
<hr>';
// Tabelle di riepilogo
foreach ($requirements as $key => $values) {
$statuses = array_column($values, 'status');
$general_status = true;
foreach ($statuses as $status) {
$general_status &= $status;
}
echo '
<div class="box box-'.($general_status ? 'success collapsed-box' : 'danger').'">
<div class="box-header with-border">
<h3 class="box-title">'.$key.'</h3>';
if ($general_status) {
echo '
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-plus"></i>
</button>
</div>';
}
echo '
</div>
<div class="box-body no-padding">
<table class="table">';
foreach ($values as $value) {
echo '
<tr class="'.($value['status'] ? 'success' : 'danger').'">
<td style="width: 10px"><i class="fa fa-'.($value['status'] ? 'check' : 'times').'"></i></td>
<td>'.$value['type'].'</td>
<td>'.$value['name'].'</td>
<td>'.$value['description'].'</td>
</tr>';
}
echo '
</table>
</div>
</div>';
}

View File

@ -1,6 +1,6 @@
<?php
include_once __DIR__.'/../core.php';
include_once __DIR__.'/../../core.php';
$updateRate = 20;
$scriptValue = $updateRate * 5;
@ -73,43 +73,24 @@ if (filter('action') == 'do_update') {
Update::updateCleanup();
echo '
<p><strong>'.tr('Aggiornamento completato!!!').'</strong> <i class="fa fa-smile-o"></i></p>';
// Rimostro la finestra di login
echo '
<script>
$(".login-box").fadeIn();
</script>';
<p><strong>'.tr('Aggiornamento completato').'</strong> <i class="fa fa-smile-o"></i></p>';
// Istruzioni per la prima installazione
if ($_GET['firstuse'] == 'true') {
if (!empty($_SESSION['osm_password'])) {
$password = $_SESSION['osm_password'];
} else {
$password = 'admin';
}
echo '
<p>'.tr('Puoi procedere al login con i seguenti dati').':</p>
<p>'.tr('Username').': <i>admin</i></p>
<p>'.tr('Password').': <i> '.$password.'</i></p>
<p class="text-danger">'.tr("E' fortemente consigliato rimuovere i permessi di scrittura dal file _FILE_", [
'_FILE_' => '<b>config.inc.php</b>',
]).'.</p>';
]).'.</p>
// Imposto la password di admin che l'utente ha selezionato all'inizio
if (isset($_SESSION['osm_password'])) {
$dbo->query('UPDATE `zz_users` SET `password`='.prepare(Auth::hashPassword($password))." WHERE `username`='admin'");
unset($_SESSION['osm_password']);
}
if (isset($_SESSION['osm_email'])) {
if (!empty($_SESSION['osm_email'])) {
$dbo->query('UPDATE `zz_users` SET `email`='.prepare($_SESSION['osm_email'])." WHERE `username`='admin' ");
}
unset($_SESSION['osm_email']);
}
<a class="btn btn-success btn-block" href="'.ROOTDIR.'">
<i class="fa fa-check"></i> '.tr('Continua').'
</a>';
} else {
// Rimostro la finestra di login
echo '
<script>
$(".login-box").fadeIn();
</script>';
}
}
@ -119,11 +100,7 @@ if (filter('action') == 'do_update') {
if (Update::isUpdateLocked() && filter('force') === null) {
$pageTitle = tr('Aggiornamento in corso!');
if (file_exists($docroot.'/include/custom/top.php')) {
include_once $docroot.'/include/custom/top.php';
} else {
include_once $docroot.'/include/top.php';
}
include_once App::filepath('include|custom|', 'top.php');
echo '
<div class="box box-center box-danger box-solid text-center">
@ -137,11 +114,7 @@ if (filter('action') == 'do_update') {
</div>
</div>';
if (file_exists($docroot.'/include/custom/bottom.php')) {
include_once $docroot.'/include/custom/bottom.php';
} else {
include_once $docroot.'/include/bottom.php';
}
include_once App::filepath('include|custom|', 'bottom.php');
exit();
}
@ -151,11 +124,7 @@ if (filter('action') == 'do_update') {
$button = !$dbo->isInstalled() ? tr('Installa!') : tr('Aggiorna!');
$pageTitle = !$dbo->isInstalled() ? tr('Installazione') : tr('Aggiornamento');
if (file_exists($docroot.'/include/custom/top.php')) {
include_once $docroot.'/include/custom/top.php';
} else {
include_once $docroot.'/include/top.php';
}
include_once App::filepath('include|custom|', 'top.php');
echo '
<div class="box box-center-large box-warning text-center">

View File

@ -6,20 +6,17 @@ include_once __DIR__.'/../core.php';
if (!empty($id_plugin)) {
$element = Plugins::get($id_plugin);
// Inclusione di eventuale plugin personalizzato
if (!empty($element['script'])) {
// Inclusione di eventuale plugin personalizzato
if (file_exists($docroot.'/modules/'.$element['module_dir'].'/plugins/custom/'.$element['script'])) {
include $docroot.'/modules/'.$element['module_dir'].'/plugins/custom/'.$element['script'];
} elseif (file_exists($docroot.'/modules/'.$element['module_dir'].'/plugins/'.$element['script'])) {
include $docroot.'/modules/'.$element['module_dir'].'/plugins/'.$element['script'];
}
include App::filepath('modules/'.$element['module_dir'].'/plugins|custom|', $element['script']);
return;
}
echo '
<h4>
'.$element['name'];
<span class="'.(!empty($element['help']) ? ' tip' : '').'"'.(!empty($element['help']) ? ' title="'.prepareToField($element['help']).'" data-position="bottom"' : '').' >
'.$element['title'].(!empty($element['help']) ? ' <i class="fa fa-question-circle-o"></i>' : '').'</span>';
if (file_exists($docroot.'/plugins/'.$element['directory'].'/add.php')) {
echo '
@ -40,43 +37,27 @@ $total = App::readQuery($element);
$module_options = (!empty($element['options2'])) ? $element['options2'] : $element['options'];
// Caricamento file aggiuntivo su elenco record
if (file_exists($docroot.$directory.'/custom/controller_before.php')) {
include $docroot.$directory.'/custom/controller_before.php';
} elseif (file_exists($docroot.$directory.'/controller_before.php')) {
include $docroot.$directory.'/controller_before.php';
}
// Segmenti
/*deve sempre essere impostato almeno un sezionale*/
if (empty($_SESSION['m'.$id_module]['id_segment'])) {
$rs = $dbo->fetchArray('SELECT id FROM zz_segments WHERE predefined = 1 AND id_module = '.prepare($id_module).'LIMIT 0,1');
$_SESSION['m'.$id_module]['id_segment'] = $rs[0]['id'];
}
if (count($dbo->fetchArray("SELECT id FROM zz_segments WHERE id_module = \"$id_module\"")) > 1) {
?>
include App::filepath($directory.'|custom|', 'controller_before.php');
if (count(Modules::getSegments($id_module)) > 1) {
?>
<div class="row">
<div class="col-md-4 pull-right">
{[ "type": "select", "label": "", "name": "id_segment_", "required": 0, "class": "", "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module = '<?php echo $id_module; ?>'", "value": "<?php echo $_SESSION['m'.$id_module]['id_segment']; ?>", "extra": "" ]}
{[ "type": "select", "name": "id_segment_", "required": 0, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module = '<?php echo $id_module; ?>'", "value": "<?php echo $_SESSION['m'.$id_module]['id_segment']; ?>" ]}
</div>
</div>
<br>
<script>
$(document).ready(function () {
$("#id_segment_").on("change", function(){
if ($(this).val()<1){
session_set('<?php echo 'm'.$id_module; ?>,id_segment', '', 1, 1);
}else{
session_set('<?php echo 'm'.$id_module; ?>,id_segment', $(this).val(), 0, 1);
}
});
});
</script>
@ -141,6 +122,8 @@ if (!empty($module_options) && $module_options != 'menu' && $module_options != '
<tfoot>
<tr>';
echo '
<td></td>';
foreach ($total['fields'] as $key => $field) {
echo '
<td></td>';
@ -187,10 +170,34 @@ if (!empty($module_options) && $module_options != 'menu' && $module_options != '
</div>
<div class="col-md-5 text-right">
<div class="btn-group" role="group">
<button type="button" class="btn btn-primary btn-csv disabled" disabled>'.tr('Esporta').'</button>
<button type="button" class="btn btn-default btn-copy disabled" disabled>'.tr('Copia').'</button>
<button type="button" class="btn btn-default btn-print disabled" disabled>'.tr('Stampa').'</button>
<div class="btn-group" role="group">';
if (Settings::get('Abilita esportazione Excel e PDF')) {
echo '
<div class="btn-group">
<button type="button" class="btn btn-primary table-btn btn-csv disabled" disabled>'.tr('Esporta').'</button>
<button type="button" class="btn btn-primary table-btn disabled dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li><a class="table-btn btn-pdf disabled" disabled>'.tr('PDF').'</a></li>
<li><a class="table-btn btn-excel disabled" disabled>'.tr('Excel').'</a></li>
</ul>
</div>';
} else {
echo '
<button type="button" class="btn btn-primary table-btn btn-csv disabled" disabled>'.tr('Esporta').'</button>';
}
echo '
<button type="button" class="btn btn-default table-btn btn-copy disabled" disabled>'.tr('Copia').'</button>
<button type="button" class="btn btn-default table-btn btn-print disabled" disabled>'.tr('Stampa').'</button>
</div>
</div>
</div>';
@ -213,8 +220,4 @@ elseif ($module_options == 'custom') {
}
// Caricamento file aggiuntivo su elenco record
if (file_exists($docroot.$directory.'/custom/controller_after.php')) {
include $docroot.$directory.'/custom/controller_after.php';
} elseif (file_exists($docroot.$directory.'/controller_after.php')) {
include $docroot.$directory.'/controller_after.php';
}
include App::filepath($directory.'|custom|', 'controller_after.php');

View File

@ -5,24 +5,6 @@ include_once __DIR__.'/../core.php';
$paths = App::getPaths();
$user = Auth::user();
// Istanziamento della barra di debug
if (!empty($debug)) {
$debugbar = new DebugBar\DebugBar();
$debugbar->addCollector(new DebugBar\DataCollector\MemoryCollector());
$debugbar->addCollector(new DebugBar\DataCollector\PhpInfoCollector());
$debugbar->addCollector(new DebugBar\DataCollector\RequestDataCollector());
$debugbar->addCollector(new DebugBar\DataCollector\TimeDataCollector());
$debugbar->addCollector(new DebugBar\Bridge\MonologCollector($logger));
$debugbar->addCollector(new DebugBar\DataCollector\PDO\PDOCollector($dbo->getPDO()));
$debugbarRenderer = $debugbar->getJavascriptRenderer();
$debugbarRenderer->setIncludeVendors(false);
$debugbarRenderer->setBaseUrl($paths['assets'].'/php-debugbar');
}
echo '<!DOCTYPE html>
<html>
<head>
@ -31,13 +13,20 @@ echo '<!DOCTYPE html>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<meta name="robots" content="noindex,nofollow">
<link href="'.$paths['img'].'/favicon.png" rel="icon" type="image/x-icon" />';
foreach ($css_modules as $style) {
$style = (is_array($style)) ? $style : ['href' => $style, 'media' => 'all'];
// CSS
foreach (App::getAssets()['css'] as $style) {
echo '
<link rel="stylesheet" type="text/css" media="'.$style['media'].'" href="'.$style['href'].'"/>';
<link rel="stylesheet" type="text/css" media="all" href="'.$style.'"/>';
}
// Print CSS
foreach (App::getAssets()['print'] as $style) {
echo '
<link rel="stylesheet" type="text/css" media="print" href="'.$style.'"/>';
}
if (Auth::check()) {
@ -124,11 +113,22 @@ if (Auth::check()) {
ckeditorToolbar: [
["Undo","Redo","-","Cut","Copy","Paste","PasteText","PasteFromWord","-","Scayt", "-","Link","Unlink","-","Bold","Italic","Underline","Superscript","SpecialChar","HorizontalRule","-","NumberedList","BulletedList","Outdent","Indent","Blockquote","-","Styles","Format","Image","Table", "TextColor", "BGColor" ],
],
tempo_attesa_ricerche: '.get_var('Tempo di attesa ricerche in secondi').',
};
</script>';
} else {
echo '
<script>
globals = {
locale: \''.$lang.'\',
full_locale: \''.$lang.'_'.strtoupper($lang).'\',
};
</script>';
}
foreach ($jscript_modules as $js) {
// JS
foreach (App::getAssets()['js'] as $js) {
echo '
<script type="text/javascript" charset="utf-8" src="'.$js.'"></script>';
}
@ -144,8 +144,33 @@ echo '
});
</script>';
if (!empty($debugbarRenderer) && Auth::check()) {
echo $debugbarRenderer->renderHead();
if (Auth::check()) {
// Barra di debug
if (App::debug()) {
$debugbar = new DebugBar\DebugBar();
$debugbar->addCollector(new DebugBar\DataCollector\MemoryCollector());
$debugbar->addCollector(new DebugBar\DataCollector\PhpInfoCollector());
$debugbar->addCollector(new DebugBar\DataCollector\RequestDataCollector());
$debugbar->addCollector(new DebugBar\DataCollector\TimeDataCollector());
$debugbar->addCollector(new DebugBar\Bridge\MonologCollector($logger));
$debugbar->addCollector(new DebugBar\DataCollector\PDO\PDOCollector($dbo->getPDO()));
$debugbarRenderer = $debugbar->getJavascriptRenderer();
$debugbarRenderer->setIncludeVendors(false);
$debugbarRenderer->setBaseUrl($paths['assets'].'/php-debugbar');
echo $debugbarRenderer->renderHead();
}
if (Settings::get('Abilita esportazione Excel e PDF')) {
echo '
<script type="text/javascript" charset="utf-8" src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script type="text/javascript" charset="utf-8" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script>
<script type="text/javascript" charset="utf-8" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script>';
}
}
$hide_sidebar = get_var('Nascondere la barra sinistra di default');
@ -154,7 +179,7 @@ echo '
</head>
<body class="skin-'.$theme.(!empty($hide_sidebar) ? ' sidebar-collapse' : '').(!Auth::check() ? ' hold-transition login-page' : '').'">
<div class="wrapper">';
<div class="'.(!Auth::check() ? '' : 'wrapper').'">';
if (Auth::check()) {
$calendar = ($_SESSION['period_start'] != date('Y').'-01-01' || $_SESSION['period_end'] != date('Y').'-12-31') ? 'red' : 'white';
@ -176,7 +201,7 @@ if (Auth::check()) {
<div id="tiny-loader" style="display:none;"></div>
<header class="main-header">
<a href="https://www.openstamanager.com" class="logo" target="_blank">
<a href="https://www.openstamanager.com" class="logo" title="'.tr('Il gestionale open source per l\'assistenza tecnica e la fatturazione').'" target="_blank">
<!-- mini logo for sidebar mini 50x50 pixels -->
<span class="logo-mini">'.tr('OSM').'</span>
<!-- logo for regular state and mobile devices -->
@ -185,7 +210,7 @@ if (Auth::check()) {
<!-- Header Navbar: style can be found in header.less -->
<nav class="navbar navbar-static-top" role="navigation">
<!-- Sidebar toggle button-->
<a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button">
<a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button">
<span class="sr-only">'.tr('Mostra/nascondi menu').'</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
@ -193,8 +218,8 @@ if (Auth::check()) {
</a>
<div class="input-group btn-calendar pull-left">
<button id="daterange" class="btn"><i class="fa fa-calendar" style="color:'.$calendar.'"></i> <i class="fa fa-caret-down"></i></button>
<span class="hidden-xs" style="vertical-align:middle">
<button id="daterange" class="btn"><i class="fa fa-calendar" style="color:'.$calendar.'"></i> <i class="fa fa-caret-down" style="color:'.$calendar.';" ></i></button>
<span class="hidden-xs" style="vertical-align:middle; color:'.$calendar.';">
'.Translator::dateToLocale($_SESSION['period_start']).' - '.Translator::dateToLocale($_SESSION['period_end']).'
</span>
</div>

View File

@ -52,18 +52,17 @@ if (Auth::check() && isset($dbo) && $dbo->isConnected() && $dbo->isInstalled())
}
// Procedura di installazione
include_once $docroot.'/include/configuration.php';
include_once $docroot.'/include/init/configuration.php';
// Procedura di aggiornamento
include_once $docroot.'/include/update.php';
include_once $docroot.'/include/init/update.php';
// Procedura di inizializzazione
include_once $docroot.'/include/init/init.php';
$pageTitle = tr('Login');
if (file_exists($docroot.'/include/custom/top.php')) {
include_once $docroot.'/include/custom/top.php';
} else {
include_once $docroot.'/include/top.php';
}
include_once App::filepath('include|custom|', 'top.php');
// Controllo se è una beta e in caso mostro un warning
if (str_contains($version, 'beta')) {
@ -175,8 +174,4 @@ echo '/> '.tr('Mantieni attiva la sessione').'
});
</script>';
if (file_exists($docroot.'/include/custom/bottom.php')) {
include_once $docroot.'/include/custom/bottom.php';
} else {
include_once $docroot.'/include/bottom.php';
}
include_once App::filepath('include|custom|', 'bottom.php');

View File

@ -6,11 +6,7 @@ $pageTitle = tr('Informazioni');
$paths = App::getPaths();
if (file_exists($docroot.'/include/custom/top.php')) {
include $docroot.'/include/custom/top.php';
} else {
include $docroot.'/include/top.php';
}
include_once App::filepath('include|custom|', 'top.php');
echo '
<div class="box">
@ -168,8 +164,4 @@ echo '
</div>
</div>';
if (file_exists($docroot.'/include/custom/bottom.php')) {
include $docroot.'/include/custom/bottom.php';
} else {
include $docroot.'/include/bottom.php';
}
include_once App::filepath('include|custom|', 'bottom.php');

View File

@ -336,12 +336,12 @@ function readDate($data)
/**
* Genera una porzione di codice html a partire da una stringa nei seguenti formati:
* campo <input> generico:
* {[ "type": "text", "required": 1, "value": "$idintervento$", "extra": "" ]}.
* {[ "type": "text", "required": 1, "value": "$idintervento$" ]}.
*
* campo di testo normale e non modificabile
* {[ "type": "span", "value": "$testo$" ]}
*
* {[ "type": "select", "required": 1, "values": "query='SELECT id, descrizione FROM co_contratti WHERE idanagrafica=$idanagrafica$"', "value": "$idcontratto$", "extra": "" ]}
* {[ "type": "select", "required": 1, "values": "query='SELECT id, descrizione FROM co_contratti WHERE idanagrafica=$idanagrafica$"', "value": "$idcontratto$" ]}
*
* Il parametro $records contiene il risultato della query di selezione record per fare i vari replace delle variabili racchiuse tra $$ nel template
*
@ -622,7 +622,7 @@ function build_html_element($string)
// Generazione <select> da JSON
// esempio creazione select con opzioni: Maschio, Femmina, Unisex
// {[ "type": "select", "label": "Sesso", "name": "sesso", "values": "list=\"\": \"\", \"M\": \"Maschio\", \"F\": \"Femmina\", \"U\": \"Unisex\"", "value": "$sesso$", "extra": "" ]}
// {[ "type": "select", "label": "Sesso", "name": "sesso", "values": "list=\"\": \"\", \"M\": \"Maschio\", \"F\": \"Femmina\", \"U\": \"Unisex\"", "value": "$sesso$" ]}
elseif (preg_match_all('/^list=(.+?)$/', $values, $m)) {
$data = json_decode('{'.$m[1][0].'}');
foreach ($data as $id => $etichetta) {
@ -1030,6 +1030,7 @@ function filelist_and_upload($id_module, $id_record, $label = 'Nuovo allegato:',
* @param unknown $path
*
* @deprecated 2.3
*
* @return bool
*/
function deltree($path)
@ -1060,6 +1061,7 @@ function deltree($path)
* Carica gli script JavaScript inclusi nell'array indicato.
*
* @deprecated 2.3
*
* @param array $jscript_modules_array
*/
function loadJscriptModules($array)
@ -1080,6 +1082,7 @@ function loadJscriptModules($array)
* Carica i file di stile CSS inclusi nell'array indicato.
*
* @deprecated 2.3
*
* @param array $css_modules_array
*/
function loadCSSModules($array)
@ -1107,7 +1110,7 @@ function loadCSSModules($array)
* @deprecated 2.4
*
* @param string $str
* @param int $qty
* @param int $qty
* @param string $mask
*/
function get_next_code($str, $qty = 1, $mask = '')

View File

@ -108,19 +108,31 @@ $(document).ready(function () {
// Pulsanti di Datatables
$(".btn-csv").click(function (e) {
var table = $(document).find("#" + $(this).parent().parent().parent().data("target")).DataTable();
var table = $(document).find("#" + $(this).closest("[data-target]").data("target")).DataTable();
table.buttons(0).trigger();
});
$(".btn-excel").click(function (e) {
var table = $(document).find("#" + $(this).closest("[data-target]").data("target")).DataTable();
table.buttons(3).trigger();
});
$(".btn-pdf").click(function (e) {
var table = $(document).find("#" + $(this).closest("[data-target]").data("target")).DataTable();
table.buttons(4).trigger();
});
$(".btn-copy").click(function (e) {
var table = $(document).find("#" + $(this).parent().parent().parent().data("target")).DataTable();
var table = $(document).find("#" + $(this).closest("[data-target]").data("target")).DataTable();
table.buttons(1).trigger();
});
$(".btn-print").click(function (e) {
var table = $(document).find("#" + $(this).parent().parent().parent().data("target")).DataTable();
var table = $(document).find("#" + $(this).closest("[data-target]").data("target")).DataTable();
table.buttons(2).trigger();
});
@ -534,6 +546,9 @@ function start_datatables() {
});
var sum;
var tempo;
var tempo_attesa_ricerche = (globals.tempo_attesa_ricerche*1000);
var table = $this.DataTable({
language: {
url: globals.js + '/i18n/datatables/' + globals.locale + '.min.json'
@ -567,7 +582,8 @@ function start_datatables() {
style: 'multi',
selector: 'td:first-child'
},
buttons: [{
buttons: [
{
extend: 'csv',
fieldSeparator: ";",
exportOptions: {
@ -586,6 +602,37 @@ function start_datatables() {
},
{
extend: 'print',
autoPrint: true,
customize: function ( win ) {
$(win.document.body)
.css( 'font-size', '10pt' )
.append(
'<table class="main-records table table-condensed table-bordered dataTable" ><tfoot><tr><td></td><td class="pull-right" >'+$('#summable').text()+'</td><td></td></tr></tfoot></table>',
);
$(win.document.body).find( 'table' )
.addClass( 'compact' )
.css( 'font-size', 'inherit' );
$(win.document.body).find( 'td:first-child' )
.addClass( 'hide' );
$(win.document.body).find( 'th:first-child' )
.addClass( 'hide' );
},
exportOptions: {
modifier: {
selected: true
}
}
},
{
extend: 'excel',
exportOptions: {
modifier: {
selected: true
}
}
},
{
extend: 'pdf',
exportOptions: {
modifier: {
selected: true
@ -611,6 +658,9 @@ function start_datatables() {
$('<br><input type="text" style="width:100%" class="form-control" placeholder="' + globals.translations.filter + '..."><i class="deleteicon fa fa-times fa-2x hide"></i>')
.appendTo(column.header())
.on('keyup', function (e) {
clearInterval(tempo);
if (e.which != 9) {
if (!$(this).val()) {
if ($(this).parent().data("slow") != undefined) $("#slow").remove();
@ -628,13 +678,25 @@ function start_datatables() {
idx1 = 'module_' + $this.data('idmodule'); //+ "-" + $this.data('idplugin');
idx2 = 'search_' + $(this).parent().attr('id').replace('th_', '');
// Imposto delle sessioni per le ricerche del modulo e del campo specificatsi
session_set(idx1 + ',' + idx2, $(this).val(), 0);
function start_search(search_value){
session_set(idx1 + ',' + idx2, search_value, 0);
column.search(search_value).draw();
}
column.search(this.value).draw();
// Imposto delle sessioni per le ricerche del modulo e del campo specificatsi
if(e.keyCode == 13 || $(this).val()==''){
start_search($(this).val());
}else{
tempo = window.setTimeout(start_search, tempo_attesa_ricerche, $(this).val());
}
});
});
// Disabilito l'ordinamento alla pressione del tasto invio sull'<input>
$("thead input, .search").on('keypress', function (e) {
stopTableSorting(e);
});
// Disabilito l'ordinamento al click sull'<input>
$("thead input, .deleteicon").click(function (e) {
stopTableSorting(e);
@ -691,19 +753,9 @@ function start_datatables() {
if (api.rows({
selected: true
}).count() > 0) {
container.find('.btn-csv').removeClass('disabled');
container.find('.btn-print').removeClass('disabled');
container.find('.btn-copy').removeClass('disabled');
container.find('.btn-csv').attr('disabled', false);
container.find('.btn-print').attr('disabled', false);
container.find('.btn-copy').attr('disabled', false);
container.find('.table-btn').removeClass('disabled').attr('disabled', false);
} else {
container.find('.btn-csv').addClass('disabled');
container.find('.btn-print').addClass('disabled');
container.find('.btn-copy').addClass('disabled');
container.find('.btn-csv').attr('disabled', true);
container.find('.btn-print').attr('disabled', true);
container.find('.btn-copy').attr('disabled', true);
container.find('.table-btn').addClass('disabled').attr('disabled', true);
}
// Seleziona tutto
@ -720,10 +772,11 @@ function start_datatables() {
}
},
footerCallback: function (row, data, start, end, display) {
var i = 0;
var i = -1;
this.api().columns().every(function () {
if (sum.summable[i] != undefined) {
$(this.footer()).addClass("text-right");
$(this.footer()).attr("id", "summable");
$(this.footer()).html(sum.summable[i]);
} else $(this.footer()).html("&nbsp;");
i++;
@ -735,6 +788,10 @@ function start_datatables() {
if (type === 'row') {
var selected = $this.data('selected').split(';');
selected = selected.filter(function (value, index, self) {
return value != '' && self.indexOf(value) === index;
})
var data = table.rows(indexes).data();
data.each(function (item) {
@ -752,9 +809,9 @@ function start_datatables() {
}
});
selected = selected.filter(function (entry) {
return entry != '';
});
selected = selected.filter(function (value, index, self) {
return value != '' && self.indexOf(value) === index;
})
$this.data('selected', selected.join(';'));
@ -771,19 +828,9 @@ function start_datatables() {
if (table.rows({
selected: true
}).count() > 0) {
container.find('.btn-csv').removeClass('disabled');
container.find('.btn-print').removeClass('disabled');
container.find('.btn-copy').removeClass('disabled');
container.find('.btn-csv').attr('disabled', false);
container.find('.btn-print').attr('disabled', false);
container.find('.btn-copy').attr('disabled', false);
container.find('.table-btn').removeClass('disabled').attr('disabled', false);
} else {
container.find('.btn-csv').addClass('disabled');
container.find('.btn-print').addClass('disabled');
container.find('.btn-copy').addClass('disabled');
container.find('.btn-csv').attr('disabled', true);
container.find('.btn-print').attr('disabled', true);
container.find('.btn-copy').attr('disabled', true);
container.find('.table-btn').addClass('disabled').attr('disabled', true);
}
}
});
@ -1005,8 +1052,7 @@ function start_inputmask(element) {
});
$(element+'.alphanumeric-mask').inputmask('Regex', {
regex: "[A-Za-z0-9#_|\/\\-]*",
casing: "upper",
regex: "[A-Za-z0-9#_|\/\\-.]*",
});
if (isMobile.any()) {
@ -1021,7 +1067,7 @@ function start_inputmask(element) {
if (min == 'undefined') {
min = false;
}
var max = $this.attr('max-value');
if (max == 'undefined') {
max = false;
@ -1117,10 +1163,10 @@ function session_set(session_array, value, clear, reload) {
}
return $.get(globals.rootdir + "/ajax.php?op=session_set&session=" + session_array + "&value=" + value + "&clear=" + clear, function(data, status){
if (reload==1)
location.reload();
location.reload();
});
}
@ -1318,3 +1364,15 @@ function getCookie(cname) {
}
return "";
}
/**
* Funzione per controllare se un file esiste
*/
function UrlExists(url)
{
var http = new XMLHttpRequest();
http.open('HEAD', url, false);
http.send();
return http.status!=404;
}

View File

@ -407,7 +407,7 @@ function create_thumbnails($tmp, $filename, $dir)
function get_client_ip()
{
$ipaddress = '';
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
@ -417,10 +417,10 @@ function get_client_ip()
$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
} elseif (!empty($_SERVER['HTTP_FORWARDED'])) {
$ipaddress = $_SERVER['HTTP_FORWARDED'];
} elseif (!empty($_SERVER['REMOTE_ADDR']) AND $_SERVER['REMOTE_ADDR']!='127.0.0.1' ) {
} elseif (!empty($_SERVER['REMOTE_ADDR']) and $_SERVER['REMOTE_ADDR'] != '127.0.0.1') {
$ipaddress = $_SERVER['REMOTE_ADDR'];
} elseif (!empty(getHostByName(getHostName()))){
$ipaddress = getHostByName(getHostName());
} elseif (!empty(gethostbyname(gethostname()))) {
$ipaddress = gethostbyname(gethostname());
} else {
$ipaddress = 'UNKNOWN';
}
@ -514,7 +514,7 @@ function slashes($string)
*
* @since 2.3
*
* @return string
* @return mixed
*/
function prepare($parameter)
{
@ -529,7 +529,7 @@ function prepare($parameter)
*
* @since 2.3
*
* @return string
* @return mixed
*/
function p($parameter)
{
@ -587,9 +587,9 @@ function get_var($nome, $sezione = null, $descrizione = false, $again = false)
*
* @return string
*/
function filter($param, $method = null)
function filter($param, $method = null, $raw = false)
{
return Filter::getValue($param, $method = null);
return Filter::getValue($param, $method, $raw);
}
/**
@ -602,9 +602,9 @@ function filter($param, $method = null)
*
* @return string
*/
function post($param, $rule = 'text')
function post($param, $raw = false)
{
return Filter::getValue($param, 'post');
return Filter::getValue($param, 'post', $raw);
}
/**
@ -617,9 +617,9 @@ function post($param, $rule = 'text')
*
* @return string
*/
function get($param, $rule = 'text')
function get($param, $raw = false)
{
return Filter::getValue($param, 'get');
return Filter::getValue($param, 'get', $raw);
}
/**
@ -645,7 +645,7 @@ function isAjaxRequest()
*
* @return float
*/
function sum($first, $second = null, $decimals = null)
function sum($first, $second = null, $decimals = 4)
{
$first = (array) $first;
$second = (array) $second;
@ -654,9 +654,7 @@ function sum($first, $second = null, $decimals = null)
$result = 0;
if (!is_numeric($decimals)) {
$decimals = is_numeric($decimals) ? $decimals : Translator::getFormatter()->getPrecision();
}
$decimals = is_numeric($decimals) ? $decimals : Translator::getFormatter()->getPrecision();
$bcadd = function_exists('bcadd');

View File

@ -1,4 +1,7 @@
$(document).ready(function () {
// Inizializzazzione dei box AdminLTE
$('.box').boxWidget();
// Modal di default
$('[data-href]').not('.ask, .bound').click(function () {
launch_modal($(this).data('title'), $(this).data('href'), 1, $(this).data('target'));
@ -51,11 +54,26 @@ $(document).ready(function () {
collapse: false,
sideBySide: true,
useCurrent: false,
stepping: 5,
stepping: 5,
widgetPositioning: {
horizontal: 'left',
vertical: 'bottom'
},
minDate: moment($this.attr('min-date')).isValid() ? $this.attr('min-date') : false,
maxDate: moment($this.attr('max-date')).isValid() ? $this.attr('max-date') : false,
});
});
//fix per timestamp-picker non visibile con la classe table-responsive
$('.timestamp-picker').each(function () {
$this = $(this)
$this.on("dp.show", function (e) {
$('#tecnici > div').removeClass('table-responsive');
})
$this.on("dp.hide", function (e) {
$('#tecnici > div').addClass('table-responsive');
})
});
$('.datepicker').each(function () {
$this = $(this);

File diff suppressed because it is too large Load Diff

12
log.php
View File

@ -4,11 +4,7 @@ include_once __DIR__.'/core.php';
$pageTitle = tr('Log');
if (file_exists($docroot.'/include/custom/top.php')) {
include $docroot.'/include/custom/top.php';
} else {
include $docroot.'/include/top.php';
}
include_once App::filepath('include|custom|', 'top.php');
echo '
<div class="box">
@ -81,8 +77,4 @@ echo '
</div>
<!-- /.box -->';
if (file_exists($docroot.'/include/custom/bottom.php')) {
include $docroot.'/include/custom/bottom.php';
} else {
include $docroot.'/include/bottom.php';
}
include_once App::filepath('include|custom|', 'bottom.php');

View File

@ -88,7 +88,7 @@ echo '
<div class="row">
<div class="col-md-6">
{[ "type": "select", "multiple": "1", "label": "'.tr('Stampe').'", "name": "prints[]", "value": "'.implode(',', $selected).'", "values": "query=SELECT id, title AS text FROM zz_prints WHERE id_module = '.prepare($id_module).'" ]}
{[ "type": "select", "multiple": "1", "label": "'.tr('Stampe').'", "name": "prints[]", "value": "'.implode(',', $selected).'", "values": "query=SELECT id, title AS text FROM zz_prints WHERE id_module = '.prepare($id_module).' AND enabled=1" ]}
</div>';
// Allegati
@ -131,8 +131,11 @@ echo '
<script>
var emails = [];
$(document).ready(function(){
$(document).ready(function(){';
// Autocompletamento destinatario
if (!empty($variables['id_anagrafica'])) {
echo '
$(document).load(globals.rootdir + "/ajax_complete.php?module=Anagrafiche&op=get_email&id_anagrafica='.$variables['id_anagrafica'].'", function(response) {
emails = JSON.parse(response);
@ -144,7 +147,10 @@ echo '
$(this).autocomplete("search", $(this).val())
});;
});
});
});';
}
echo '
CKEDITOR.replace("body", {
toolbar: globals.ckeditorToolbar,

View File

@ -14,7 +14,7 @@ switch (post('op')) {
if (!empty($id)) {
// Leggo l'id del modulo
$rs = $dbo->fetchArray('SELECT id, name, directory FROM zz_modules WHERE id='.prepare($id).' AND `default`=0');
$modulo = $rs[0]['name'];
$modulo = $rs[0]['title'];
$module_dir = $rs[0]['directory'];
if (count($rs) == 1) {
@ -38,31 +38,25 @@ switch (post('op')) {
break;
case 'disable':
$dbo->query('UPDATE zz_modules SET enabled=0 WHERE id='.prepare($id));
$rs = $dbo->fetchArray('SELECT id, name FROM zz_modules WHERE id='.prepare($id));
$modulo = $rs[0]['name'];
$dbo->query('UPDATE `zz_modules` SET `enabled` = 0 WHERE (`id` = '.prepare($id).' OR `parent` = '.prepare($id).') AND `id` != '.prepare(Modules::get('Aggiornamenti')['id']));
$_SESSION['infos'][] = tr('Modulo _MODULE_ disabilitato!', [
'_MODULE_' => '"'.$modulo.'"',
'_MODULE_' => '"'.Modules::get($id)['title'].'"',
]);
break;
case 'enable':
$dbo->query('UPDATE zz_modules SET enabled=1 WHERE id='.prepare($id));
$rs = $dbo->fetchArray('SELECT id, name FROM zz_modules WHERE id='.prepare($id));
$modulo = $rs[0]['name'];
$dbo->query('UPDATE `zz_modules` SET `enabled` = 1 WHERE `id` = '.prepare($id).' OR `parent` = '.prepare($id));
$_SESSION['infos'][] = tr('Modulo _MODULE_ abilitato!', [
'_MODULE_' => '"'.$modulo.'"',
'_MODULE_' => '"'.Modules::get($id)['title'].'"',
]);
break;
case 'disable_widget':
$dbo->query('UPDATE zz_widgets SET enabled=0 WHERE id='.prepare($id));
$dbo->query('UPDATE zz_widgets SET enabled = 0 WHERE id = '.prepare($id));
$rs = $dbo->fetchArray('SELECT id, name FROM zz_widgets WHERE id='.prepare($id));
$widget = $rs[0]['name'];

View File

@ -39,51 +39,22 @@ if (get_var('Attiva aggiornamenti')) {
}
echo '
<div class="row">';
// Aggiornamento
echo '
<div class="col-md-6">
<div class="box box-success">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Carica un aggiornamento').'</h3>
</div>
<div class="box-body">
<form action="'.$rootdir.'/controller.php?id_module='.$id_module.'" method="post" enctype="multipart/form-data" class="form-inline" id="update">
<input type="hidden" name="op" value="upload">
<input type="hidden" name="type" value="update">
<div class="box box-success">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Carica un aggiornamento').' <span class="tip" title="'.tr('Form di caricamento per aggiornamenti del gestionale e innesti di moduli e plugin').'"><i class="fa fa-question-circle-o"></i></span></h3>
</div>
<div class="box-body">
<form action="'.ROOTDIR.'/controller.php?id_module='.$id_module.'" method="post" enctype="multipart/form-data" class="form-inline" id="update">
<input type="hidden" name="op" value="upload">
<label><input type="file" name="blob"></label>
<label><input type="file" name="blob"></label>
<button type="button" class="btn btn-primary" onclick="if( confirm(\''.tr('Avviare la procedura?').'\') ){ $(\'#update\').submit(); }">
<i class="fa fa-upload"></i> '.tr('Carica').'...
</button>
</form>
</div>
</div>
</div>';
// Nuovo modulo
echo '
<div class="col-md-6">
<div class="box box-info">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Carica un nuovo modulo').'</h3>
</div>
<div class="box-body">
<form action="'.$rootdir.'/controller.php?id_module='.$id_module.'" method="post" enctype="multipart/form-data" class="form-inline" id="module">
<input type="hidden" name="op" value="upload">
<input type="hidden" name="type" value="new">
<label><input type="file" name="blob"></label>
<button type="button" class="btn btn-primary" onclick="if( confirm(\''.tr('Avviare la procedura?').'\') ){ $(\'#module\').submit(); }">
<i class="fa fa-upload"></i> '.tr('Carica').'...
</button>
</form>
</div>
</div>
</div>';
echo '
</div>';
<button type="button" class="btn btn-primary pull-right" onclick="if( confirm(\''.tr('Avviare la procedura?').'\') ){ $(\'#update\').submit(); }">
<i class="fa fa-upload"></i> '.tr('Carica').'...
</button>
</form>
</div>
</div>';
}
// Elenco moduli installati
@ -100,7 +71,7 @@ echo '
<th width="20">'.tr('Opzioni').'</th>
</tr>';
$modules = $dbo->fetchArray('SELECT * FROM zz_modules WHERE parent IS NULL ORDER BY `order` ASC');
$modules = Modules::getHierarchy();
$osm_version = Update::getVersion();
@ -118,9 +89,9 @@ foreach ($modules as $module) {
// Possibilità di disabilitare o abilitare i moduli tranne quello degli aggiornamenti
if ($module['id'] != $id_module) {
if ($module['enabled']) {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Disabilitare questo modulo?')."') ){ $.post( '".$rootdir.'/actions.php?id_module='.$id_module."', { op: 'disable', id: '".$module['id']."' }, function(response){ location.href='".$rootdir.'/controller.php?id_module='.$id_module."'; }); }\">".$stato."</a>\n";
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Disabilitare questo modulo?')."') ){ $.post( '".ROOTDIR.'/actions.php?id_module='.$id_module."', { op: 'disable', id: '".$module['id']."' }, function(response){ location.href='".ROOTDIR.'/controller.php?id_module='.$id_module."'; }); }\">".$stato."</a>\n";
} else {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Abilitare questo modulo?')."') ){ $.post( '".$rootdir.'/actions.php?id_module='.$id_module."', { op: 'enable', id: '".$module['id']."' }, function(response){ location.href='".$rootdir.'/controller.php?id_module='.$id_module."'; }); }\"\">".$stato."</a>\n";
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Abilitare questo modulo?')."') ){ $.post( '".ROOTDIR.'/actions.php?id_module='.$id_module."', { op: 'enable', id: '".$module['id']."' }, function(response){ location.href='".ROOTDIR.'/controller.php?id_module='.$id_module."'; }); }\"\">".$stato."</a>\n";
}
}
@ -134,7 +105,7 @@ foreach ($modules as $module) {
if ($comp) {
$compatible = '<i class="fa fa-check-circle text-success" data-toggle="tooltip" title="'.tr('Compatibile').'"></i>';
($module['enabled']) ? $class = 'success': $class = 'warning';
($module['enabled']) ? $class = 'success' : $class = 'warning';
} else {
$compatible = '<i class="fa fa-warning text-danger" data-toggle="tooltip" title="'.tr('Non compatibile!').tr('Questo modulo è compatibile solo con le versioni').': '.$module['compatibility'].'"></i>';
$class = 'danger';
@ -142,7 +113,7 @@ foreach ($modules as $module) {
echo '
<tr class="'.$class.'">
<td>'.$module['name'].'</td>
<td>'.$module['title'].'</td>
<td align="right">'.$module['version'].'</td>
<td align="center">'.$stato.'</td>
<td align="center">'.$compatible.'</td>';
@ -153,7 +124,7 @@ foreach ($modules as $module) {
// Possibilità di disinstallare solo se il modulo non è tra quelli predefiniti
if (empty($module['default'])) {
echo "
<a href=\"javascript:;\" data-toggle='tooltip' title=\"".tr('Disinstalla')."...\" onclick=\"if( confirm('".tr('Vuoi disinstallare questo modulo?').' '.tr('Tutti i dati salvati andranno persi!')."') ){ if( confirm('".tr('Sei veramente sicuro?')."') ){ $.post( '".$rootdir.'/actions.php?id_module='.$id_module."', { op: 'uninstall', id: '".$module['id']."' }, function(response){ location.href='".$rootdir.'/controller.php?id_module='.$id_module."'; }); } }\"><i class='fa fa-trash'></i></a>";
<a href=\"javascript:;\" data-toggle='tooltip' title=\"".tr('Disinstalla')."...\" onclick=\"if( confirm('".tr('Vuoi disinstallare questo modulo?').' '.tr('Tutti i dati salvati andranno persi!')."') ){ if( confirm('".tr('Sei veramente sicuro?')."') ){ $.post( '".ROOTDIR.'/actions.php?id_module='.$id_module."', { op: 'uninstall', id: '".$module['id']."' }, function(response){ location.href='".ROOTDIR.'/controller.php?id_module='.$id_module."'; }); } }\"><i class='fa fa-trash'></i></a>";
} else {
echo "
<a class='disabled text-muted'>
@ -166,71 +137,7 @@ foreach ($modules as $module) {
</tr>';
// Prima di cambiare modulo verifico se ci sono sottomoduli
$submodules = $dbo->fetchArray('SELECT * FROM zz_modules WHERE parent='.prepare($module['id']).' ORDER BY `order` ASC');
foreach ($submodules as $sub) {
// STATO
if (!empty($sub['enabled'])) {
$text = tr('Abilitato');
$text .= ($sub['id'] != $id_module) ? '. '.tr('Clicca per disabilitarlo').'...' : '';
$stato = '<i class="fa fa-cog fa-spin text-success" data-toggle="tooltip" title="'.$text.'"></i>';
} else {
$stato = '<i class="fa fa-cog text-warning" data-toggle="tooltip" title="'.tr('Non abilitato').'"></i>';
$class = 'warning';
}
// Possibilità di disabilitare o abilitare i moduli tranne quello degli aggiornamenti
if ($sub['id'] != $id_module) {
if ($sub['enabled']) {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Disabilitare questo modulo?')."') ){ $.post( '".$rootdir.'/actions.php?id_module='.$id_module."', { op: 'disable', id: '".$sub['id']."' }, function(response){ location.href='".$rootdir.'/controller.php?id_module='.$id_module."'; }); }\">".$stato."</a>\n";
} else {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Abilitare questo modulo?')."') ){ $.post( '".$rootdir.'/actions.php?id_module='.$id_module."', { op: 'enable', id: '".$sub['id']."' }, function(response){ location.href='".$rootdir.'/controller.php?id_module='.$id_module."'; }); }\"\">".$stato."</a>\n";
}
}
// COMPATIBILITA'
$compatibilities = explode(',', $sub['compatibility']);
// Controllo per ogni versione se la regexp combacia per dire che è compatibile o meno
$comp = false;
foreach ($compatibilities as $compatibility) {
$comp = (preg_match('/'.$compatibility.'/', $osm_version)) ? true : $comp;
}
if ($comp) {
$compatible = '<i class="fa fa-check-circle text-success" data-toggle="tooltip" title="'.tr('Compatibile').'"></i>';
($sub['enabled']) ? $class = 'success': $class = 'warning';
} else {
$compatible = '<i class="fa fa-warning text-danger" data-toggle="tooltip" title="'.tr('Non compatibile!').tr('Questo modulo è compatibile solo con le versioni').': '.$sub['compatibility'].'"></i>';
$class = 'danger';
}
echo '
<tr class="'.$class.'">
<td><small>&nbsp;&nbsp;- '.$sub['name'].'</small></td>
<td align="right">'.$sub['version'].'</td>
<td align="center">'.$stato.'</td>
<td align="center">'.$compatible.'</td>';
echo '
<td>';
// Possibilità di disinstallare solo se il modulo non è tra quelli predefiniti
if (empty($sub['default'])) {
echo "
<a href=\"javascript:;\" data-toggle='tooltip' title=\"".tr('Disinstalla')."...\" onclick=\"if( confirm('".tr('Vuoi disinstallare questo modulo?').' '.tr('Tutti i dati salvati andranno persi!')."') ){ if( confirm('".tr('Sei veramente sicuro?')."') ){ $.post( '".$rootdir.'/actions.php?id_module='.$id_module."', { op: 'uninstall', id: '".$sub['id']."' }, function(response){ location.href='".$rootdir.'/controller.php?id_module='.$id_module."'; }); } }\">
<i class='fa fa-trash'></i>
</a>";
} else {
echo "
<a class='disabled text-muted'>
<i class='fa fa-trash'></i>
</a>";
}
echo '
</td>
</tr>';
}
echo submodules($module['children']);
}
echo '
@ -273,9 +180,9 @@ foreach ($widgets as $widget) {
// Possibilità di disabilitare o abilitare i moduli tranne quello degli aggiornamenti
if ($widget['enabled']) {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Disabilitare questo widget?')."') ){ $.post( '".$rootdir.'/actions.php?id_module='.$id_module."', { op: 'disable_widget', id: '".$widget['id']."' }, function(response){ location.href='".$rootdir.'/controller.php?id_module='.$id_module."'; }); }\">".$stato."</a>\n";
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Disabilitare questo widget?')."') ){ $.post( '".ROOTDIR.'/actions.php?id_module='.$id_module."', { op: 'disable_widget', id: '".$widget['id']."' }, function(response){ location.href='".ROOTDIR.'/controller.php?id_module='.$id_module."'; }); }\">".$stato."</a>\n";
} else {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Abilitare questo widget?')."') ){ $.post( '".$rootdir.'/actions.php?id_module='.$id_module."', { op: 'enable_widget', id: '".$widget['id']."' }, function(response){ location.href='".$rootdir.'/controller.php?id_module='.$id_module."'; }); }\"\">".$stato."</a>\n";
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Abilitare questo widget?')."') ){ $.post( '".ROOTDIR.'/actions.php?id_module='.$id_module."', { op: 'enable_widget', id: '".$widget['id']."' }, function(response){ location.href='".ROOTDIR.'/controller.php?id_module='.$id_module."'; }); }\"\">".$stato."</a>\n";
}
// POSIZIONE
@ -287,10 +194,10 @@ foreach ($widgets as $widget) {
if ($widget['location'] == 'controller_right') {
$posizione = "<i class='fa fa-arrow-up text-warning' data-toggle='tooltip' title=\"".tr('Clicca per cambiare la posizione...')."\"></i>&nbsp;<i class='fa fa-arrow-right text-success' data-toggle='tooltip' title=\"\"></i>";
$posizione = "<a href='javascript:;' onclick=\"if( confirm('".tr('Cambiare la posizione di questo widget?')."') ){ $.post( '".$rootdir.'/actions.php?id_module='.$id_module."', { op: 'change_position_widget_top', id: '".$widget['id']."' }, function(response){ location.href='".$rootdir.'/controller.php?id_module='.$id_module."'; }); }\"\">".$posizione."</a>\n";
$posizione = "<a href='javascript:;' onclick=\"if( confirm('".tr('Cambiare la posizione di questo widget?')."') ){ $.post( '".ROOTDIR.'/actions.php?id_module='.$id_module."', { op: 'change_position_widget_top', id: '".$widget['id']."' }, function(response){ location.href='".ROOTDIR.'/controller.php?id_module='.$id_module."'; }); }\"\">".$posizione."</a>\n";
} elseif ($widget['location'] == 'controller_top') {
$posizione = "<i class='fa fa-arrow-up text-success' data-toggle='tooltip' title=\"\"></i>&nbsp;<i class='fa fa-arrow-right text-warning' data-toggle='tooltip' title=\"".tr('Clicca per cambiare la posizione...').'"></i></i>';
$posizione = "<a href='javascript:;' onclick=\"if( confirm('".tr('Cambiare la posizione di questo widget?')."') ){ $.post( '".$rootdir.'/actions.php?id_module='.$id_module."', { op: 'change_position_widget_right', id: '".$widget['id']."' }, function(response){ location.href='".$rootdir.'/controller.php?id_module='.$id_module."'; }); }\"\">".$posizione."</a>\n";
$posizione = "<a href='javascript:;' onclick=\"if( confirm('".tr('Cambiare la posizione di questo widget?')."') ){ $.post( '".ROOTDIR.'/actions.php?id_module='.$id_module."', { op: 'change_position_widget_right', id: '".$widget['id']."' }, function(response){ location.href='".ROOTDIR.'/controller.php?id_module='.$id_module."'; }); }\"\">".$posizione."</a>\n";
}
echo '

View File

@ -0,0 +1,77 @@
<?php
function submodules($list, $depth = 1)
{
$osm_version = Update::getVersion();
$id_module = App::getCurrentModule()['id'];
foreach ($list as $sub) {
// STATO
if (!empty($sub['enabled'])) {
$text = tr('Abilitato');
$text .= ($sub['id'] != $id_module) ? '. '.tr('Clicca per disabilitarlo').'...' : '';
$stato = '<i class="fa fa-cog fa-spin text-success" data-toggle="tooltip" title="'.$text.'"></i>';
} else {
$stato = '<i class="fa fa-cog text-warning" data-toggle="tooltip" title="'.tr('Non abilitato').'"></i>';
$class = 'warning';
}
// Possibilità di disabilitare o abilitare i moduli tranne quello degli aggiornamenti
if ($sub['id'] != $id_module) {
if ($sub['enabled']) {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Disabilitare questo modulo?')."') ){ $.post( '".ROOTDIR.'/actions.php?id_module='.$id_module."', { op: 'disable', id: '".$sub['id']."' }, function(response){ location.href='".ROOTDIR.'/controller.php?id_module='.$id_module."'; }); }\">".$stato."</a>\n";
} else {
$stato = "<a href='javascript:;' onclick=\"if( confirm('".tr('Abilitare questo modulo?')."') ){ $.post( '".ROOTDIR.'/actions.php?id_module='.$id_module."', { op: 'enable', id: '".$sub['id']."' }, function(response){ location.href='".ROOTDIR.'/controller.php?id_module='.$id_module."'; }); }\"\">".$stato."</a>\n";
}
}
// COMPATIBILITA'
// Controllo per ogni versione se la regexp combacia per dire che è compatibile o meno
$compatibilities = explode(',', $sub['compatibility']);
$comp = false;
foreach ($compatibilities as $compatibility) {
$comp = (preg_match('/'.$compatibility.'/', $osm_version)) ? true : $comp;
}
if ($comp) {
$compatible = '<i class="fa fa-check-circle text-success" data-toggle="tooltip" title="'.tr('Compatibile').'"></i>';
($sub['enabled']) ? $class = 'success' : $class = 'warning';
} else {
$compatible = '<i class="fa fa-warning text-danger" data-toggle="tooltip" title="'.tr('Non compatibile!').tr('Questo modulo è compatibile solo con le versioni').': '.$sub['compatibility'].'"></i>';
$class = 'danger';
}
$result .= '
<tr class="'.$class.'">
<td><small>'.str_repeat('&nbsp;', $depth * 4).'- '.$sub['title'].'</small></td>
<td align="right">'.$sub['version'].'</td>
<td align="center">'.$stato.'</td>
<td align="center">'.$compatible.'</td>';
$result .= '
<td>';
// Possibilità di disinstallare solo se il modulo non è tra quelli predefiniti
if (empty($sub['default'])) {
$result .= "
<a href=\"javascript:;\" data-toggle='tooltip' title=\"".tr('Disinstalla')."...\" onclick=\"if( confirm('".tr('Vuoi disinstallare questo modulo?').' '.tr('Tutti i dati salvati andranno persi!')."') ){ if( confirm('".tr('Sei veramente sicuro?')."') ){ $.post( '".ROOTDIR.'/actions.php?id_module='.$id_module."', { op: 'uninstall', id: '".$sub['id']."' }, function(response){ location.href='".ROOTDIR.'/controller.php?id_module='.$id_module."'; }); } }\">
<i class='fa fa-trash'></i>
</a>";
} else {
$result .= "
<a class='disabled text-muted'>
<i class='fa fa-trash'></i>
</a>";
}
$result .= '
</td>
</tr>';
$result .= submodules($sub['children'], $depth + 1);
}
return $result;
}

View File

@ -6,113 +6,106 @@ if (!get_var('Attiva aggiornamenti')) {
die(tr('Accesso negato'));
}
$tmp = $_FILES['blob']['tmp_name'];
$filename = $_FILES['blob']['name'];
$filetype = $_FILES['blob']['type'];
$size = $_FILES['blob']['size'];
$type = $_POST['type'];
if (!extension_loaded('zip')) {
$_SESSION['errors'][] = tr('Estensione zip non supportata!').'<br>'.tr('Verifica e attivala sul tuo file _FILE_', [
'_FILE_' => '<b>php.ini</b>',
]);
} elseif (!ends_with($filename, '.zip')) {
$_SESSION['errors'][] = tr('Il file non è un archivio zip!');
} elseif (!empty($tmp) && is_file($tmp)) {
$zip = new ZipArchive();
if ($zip->open($tmp)) {
$tmp_dir = $docroot.'/tmp';
// Controllo sulla cartella
directory($tmp_dir);
$zip->extractTo($tmp_dir);
// AGGIORNAMENTO
if ('update' == $type) {
// Salvo i file di configurazione e versione attuale
$old_config = file_get_contents($docroot.'/config.inc.php');
// Aggiornamento del CORE
if (file_exists($tmp_dir.'/VERSION')) {
//rename($docroot.'/VERSION', $docroot.'/VERSION.old');
// Copia i file dalla cartella temporanea alla root
copyr($tmp_dir, $docroot);
// Scollego l'utente per eventuali aggiornamenti del db
Auth::logout();
}
// Aggiornamento di un MODULO
elseif (file_exists($tmp_dir.'/MODULE')) {
$module_info = parse_ini_file($tmp_dir.'/MODULE', true);
$module_name = $module_info['module_name'];
$module_dir = $module_info['module_directory'];
// Copio i file nella cartella "modules/<nomemodulo>/"
copyr($tmp_dir, $docroot.'/modules/'.$module_dir.'/');
// Rinomino il file di versione per forzare l'aggiornamento
//rename($docroot.'/VERSION_'.$module, $docroot.'/VERSION_'.$module.'.old');
// Scollego l'utente per eventuali aggiornamenti del db
Auth::logout();
} else {
$_SESSION['errors'][] = tr('File di aggiornamento non riconosciuto!');
}
// Ripristino il file di configurazione dell'utente
file_put_contents($docroot.'/config.inc.php', $old_config);
}
// NUOVO MODULO
elseif ('new' == $type) {
// Se non c'è il file MODULE non é un modulo
if (is_file($tmp_dir.'/MODULE')) {
// Leggo le info dal file di configurazione del modulo
$module_info = parse_ini_file($tmp_dir.'/MODULE', true);
$module_name = $module_info['module_name'];
$module_version = $module_info['module_version'];
$module_dir = $module_info['module_directory'];
// Copio i file nella cartella "modules/<nomemodulo>/"
copyr($tmp_dir, $docroot.'/modules/'.$module_dir.'/');
// Scollego l'utente per eventuali aggiornamenti del db
Auth::logout();
// Sposto i file della cartella "files/" nella root
$files_dir = $docroot.'/modules/'.$module_dir.'/files/';
if (is_dir($files_dir)) {
copyr($files_dir, $docroot.'/files');
delete($files_dir);
}
// Inserimento delle voci del modulo nel db per ogni sezione [sezione]
// Verifico che il modulo non esista già
$n = $dbo->fetchNum('SELECT name FROM zz_modules WHERE name='.prepare($module_name));
if (0 == $n) {
$module_info['module_parent'] = $dbo->fetchNum('SELECT name FROM zz_modules WHERE id='.prepare($module_info['module_parent'])) ? prepare($module_info['module_parent']) : 'NULL';
$query = 'INSERT INTO zz_modules(`name`, `title`, `directory`, `options`, `icon`, `version`, `compatibility`, `order`, `parent`, `default`, `enabled`) VALUES('.prepare($module_name).', '.prepare($module_name).', '.prepare($module_dir).', '.prepare($module_info['module_options']).', '.prepare($module_info['module_icon']).', '.prepare($module_version).', '.prepare($module_info['module_compatibility']).', "100", '.$module_info['module_parent'].', 0, 1)';
$dbo->query($query);
}
}
// File zip non contiene il file MODULE
else {
$_SESSION['errors'][] = tr('File di installazione non valido!');
}
}
delete($tmp_dir);
redirect($rootdir);
} else {
$_SESSION['errors'][] = checkZip($tmp);
}
$zip->close();
return;
}
$file = $_FILES['blob'];
$type = $_POST['type'];
// Lettura dell'archivio
$zip = new ZipArchive();
if (!$zip->open($file['tmp_name'])) {
$_SESSION['errors'][] = tr('File di installazione non valido!');
$_SESSION['errors'][] = checkZip($file['tmp_name']);
return;
}
// Percorso di estrazione
$extraction_dir = $docroot.'/tmp';
directory($extraction_dir);
// Estrazione dell'archivio
$zip->extractTo($extraction_dir);
// Aggiornamento del progetto
if (file_exists($extraction_dir.'/VERSION')) {
// Salva il file di configurazione
$config = file_get_contents($docroot.'/config.inc.php');
// Copia i file dalla cartella temporanea alla root
copyr($extraction_dir, $docroot);
// Ripristina il file di configurazione dell'installazione
file_put_contents($docroot.'/config.inc.php', $config);
} else {
$finder = Symfony\Component\Finder\Finder::create()
->files()
->ignoreDotFiles(true)
->ignoreVCS(true)
->in($extraction_dir);
$files = $finder->name('MODULE')->name('PLUGIN');
foreach ($files as $file) {
// Informazioni dal file di configurazione
$info = Util\Ini::readFile($file->getRealPath());
// Informazioni aggiuntive per il database
$insert = [];
// Modulo
if (basename($file->getRealPath()) == 'MODULE') {
$directory = 'modules';
$table = 'zz_modules';
$installed = Modules::get($info['name']);
$insert['parent'] = Modules::get($info['parent']);
}
// Plugin
elseif (basename($file->getRealPath()) == 'PLUGIN') {
$directory = 'plugins';
$table = 'zz_plugins';
$installed = Plugins::get($info['name']);
$insert['idmodule_from'] = Modules::get($info['module_from'])['id'];
$insert['idmodule_to'] = Modules::get($info['module_to'])['id'];
$insert['position'] = $info['position'];
}
// Copia dei file nella cartella relativa
copyr(dirname($file->getRealPath()), $docroot.'/'.$directory.'/'.$info['directory']);
// Eventuale registrazione nel database
if (empty($installed)) {
$dbo->insert($table, array_merge($insert, [
'name' => $info['name'],
'title' => !empty($info['title']) ? $info['title'] : $info['name'],
'directory' => $info['directory'],
'options' => $info['options'],
'version' => $info['version'],
'compatibility' => $info['compatibility'],
'order' => 100,
'default' => 0,
'enabled' => 1,
]));
$_SESSION['errors'][] = tr('Installazione completata!');
} else {
$_SESSION['errors'][] = tr('Aggiornamento completato!');
}
}
}
// Rimozione delle risorse inutilizzate
delete($extraction_dir);
$zip->close();
// Redirect
redirect(ROOTDIR.'/editor.php?id_module='.$id_module);

View File

@ -49,7 +49,7 @@ switch (post('op')) {
'idlistino_vendite' => $post['idlistino_vendite'],
'idiva_acquisti' => $post['idiva_acquisti'],
'idiva_vendite' => $post['idiva_vendite'],
'idbanca_acquisti' => $post['idbanca_acquisti'],
'idbanca_acquisti' => $post['idbanca_acquisti'],
'idbanca_vendite' => $post['idbanca_vendite'],
'settore' => $post['settore'],
'marche' => $post['marche'],
@ -76,15 +76,10 @@ switch (post('op')) {
// Validazione della Partita IVA
$check_vat_number = Validate::isValidVatNumber(strtoupper($post['piva']));
// Se $check_vat_number non è null e la riposta è negativa --> mostro il messaggio di avviso.
if ((!is_null($check_vat_number)) && (!$check_vat_number->valid)) {
if (!empty($check_vat_number->error->info)) {
$_SESSION['errors'][] = $check_vat_number->error->info;
} else {
$_SESSION['errors'][] = tr('Attenzione: la partita IVA _IVA_ sembra non essere valida', [
'_IVA_' => $post['piva'],
]);
}
if (empty($check_vat_number)) {
$_SESSION['errors'][] = tr('Attenzione: la partita IVA _IVA_ sembra non essere valida', [
'_IVA_' => $post['piva'],
]);
}
// Aggiorno il codice anagrafica se non è già presente, altrimenti lo ignoro
@ -107,7 +102,7 @@ switch (post('op')) {
// Aggiorno le tipologie di anagrafica
$post['idtipoanagrafica'] = (array) $post['idtipoanagrafica'];
if (str_contains($records[0]['idtipianagrafica'], $id_azienda)) {
if (in_array($id_azienda, $tipi_anagrafica)) {
$post['idtipoanagrafica'][] = $id_azienda;
}
@ -193,8 +188,9 @@ switch (post('op')) {
// Inserisco il rapporto dell'anagrafica (cliente, tecnico, ecc)
$dbo->sync('an_tipianagrafiche_anagrafiche', ['idanagrafica' => $new_id], ['idtipoanagrafica' => (array) $idtipoanagrafica]);
if (in_array($id_azienda, $post['idtipoanagrafica'])) {
$dbo->query('UPDATE zz_settings SET valore='.prepare($new_id)." WHERE nome='Azienda predefinita'");
if (in_array($id_azienda, $idtipoanagrafica)) {
Settings::set('Azienda predefinita', $new_id);
$_SESSION['infos'][] = tr('Anagrafica Azienda impostata come predefinita. Per ulteriori informazionioni, visitare "Strumenti -> Impostazioni -> Generali".');
}
@ -262,11 +258,23 @@ switch (post('op')) {
case 'delete':
// Se l'anagrafica non è l'azienda principale, la disattivo
if (!str_contains($records[0]['idtipianagrafica'], $id_azienda)) {
if (!in_array($id_azienda, $tipi_anagrafica)) {
$dbo->query('UPDATE an_anagrafiche SET deleted = 1 WHERE idanagrafica = '.prepare($id_record).Modules::getAdditionalsQuery($id_module));
// Se l'anagrafica è collegata ad un utente lo disabilito
$dbo->query('UPDATE zz_users SET enabled = 0 WHERE idanagrafica = '.prepare($id_record).Modules::getAdditionalsQuery($id_module));
$_SESSION['infos'][] = tr('Anagrafica eliminata!');
}
break;
}
// Operazioni aggiuntive per il logo
if (filter('op') == 'link_file') {
$nome = 'Logo stampe';
if (Settings::get('Azienda predefinita') == $id_record && filter('nome_allegato') == $nome) {
Settings::set($nome, $upload);
}
}

View File

@ -5,8 +5,6 @@ include_once __DIR__.'/../../core.php';
if (get('tipoanagrafica') != '') {
$rs = $dbo->fetchArray('SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='.prepare(get('tipoanagrafica')));
$idtipoanagrafica = $rs[0]['idtipoanagrafica'];
} else {
$idtipoanagrafica = '';
}
echo '
@ -20,14 +18,12 @@ echo '
</div>
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Tipo di anagrafica').'", "name": "idtipoanagrafica[]", "multiple": "1", "required": 1, "values": "query=SELECT idtipoanagrafica AS id, descrizione FROM an_tipianagrafiche WHERE idtipoanagrafica NOT IN (SELECT DISTINCT(x.idtipoanagrafica) FROM an_tipianagrafiche_anagrafiche x INNER JOIN an_tipianagrafiche t ON x.idtipoanagrafica = t.idtipoanagrafica INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = x.idanagrafica WHERE t.descrizione = \'Azienda\' AND deleted = 0) ORDER BY descrizione", "value": "'.$idtipoanagrafica.'" ]}
{[ "type": "select", "label": "'.tr('Tipo di anagrafica').'", "name": "idtipoanagrafica[]", "multiple": "1", "required": 1, "values": "query=SELECT idtipoanagrafica AS id, descrizione FROM an_tipianagrafiche WHERE idtipoanagrafica NOT IN (SELECT DISTINCT(x.idtipoanagrafica) FROM an_tipianagrafiche_anagrafiche x INNER JOIN an_tipianagrafiche t ON x.idtipoanagrafica = t.idtipoanagrafica INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = x.idanagrafica WHERE t.descrizione = \'Azienda\' AND deleted = 0) ORDER BY descrizione", "value": "'.(isset($idtipoanagrafica) ? $idtipoanagrafica : null).'", "readonly": '.(!empty($readonly_tipo) ? 1 : 0).' ]}
</div>
</div>';
echo
'<div class="box box-info collapsed-box">
echo '
<div class="box box-info collapsed-box">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Dati anagrafici').'</h3>
<div class="box-tools pull-right">
@ -39,46 +35,46 @@ echo
<div class="box-body collapse">
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('Partita IVA').'", "maxlength": 13, "name": "piva", "class": "text-center alphanumeric-mask", "value": "" ]}
{[ "type": "text", "label": "'.tr('Partita IVA').'", "maxlength": 13, "name": "piva", "class": "text-center alphanumeric-mask" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('Codice fiscale').'", "maxlength": 16, "name": "codice_fiscale", "class": "text-center alphanumeric-mask", "value": "" ]}
{[ "type": "text", "label": "'.tr('Codice fiscale').'", "maxlength": 16, "name": "codice_fiscale", "class": "text-center alphanumeric-mask" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Relazione').'", "name": "idrelazione", "values": "query=SELECT id, descrizione, colore AS _bgcolor_ FROM an_relazioni ORDER BY descrizione", "value": "" ]}
{[ "type": "select", "label": "'.tr('Relazione').'", "name": "idrelazione", "values": "query=SELECT id, descrizione, colore AS _bgcolor_ FROM an_relazioni ORDER BY descrizione" ]}
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('Indirizzo').'", "name": "indirizzo", "value": "" ]}
{[ "type": "text", "label": "'.tr('Indirizzo').'", "name": "indirizzo" ]}
</div>
<div class="col-md-2">
{[ "type": "text", "label": "'.tr('C.A.P.').'", "name": "cap", "maxlength": 5, "class": "text-center", "value": "" ]}
{[ "type": "text", "label": "'.tr('C.A.P.').'", "name": "cap", "maxlength": 5, "class": "text-center" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('Città').'", "name": "citta", "class": "text-center", "value": "" ]}
{[ "type": "text", "label": "'.tr('Città').'", "name": "citta", "class": "text-center" ]}
</div>
<div class="col-md-2">
{[ "type": "text", "label": "'.tr('Provincia').'", "name": "provincia", "maxlength": 2, "class": "text-center", "value": "" ]}
{[ "type": "text", "label": "'.tr('Provincia').'", "name": "provincia", "maxlength": 2, "class": "text-center" ]}
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('Telefono').'", "name": "telefono", "class": "text-center", "value": "", "icon-before": "<i class=\"fa fa-phone\"></i>" ]}
{[ "type": "text", "label": "'.tr('Telefono').'", "name": "telefono", "class": "text-center", "icon-before": "<i class=\"fa fa-phone\"></i>" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('Cellulare').'", "name": "cellulare", "class": "text-center", "value": "", "icon-before": "<i class=\"fa fa-mobile\"></i>" ]}
{[ "type": "text", "label": "'.tr('Cellulare').'", "name": "cellulare", "class": "text-center", "icon-before": "<i class=\"fa fa-mobile\"></i>" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('Email').'", "name": "email", "class": "email-mask", "placeholder":"casella@dominio.ext", "value": "", "icon-before": "<i class=\"fa fa-envelope\"></i>" ]}
{[ "type": "text", "label": "'.tr('Email').'", "name": "email", "class": "email-mask", "placeholder":"casella@dominio.ext", "icon-before": "<i class=\"fa fa-envelope\"></i>" ]}
</div>
</div>
@ -86,11 +82,8 @@ echo
</div>
</div>';
echo
'<div class="row">
echo
'<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary"><i class="fa fa-plus"></i> '.tr('Aggiungi').'</button>
</div>

View File

@ -52,6 +52,7 @@ foreach ($rs as $r) {
$result['link'] = ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$r['id'];
$result['title'] = $r['ragione_sociale'];
$result['title'] .= ($r['deleted']) ? ' <small class="text-danger"><em>('.tr('Eliminato').')</em></small>': '';
$result['category'] = 'Anagrafiche';
// Campi da evidenziare

View File

@ -4,16 +4,14 @@ include_once __DIR__.'/../../../core.php';
switch ($resource) {
case 'clienti':
//$citta_cliente = ", IF(citta IS NULL OR citta = '', '', CONCAT(' (', citta, ')'))";
$query = "SELECT an_anagrafiche.idanagrafica AS id, CONCAT(ragione_sociale $citta_cliente) AS descrizione, idtipointervento_default FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica |where| ORDER BY ragione_sociale";
$query = 'SELECT an_anagrafiche.idanagrafica AS id, CONCAT(ragione_sociale) AS descrizione, idtipointervento_default FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica |where| ORDER BY ragione_sociale';
foreach ($elements as $element) {
$filter[] = 'an_anagrafiche.idanagrafica='.prepare($element);
}
$where[] = "descrizione='Cliente'";
if (empty($filter)) {
$where[] = "descrizione='Cliente'";
$where[] = 'deleted=0';
}
@ -34,8 +32,8 @@ switch ($resource) {
$filter[] = 'an_anagrafiche.idanagrafica='.prepare($element);
}
$where[] = "descrizione='Fornitore'";
if (empty($filter)) {
$where[] = "descrizione='Fornitore'";
$where[] = 'deleted=0';
}
@ -56,8 +54,8 @@ switch ($resource) {
$filter[] = 'an_anagrafiche.idanagrafica='.prepare($element);
}
$where[] = "descrizione='Agente'";
if (empty($filter)) {
$where[] = "descrizione='Agente'";
$where[] = 'deleted=0';
}
@ -77,7 +75,7 @@ switch ($resource) {
$idagente_default = 0;
}
$ids = array_column($results, $id);
$ids = array_column($results, 'idanagrafica');
$pos = array_search($idagente_default, $ids);
if ($pos !== false) {
$results[$pos]['_bgcolor_'] = '#ff0';
@ -91,9 +89,15 @@ switch ($resource) {
$filter[] = 'an_anagrafiche.idanagrafica='.prepare($element);
}
$where[] = "descrizione='Tecnico'";
if (empty($filter)) {
$where[] = "descrizione='Tecnico'";
$where[] = 'deleted=0';
//come tecnico posso aprire attività solo a mio nome
$user = Auth::user();
if ($user['gruppo'] == 'Tecnici' and !empty($user['idanagrafica'])) {
$where[] = 'an_anagrafiche.idanagrafica='.$user['idanagrafica'];
}
}
if (!empty($search)) {

View File

@ -13,8 +13,42 @@ switch ($resource) {
}
break;
case 'clienti':
$q = 'SELECT AN.idanagrafica,
AN.ragione_sociale,
AN.piva,
AN.codice_fiscale,
AN.indirizzo,
AN.indirizzo2,
AN.citta,
AN.cap,
AN.provincia,
AN.km,
IFNULL(AN.lat, 0.00) AS latitudine,
IFNULL(AN.lng, 0.00) AS longitudine,
NAZIONE.nome AS nazione,
AN.telefono,
AN.fax,
AN.cellulare,
AN.email,
AN.sitoweb,
AN.note,
AN.idzona,
AN.deleted
FROM (an_anagrafiche AS AN
LEFT OUTER JOIN an_nazioni NAZIONE ON AN.id_nazione=NAZIONE.id)
HAVING 1=1 AND
AN.deleted=0 AND
AN.idanagrafica IN (SELECT idanagrafica FROM an_tipianagrafiche_anagrafiche WHERE idtipoanagrafica=1)
ORDER BY AN.ragione_sociale';
$results = $dbo->fetchArray($q);
break;
}
return [
'an_anagrafiche',
'clienti',
];

View File

@ -4,19 +4,24 @@ include_once __DIR__.'/../../core.php';
switch (post('op')) {
case 'delete-bulk':
$id_azienda = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Azienda'")[0]['idtipoanagrafica'];
foreach ($id_records as $id) {
$records = $dbo->fetchArray('SELECT an_tipianagrafiche.idtipoanagrafica FROM an_tipianagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche.idtipoanagrafica=an_tipianagrafiche_anagrafiche.idtipoanagrafica WHERE idanagrafica='.prepare($id));
$tipi = array_column($records, 'idtipoanagrafica');
if ($debug) {
$id_azienda = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Azienda'")[0]['idtipoanagrafica'];
// Se l'anagrafica non è l'azienda principale, la disattivo
if (!in_array($id_azienda, $tipi)) {
$dbo->query('UPDATE an_anagrafiche SET deleted = 1 WHERE idanagrafica = '.prepare($id).Modules::getAdditionalsQuery($id_module));
foreach ($id_records as $id) {
$records = $dbo->fetchArray('SELECT an_tipianagrafiche.idtipoanagrafica FROM an_tipianagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche.idtipoanagrafica=an_tipianagrafiche_anagrafiche.idtipoanagrafica WHERE idanagrafica='.prepare($id));
$tipi = array_column($records, 'idtipoanagrafica');
// Se l'anagrafica non è l'azienda principale, la disattivo
if (!in_array($id_azienda, $tipi)) {
$dbo->query('UPDATE an_anagrafiche SET deleted = 1 WHERE idanagrafica = '.prepare($id).Modules::getAdditionalsQuery($id_module));
}
}
}
$_SESSION['infos'][] = tr('Anagrafiche eliminate!');
$_SESSION['infos'][] = tr('Anagrafiche eliminate!');
} else {
$_SESSION['warnings'][] = tr('Procedura in fase di sviluppo. Nessuna modifica apportata.');
}
break;
}

View File

@ -0,0 +1,38 @@
<?php
if (in_array($id_cliente, $tipi_anagrafica)) {
echo '
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
'.tr('Nuovo').' <span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu dropdown-menu-right">
<li><a data-toggle="modal" data-title="'.tr('Aggiungi intervento').'" data-target="#bs-popup" data-href="add.php?id_module='.Modules::get('Interventi')['id'].'&idanagrafica='.$records[0]['idanagrafica'].'">
'.tr('Nuovo intervento').'
</a></li>
<li><a data-toggle="modal" data-title="'.tr('Aggiungi preventivo').'" data-target="#bs-popup" data-href="add.php?id_module='.Modules::get('Preventivi')['id'].'&idanagrafica='.$records[0]['idanagrafica'].'">
'.tr('Nuovo preventivo').'
</a></li>
<li><a data-toggle="modal" data-title="'.tr('Aggiungi contratto').'" data-target="#bs-popup" data-href="add.php?id_module='.Modules::get('Contratti')['id'].'&idanagrafica='.$records[0]['idanagrafica'].'">
'.tr('Nuovo contratto').'
</a></li>
<li><a data-toggle="modal" data-title="'.tr('Aggiungi ddt').'" data-target="#bs-popup" data-href="add.php?id_module='.Modules::get('Ddt di vendita')['id'].'&idanagrafica='.$records[0]['idanagrafica'].'">
'.tr('Nuovo ddt').'
</a></li>
<li><a data-toggle="modal" data-title="'.tr('Aggiungi ordine').'" data-target="#bs-popup" data-href="add.php?id_module='.Modules::get('Ordini cliente')['id'].'&idanagrafica='.$records[0]['idanagrafica'].'">
'.tr('Nuovo ordine').'
</a></li>
<li><a data-toggle="modal" data-title="'.tr('Aggiungi fattura').'" data-target="#bs-popup" data-href="add.php?id_module='.Modules::get('Fatture di vendita')['id'].'&idanagrafica='.$records[0]['idanagrafica'].'">
'.tr('Nuova fattura').'
</a></li>
</ul>
</div>';
}

View File

@ -2,8 +2,8 @@
include_once __DIR__.'/../../core.php';
$fornitore = in_array('Fornitore', explode(',', $records[0]['tipianagrafica']));
$cliente = in_array('Cliente', explode(',', $records[0]['tipianagrafica']));
$fornitore = in_array($id_fornitore, $tipi_anagrafica);
$cliente = in_array($id_cliente, $tipi_anagrafica);
$google = Settings::get('Google Maps API key');
@ -24,354 +24,356 @@ if (!$cliente) {
}
?>
<form action="" method="post" id="edit-form">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="update">
<!-- DATI ANAGRAFICI -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Dati anagrafici'); ?></h3>
</div>
<form action="" method="post" id="edit-form" >
<fieldset <?php echo (!$records[0]['deleted']) ? '' : 'disabled'; ?> >
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="update">
<div class="panel-body">
<div class="row">
<div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('Ragione sociale'); ?>", "name": "ragione_sociale", "required": 1, "value": "$ragione_sociale$" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Tipologia'); ?>", "name": "tipo", "values": "list=\"\": \"<?php echo tr('Non specificato'); ?>\", \"Azienda\": \"<?php echo tr('Azienda'); ?>\", \"Privato\": \"<?php echo tr('Privato'); ?>\", \"Ente pubblico\": \"<?php echo tr('Ente pubblico'); ?>\"", "value": "$tipo$" ]}
</div>
<!-- DATI ANAGRAFICI -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Dati anagrafici'); ?></h3>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Partita IVA'); ?>", "maxlength": 13, "name": "piva", "class": "text-center alphanumeric-mask", "value": "$piva$" ]}
<div class="panel-body">
<div class="row">
<div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('Ragione sociale'); ?>", "name": "ragione_sociale", "required": 1, "value": "$ragione_sociale$" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Tipologia'); ?>", "name": "tipo", "values": "list=\"\": \"<?php echo tr('Non specificato'); ?>\", \"Azienda\": \"<?php echo tr('Azienda'); ?>\", \"Privato\": \"<?php echo tr('Privato'); ?>\", \"Ente pubblico\": \"<?php echo tr('Ente pubblico'); ?>\"", "value": "$tipo$" ]}
</div>
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Codice fiscale'); ?>", "maxlength": 16, "name": "codice_fiscale", "class": "text-center alphanumeric-mask", "value": "$codice_fiscale$" ]}
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Partita IVA'); ?>", "maxlength": 13, "name": "piva", "class": "text-center alphanumeric-mask", "value": "$piva$" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Codice fiscale'); ?>", "maxlength": 16, "name": "codice_fiscale", "class": "text-center alphanumeric-mask", "value": "$codice_fiscale$" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Codice anagrafica'); ?>", "name": "codice", "required": 1, "class": "text-center", "value": "$codice$" ]}
</div>
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Codice anagrafica'); ?>", "name": "codice", "required": 1, "class": "text-center", "value": "$codice$" ]}
</div>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Luogo di nascita'); ?>", "name": "luogo_nascita", "value": "$luogo_nascita$" ]}
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Luogo di nascita'); ?>", "name": "luogo_nascita", "value": "$luogo_nascita$" ]}
<div class="col-md-4">
{[ "type": "date", "label": "<?php echo tr('Data di nascita'); ?>", "maxlength": 10, "name": "data_nascita", "value": "$data_nascita$" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Sesso'); ?>", "name": "sesso", "values": "list=\"\": \"Non specificato\", \"M\": \"<?php echo tr('Uomo'); ?>\", \"F\": \"<?php echo tr('Donna'); ?>\"", "value": "$sesso$" ]}
</div>
</div>
<div class="col-md-4">
{[ "type": "date", "label": "<?php echo tr('Data di nascita'); ?>", "maxlength": 10, "name": "data_nascita", "value": "$data_nascita$" ]}
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Indirizzo'); ?>", "name": "indirizzo", "value": "$indirizzo$" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Indirizzo2'); ?>", "name": "indirizzo2", "value": "$indirizzo2$" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Zona'); ?>", "name": "idzona", "values": "query=SELECT id, CONCAT_WS( ' - ', nome, descrizione) AS descrizione FROM an_zone ORDER BY descrizione ASC", "value": "$idzona$", "placeholder": "<?php echo tr('Nessuna zona'); ?>", "icon-after": "add|<?php echo Modules::get('Zone')['id']; ?>" ]}
</div>
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Sesso'); ?>", "name": "sesso", "values": "list=\"\": \"Non specificato\", \"M\": \"<?php echo tr('Uomo'); ?>\", \"F\": \"<?php echo tr('Donna'); ?>\"", "value": "$sesso$" ]}
</div>
</div>
<div class="row">
<div class="col-md-2">
{[ "type": "select", "label": "<?php echo tr('Nazione'); ?>", "name": "id_nazione", "values": "query=SELECT id AS id, nome AS descrizione FROM an_nazioni ORDER BY nome ASC", "value": "$id_nazione$" ]}
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Indirizzo'); ?>", "name": "indirizzo", "value": "$indirizzo$" ]}
</div>
<div class="col-md-2">
{[ "type": "text", "label": "<?php echo tr('C.A.P.'); ?>", "name": "cap", "maxlength": 5, "class": "text-center", "value": "$cap$" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Indirizzo2'); ?>", "name": "indirizzo2", "value": "$indirizzo2$" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Città'); ?>", "name": "citta", "class": "text-center", "value": "$citta$" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Zona'); ?>", "name": "idzona", "values": "query=SELECT id, CONCAT_WS( ' - ', nome, descrizione) AS descrizione FROM an_zone ORDER BY descrizione ASC", "value": "$idzona$", "placeholder": "<?php echo tr('Nessuna zona'); ?>", "icon-after": "add|<?php echo Modules::get('Zone')['id']; ?>" ]}
</div>
</div>
<div class="col-md-2">
{[ "type": "text", "label": "<?php echo tr('Provincia'); ?>", "name": "provincia", "maxlength": 2, "class": "text-center", "value": "$provincia$" ]}
</div>
<div class="row">
<div class="col-md-2">
{[ "type": "select", "label": "<?php echo tr('Nazione'); ?>", "name": "id_nazione", "values": "query=SELECT id AS id, nome AS descrizione FROM an_nazioni ORDER BY nome ASC", "value": "$id_nazione$" ]}
</div>
<div class="col-md-2">
{[ "type": "text", "label": "<?php echo tr('C.A.P.'); ?>", "name": "cap", "maxlength": 5, "class": "text-center", "value": "$cap$" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Città'); ?>", "name": "citta", "class": "text-center", "value": "$citta$" ]}
</div>
<div class="col-md-2">
{[ "type": "text", "label": "<?php echo tr('Provincia'); ?>", "name": "provincia", "maxlength": 2, "class": "text-center", "value": "$provincia$" ]}
</div>
<div class="col-md-2">
{[ "type": "number", "label": "<?php echo tr('Km'); ?>", "name": "km", "maxlength": 4, "class": "text-center", "value": "$km$" ]}
<div class="col-md-2">
{[ "type": "number", "label": "<?php echo tr('Distanza'); ?>", "name": "km", "decimals":"1", "class": "text-center", "value": "$km$", "icon-after": "Km" ]}
</div>
</div>
</div>
</div>
</div>
<!-- CONTATTI -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Contatti'); ?></h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Telefono'); ?>", "name": "telefono", "class": "text-center", "value": "$telefono$", "icon-before": "<i class='fa fa-phone'></i>" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Fax'); ?>", "name": "fax", "class": "text-center", "value": "$fax$", "icon-before": "<i class='fa fa-fax'></i>" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Cellulare'); ?>", "name": "cellulare", "class": "text-center", "value": "$cellulare$", "icon-before": "<i class='fa fa-mobile'></i>" ]}
</div>
<!-- CONTATTI -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Contatti'); ?></h3>
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Email'); ?>", "name": "email", "class": "email-mask", "placeholder":"casella@dominio.ext", "value": "$email$", "icon-before": "<i class='fa fa-envelope'></i>" ]}
<div class="panel-body">
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Telefono'); ?>", "name": "telefono", "class": "text-center", "value": "$telefono$", "icon-before": "<i class='fa fa-phone'></i>" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Fax'); ?>", "name": "fax", "class": "text-center", "value": "$fax$", "icon-before": "<i class='fa fa-fax'></i>" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Cellulare'); ?>", "name": "cellulare", "class": "text-center", "value": "$cellulare$", "icon-before": "<i class='fa fa-mobile'></i>" ]}
</div>
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('PEC'); ?>", "name": "pec", "class": "email-mask", "placeholder":"pec@dominio.ext", "value": "$pec$", "icon-before": "<i class='fa fa-envelope-o'></i>" ]}
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Email'); ?>", "name": "email", "class": "email-mask", "placeholder":"casella@dominio.ext", "value": "$email$", "icon-before": "<i class='fa fa-envelope'></i>" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Sito web'); ?>", "name": "sitoweb", "placeholder":"www.dominio.ext", "value": "$sitoweb$", "icon-before": "<i class='fa fa-globe'></i>" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('PEC'); ?>", "name": "pec", "class": "email-mask", "placeholder":"pec@dominio.ext", "value": "$pec$", "icon-before": "<i class='fa fa-envelope-o'></i>" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Sito web'); ?>", "name": "sitoweb", "placeholder":"www.dominio.ext", "value": "$sitoweb$", "icon-before": "<i class='fa fa-globe'></i>" ]}
</div>
</div>
</div>
</div>
</div>
<?php
<?php
if ($cliente || $fornitore) {
?>
<!-- ACQUISTI -->
<div class = "row">
<div class="col-md-6">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Acquisti'); ?></h3>
</div>
if ($cliente || $fornitore) {
?>
<div class="panel-body">
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Pagamento predefinito'); ?>", "name": "idpagamento_acquisti", "values": "query=SELECT id, descrizione FROM co_pagamenti GROUP BY descrizione ORDER BY descrizione ASC", "value": "$idpagamento_acquisti$", "extra": "<?php echo ($fornitore) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Banca predefinita'); ?>", "name": "idbanca_acquisti", "values": "query=SELECT id, nome AS descrizione FROM co_banche ORDER BY nome ASC", "value": "$idbanca_acquisti$", "extra": "<?php echo ($fornitore) ? '' : 'readonly'; ?>", "icon-after": "add|<?php echo Modules::get('Banche')['id']; ?>|||<?php echo ($fornitore) ? '' : 'disabled'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Iva predefinita'); ?>", "name": "idiva_acquisti", "values": "query=SELECT id, descrizione FROM co_iva ORDER BY descrizione ASC", "value": "$idiva_acquisti$", "extra": "<?php echo ($fornitore) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Listino articoli'); ?>", "name": "idlistino_acquisti", "values": "query=SELECT id, nome AS descrizione FROM mg_listini ORDER BY nome ASC", "value": "$idlistino_acquisti$", "extra": "<?php echo ($fornitore) ? '' : 'readonly'; ?>" ]}
</div>
<!-- ACQUISTI -->
<div class = "row">
<div class="col-md-6">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Acquisti'); ?></h3>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<!-- VENDITE -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Vendite'); ?></h3>
</div>
<div class="panel-body">
<div class="panel-body">
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Pagamento predefinito'); ?>", "name": "idpagamento_vendite", "values": "query=SELECT id, descrizione FROM co_pagamenti GROUP BY descrizione ORDER BY descrizione ASC", "value": "$idpagamento_vendite$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Banca predefinita'); ?>", "name": "idbanca_vendite", "values": "query=SELECT id, nome AS descrizione FROM co_banche ORDER BY nome ASC", "value": "$idbanca_vendite$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>", "icon-after": "add|<?php echo Modules::get('Banche')['id']; ?>|||<?php echo ($cliente) ? '' : 'disabled'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Iva predefinita'); ?>", "name": "idiva_vendite", "values": "query=SELECT id, descrizione FROM co_iva ORDER BY descrizione ASC", "value": "$idiva_vendite$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Listino articoli'); ?>", "name": "idlistino_vendite", "values": "query=SELECT id, nome AS descrizione FROM mg_listini ORDER BY nome ASC", "value": "$idlistino_vendite$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Indirizzo di fatturazione'); ?>", "name": "idsede_fatturazione", "values": "query=SELECT id, IF(citta = '', nomesede, CONCAT_WS(', ', nomesede, citta)) AS descrizione FROM an_sedi WHERE idanagrafica='<?php echo $id_record; ?>' UNION SELECT '0' AS id, 'Sede legale' AS descrizione ORDER BY descrizione", "value": "$idsede_fatturazione$" , "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Tipo attività'); ?>", "name": "idtipointervento_default", "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "$idtipointervento_default$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "Agente principale", "name": "idagente", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted=1, CONCAT(ragione_sociale, ' (Eliminato)'), ragione_sociale ) AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE (descrizione='Agente' AND deleted=0)<?php echo isset($records[0]['idagente']) ? 'OR (an_anagrafiche.idanagrafica = '.prepare($records[0]['idagente']).'AND deleted=1) ' : ''; ?>ORDER BY ragione_sociale", "value": "$idagente$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="clearfix" ></div>
<?php
}
?>
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Informazioni aggiuntive'); ?></h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Codice registro imprese'); ?>", "name": "codiceri", "value": "$codiceri$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Codice R.E.A.').'<small>('.tr('provincia/C.C.I.A.A.').')</small>'; ?>", "name": "codicerea", "value": "$codicerea$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Num. iscr. C.C.I.A.A.'); ?>", "name": "cciaa", "value": "$cciaa$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Città iscr. C.C.I.A.A.'); ?>", "name": "cciaa_citta", "value": "$cciaa_citta$" ]}
</div>
</div>
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Num. iscr. tribunale'); ?>", "name": "iscrizione_tribunale", "value": "$iscrizione_tribunale$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Num. iscr. albo artigiani'); ?>", "name": "n_alboartigiani", "value": "$n_alboartigiani$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Foro di competenza'); ?>", "name": "foro_competenza", "value": "$foro_competenza$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Capitale sociale'); ?>", "name": "capitale_sociale", "value": "$capitale_sociale$" ]}
</div>
</div>
<?php
//se non è l'anagrafica azienda, ma cliente o fornitore
if ((!str_contains($records[0]['idtipianagrafica'], $id_azienda)) or (($cliente or $fornitore))) {
?>
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Appoggio bancario'); ?>", "name": "appoggiobancario", "value": "$appoggiobancario$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Filiale banca'); ?>", "name": "filiale", "value": "$filiale$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Codice IBAN'); ?>", "name": "codiceiban", "value": "$codiceiban$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Codice BIC'); ?>", "name": "bic", "value": "$bic$" ]}
</div>
</div>
<?php
}
?>
<div class="row">
<div class="col-md-12">
{[ "type": "text", "label": "<?php echo tr('Dicitura fissa in fattura'); ?>", "name": "diciturafissafattura", "value": "$diciturafissafattura$" ]}
</div>
</div>
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Settore merceologico'); ?>", "name": "settore", "value": "$settore$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Marche trattate'); ?>", "name": "marche", "value": "$marche$" ]}
</div>
<div class="col-md-3">
{[ "type": "number", "label": "<?php echo tr('Num. dipendenti'); ?>", "name": "dipendenti", "decimals": 0, "value": "$dipendenti$" ]}
</div>
<div class="col-md-3">
{[ "type": "number", "label": "<?php echo tr('Num. macchine'); ?>", "name": "macchine", "decimals": 0, "value": "$macchine$" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "select", "multiple": "1", "label": "<?php echo tr('Tipo di anagrafica'); ?>", "name": "idtipoanagrafica[]", "values": "query=SELECT idtipoanagrafica AS id, descrizione FROM an_tipianagrafiche WHERE idtipoanagrafica NOT IN (SELECT DISTINCT(x.idtipoanagrafica) FROM an_tipianagrafiche_anagrafiche x INNER JOIN an_tipianagrafiche t ON x.idtipoanagrafica = t.idtipoanagrafica INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = x.idanagrafica WHERE t.descrizione = 'Azienda' AND deleted = 0) ORDER BY descrizione", "value": "$idtipianagrafica$" ]}
<?php
if (str_contains($records[0]['idtipianagrafica'], $id_azienda)) {
echo '
<p class=\'badge badge-info\' >'.tr('Questa anagrafica appartiene alla tipologia "Azienda"').'.</p>';
}
?>
</div>
</div>
<div class="row">
<?php
if (in_array('Tecnico', explode(',', $records[0]['tipianagrafica']))) {
?>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Colore'); ?>", "name": "colore", "class": "colorpicker text-center", "value": "$colore$", "extra": "maxlength='7'", "icon-after": "<div class='img-circle square'></div>" ]}
</div>
<?php
} ?>
<?php
if (in_array('Cliente', explode(',', $records[0]['tipianagrafica']))) {
?>
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "Agenti secondari", "multiple": "1", "name": "idagenti[]", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted=1, CONCAT(ragione_sociale, ' (Eliminato)'), ragione_sociale ) AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE (descrizione='Agente' AND deleted=0 AND an_anagrafiche.idanagrafica NOT IN (SELECT idagente FROM an_anagrafiche WHERE idanagrafica = <?php echo prepare($records[0]['idanagrafica']); ?> )) OR (an_anagrafiche.idanagrafica IN (SELECT idagente FROM an_anagrafiche_agenti WHERE idanagrafica = <?php echo prepare($records[0]['idanagrafica']); ?> ) ) ORDER BY ragione_sociale", "value": "$idagenti$" ]}
{[ "type": "select", "label": "<?php echo tr('Pagamento predefinito'); ?>", "name": "idpagamento_acquisti", "values": "query=SELECT id, descrizione FROM co_pagamenti GROUP BY descrizione ORDER BY descrizione ASC", "value": "$idpagamento_acquisti$", "extra": "<?php echo ($fornitore) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Banca predefinita'); ?>", "name": "idbanca_acquisti", "values": "query=SELECT id, nome AS descrizione FROM co_banche ORDER BY nome ASC", "value": "$idbanca_acquisti$", "extra": "<?php echo ($fornitore) ? '' : 'readonly'; ?>", "icon-after": "add|<?php echo Modules::get('Banche')['id']; ?>|||<?php echo ($fornitore) ? '' : 'disabled'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Iva predefinita'); ?>", "name": "idiva_acquisti", "values": "query=SELECT id, descrizione FROM co_iva ORDER BY descrizione ASC", "value": "$idiva_acquisti$", "extra": "<?php echo ($fornitore) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Listino articoli'); ?>", "name": "idlistino_acquisti", "values": "query=SELECT id, nome AS descrizione FROM mg_listini ORDER BY nome ASC", "value": "$idlistino_acquisti$", "extra": "<?php echo ($fornitore) ? '' : 'readonly'; ?>" ]}
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<!-- VENDITE -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Vendite'); ?></h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Pagamento predefinito'); ?>", "name": "idpagamento_vendite", "values": "query=SELECT id, descrizione FROM co_pagamenti GROUP BY descrizione ORDER BY descrizione ASC", "value": "$idpagamento_vendite$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Banca predefinita'); ?>", "name": "idbanca_vendite", "values": "query=SELECT id, nome AS descrizione FROM co_banche ORDER BY nome ASC", "value": "$idbanca_vendite$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>", "icon-after": "add|<?php echo Modules::get('Banche')['id']; ?>|||<?php echo ($cliente) ? '' : 'disabled'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Iva predefinita'); ?>", "name": "idiva_vendite", "values": "query=SELECT id, descrizione FROM co_iva ORDER BY descrizione ASC", "value": "$idiva_vendite$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Listino articoli'); ?>", "name": "idlistino_vendite", "values": "query=SELECT id, nome AS descrizione FROM mg_listini ORDER BY nome ASC", "value": "$idlistino_vendite$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Indirizzo di fatturazione'); ?>", "name": "idsede_fatturazione", "values": "query=SELECT id, IF(citta = '', nomesede, CONCAT_WS(', ', nomesede, citta)) AS descrizione FROM an_sedi WHERE idanagrafica='<?php echo $id_record; ?>' UNION SELECT '0' AS id, 'Sede legale' AS descrizione ORDER BY descrizione", "value": "$idsede_fatturazione$" , "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Tipo attività'); ?>", "name": "idtipointervento_default", "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "$idtipointervento_default$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "Agente principale", "name": "idagente", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted=1, CONCAT(ragione_sociale, ' (Eliminato)'), ragione_sociale ) AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE (descrizione='Agente' AND deleted=0)<?php echo isset($records[0]['idagente']) ? 'OR (an_anagrafiche.idanagrafica = '.prepare($records[0]['idagente']).'AND deleted=1) ' : ''; ?>ORDER BY ragione_sociale", "value": "$idagente$", "extra": "<?php echo ($cliente) ? '' : 'readonly'; ?>" ]}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="clearfix" ></div>
<?php
}
?>
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Informazioni aggiuntive'); ?></h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Codice registro imprese'); ?>", "name": "codiceri", "value": "$codiceri$" ]}
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Relazione con il cliente'); ?>", "name": "idrelazione", "values": "query=SELECT id, descrizione, colore AS _bgcolor_ FROM an_relazioni ORDER BY descrizione", "value": "$idrelazione$" ]}
{[ "type": "text", "label": "<?php echo tr('Codice R.E.A.').'<small>('.tr('provincia/C.C.I.A.A.').')</small>'; ?>", "name": "codicerea", "value": "$codicerea$" ]}
</div>
<?php
} ?>
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Num. iscr. C.C.I.A.A.'); ?>", "name": "cciaa", "value": "$cciaa$" ]}
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "<?php echo tr('Note'); ?>", "name": "note", "value": "$note$" ]}
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Città iscr. C.C.I.A.A.'); ?>", "name": "cciaa_citta", "value": "$cciaa_citta$" ]}
</div>
</div>
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Num. iscr. tribunale'); ?>", "name": "iscrizione_tribunale", "value": "$iscrizione_tribunale$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Num. iscr. albo artigiani'); ?>", "name": "n_alboartigiani", "value": "$n_alboartigiani$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Foro di competenza'); ?>", "name": "foro_competenza", "value": "$foro_competenza$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Capitale sociale'); ?>", "name": "capitale_sociale", "value": "$capitale_sociale$" ]}
</div>
</div>
<?php
//se non è l'anagrafica azienda, ma cliente o fornitore
if (!in_array($id_azienda, $tipi_anagrafica) || (($cliente or $fornitore))) {
?>
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Appoggio bancario'); ?>", "name": "appoggiobancario", "value": "$appoggiobancario$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Filiale banca'); ?>", "name": "filiale", "value": "$filiale$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Codice IBAN'); ?>", "name": "codiceiban", "value": "$codiceiban$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Codice BIC'); ?>", "name": "bic", "value": "$bic$" ]}
</div>
</div>
<?php
}
?>
<div class="row">
<div class="col-md-12">
{[ "type": "text", "label": "<?php echo tr('Dicitura fissa in fattura'); ?>", "name": "diciturafissafattura", "value": "$diciturafissafattura$" ]}
</div>
</div>
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Settore merceologico'); ?>", "name": "settore", "value": "$settore$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Marche trattate'); ?>", "name": "marche", "value": "$marche$" ]}
</div>
<div class="col-md-3">
{[ "type": "number", "label": "<?php echo tr('Num. dipendenti'); ?>", "name": "dipendenti", "decimals": 0, "value": "$dipendenti$" ]}
</div>
<div class="col-md-3">
{[ "type": "number", "label": "<?php echo tr('Num. macchine'); ?>", "name": "macchine", "decimals": 0, "value": "$macchine$" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "select", "multiple": "1", "label": "<?php echo tr('Tipo di anagrafica'); ?>", "name": "idtipoanagrafica[]", "values": "query=SELECT idtipoanagrafica AS id, descrizione FROM an_tipianagrafiche WHERE idtipoanagrafica NOT IN (SELECT DISTINCT(x.idtipoanagrafica) FROM an_tipianagrafiche_anagrafiche x INNER JOIN an_tipianagrafiche t ON x.idtipoanagrafica = t.idtipoanagrafica INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = x.idanagrafica WHERE t.descrizione = 'Azienda' AND deleted = 0) ORDER BY descrizione", "value": "$idtipianagrafica$" ]}
<?php
if (in_array($id_azienda, $tipi_anagrafica)) {
echo '
<p class=\'badge badge-info\' >'.tr('Questa anagrafica appartiene alla tipologia "Azienda"').'.</p>';
}
?>
</div>
</div>
<div class="row">
<?php
if (in_array('Tecnico', explode(',', $records[0]['tipianagrafica']))) {
?>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Colore'); ?>", "name": "colore", "class": "colorpicker text-center", "value": "$colore$", "extra": "maxlength='7'", "icon-after": "<div class='img-circle square'></div>" ]}
</div>
<?php
} ?>
<?php
if (in_array('Cliente', explode(',', $records[0]['tipianagrafica']))) {
?>
<div class="col-md-6">
{[ "type": "select", "label": "Agenti secondari", "multiple": "1", "name": "idagenti[]", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted=1, CONCAT(ragione_sociale, ' (Eliminato)'), ragione_sociale ) AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE (descrizione='Agente' AND deleted=0 AND an_anagrafiche.idanagrafica NOT IN (SELECT idagente FROM an_anagrafiche WHERE idanagrafica = <?php echo prepare($records[0]['idanagrafica']); ?> )) OR (an_anagrafiche.idanagrafica IN (SELECT idagente FROM an_anagrafiche_agenti WHERE idanagrafica = <?php echo prepare($records[0]['idanagrafica']); ?> ) ) ORDER BY ragione_sociale", "value": "$idagenti$" ]}
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Relazione con il cliente'); ?>", "name": "idrelazione", "values": "query=SELECT id, descrizione, colore AS _bgcolor_ FROM an_relazioni ORDER BY descrizione", "value": "$idrelazione$" ]}
</div>
<?php
} ?>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "<?php echo tr('Note'); ?>", "name": "note", "value": "$note$" ]}
</div>
</div>
</div>
<?php
if (!empty($google)) {
@ -417,23 +419,102 @@ if (!empty($google)) {
}
?>
</div>
</div>
</div>
</fieldset>
</form>
{( "name": "filelist_and_upload", "id_module": "<?php echo $id_module; ?>", "id_record": "<?php echo $id_record; ?>" )}
<?php
if (!str_contains($records[0]['idtipianagrafica'], $id_azienda)) {
echo '
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> '.tr('Elimina').'
</a>';
}else{
echo '
<div class=\'alert alert-warning\' >'.tr('Questa è l\'anagrafica "Azienda" e non è possibile eliminarla').'.</div>';
if (Settings::get('Azienda predefinita') == $id_record) {
echo '
<div class="alert alert-info text-center">'.tr('Per impostare il logo delle stampe, caricare un file con nome "Logo stampe"').'.</div>';
}
if (!$records[0]['deleted']) {
//fatture, ddt, preventivi, contratti, ordini, interventi, utenti collegati a questa anagrafica
$elementi = $dbo->fetchArray('SELECT `co_documenti`.`id`, `co_documenti`.`data`, `co_documenti`.`numero`, `co_documenti`.`numero_esterno`, `co_tipidocumento`.`descrizione` AS tipo_documento, `co_tipidocumento`.`dir` FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`idanagrafica` = '.prepare($id_record).'
UNION
SELECT `zz_users`.`id`, `zz_users`.`created_at` AS data, `zz_users`.`username` AS numero, 0 AS `numero_esterno`, "Utente" AS tipo_documento, 0 AS `dir` FROM `zz_users` WHERE `zz_users`.`idanagrafica` = '.prepare($id_record).'
UNION
SELECT `or_ordini`.`id`, `or_ordini`.`data`, `or_ordini`.`numero`, `or_ordini`.`numero_esterno`, `or_tipiordine`.`descrizione` AS tipo_documento, `or_tipiordine`.`dir` FROM `or_ordini` JOIN `or_tipiordine` ON `or_tipiordine`.`id` = `or_ordini`.`idtipoordine` WHERE `or_ordini`.`idanagrafica` = '.prepare($id_record).'
UNION
SELECT `dt_ddt`.`id`, `dt_ddt`.`data`, `dt_ddt`.`numero`, `dt_ddt`.`numero_esterno`, `dt_tipiddt`.`descrizione` AS tipo_documento, `dt_tipiddt`.`dir` FROM `dt_ddt` JOIN `dt_tipiddt` ON `dt_tipiddt`.`id` = `dt_ddt`.`idtipoddt` WHERE `dt_ddt`.`idanagrafica` = '.prepare($id_record).'
UNION
SELECT `in_interventi`.`id`, `in_interventi`.`data_richiesta`, `in_interventi`.`codice` AS numero, 0 AS numero_esterno, "Intervento" AS tipo_documento, 0 AS dir FROM `in_interventi` JOIN `in_interventi_tecnici` ON `in_interventi`.`id` = `in_interventi_tecnici`.`idintervento` WHERE `in_interventi`.`id` IN (SELECT `idintervento` FROM `in_interventi_tecnici` WHERE `idtecnico` = '.prepare($id_record).' OR `in_interventi`.`idanagrafica` = '.prepare($id_record).' )
UNION
SELECT `co_contratti`.`id`, `co_contratti`.`data_bozza`, `co_contratti`.`numero`, 0 AS numero_esterno , "Contratto" AS tipo_documento, 0 AS dir FROM `co_contratti` WHERE `co_contratti`.`id` IN (SELECT `idcontratto` FROM `co_contratti_promemoria` WHERE `idanagrafica` = '.prepare($id_record).')
UNION
SELECT `co_preventivi`.`id`, `co_preventivi`.`data_bozza`, `co_preventivi`.`numero`, 0 AS numero_esterno , "Preventivo" AS tipo_documento, 0 AS dir FROM `co_preventivi` WHERE `co_preventivi`.`id` IN (SELECT `idpreventivo` FROM `co_righe_preventivi` WHERE `idanagrafica` = '.prepare($id_record).') ORDER BY `data`');
if (!empty($elementi)) {
echo '
<div class="alert alert-warning">
<p>'.tr('_NUM_ altr_I_ document_I_ collegat_I_', [
'_NUM_' => count($elementi),
'_I_' => (count($elementi) > 1) ? tr('i') : tr('o'),
]).':</p>
<ul>';
foreach ($elementi as $elemento) {
$descrizione = tr('_DOC_ _NUM_ del _DATE_', [
'_DOC_' => $elemento['tipo_documento'],
'_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']),
]);
//se non è un preventivo è un ddt o una fattura
//se non è un ddt è una fattura.
if (in_array($elemento['tipo_documento'], ['Utente'])) {
$modulo = 'Utenti e permessi';
} elseif (in_array($elemento['tipo_documento'], ['Intervento'])) {
$modulo = 'Interventi';
} elseif (in_array($elemento['tipo_documento'], ['Preventivo'])) {
$modulo = 'Preventivi';
} elseif (in_array($elemento['tipo_documento'], ['Contratto'])) {
$modulo = 'Contratti';
} elseif (in_array($elemento['tipo_documento'], ['Ordine cliente', 'Ordine fornitore'])) {
$modulo = ($elemento['dir'] == 'entrata') ? 'Ordini cliente' : 'Ordini fornitore';
} elseif (in_array($elemento['tipo_documento'], ['Ddt di vendita', 'Ddt di acquisto'])) {
$modulo = ($elemento['dir'] == 'entrata') ? 'Ddt di vendita' : 'Ddt di acquisto';
} else {
$modulo = ($elemento['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto';
}
$id = $elemento['id'];
echo '
<li>'.Modules::link($modulo, $id, $descrizione).'</li>';
}
echo '
</ul>
<p>'.tr('Eliminando questo documento si potrebbero verificare problemi nelle altre sezioni del gestionale.').'</p>
</div>';
}
if (!in_array($id_azienda, $tipi_anagrafica)) {
echo '
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> '.tr('Elimina').'
</a>';
} else {
echo '
<div class=\'alert alert-warning\' >'.tr('Questa è l\'anagrafica "Azienda" e non è possibile eliminarla').'.</div>';
}
} else {
echo '
<div class=\'alert alert-danger\'>'.tr('Questa anagrafica è stata eliminata').'.</div>';
}
?>
<script>

View File

@ -3,6 +3,28 @@
include_once __DIR__.'/../../core.php';
switch (post('op')) {
case 'example':
$module = filter('module');
$list = [
['Codice', 'Ragione sociale', 'Partita IVA', 'Nazione', 'Indirizzo', 'CAP', 'Città', 'Provincia', 'Telefono', 'Fax', 'Cellulare', 'Email', 'IBAN', 'Note', 'Tipologia'],
['00001', 'Cliente', '12345678910', 'ITALIA', 'Via Giuseppe Mazzini, 123', '12345', 'Este', 'PD', '786 543 21', '123 456 78', '321 123 456 78', 'email@cliente.it', 'IT60 X054 2811 1010 0000 0123 456', 'Anagrafica di esempio', 'Cliente'],
];
directory('../../files/'.$module);
$fp = fopen('../../files/'.$module.'/'.$module.'.csv', 'w');
foreach ($list as $fields) {
fputcsv($fp, $fields, ';');
}
fclose($fp);
exit;
break;
case 'import':
foreach ($data as $key => $value) {

View File

@ -10,4 +10,7 @@ if (isset($id_record)) {
$records[0]['lat'] = floatval($records[0]['lat']);
$records[0]['lng'] = floatval($records[0]['lng']);
}
$tipi_anagrafica = $dbo->fetchArray('SELECT an_tipianagrafiche.idtipoanagrafica FROM an_tipianagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche.idtipoanagrafica=an_tipianagrafiche_anagrafiche.idtipoanagrafica WHERE idanagrafica='.prepare($id_record));
$tipi_anagrafica = array_column($tipi_anagrafica, 'idtipoanagrafica');
}

View File

@ -2,9 +2,17 @@
include_once __DIR__.'/../../../core.php';
// Interventi
$rsi = $dbo->fetchArray('SELECT ragione_sociale, (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS data, (SELECT SUM(prezzo_ore_consuntivo+prezzo_km_consuntivo+prezzo_dirittochiamata) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS totale FROM in_interventi INNER JOIN an_anagrafiche ON in_interventi.idanagrafica=an_anagrafiche.idanagrafica WHERE in_interventi.idanagrafica='.prepare($id_record));
include_once Modules::filepath('Preventivi', 'modutil.php');
// Interventi
$rsi = [];
if (in_array('Cliente', explode(',', $records[0]['tipianagrafica']))) {
//Clienti
$rsi = $dbo->fetchArray('SELECT ragione_sociale, (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS data, (SELECT SUM(prezzo_ore_consuntivo+prezzo_km_consuntivo+prezzo_dirittochiamata) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS totale FROM in_interventi INNER JOIN an_anagrafiche ON in_interventi.idanagrafica=an_anagrafiche.idanagrafica WHERE in_interventi.idanagrafica='.prepare($id_record));
} elseif (in_array('Tecnico', explode(',', $records[0]['tipianagrafica']))) {
//Tecnici
$rsi = $dbo->fetchArray('SELECT ragione_sociale, (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS data, (SELECT SUM(prezzo_ore_consuntivo+prezzo_km_consuntivo+prezzo_dirittochiamata) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id AND in_interventi_tecnici.idtecnico = '.prepare($id_record).' ) AS totale FROM in_interventi INNER JOIN an_anagrafiche ON in_interventi.idanagrafica=an_anagrafiche.idanagrafica INNER JOIN in_interventi_tecnici ON in_interventi.id = in_interventi_tecnici.idintervento WHERE in_interventi_tecnici.idtecnico='.prepare($id_record));
}
$totale_interventi = 0;
$data_start = strtotime('now');
@ -42,19 +50,19 @@ echo '
</div>';
// Preventivi
$rsi = $dbo->fetchArray('SELECT data_accettazione AS data, ragione_sociale, budget FROM co_preventivi INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica WHERE co_preventivi.idanagrafica='.prepare($id_record));
$rsi = $dbo->fetchArray('SELECT co_preventivi.id AS idpreventivo, data_accettazione AS data, ragione_sociale, budget FROM co_preventivi INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica WHERE co_preventivi.idanagrafica='.prepare($id_record));
$totale_preventivi = 0;
$data_start = strtotime('now');
for ($i = 0; $i < count($rsi); ++$i) {
$totale_preventivi += $rsi[$i]['budget'];
//$totale_preventivi += $rsi[$i]['budget'];
$totale_preventivi += get_imponibile_preventivo($rsi[$i]['idpreventivo']);
// Calcolo data più bassa per la ricerca
if (strtotime($rsi[$i]['data']) < $data_start) {
$data_start = strtotime($rsi[$i]['data']);
}
}
echo '
<div class="col-md-6">
<div class="box box-info">
@ -64,7 +72,7 @@ echo '
<div class="box-body">';
if (count($rsi) > 0) {
echo '
<p>'.tr('Si è lavorato per <strong>_NUMBER_ preventivi</strong> per un totale di _EUR_ &euro;', [
<p>'.tr('Sono stati fatti <strong>_NUMBER_ preventivi</strong> per un totale di _EUR_ &euro;', [
'_NUMBER_' => count($rsi),
'_EUR_' => Translator::numberToLocale($totale_preventivi),
]).'</p>
@ -81,7 +89,7 @@ echo '
</div>';
// Contratti
$rsi = $dbo->fetchArray('SELECT data_accettazione AS data, ragione_sociale, budget FROM co_contratti INNER JOIN an_anagrafiche ON co_contratti.idanagrafica=an_anagrafiche.idanagrafica WHERE co_contratti.idanagrafica='.prepare($id_record));
$rsi = $dbo->fetchArray('SELECT data_accettazione AS data, ragione_sociale, (SELECT SUM(co_righe_contratti.subtotale - co_righe_contratti.sconto) FROM co_righe_contratti WHERE co_righe_contratti.idcontratto = co_contratti.id) AS budget FROM co_contratti INNER JOIN an_anagrafiche ON co_contratti.idanagrafica=an_anagrafiche.idanagrafica WHERE co_contratti.idanagrafica='.prepare($id_record));
$totale_contratti = 0;
$data_start = strtotime(date('Ymd'));
@ -104,7 +112,7 @@ echo '
<div class="box-body">';
if (count($rsi) > 0) {
echo '
<p>'.tr('Si è lavorato per <strong>_NUMBER_ contratti</strong> per un totale di _EUR_ &euro;', [
<p>'.tr('Sono stati stipulati <strong>_NUMBER_ contratti</strong> per un totale di _EUR_ &euro;', [
'_NUMBER_' => count($rsi),
'_EUR_' => Translator::numberToLocale($totale_contratti),
]).'</p>

View File

@ -2,69 +2,66 @@
include_once __DIR__.'/../../core.php';
$upload_dir = $docroot.'/files/'.Modules::get('Articoli')['directory'];
switch (post('op')) {
case 'update':
// Aggiunta articolo
case 'add':
$codice = post('codice');
$descrizione = post('descrizione');
$um = post('um');
$categoria = post('categoria');
$subcategoria = post('subcategoria');
// Inserisco l'articolo solo se non esiste un altro articolo con stesso codice
if ($dbo->fetchNum('SELECT * FROM mg_articoli WHERE codice='.prepare($codice)) == 0) {
$dbo->insert('mg_articoli', [
'codice' => $codice,
'descrizione' => post('descrizione'),
'id_categoria' => post('categoria'),
'id_sottocategoria' => post('subcategoria'),
'attivo' => 1,
]);
$id_record = $dbo->lastInsertedID();
$_SESSION['infos'][] = tr('Aggiunto un nuovo articolo!');
} else {
$_SESSION['errors'][] = tr('Esiste già un articolo con questo codice!');
}
break;
// Modifica articolo
case 'update':
$componente = post('componente_filename');
$qta = post('qta');
$threshold_qta = post('threshold_qta');
$abilita_serial = post('abilita_serial');
$prezzo_vendita = post('prezzo_vendita');
$prezzo_acquisto = post('prezzo_acquisto');
$idiva_vendita = post('idiva_vendita');
$gg_garanzia = post('gg_garanzia');
$servizio = post('servizio');
$componente_filename = post('componente_filename');
$volume = post('volume');
$peso_lordo = post('peso_lordo');
$attivo = post('attivo');
$note = post('note');
$query = 'UPDATE mg_articoli SET '.
' codice='.prepare($codice).','.
' descrizione='.prepare($descrizione).','.
' um='.prepare($um).','.
' id_categoria='.prepare($categoria).','.
' id_sottocategoria='.prepare($subcategoria).','.
' abilita_serial='.prepare($abilita_serial).','.
' threshold_qta='.prepare($threshold_qta).','.
' prezzo_vendita='.prepare($prezzo_vendita).','.
' prezzo_acquisto='.prepare($prezzo_acquisto).','.
' idiva_vendita='.prepare($idiva_vendita).','.
' gg_garanzia='.prepare($gg_garanzia).','.
' servizio='.prepare($servizio).','.
' volume='.prepare($volume).','.
' peso_lordo='.prepare($peso_lordo).','.
' componente_filename='.prepare($componente_filename).','.
' attivo='.prepare($attivo).', '.
' note='.prepare($note).
' WHERE id='.prepare($id_record);
$dbo->query($query);
$dbo->update('mg_articoli', [
'codice' => post('codice'),
'descrizione' => post('descrizione'),
'um' => post('um'),
'id_categoria' => post('categoria'),
'id_sottocategoria' => post('subcategoria'),
'abilita_serial' => post('abilita_serial'),
'threshold_qta' => post('threshold_qta'),
'prezzo_vendita' => post('prezzo_vendita'),
'prezzo_acquisto' => post('prezzo_acquisto'),
'idiva_vendita' => post('idiva_vendita'),
'gg_garanzia' => post('gg_garanzia'),
'servizio' => post('servizio'),
'volume' => post('volume'),
'peso_lordo' => post('peso_lordo'),
'componente_filename' => $componente,
'attivo' => post('attivo'),
'note' => post('note'),
], ['id' => $id_record]);
// Leggo la quantità attuale per capire se l'ho modificata
$rs = $dbo->fetchArray('SELECT qta FROM mg_articoli WHERE id='.prepare($id_record));
$old_qta = $rs[0]['qta'];
$old_qta = $records[0]['qta'];
$movimento = $qta - $old_qta;
if ($movimento != 0) {
add_movimento_magazzino($id_record, $movimento);
$descrizione_movimento = post('descrizione_movimento');
$data_movimento = post('data_movimento');
add_movimento_magazzino($id_record, $movimento, [], $descrizione_movimento, $data_movimento);
}
/*
Salvataggio info componente (campo `contenuto`)
*/
$componente = post('componente_filename');
// Salvataggio info componente (campo `contenuto`)
if (!empty($componente)) {
$contenuto = \Util\Ini::write(file_get_contents($docroot.'/files/my_impianti/'.$componente), $post);
@ -73,12 +70,15 @@ switch (post('op')) {
// Upload file
if (!empty($_FILES) && !empty($_FILES['immagine01']['name'])) {
$tmp = $_FILES['immagine01']['tmp_name'];
$filename = Uploads::upload($_FILES['immagine01'], [
'name' => 'Immagine',
'id_module' => $id_module,
'id_record' => $id_record,
], [
'thumbnails' => true,
]);
$filename = basename($_FILES['immagine01']['name']);
$filename = unique_filename($filename, $upload_dir);
if (create_thumbnails($tmp, $filename, $upload_dir)) {
if (!empty($filename)) {
$dbo->query('UPDATE mg_articoli SET immagine01='.prepare($filename).' WHERE id='.prepare($id_record));
} else {
$_SESSION['warnings'][] = tr('Errore durante il caricamento del file in _DIR_!', [
@ -89,38 +89,16 @@ switch (post('op')) {
// Eliminazione file
if (post('delete_immagine01') !== null) {
$filename = post('immagine01');
$f = pathinfo($filename);
delete($upload_dir.'/'.$f['filename'].'.'.$f['extension']);
delete($upload_dir.'/'.$f['filename'].'_thumb100.'.$f['extension']);
delete($upload_dir.'/'.$f['filename'].'_thumb250.'.$f['extension']);
Uploads::delete($records[0]['immagine01'], [
'id_module' => $id_module,
'id_record' => $id_record,
]);
$dbo->query("UPDATE mg_articoli SET immagine01 = '' WHERE id=".prepare($id_record));
}
$_SESSION['infos'][] = tr('Informazioni salvate correttamente!');
break;
// Aggiunta articolo
case 'add':
$codice = post('codice');
$descrizione = post('descrizione');
$categoria = post('categoria');
$subcategoria = post('subcategoria');
// Inserisco l'articolo solo se non esiste un altro articolo con stesso codice
if ($dbo->fetchNum('SELECT * FROM mg_articoli WHERE codice='.prepare($codice)) == 0) {
$query = 'INSERT INTO mg_articoli(codice, descrizione, id_categoria, id_sottocategoria, attivo) VALUES ('.prepare($codice).', '.prepare($descrizione).', '.prepare($categoria).', '.prepare($subcategoria).', 1)';
$dbo->query($query);
$_SESSION['infos'][] = tr('Aggiunto un nuovo articolo!');
$query = 'SELECT * FROM mg_articoli WHERE codice='.prepare($codice);
$rs = $dbo->fetchArray($query);
$id_record = $rs[0]['id'];
} else {
$_SESSION['errors'][] = tr('Esiste già un articolo con questo codice!');
}
break;
// Aggiunta prodotto
@ -246,6 +224,14 @@ switch (post('op')) {
case 'delmovimento':
$idmovimento = post('idmovimento');
// Lettura qtà movimento
$rs = $dbo->fetchArray('SELECT idarticolo, qta FROM mg_movimenti WHERE id='.prepare($idmovimento));
$qta = $rs[0]['qta'];
$idarticolo = $rs[0]['idarticolo'];
// Aggiorno la quantità dell'articolo
$dbo->query('UPDATE mg_articoli SET qta=qta-'.$qta.' WHERE id='.prepare($idarticolo));
$query = 'DELETE FROM mg_movimenti WHERE id='.prepare($idmovimento);
if ($dbo->query($query)) {
$_SESSION['infos'][] = tr('Movimento rimosso!');
@ -264,3 +250,18 @@ switch (post('op')) {
$_SESSION['infos'][] = tr('Articolo eliminato!');
break;
}
// Operazioni aggiuntive per l'immagine
if (filter('op') == 'unlink_file' && filter('filename') == $records[0]['immagine01']) {
$dbo->update('mg_articoli', [
'immagine01' => '',
], [
'id' => $id_record,
]);
} elseif (filter('op') == 'link_file' && filter('nome_allegato') == 'Immagine') {
$dbo->update('mg_articoli', [
'immagine01' => $upload,
], [
'id' => $id_record,
]);
}

View File

@ -10,19 +10,19 @@ unset($_SESSION['superselect']['id_categoria']);
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Inserisci il codice:'); ?>", "name": "codice", "class":"alphanumeric-mask", "required": 1, "value": "" ]}
{[ "type": "text", "label": "<?php echo tr('Inserisci il codice:'); ?>", "name": "codice", "class":"alphanumeric-mask", "required": 1 ]}
</div>
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Inserisci la descrizione:'); ?>", "name": "descrizione", "required": 1, "value": "" ]}
{[ "type": "text", "label": "<?php echo tr('Inserisci la descrizione:'); ?>", "name": "descrizione", "required": 1 ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Inserisci la categoria:'); ?>", "name": "categoria", "required": 1, "value": "", "ajax-source": "categorie", "icon-after": "add|<?php echo Modules::get('Categorie')['id']; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Inserisci la categoria:'); ?>", "name": "categoria", "required": 1, "ajax-source": "categorie", "icon-after": "add|<?php echo Modules::get('Categorie')['id']; ?>" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Inserisci la subcategoria:'); ?>", "name": "subcategoria", "id": "subcategoria_add", "value": "", "ajax-source": "sottocategorie", "icon-after": "add|<?php echo Modules::get('Categorie')['id']; ?>||hide" ]}
{[ "type": "select", "label": "<?php echo tr('Inserisci la subcategoria:'); ?>", "name": "subcategoria", "id": "subcategoria_add", "ajax-source": "sottocategorie", "icon-after": "add|<?php echo Modules::get('Categorie')['id']; ?>||hide" ]}
</div>
</div>

View File

@ -25,7 +25,7 @@ switch ($resource) {
($fatture[$i]['n2_fattura'] != '') ? $n_fattura = $fatture[$i]['n2_fattura'] : $n_fattura = $fatture[$i]['n_fattura'];
$id_module = Modules::get('Fatture di vendita')['id'];
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$fatture[$i]['iddocumento']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">Fattura num. ".$n_fattura."</a></td>\n";
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$fatture[$i]['iddocumento']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">Fatt. n. ".$n_fattura."</a></td>\n";
echo "<td class='table_cell text-left'>".Translator::dateToLocale($fatture[$i]['data_fattura'])."</td>\n";
echo "<td class='table_cell text-right'>".Translator::numberToLocale($fatture[$i]['costo_unitario'])." &euro;</td></tr>\n";
@ -55,7 +55,7 @@ switch ($resource) {
($fatture[$i]['n2_fattura'] != '') ? $n_fattura = $fatture[$i]['n2_fattura'] : $n_fattura = $fatture[$i]['n_fattura'];
$id_module = Modules::get('Fatture di vendita')['id'];
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$fatture[$i]['iddocumento']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">Fattura num. ".$n_fattura."</a></td>\n";
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$fatture[$i]['iddocumento']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">Fatt. n. ".$n_fattura."</a></td>\n";
echo "<td class='table_cell text-left'>".Translator::dateToLocale($fatture[$i]['data_fattura'])."</td>\n";
echo "<td class='table_cell text-right'>".Translator::numberToLocale($fatture[$i]['costo_unitario'])." &euro;</td></tr>\n";
@ -85,7 +85,7 @@ switch ($resource) {
($fatture[$i]['n2_fattura'] != '') ? $n_fattura = $fatture[$i]['n2_fattura'] : $n_fattura = $fatture[$i]['n_fattura'];
$id_module = Modules::get('Fatture di acquisto')['id'];
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$fatture[$i]['iddocumento']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">Fattura num. ".$n_fattura."</a></td>\n";
echo "<tr><td class='first_cell text-left'><a href='".ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$fatture[$i]['iddocumento']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">Fatt. n. ".$n_fattura."</a></td>\n";
echo "<td class='table_cell text-left'>".Translator::dateToLocale($fatture[$i]['data_fattura'])."</td>\n";
echo "<td class='table_cell text-right'>".Translator::numberToLocale($fatture[$i]['costo_unitario'])." &euro;</td></tr>\n";

View File

@ -42,9 +42,10 @@ switch ($resource) {
$rs = $dbo->fetchArray($query);
foreach ($rs as $r) {
if ($prev != $r['id_sottocategoria']) {
$categoria = $dbo->fetchArray('SELECT `nome` FROM `mg_categorie` WHERE `id`='.prepare($r['id_categoria']))[0]['nome'];
$categoria = $dbo->fetchOne('SELECT `nome` FROM `mg_categorie` WHERE `id`='.prepare($r['id_categoria']))['nome'];
$sottocategoria = $dbo->fetchArray('SELECT `nome` FROM `mg_categorie` WHERE `id`='.prepare($r['id_sottocategoria']))[0]['nome'];
$sottocategoria = $dbo->fetchOne('SELECT `nome` FROM `mg_categorie` WHERE `id`='.prepare($r['id_sottocategoria']));
$sottocategoria = isset($sottocategoria['nome']) ? $sottocategoria['nome'] : null;
$prev = $r['id_sottocategoria'];
$results[] = ['text' => $categoria.' ('.(!empty($r['id_sottocategoria']) ? $sottocategoria : '-').')', 'children' => []];

View File

@ -2,8 +2,20 @@
include_once __DIR__.'/../../core.php';
// Necesario per funzione \Util\Ini::getList
include_once Modules::filepath('MyImpianti', 'modutil.php');
$_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
$img = null;
if (!empty($records[0]['immagine01'])) {
$fileinfo = Uploads::fileInfo($records[0]['immagine01']);
$default_img = '/'.Uploads::getUploadDirectory($id_module).'/'.$fileinfo['filename'].'_thumb600.'.$fileinfo['extension'];
$img = file_exists(DOCROOT.$default_img) ? ROOTDIR.$default_img : ROOTDIR.'/'.Uploads::getUploadDirectory($id_module).'/'.$records[0]['immagine01'];
}
?><form action="" method="post" id="edit-form" enctype="multipart/form-data">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="update">
@ -17,10 +29,7 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
<div class="panel-body">
<div class="row">
<div class="col-md-3">
<?php
$immagine01 = ($records[0]['immagine01'] == '') ? '' : $rootdir.'/files/articoli/'.$records[0]['immagine01'];
?>
{[ "type": "image", "label": "<?php echo tr('Immagine'); ?>", "name": "immagine01", "class": "img-thumbnail", "value": "<?php echo $immagine01; ?>" ]}
{[ "type": "image", "label": "<?php echo tr('Immagine'); ?>", "name": "immagine01", "class": "img-thumbnail", "value": "<?php echo $img; ?>" ]}
</div>
<div class="col-md-4">
@ -30,7 +39,7 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
</div>
<div class="col-md-5">
{[ "type": "checkbox", "label": "<?php echo tr("Seleziona per rendere attivo l'articolo"); ?>", "name": "attivo", "value": "$attivo$", "help": "", "placeholder": "<?php echo tr('Articolo attivo'); ?>" ]}
{[ "type": "checkbox", "label": "<?php echo tr("Seleziona per rendere attivo l'articolo"); ?>", "name": "attivo", "value": "$attivo$", "placeholder": "<?php echo tr('Articolo attivo'); ?>" ]}
<br>
{[ "type": "select", "label": "<?php echo tr('Subcategoria'); ?>", "name": "subcategoria", "value": "$id_sottocategoria$", "ajax-source": "sottocategorie" ]}
</div>
@ -44,15 +53,35 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
<div class="row">
<div class="col-md-3">
{[ "type": "number", "label": "<?php echo tr('Quantità'); ?>", "name": "qta", "required": 1, "value": "$qta$", "readonly": 1, "decimals": "qta", "min-value": "undefined" ]}
<input type="hidden" id="old_qta" value="<?php echo $records[0]['qta']; ?>">
</div>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Modifica quantità manualmente'); ?>", "name": "qta_manuale", "value": 0, "help": "<?php echo tr('Seleziona per modificare manualmente la quantità'); ?>", "placeholder": "<?php echo tr('Quantità manuale'); ?>" ]}
{[ "type": "checkbox", "label": "<?php echo tr('Modifica quantità manualmente'); ?>", "name": "qta_manuale", "value": 0, "help": "<?php echo tr('Seleziona per modificare manualmente la quantità'); ?>", "placeholder": "<?php echo tr('Quantità manuale'); ?>", "extra": "<?php echo ($records[0]['servizio']) ? 'disabled' : ''; ?>" ]}
<script type="text/javascript">
$('#qta_manuale').click(function(){
$("#qta").attr("readonly", !$('#qta_manuale').is(":checked"));
});
$(document).ready(function() {
$('#servizio').click(function(){
$("#qta_manuale").attr("disabled", $('#servizio').is(":checked"));
});
$('#qta_manuale').click(function(){
$("#qta").attr("readonly", !$('#qta_manuale').is(":checked"));
if($('#qta_manuale').is(":checked")){
$("#div_modifica_manuale").show();
$("#div_modifica_manuale").show();
$("#descrizione_movimento").attr('required', true);
$("#data_movimento").attr('required', true);
}else{
$("#div_modifica_manuale").hide();
$('#qta').val($('#old_qta').val());
$("#descrizione_movimento").attr('required', false);
$("#data_movimento").attr('required', false);
}
});
});
</script>
@ -62,10 +91,8 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
{[ "type": "select", "label": "<?php echo tr('Unità di misura'); ?>", "name": "um", "value": "$um$", "ajax-source": "misure", "icon-after": "add|<?php echo Modules::get('Unità di misura')['id']; ?>" ]}
</div>
<?php
($records[0]['serial']>0) ? $records[0]['abilita_serial'] = 1 : $records[0]['abilita_serial'] = $records[0]['abilita_serial'];
$records[0]['abilita_serial'] = ($records[0]['serial'] > 0) ? 1 : $records[0]['abilita_serial'];
if (empty($records[0]['abilita_serial'])) {
$plugin = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Serial'");
echo '<script>$("#link-tab_'.$plugin[0]['id'].'").addClass("disabled");</script>';
@ -73,12 +100,21 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
?>
<div class="col-md-4">
{[ "type": "checkbox", "label": "<?php echo tr('Abilita serial number'); ?>", "name": "abilita_serial", "value": "$abilita_serial$", "help": "<?php echo tr('Abilita serial number in fase di aggiunta articolo in fattura o ddt'); ?>", "placeholder": "<?php echo tr('Serial number'); ?>", "extra": "<?php echo ($records[0]['serial']>0) ? 'readonly' : ''; ?>" ]}
{[ "type": "checkbox", "label": "<?php echo tr('Abilita serial number'); ?>", "name": "abilita_serial", "value": "$abilita_serial$", "help": "<?php echo tr('Abilita serial number in fase di aggiunta articolo in fattura o ddt'); ?>", "placeholder": "<?php echo tr('Serial number'); ?>", "extra": "<?php echo ($records[0]['serial'] > 0) ? 'readonly' : ''; ?>" ]}
</div>
</div>
<div class='row' id="div_modifica_manuale" style="display:none;">
<div class='col-md-3'>
{[ "type": "text", "label": "<?php echo tr('Descrizione movimento'); ?>", "name": "descrizione_movimento" ]}
</div>
<div class='col-md-3'>
{[ "type": "date", "label": "<?php echo tr('Data movimento'); ?>", "name": "data_movimento", "value": "-now-" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "<?php echo tr('Note'); ?>", "name": "note", "value": "$note$" ]}
@ -132,10 +168,10 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
</div>
<div class="col-md-6">
{[ "type": "checkbox", "label": "<?php echo tr('Questo articolo è un servizio'); ?>", "name": "servizio", "value": "$servizio$", "help": "", "placeholder": "<?php echo tr('Servizio'); ?>" ]}
{[ "type": "checkbox", "label": "<?php echo tr('Questo articolo è un servizio'); ?>", "name": "servizio", "value": "$servizio$", "help": "<?php echo tr('Le quantità non saranno considerate'); ?>", "placeholder": "<?php echo tr('Servizio'); ?>" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "number", "label": "<?php echo tr('Peso lordo'); ?>", "name": "peso_lordo", "value": "$peso_lordo$", "icon-after": "KG" ]}
@ -159,9 +195,6 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
<div class="panel-body">
<?php
/* necesario per funzione \Util\Ini::getList */
include $docroot.'/modules/my_impianti/modutil.php';
echo '
<div class="row">
<div class="col-md-4">
@ -295,6 +328,8 @@ echo '
</div>
</form>
{( "name": "filelist_and_upload", "id_module": "<?php echo $id_module; ?>", "id_record": "<?php echo $id_record; ?>" )}
<script>
$("#categoria").change( function(){
session_set("superselect,id_categoria", $(this).val(), 0);
@ -350,8 +385,6 @@ if (!empty($elementi)) {
?>
{( "name": "filelist_and_upload", "id_module": "<?php echo $id_module; ?>", "id_record": "<?php echo $id_record; ?>" )}
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> <?php echo tr('Elimina'); ?>
</a>

178
modules/articoli/import.php Normal file
View File

@ -0,0 +1,178 @@
<?php
include_once __DIR__.'/../../core.php';
include_once Modules::filepath('Articoli', 'modutil.php');
switch (post('op')) {
case 'example':
$module = filter('module');
$list = [
['Codice', 'Descrizione', 'Quantità', 'Unità di misura', 'Prezzo acquisto', 'Prezzo vendita', 'Peso lordo (KG)', 'Volume (M3)', 'Categoria', 'Note'],
['00004', 'Articolo', '10', 'Kg', '5,25', '12,72', '10,2', '500', 'Categoria4', 'Articolo di prova'],
];
directory('../../files/'.$module);
$fp = fopen('../../files/'.$module.'/'.$module.'.csv', 'w');
foreach ($list as $fields) {
fputcsv($fp, $fields, ';');
}
fclose($fp);
exit;
break;
case 'import':
foreach ($data as $key => $value) {
if (!empty($value)) {
$qta = force_decimal($data[$key]['qta']);
unset($data[$key]['qta']);
$data[$key]['attivo'] = 1;
$data[$key]['prezzo_acquisto'] = force_decimal($data[$key]['prezzo_acquisto']);
$data[$key]['prezzo_vendita'] = force_decimal($data[$key]['prezzo_vendita']);
$data[$key]['peso_lordo'] = force_decimal($data[$key]['peso_lordo']);
$data[$key]['volume'] = force_decimal($data[$key]['volume']);
// Categorie
if (!empty($data[$key]['id_categoria'])) {
$rs_cat = $dbo->select('mg_categorie', 'id', [
'nome' => $data[$key]['id_categoria'],
]);
if (empty($rs_cat[0]['id'])) {
$dbo->insert('mg_categorie', [
'nome' => $data[$key]['id_categoria'],
]);
$data[$key]['id_categoria'] = $dbo->lastInsertedID();
} else {
$data[$key]['id_categoria'] = $rs_cat[0]['id'];
}
}
// Um
if (!empty($data[$key]['um'])) {
$rs_um = $dbo->select('mg_unitamisura', 'id', [
'valore' => $data[$key]['um'],
]);
if (empty($rs_um[0]['id'])) {
$dbo->insert('mg_unitamisura', [
'valore' => $data[$key]['um'],
]);
}
}
// Insert o update
$insert = true;
if (!empty($primary_key)) {
$rs = $dbo->select('mg_articoli', $primary_key, [
$primary_key => $data[$key][$primary_key],
]);
$insert = !in_array($data[$key][$primary_key], $rs[0]);
}
// Insert
if ($insert) {
$data[$key]['id_categoria'] = (empty($data[$key]['id_categoria'])) ? 0 : $data[$key]['id_categoria'];
$dbo->insert('mg_articoli', $data[$key]);
add_movimento_magazzino($dbo->lastInsertedID(), $qta, [], 'Movimento da import', date());
}
// Update
else {
$dbo->update('mg_articoli', $data[$key], [$primary_key => $data[$key][$primary_key]]);
$rs = $dbo->select('mg_articoli', 'id', [
$primary_key => $data[$key][$primary_key],
]);
add_movimento_magazzino($rs[0]['id'], $qta, [], 'Movimento da import', date());
}
unset($data[$key]);
}
}
break;
}
return [
[
'field' => 'codice',
'label' => 'Codice',
'primary_key' => true,
],
[
'field' => 'descrizione',
'label' => 'Descrizione',
],
[
'field' => 'qta',
'label' => 'Quantità',
],
[
'field' => 'um',
'label' => 'Unit&agrave; di misura',
'names' => [
'Unità di misura',
'Unità misura',
'unità misura',
'unità di misura',
'Unit` di misura',
'um',
],
],
[
'field' => 'prezzo_acquisto',
'label' => 'Prezzo acquisto',
'names' => [
'Prezzo Acquisto',
'prezzo acquisto',
],
],
[
'field' => 'prezzo_vendita',
'label' => 'Prezzo vendita',
'names' => [
'Prezzo Vendita',
'prezzo vendita',
],
],
[
'field' => 'peso_lordo',
'label' => 'Peso lordo (KG)',
'names' => [
'Peso lordo (KG)',
'Peso',
],
],
[
'field' => 'volume',
'label' => 'Volume (M3)',
'names' => [
'Volume (M3)',
'volume',
],
],
[
'field' => 'id_categoria',
'label' => 'Categoria',
'names' => [
'Categoria',
'id_categoria',
'idcategoria',
'categoria',
],
],
[
'field' => 'note',
'label' => 'Note',
],
];

View File

@ -5,7 +5,7 @@ include_once __DIR__.'/../../core.php';
/**
* Funzione per inserire i movimenti di magazzino.
*/
function add_movimento_magazzino($idarticolo, $qta, $array = [], $descrizone = '')
function add_movimento_magazzino($id_articolo, $qta, $array = [], $descrizone = '', $data = '')
{
$dbo = Database::getConnection();
@ -13,14 +13,22 @@ function add_movimento_magazzino($idarticolo, $qta, $array = [], $descrizone = '
return false;
}
//Info Articolo
$rs_art = $dbo->fetchArray("SELECT * FROM mg_articoli WHERE id='".$idarticolo."'");
$nome = null;
$tipo = null;
$numero = null;
// Informazioni articolo
$articolo = $dbo->fetchOne('SELECT * FROM mg_articoli WHERE id='.prepare($id_articolo));
$manuale = 0;
// Ddt
if (!empty($array['idddt'])) {
$rs = $dbo->fetchArray('SELECT numero, numero_esterno, dt_tipiddt.descrizione AS tipo, dt_tipiddt.dir FROM dt_ddt LEFT JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($array['idddt']));
$numero = (!empty($rs[0]['numero_esterno'])) ? $rs[0]['numero_esterno'] : $rs[0]['numero'];
$tipo = strtolower($rs[0]['tipo']);
$rs_data = $dbo->fetchArray("SELECT data FROM dt_ddt WHERE id='".$array['idddt']."'");
$data = $rs_data[0]['data'];
}
// Fattura
@ -28,6 +36,9 @@ function add_movimento_magazzino($idarticolo, $qta, $array = [], $descrizone = '
$rs = $dbo->fetchArray('SELECT numero, numero_esterno, co_tipidocumento.descrizione AS tipo, co_tipidocumento.dir FROM co_documenti LEFT JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($array['iddocumento']));
$numero = (!empty($rs[0]['numero_esterno'])) ? $rs[0]['numero_esterno'] : $rs[0]['numero'];
$tipo = strtolower($rs[0]['tipo']);
$rs_data = $dbo->fetchArray("SELECT data FROM co_documenti WHERE id='".$array['iddocumento']."'");
$data = $rs_data[0]['data'];
}
// Automezzo
@ -47,23 +58,33 @@ function add_movimento_magazzino($idarticolo, $qta, $array = [], $descrizone = '
$new = ($qta < 0 ? '+' : '').-$qta;
$dbo->query('UPDATE mg_articoli_automezzi SET qta = qta + '.$new.' WHERE idarticolo = '.prepare($idarticolo).' AND idautomezzo = '.prepare($array['idautomezzo']));
$dbo->query('UPDATE mg_articoli_automezzi SET qta = qta + '.$new.' WHERE idarticolo = '.prepare($id_articolo).' AND idautomezzo = '.prepare($array['idautomezzo']));
$data = date('Y-m-d');
}
// Intervento
elseif (!empty($array['idintervento'])) {
$rs_data = $dbo->fetchArray('SELECT IFNULL(MAX(orario_fine), data_richiesta) AS data, codice FROM in_interventi LEFT JOIN in_interventi_tecnici ON in_interventi.id=in_interventi_tecnici.idintervento WHERE in_interventi.id = '.prepare($array['idintervento']));
$data = $rs_data[0]['data'];
$codice_intervento = $rs_data[0]['codice'];
$movimento = ($qta > 0) ? tr('Ripristino articolo da intervento _NUM_') : tr('Scarico magazzino per intervento _NUM_');
$numero = $array['idintervento'];
$numero = $codice_intervento;
}
// Manuale
else {
$manuale = 1;
$movimento = !empty($descrizone) ? $descrizone : '';
$descrizone = '';
if (empty($movimento)) {
$movimento = ($qta > 0) ? tr('Carico magazzino') : tr('Scarico magazzino');
}
if ($data == '') {
$data = date('Y-m-d');
}
}
// Descrizione di default
@ -80,18 +101,20 @@ function add_movimento_magazzino($idarticolo, $qta, $array = [], $descrizone = '
$new = ($qta > 0 ? '+' : '').$qta;
//Movimento il magazzino solo se l'articolo non è un servizio
if ($rs_art[0]['servizio'] == 0) {
// Movimento il magazzino solo se l'articolo non è un servizio
if ($articolo['servizio'] == 0) {
// Movimentazione effettiva
if (empty($array['idintervento']) || empty($array['idautomezzo'])) {
$dbo->query('UPDATE mg_articoli SET qta = qta + '.$new.' WHERE id = '.prepare($idarticolo));
$dbo->query('UPDATE mg_articoli SET qta = qta + '.$new.' WHERE id = '.prepare($id_articolo));
}
// Registrazione della movimentazione
$dbo->insert('mg_movimenti', array_merge($array, [
'idarticolo' => $idarticolo,
'idarticolo' => $id_articolo,
'qta' => $qta,
'movimento' => $movimento,
'data' => $data,
'manuale' => $manuale,
]));
}

View File

@ -11,19 +11,15 @@ echo '
</div>
<div class="panel-body">';
$search_lotto = $get['search_lotto'];
$search_serial = $get['search_serial'];
$search_altro = $get['search_altro'];
$search_lotto = get('search_lotto');
$search_serial = get('search_serial');
$search_altro = get('search_altro');
// Calcolo prossimo lotto e serial number
$rs = $dbo->fetchArray('SELECT MAX(lotto) AS max_lotto, MAX(serial) AS max_serial, MAX(altro) AS max_altro FROM mg_prodotti WHERE id_articolo='.prepare($id_record));
//$max_lotto = $rs[0]['max_lotto'];
$max_serial = $rs[0]['max_serial'];
//$max_altro = $rs[0]['max_altro'];
$rs = $dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE id_articolo='.prepare($id_record).' ORDER BY id DESC LIMIT 0,1');
$max_serial = $rs[0]['serial'];
//$next_lotto = get_next_code($max_lotto);
$next_serial = get_next_code($max_serial);
//$next_altro = get_next_code($max_altro);
echo '
<form action="" method="post" role="form">
@ -38,90 +34,53 @@ echo '
</div>
</div>';
/*
// Lotto
echo '
<div class="row form-group">
<label class="col-md-2 control-label" for="lotto_start">'.tr('Lotto da').':</label>
<div class="col-md-2">
<input type="text" class="form-control input-md" name="lotto_start" onkeyup="$(\'input[name=lotto_end]\').val( $(\'input[name=lotto_start]\').val() ); $(\'#warn_lotto\').hide(); ricalcola_totale_prodotti();" value="'.$next_lotto.'">
</div>
<label class="col-md-1 control-label text-center" for="lotto_end"> <i class="fa fa-arrow-circle-right fa-2x"></i> </label>
<div class="col-md-2">
<input type="text" class="form-control input-md" name="lotto_end" onkeyup="check_progressivo( $(\'input[name=lotto_start]\'), $(\'input[name=lotto_end]\'), $(\'#warn_lotto\'), $(\'#inserisci\') );" value="'.$next_lotto.'">
</div>';
if (!empty($max_lotto)) {
echo '
<div class="col-md-3">
<p id="warn_lotto" class="text-danger"><b>'.tr('Ultimo lotto inserito').': </b> '.$max_lotto.'</p>
</div>';
}
echo '
</div>';
*/
// Serial
echo '
<div class="row form-group">
<label class="col-md-2 control-label" for="serial_start">'.tr('Serial number da').':</label>
<div class="col-md-2">
<input type="text" class="form-control input-md" name="serial_start" onkeyup="$(\'input[name=serial_end]\').val( $(\'input[name=serial_start]\').val() ); $(\'#warn_serial\').hide(); ricalcola_totale_prodotti();" value="'.$next_serial.'" />
</div>
<label class="col-md-1 control-label text-center" for="serial_end"> <i class="fa fa-arrow-circle-right fa-2x"></i> </label>
<label class="col-md-1 control-label text-center" for="serial_end">
<i class="fa fa-arrow-circle-right fa-2x"></i>
</label>
<div class="col-md-2">
<input type="text" class="form-control input-md" name="serial_end" onkeyup="check_progressivo( $(\'input[name=serial_start]\'), $(\'input[name=serial_end]\'), $(\'#warn_serial\'), $(\'#inserisci\') );" value="'.$next_serial.'" />
</div>';
if (!empty($max_serial)) {
echo '
<div class="col-md-3">
<div class="col-md-5">
<p id="warn_serial" class="text-danger"><b>'.tr('Ultimo serial number inserito').': </b> '.$max_serial.'</p>
</div>';
}
echo '
</div>';
/*
// Altro
echo '
<div class="row form-group">
<label class="col-md-2 control-label" for="altro_start">'.tr('Altro codice da').':</label>
<div class="col-md-2">
<input type="text" class="form-control input-md" name="altro_start" onkeyup="$(\'input[name=altro_end]\').val( $(\'input[name=altro_start]\').val() ); $(\'#warn_altro\').hide(); ricalcola_totale_prodotti();" value="'.$next_altro.'" />
</div>
<label class="col-md-1 control-label text-center" for="altro_end"> <i class="fa fa-arrow-circle-right fa-2x"></i> </label>
<div class="col-md-2">
<input type="text" class="form-control input-md" name="altro_end" onkeyup="check_progressivo( $(\'input[name=altro_start]\'), $(\'input[name=altro_end]\'), $(\'#warn_altro\'), $(\'#inserisci\') );" value="'.$next_altro.'" />
</div>';
if (!empty($max_altro)) {
echo '
<div class="col-md-3">
<p id="warn_altro" class="text-danger"><b>'.tr('Ultimo codice aggiuntivo inserito').': </b> '.$max_altro.'</p>
</div>';
}
echo '
</div>';
*/
// Totale prodotti da inserire
echo '
<div class="row">
<div class="col-md-12">
<p class="text-danger text-center">'.tr('Totale prodotti da inserire').': <span id="totale_prodotti">0</span></p>
<button type="submit" id="inserisci" class="btn btn-success" onclick="if( confirm(\'Confermi l\\\'inserimento di \' + globalsp.n_prodotti + \' prodotti?\') ){ $(\'#insert_form\').submit(); }"><i class="fa fa-check"></i> '.tr('Salva modifiche').'</button>';
<p class="text-danger">'.tr('Totale prodotti da inserire').': <span id="totale_prodotti">0</span></p>
<button type="submit" id="inserisci" class="btn btn-success pull-right" onclick="if( confirm(\'Confermi l\\\'inserimento di \' + globalsp.n_prodotti + \' prodotti?\') ){ $(\'#insert_form\').submit(); }"><i class="fa fa-check"></i> '.tr('Salva modifiche').'</button>
<div class="clearfix"></div>
<div class="alert alert-info">';
// Visualizzo, in base alle impostazioni scelte, se il magazzino verrà movimentato
if (get_var("Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number") == true) {
if (get_var("Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number")) {
echo '
<small>'.tr("L'inserimento incrementerà la quantità dell'articolo!").'</small>';
<small>'.tr("L'inserimento incrementerà la quantità dell'articolo!").'</small>';
} else {
echo '
<small>'.tr("L'inserimento non movimenterà la quantità dell'articolo!").'</small>';
<small>'.tr("L'inserimento non movimenterà la quantità dell'articolo!").'</small>';
}
echo '
</div>
</div>
</div>
</form>

View File

@ -12,11 +12,17 @@ echo '
<div class="box-body">';
// Calcolo la quantità dai movimenti in magazzino
$rst = $dbo->fetchArray('SELECT SUM(qta) AS qta_totale FROM mg_movimenti WHERE idarticolo='.prepare($id_record).' AND (idintervento IS NULL OR idautomezzo = 0)');
$rst = $dbo->fetchArray('SELECT COUNT(mg_movimenti.id) AS row, SUM(qta) AS qta_totale, ( SELECT SUM(qta) FROM mg_movimenti WHERE idarticolo='.prepare($id_record).' AND (idintervento IS NULL OR idautomezzo = 0) AND data <= CURDATE() ) AS qta_totale_attuale FROM mg_movimenti WHERE idarticolo='.prepare($id_record).' AND (idintervento IS NULL OR idautomezzo = 0)');
$qta_totale = $rst[0]['qta_totale'];
$qta_totale_attuale = $rst[0]['qta_totale_attuale'];
echo '
<p>'.tr('Quantità calcolata dai movimenti').': '.Translator::numberToLocale($qta_totale).' '.$rs[0]['unita_misura'].'</p>';
if ($rst[0]['row'] > 0) {
echo '
<p>'.tr('Quantità calcolata dai movimenti').': <b>'.Translator::numberToLocale($qta_totale, 'qta').' '.$records[0]['um'].'</b> <span class=\'tip\' title=\''.tr('Quantità calcolata da tutti i movimenti registrati').'.\' ><i class="fa fa-question-circle-o"></i></span></p>';
echo '
<p>'.tr('Quantità calcolata attuale').': <b>'.Translator::numberToLocale($qta_totale_attuale, 'qta').' '.$records[0]['um'].'</b> <span class=\'tip\' title=\''.tr('Quantità calcolata secondo i movimenti registrati con data oggi o date trascorse').'.\' ><i class="fa fa-question-circle-o"></i></span></p>';
}
// Elenco movimenti magazzino
$query = 'SELECT * FROM mg_movimenti WHERE idarticolo='.prepare($id_record).' ORDER BY created_at DESC';
@ -38,30 +44,41 @@ if (!empty($rs2)) {
echo '
<table class="table table-striped table-condensed table-bordered">
<tr>
<th class="text-center" width="100">'.tr('Q.').'</th>
<th width="720">'.tr('Causale').'</th>
<th>'.tr('Data').'</th>
<th class="text-center">#</th>
<th >'.tr('Q.').'</th>
<th >'.tr('Causale').'</th>
<th >'.tr('Data').'</th>
<th class="text-center" width="7%">#</th>
</tr>';
foreach ($rs2 as $r) {
// Quantità
echo '
<tr>
<td class="text-right">'.Translator::numberToLocale($r['qta']).'</td>';
<td class="text-right">'.Translator::numberToLocale($r['qta'], 'qta').' '.$records[0]['um'].'</td>';
// Causale
$dir = ($r['qta'] < 0) ? 'vendita' : 'acquisto';
if (!empty($r['iddocumento'])) {
$dir = $dbo->fetchArray('SELECT dir FROM co_tipidocumento WHERE id = (SELECT idtipodocumento FROM co_documenti WHERE id = '.prepare($r['iddocumento']).')')[0]['dir'] == 'entrata' ? 'vendita' : 'acquisto';
}
echo '
<td>'.$r['movimento'].'</td>';
<td>'.$r['movimento'].'
'.((!empty($r['idintervento'])) ? Modules::link('Interventi', $r['idintervento']) : '').'
'.((!empty($r['idautomezzo'])) ? Modules::link('Automezzi', $r['idautomezzo']) : '').'
'.((!empty($r['iddt'])) ? Modules::link('DDt di '.$dir.'', $r['iddt']) : '').'
'.((!empty($r['iddocumento'])) ? Modules::link('Fatture di '.$dir.'', $r['iddocumento']) : '').'
</td>';
// Data
echo '
<td>'.Translator::timestampToLocale($r['created_at']).'</td>';
<td class="text-center" >'.Translator::dateToLocale($r['data']).' <span class=\'tip\' title=\''.tr('Data del movimento: ').Translator::dateToLocale($r['created_at']).'\' ><i class="fa fa-question-circle-o"></i></span> </td>';
// Operazioni
echo '
<td class="text-center">';
if (Auth::admin()) {
if (Auth::admin() && $r['manuale'] == '1') {
echo '
<a class="btn btn-danger btn-sm ask" data-backto="record-edit" data-op="delmovimento" data-idmovimento="'.$r['id'].'">
<i class="fa fa-trash"></i>
@ -76,7 +93,10 @@ if (!empty($rs2)) {
</table>';
} else {
echo '
<p>'.tr('Nessun movimento disponibile').'...</p>';
<div class="alert alert-info">
<i class="fa fa-info-circle"></i>
'.tr('Questo articolo non è ancora stato movimentato', []).'.
</div>';
}
echo '

View File

@ -19,7 +19,7 @@ if (!empty($rs)) {
'.Modules::link('Articoli', $r['id'], $r['descrizione']).'
</td>
<td>
'.$r['qta'].' '.$r['unitamisura'].'
'.Translator::numberToLocale($r['qta'], 'qta').' '.$r['unitamisura'].'
</td>
</tr>';
}
@ -27,5 +27,5 @@ if (!empty($rs)) {
echo '
</table>';
} else {
echo '<p>'.tr('Non ci sono articoli in esaurimento').".</p>\n";
echo '<div class=\'alert alert-info\' >'.tr('Non ci sono articoli in esaurimento.')."</div>\n";
}

View File

@ -3,7 +3,7 @@
include_once __DIR__.'/../../core.php';
// Necessaria per la funzione add_movimento_magazzino
include_once $docroot.'/modules/articoli/modutil.php';
include_once Modules::filepath('Articoli', 'modutil.php');
switch (post('op')) {
case 'update':

View File

@ -7,11 +7,11 @@ include_once __DIR__.'/../../core.php';
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1, "value": "" ]}
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1 ]}
</div>
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Targa'); ?>", "name": "targa", "required": 1, "maxlength": 10, "class": "alphanumeric-mask", "value": "" ]}
{[ "type": "text", "label": "<?php echo tr('Targa'); ?>", "name": "targa", "required": 1, "maxlength": 10, "class": "alphanumeric-mask" ]}
</div>
</div>

View File

@ -22,13 +22,13 @@ echo '
// Data di partenza
echo '
<div class="col-md-3">
{[ "type": "date", "label": "'.tr('Data dal').'", "name": "data_inizio", "required": 1, "class": "text-center", "value": "-now-" ]}
{[ "type": "date", "label": "'.tr('Data dal').'", "name": "data_inizio", "required": 1, "maxlength": 10, "value": "-now-" ]}
</div>';
// Data di fine
echo '
<div class="col-md-3">
{[ "type": "date", "label": "'.tr('Data al').'", "name": "data_fine", "value": "", "min-date": "-now-" ]}
{[ "type": "date", "label": "'.tr('Data al').'", "name": "data_fine", "maxlength": 10, "min-date": "-now-" ]}
</div>';
echo '

View File

@ -32,57 +32,73 @@ include_once __DIR__.'/../../core.php';
</div>
</form>
<!-- TECNICI -->
<div class="panel panel-primary">
<!-- TECNICI + MAGAZZINO AUTOMEZZO -->
<div class="row">
<div class="panel-heading">
<div class="row">
<div class="col-md-6">
<h3 class="panel-title"><?php echo tr('Tecnici responsabili automezzo'); ?></h3>
<!--TECNICI -->
<div class="col-md-6">
<div class="panel panel-primary">
<div class="panel-heading">
<div class="row">
<div class="col-md-12">
<h3 class="panel-title"><?php echo tr('Tecnici responsabili automezzo'); ?></h3>
</div>
</div>
</div>
<div class="col-md-6">
<h3 class="panel-title"><?php echo tr('Magazzino automezzo'); ?></h3>
<div class="panel-body">
<div class="row">
<div class="col-md-12" >
<form action="<?php echo $rootdir; ?>/editor.php?id_module=<?php echo Modules::get('Automezzi')['id']; ?>&id_record=<?php echo $id_record; ?>" id="updatetech-form" method="post" role="form">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="id_record" value="<?php echo $id_record; ?>">
<input type="hidden" name="op" value="">
<?php
include $docroot.'/modules/automezzi/row-list-tecnici.php';
?>
</form>
<a href="javascript:;" class="btn btn-sm btn-success pull-right" title="Aggiorna date" onclick="$('#updatetech-form input[name=op]').val('savetech'); $('#updatetech-form').submit();"><i class="fa fa-edit"></i> <?php echo tr('Salva date'); ?></a>
<div class="pull-left">
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir; ?>/modules/automezzi/add_tecnico.php?idautomezzo=<?php echo $id_record; ?>" data-toggle="modal" data-title="Aggiungi tecnico" data-target="#bs-popup"><i class="fa fa-plus"></i> <?php echo tr('Aggiungi tecnico'); ?></a><br>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
</div>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-6" style="border-right:1px solid #DDD;">
<form action="<?php echo $rootdir; ?>/editor.php?id_module=<?php echo Modules::get('Automezzi')['id']; ?>&id_record=<?php echo $id_record; ?>" id="updatetech-form" method="post" role="form">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="id_record" value="<?php echo $id_record; ?>">
<input type="hidden" name="op" value="">
<?php
include $docroot.'/modules/automezzi/row-list-tecnici.php';
?>
</form>
<a href="javascript:;" class="btn btn-sm btn-success pull-right" title="Aggiorna date" onclick="$('#updatetech-form input[name=op]').val('savetech'); $('#updatetech-form').submit();"><i class="fa fa-edit"></i> <?php echo tr('Salva date'); ?></a>
<div class="pull-left">
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir; ?>/modules/automezzi/add_tecnico.php?idautomezzo=<?php echo $id_record; ?>" data-toggle="modal" data-title="Aggiungi tecnico" data-target="#bs-popup"><i class="fa fa-plus"></i> <?php echo tr('Aggiungi tecnico'); ?></a><br>
<!-- MAGAZZINO AUTOMEZZO -->
<div class="col-md-6">
<div class="panel panel-primary">
<div class="panel-heading">
<div class="row">
<div class="col-md-12">
<h3 class="panel-title"><?php echo tr('Magazzino automezzo'); ?></h3>
</div>
</div>
<div class="clearfix"></div>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-12">
<?php
include $docroot.'/modules/automezzi/row-list-articoli.php';
?>
<div class="col-md-6">
<?php
include $docroot.'/modules/automezzi/row-list-articoli.php';
?>
<div class="pull-left">
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir; ?>/modules/automezzi/add_articolo.php?idautomezzo=<?php echo $id_record; ?>" data-toggle="modal" data-title="Aggiungi articoli" data-target="#bs-popup"><i class="fa fa-plus"></i> <?php echo tr('Articolo magazzino'); ?></a><br>
<div class="pull-left">
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir; ?>/modules/automezzi/add_articolo.php?idautomezzo=<?php echo $id_record; ?>" data-toggle="modal" data-title="Aggiungi articoli" data-target="#bs-popup"><i class="fa fa-plus"></i> <?php echo tr('Articolo magazzino'); ?></a><br>
</div>
<div class="clearfix"></div>
</div>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
</div>
</div>
<a class="btn btn-danger ask" data-backto="record-list">

View File

@ -5,7 +5,7 @@ include_once __DIR__.'/../../core.php';
/*
TECNICI ASSEGNATI ALL'AUTOMEZZO
*/
$q_art = "SELECT *, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=dt_automezzi_tecnici.idtecnico) AS nometecnico FROM dt_automezzi_tecnici WHERE idautomezzo='".$id_record."'";
$q_art = 'SELECT *, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=dt_automezzi_tecnici.idtecnico) AS nometecnico FROM dt_automezzi_tecnici WHERE idautomezzo='.prepare($id_record);
$rs_art = $dbo->fetchArray($q_art);
if (!empty($rs_art)) {
@ -30,13 +30,13 @@ if (!empty($rs_art)) {
// Data di inizio
echo '
<td>
{[ "type": "date", "name": "data_inizio['.$r['id'].']", "required": 1, "class": "text-center", "value": "'.$r['data_inizio'].'", "extra": "" ]}
{[ "type": "date", "name": "data_inizio['.$r['id'].']", "required": 1, "maxlength": 10, "value": "'.$r['data_inizio'].'" ]}
</td>';
// Data di fine
echo '
<td>
{[ "type": "date", "name": "data_fine['.$r['id'].']", "class": "text-center", "value": "'.$r['data_fine'].'", "min-date": "'.$r['data_inizio'].'", "extra": "" ]}
{[ "type": "date", "name": "data_fine['.$r['id'].']", "maxlength": 10, "value": "'.$r['data_fine'].'", "min-date": "'.$r['data_inizio'].'" ]}
</td>';
// Pulsanti per aggiornamento date tecnici

View File

@ -12,7 +12,6 @@ if (!extension_loaded('zip')) {
</div>';
}
if (starts_with($backup_dir, $docroot)) {
echo '
<div class="alert alert-warning">
@ -28,7 +27,6 @@ if (!is_writable($backup_dir)) {
</div>';
}
echo '
<div class="callout callout-success">
<p>';
@ -55,7 +53,6 @@ echo '
</div>
</div-->';
//Lettura file di backup
if (file_exists($backup_dir)) {
$backups_zip = [];

View File

@ -4,24 +4,23 @@ include_once __DIR__.'/../../core.php';
switch (filter('op')) {
case 'update':
$nome = filter('nome');
if (isset($nome)) {
$array = [
'nome' => $nome,
'filiale' => $post['filiale'],
'iban' => $post['iban'],
'bic' => $post['bic'],
'id_pianodeiconti3' => $post['id_pianodeiconti3'],
'note' => $post['note'],
];
$array = [
'nome' => $nome,
'filiale' => $post['filiale'],
'iban' => $post['iban'],
'bic' => $post['bic'],
'id_pianodeiconti3' => $post['id_pianodeiconti3'],
'note' => $post['note'],
];
if (!empty($id_record)) {
$dbo->update('co_banche', $array, ['id' => $id_record]);
}
if (!empty($id_record)) {
$dbo->update('co_banche', $array, ['id' => $id_record]);
}
$_SESSION['infos'][] = tr('Salvataggio completato!');
} else {
$_SESSION['errors'][] = tr('Ci sono stati alcuni errori durante il salvataggio!');
@ -35,11 +34,11 @@ switch (filter('op')) {
if (isset($nome)) {
$dbo->query('INSERT INTO `co_banche` (`nome`) VALUES ('.prepare($nome).')');
$id_record = $dbo->lastInsertedID();
if (isAjaxRequest()) {
echo json_encode(['id' => $id_record, 'text' => $nome]);
}
if (isAjaxRequest()) {
echo json_encode(['id' => $id_record, 'text' => $nome]);
}
$_SESSION['infos'][] = tr('Aggiunta nuova _TYPE_', [
'_TYPE_' => 'banca',
]);
@ -47,32 +46,29 @@ switch (filter('op')) {
$_SESSION['errors'][] = tr('Ci sono stati alcuni errori durante il salvataggio!');
}
break;
case 'delete':
$documenti = $dbo->fetchNum('SELECT idanagrafica FROM an_anagrafiche WHERE idbanca_vendite='.prepare($id_record).'
$documenti = $dbo->fetchNum('SELECT idanagrafica FROM an_anagrafiche WHERE idbanca_vendite='.prepare($id_record).'
UNION SELECT idanagrafica FROM an_anagrafiche WHERE idbanca_acquisti='.prepare($id_record));
if (isset($id_record) && empty($documenti)) {
$dbo->query('DELETE FROM `co_banche` WHERE `id`='.prepare($id_record));
$_SESSION['infos'][] = tr('_TYPE_ eliminata con successo!', [
'_TYPE_' => 'Banca',
]);
}else{
$array = [
'deleted' => 1,
];
$dbo->update('co_banche', $array, ['id' => $id_record]);
$_SESSION['infos'][] = tr('_TYPE_ eliminata con successo!', [
} else {
$array = [
'deleted' => 1,
];
$dbo->update('co_banche', $array, ['id' => $id_record]);
$_SESSION['infos'][] = tr('_TYPE_ eliminata con successo!', [
'_TYPE_' => 'Banca',
]);
}
]);
}
break;
}

View File

@ -8,7 +8,7 @@ include_once __DIR__.'/../../core.php';
<div class="row">
<div class="col-md-12">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "value": "" ]}
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": "1" ]}
</div>
</div>

View File

@ -2,9 +2,7 @@
include_once __DIR__.'/../../core.php';
?>
<form action="" method="post" id="edit-form">
?><form action="" method="post" id="edit-form">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="update">
@ -18,28 +16,28 @@ include_once __DIR__.'/../../core.php';
<div class="panel-body">
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "value": "$nome$" ]}
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": "1", "value": "$nome$" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Filiale'); ?>", "name": "filiale", "value": "$filiale$" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Conto predefinito'); ?>", "name": "id_pianodeiconti3", "value": "$id_pianodeiconti3$", "values": "query=SELECT id, descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2 = 1" ]}
{[ "type": "select", "label": "<?php echo tr('Conto predefinito'); ?>", "name": "id_pianodeiconti3", "value": "$id_pianodeiconti3$", "values": "query=SELECT id, descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2 = 1 AND ( id NOT IN (SELECT id_pianodeiconti3 FROM co_banche) OR id = '<?php echo $records[0]['id_pianodeiconti3'] ?>' )" ]}
</div>
</div>
<div class="row">
<div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('IBAN'); ?>", "name": "iban", "class": "alphanumeric-mask", "maxlength": 32, "value": "$iban$" ]}
{[ "type": "text", "label": "<?php echo tr('IBAN'); ?>", "name": "iban", "required": "1", "class": "alphanumeric-mask", "maxlength": 32, "value": "$iban$" ]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('BIC'); ?>", "name": "bic", "class": "alphanumeric-mask", "maxlength": 11, "value": "$bic$" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "<?php echo tr('Note'); ?>", "name": "note", "required": 0, "class": "", "value": "$note$", "extra": "" ]}
{[ "type": "textarea", "label": "<?php echo tr('Note'); ?>", "name": "note", "required": 0, "value": "$note$" ]}
</div>
</div>
</div>
@ -51,8 +49,8 @@ include_once __DIR__.'/../../core.php';
$documenti = $dbo->fetchNum('SELECT idanagrafica FROM an_anagrafiche WHERE idbanca_vendite='.prepare($id_record).'
UNION SELECT idanagrafica FROM an_anagrafiche WHERE idbanca_acquisti='.prepare($id_record));
if (!empty($documenti)){
echo '
if (!empty($documenti)) {
echo '
<div class="alert alert-danger">
'.tr('Ci sono _NUM_ documenti collegati', [
'_NUM_' => count($documenti),

View File

@ -40,14 +40,13 @@ switch (post('op')) {
$documenti = $dbo->fetchNum('SELECT id FROM dt_ddt WHERE idaspettobeni='.prepare($id_record).'
UNION SELECT id FROM co_documenti WHERE idaspettobeni='.prepare($id_record));
if (isset($id_record) && empty($documenti)) {
$dbo->query('DELETE FROM `dt_aspettobeni` WHERE `id`='.prepare($id_record));
$_SESSION['infos'][] = tr('Tipologia di _TYPE_ eliminata con successo.', [
'_TYPE_' => 'bene',
]);
}else{
} else {
$_SESSION['errors'][] = tr('Sono presenti dei documenti collegati a questo aspetto beni.');
}

View File

@ -8,7 +8,7 @@ include_once __DIR__.'/../../core.php';
<div class="row">
<div class="col-md-12">
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": "" ]}
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1 ]}
</div>
</div>

View File

@ -27,8 +27,8 @@ include_once __DIR__.'/../../core.php';
$documenti = $dbo->fetchNum('SELECT id FROM dt_ddt WHERE idaspettobeni='.prepare($id_record).'
UNION SELECT id FROM co_documenti WHERE idaspettobeni='.prepare($id_record));
if (!empty($documenti)){
echo '
if (!empty($documenti)) {
echo '
<div class="alert alert-danger">
'.tr('Ci sono _NUM_ documenti collegati', [
'_NUM_' => count($documenti),

View File

@ -19,9 +19,11 @@ switch (filter('op')) {
case 'add':
$nome = filter('nome');
$nota = filter('nota');
$colore = filter('colore');
if (isset($nome)) {
$dbo->query('INSERT INTO `mg_categorie` (`nome`) VALUES ('.prepare($nome).')');
$dbo->query('INSERT INTO `mg_categorie` (`nome`, `colore`, `nota`) VALUES ('.prepare($nome).', '.prepare($colore).', '.prepare($nota).')');
$id_record = $dbo->lastInsertedID();
@ -44,7 +46,7 @@ switch (filter('op')) {
$id = $id_record;
}
if ( $dbo->fetchNum('SELECT * FROM `mg_articoli` WHERE `id_categoria`='.prepare($id).' OR `id_sottocategoria`='.prepare($id).' OR `id_sottocategoria` IN (SELECT id FROM `mg_categorie` WHERE `parent`='.prepare($id).')') == 0 ) {
if ($dbo->fetchNum('SELECT * FROM `mg_articoli` WHERE `id_categoria`='.prepare($id).' OR `id_sottocategoria`='.prepare($id).' OR `id_sottocategoria` IN (SELECT id FROM `mg_categorie` WHERE `parent`='.prepare($id).')') == 0) {
$dbo->query('DELETE FROM `mg_categorie` WHERE `id`='.prepare($id));
$_SESSION['infos'][] = tr('Tipologia di _TYPE_ eliminata con successo!', [
'_TYPE_' => 'categoria',

View File

@ -19,21 +19,18 @@ if (isset($id_record)) {
if (!isset($id_original)) {
?>
<input type="hidden" name="op" value="add">
<div class="row">
<div class="col-md-12">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1 ]}
</div>
</div>
<?php
} else {
?>
<input type="hidden" name="op" value="row">
<input type="hidden" name="id_original" value="<?php echo $id_original; ?>">
<?php
}
?>
<div class="row">
<div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1, "value": "$nome$", "extra": "" ]}
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1, "value": "$nome$" ]}
</div>
<div class="col-md-4">
@ -47,19 +44,6 @@ if (!isset($id_original)) {
</div>
</div>
<script>
$(document).ready( function(){
$('.colorpicker').colorpicker().on('changeColor', function(){
$('#colore_').parent().find('.square').css('background', $('#colore_').val());
});
$('#colore_').parent().find('.square').css('background', $('#colore_').val());
});
</script>
<?php
}
?>
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
@ -77,3 +61,13 @@ if (isset($id_record)) {
</div>
</div>
</form>
<script>
$(document).ready( function(){
$('.colorpicker').colorpicker().on('changeColor', function(){
$('#colore_').parent().find('.square').css('background', $('#colore_').val());
});
$('#colore_').parent().find('.square').css('background', $('#colore_').val());
});
</script>

View File

@ -79,7 +79,7 @@ $res = $dbo->fetchNum('SELECT * FROM `mg_articoli` WHERE `id_categoria`='.prepar
if ($res) {
echo '
<div class="alert alert-danger">
<p>'.tr('Esistono ancora alcuni articoli sotto questa categoria!').'</p>
<p>'.tr('Ci sono '.count($res).' articoli collegati questa categoria. Non è possibile eliminarla.').'</p>
</div>';
} else {
echo '

View File

@ -50,14 +50,11 @@ switch (filter('op')) {
UNION SELECT id FROM co_documenti WHERE idcausalet='.prepare($id_record));
if (isset($id_record) && empty($documenti)) {
$dbo->query('DELETE FROM `dt_causalet` WHERE `id`='.prepare($id_record));
$_SESSION['infos'][] = tr('Tipologia di _TYPE_ eliminata con successo.', [
'_TYPE_' => 'causale',
]);
}else{
} else {
$_SESSION['errors'][] = tr('Sono presenti dei documenti collegati a questa causale.');
}

View File

@ -7,7 +7,7 @@ include_once __DIR__.'/../../core.php';
<div class="row">
<div class="col-md-12">
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": "" ]}
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1 ]}
</div>
</div>

View File

@ -26,8 +26,8 @@ include_once __DIR__.'/../../core.php';
$documenti = $dbo->fetchNum('SELECT id FROM dt_ddt WHERE idcausalet='.prepare($id_record).'
UNION SELECT id FROM co_documenti WHERE idcausalet='.prepare($id_record));
if (!empty($documenti)){
echo '
if (!empty($documenti)) {
echo '
<div class="alert alert-danger">
'.tr('Ci sono _NUM_ documenti collegati', [
'_NUM_' => count($documenti),

View File

@ -2,7 +2,7 @@
include_once __DIR__.'/../../core.php';
include_once $docroot.'/modules/fatture/modutil.php';
include_once Modules::filepath('Fatture di vendita', 'modutil.php');
switch (post('op')) {
case 'add':
@ -55,7 +55,7 @@ switch (post('op')) {
if ($budget != '') {
$budget = post('budget');
} else {
$q = "SELECT (SELECT SUM(subtotale) FROM co_righe2_contratti GROUP BY idcontratto HAVING idcontratto=co_contratti.id) AS 'budget' FROM co_contratti WHERE id=".prepare($id_record);
$q = "SELECT (SELECT SUM(subtotale) FROM co_righe_contratti GROUP BY idcontratto HAVING idcontratto=co_contratti.id) AS 'budget' FROM co_contratti WHERE id=".prepare($id_record);
$rs = $dbo->fetchArray($q);
$budget = $rs[0]['budget'];
}
@ -71,14 +71,13 @@ switch (post('op')) {
$idreferente = post('idreferente');
$esclusioni = post('esclusioni');
$descrizione = post('descrizione');
$idtipointervento = post('idtipointervento');
// $ore_lavoro = post('ore_lavoro');
$costo_orario = post('costo_orario');
$costo_km = post('costo_km');
$costo_diritto_chiamata = post('costo_diritto_chiamata');
$query = 'UPDATE co_contratti SET idanagrafica='.prepare($idanagrafica).', idsede='.prepare($idsede).', idstato='.prepare($idstato).', nome='.prepare($nome).', idagente='.prepare($idagente).', idpagamento='.prepare($idpagamento).', numero='.prepare($numero).', budget='.prepare($budget).', idreferente='.prepare($idreferente).', validita='.prepare($validita).', data_bozza='.prepare($data_bozza).', data_accettazione='.prepare($data_accettazione).', data_rifiuto='.prepare($data_rifiuto).', data_conclusione='.prepare($data_conclusione).', rinnovabile='.prepare($rinnovabile).', giorni_preavviso_rinnovo='.prepare($giorni_preavviso_rinnovo).', esclusioni='.prepare($esclusioni).', descrizione='.prepare($descrizione).', idtipointervento='.prepare($idtipointervento).'WHERE id='.prepare($id_record);
$query = 'UPDATE co_contratti SET idanagrafica='.prepare($idanagrafica).', idsede='.prepare($idsede).', idstato='.prepare($idstato).', nome='.prepare($nome).', idagente='.prepare($idagente).', idpagamento='.prepare($idpagamento).', numero='.prepare($numero).', budget='.prepare($budget).', idreferente='.prepare($idreferente).', validita='.prepare($validita).', data_bozza='.prepare($data_bozza).', data_accettazione='.prepare($data_accettazione).', data_rifiuto='.prepare($data_rifiuto).', data_conclusione='.prepare($data_conclusione).', rinnovabile='.prepare($rinnovabile).', giorni_preavviso_rinnovo='.prepare($giorni_preavviso_rinnovo).', esclusioni='.prepare($esclusioni).', descrizione='.prepare($descrizione).' WHERE id='.prepare($id_record);
// costo_diritto_chiamata='.prepare($costo_diritto_chiamata).', ore_lavoro='.prepare($ore_lavoro).', costo_orario='.prepare($costo_orario).', costo_km='.prepare($costo_km).'
$dbo->query($query);
@ -94,7 +93,7 @@ switch (post('op')) {
aggiorna_sconto([
'parent' => 'co_contratti',
'row' => 'co_righe2_contratti',
'row' => 'co_righe_contratti',
], [
'parent' => 'id',
'row' => 'idcontratto',
@ -161,7 +160,7 @@ switch (post('op')) {
$iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile'];
$desc_iva = $rs2[0]['descrizione'];
$dbo->query('INSERT INTO co_righe2_contratti(idcontratto, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, um, qta, sconto, sconto_unitario, tipo_sconto, is_descrizione, `order`) VALUES ('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($um).', '.prepare($qta).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe2_contratti AS t WHERE idcontratto='.prepare($id_record).'))');
$dbo->query('INSERT INTO co_righe_contratti(idcontratto, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, um, qta, sconto, sconto_unitario, tipo_sconto, is_descrizione, `order`) VALUES ('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($um).', '.prepare($qta).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_contratti AS t WHERE idcontratto='.prepare($id_record).'))');
// Messaggi informativi
if (!empty($idarticolo)) {
@ -177,7 +176,7 @@ switch (post('op')) {
case 'editriga':
$idriga = post('idriga');
$rs = $dbo->fetchArray("SELECT * FROM co_righe2_contratti WHERE id='".$idriga."'");
$rs = $dbo->fetchArray("SELECT * FROM co_righe_contratti WHERE id='".$idriga."'");
$is_descrizione = $rs[0]['is_descrizione'];
$idarticolo = post('idarticolo');
@ -205,9 +204,9 @@ switch (post('op')) {
// Modifica riga generica sul documento
if ($is_descrizione == 0) {
$query = 'UPDATE co_righe2_contratti SET idarticolo='.prepare($idarticolo).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', 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);
$query = 'UPDATE co_righe_contratti SET idarticolo='.prepare($idarticolo).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', 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 {
$query = 'UPDATE co_righe2_contratti SET descrizione='.prepare($descrizione).' WHERE id='.prepare($idriga);
$query = 'UPDATE co_righe_contratti SET descrizione='.prepare($descrizione).' WHERE id='.prepare($idriga);
}
$dbo->query($query);
@ -220,7 +219,7 @@ switch (post('op')) {
if (isset($post['idriga'])) {
$idriga = post('idriga');
$query = 'DELETE FROM `co_righe2_contratti` WHERE idcontratto='.prepare($id_record).' AND id='.prepare($idriga);
$query = 'DELETE FROM `co_righe_contratti` WHERE idcontratto='.prepare($id_record).' AND id='.prepare($idriga);
if ($dbo->query($query)) {
$_SESSION['infos'][] = tr('Riga eliminata!');
@ -228,7 +227,7 @@ switch (post('op')) {
}
// Ricalcolo il budget
$dbo->query('UPDATE co_contratti SET budget=( SELECT SUM(subtotale) FROM co_righe2_contratti GROUP BY idcontratto HAVING idcontratto=co_contratti.id ) WHERE id='.prepare($id_record));
$dbo->query('UPDATE co_contratti SET budget=( SELECT SUM(subtotale) FROM co_righe_contratti GROUP BY idcontratto HAVING idcontratto=co_contratti.id ) WHERE id='.prepare($id_record));
break;
@ -238,7 +237,7 @@ switch (post('op')) {
$idcontratto = $get['idcontratto'];
$idintervento = $get['idintervento'];
$query = 'DELETE FROM `co_righe_contratti` WHERE idcontratto='.prepare($idcontratto).' AND idintervento='.prepare($idintervento);
$query = 'DELETE FROM `co_contratti_promemoria` WHERE idcontratto='.prepare($idcontratto).' AND idintervento='.prepare($idintervento);
$dbo->query($query);
$_SESSION['infos'][] = tr('Intervento _NUM_ rimosso!', [
@ -253,11 +252,11 @@ switch (post('op')) {
$id = filter('id');
if ($start > $end) {
$dbo->query('UPDATE `co_righe2_contratti` SET `order`=`order` + 1 WHERE `order`>='.prepare($end).' AND `order`<'.prepare($start).' AND `idcontratto`='.prepare($id_record));
$dbo->query('UPDATE `co_righe2_contratti` SET `order`='.prepare($end).' WHERE id='.prepare($id));
$dbo->query('UPDATE `co_righe_contratti` SET `order`=`order` + 1 WHERE `order`>='.prepare($end).' AND `order`<'.prepare($start).' AND `idcontratto`='.prepare($id_record));
$dbo->query('UPDATE `co_righe_contratti` SET `order`='.prepare($end).' WHERE id='.prepare($id));
} elseif ($end != $start) {
$dbo->query('UPDATE `co_righe2_contratti` SET `order`=`order` - 1 WHERE `order`>'.prepare($start).' AND `order`<='.prepare($end).' AND `idcontratto`='.prepare($id_record));
$dbo->query('UPDATE `co_righe2_contratti` SET `order`='.prepare($end).' WHERE id='.prepare($id));
$dbo->query('UPDATE `co_righe_contratti` SET `order`=`order` - 1 WHERE `order`>'.prepare($start).' AND `order`<='.prepare($end).' AND `idcontratto`='.prepare($id_record));
$dbo->query('UPDATE `co_righe_contratti` SET `order`='.prepare($end).' WHERE id='.prepare($id));
}
break;
@ -265,8 +264,8 @@ switch (post('op')) {
// eliminazione contratto
case 'delete':
$dbo->query('DELETE FROM co_contratti WHERE id='.prepare($id_record));
$dbo->query('DELETE FROM co_contratti_promemoria WHERE idcontratto='.prepare($id_record));
$dbo->query('DELETE FROM co_righe_contratti WHERE idcontratto='.prepare($id_record));
$dbo->query('DELETE FROM co_righe2_contratti WHERE idcontratto='.prepare($id_record));
$_SESSION['infos'][] = tr('Contratto eliminato!');
@ -290,16 +289,16 @@ switch (get('op')) {
$rs2 = $dbo->fetchArray('SELECT MAX(CAST(numero AS UNSIGNED)) AS maxn FROM co_contratti');
$numero = $rs2[0]['maxn'] + 1;
if ($dbo->query('INSERT INTO co_contratti(numero, nome, idagente, data_bozza, data_accettazione, data_rifiuto, data_conclusione, rinnovabile, giorni_preavviso_rinnovo, budget, descrizione, idstato, idreferente, validita, esclusioni, idanagrafica, idpagamento, idtipointervento, costo_diritto_chiamata, ore_lavoro, costo_orario, costo_km, idcontratto_prev) VALUES('.prepare($numero).', '.prepare($rs[0]['nome']).', '.prepare($rs[0]['idagente']).', NOW(), '.prepare(date('Y-m-d', strtotime($rs[0]['data_conclusione'].' +1 day'))).', "", '.prepare(date('Y-m-d', strtotime($rs[0]['data_conclusione'].' +'.$giorni_add.' day'))).', '.prepare($rs[0]['rinnovabile']).', '.prepare($rs[0]['giorni_preavviso_rinnovo']).', '.prepare($rs[0]['budget']).', '.prepare($rs[0]['descrizione']).', '.prepare($rs[0]['idstato']).', '.prepare($rs[0]['idreferente']).', '.prepare($rs[0]['validita']).', '.prepare($rs[0]['esclusioni']).', '.prepare($rs[0]['idanagrafica']).', '.prepare($rs[0]['idpagamento']).', '.prepare($rs[0]['idintervento']).', '.prepare($rs[0]['costo_diritto_chiamata']).', '.prepare($rs[0]['ore_lavoro']).', '.prepare($rs[0]['costo_orario']).', '.prepare($rs[0]['costo_km']).', '.prepare($id_record).')')) {
if ($dbo->query('INSERT INTO co_contratti(numero, nome, idagente, data_bozza, data_accettazione, data_rifiuto, data_conclusione, rinnovabile, giorni_preavviso_rinnovo, budget, descrizione, idstato, idreferente, validita, esclusioni, idanagrafica, idpagamento, costo_diritto_chiamata, ore_lavoro, costo_orario, costo_km, idcontratto_prev) VALUES('.prepare($numero).', '.prepare($rs[0]['nome']).', '.prepare($rs[0]['idagente']).', NOW(), '.prepare(date('Y-m-d', strtotime($rs[0]['data_conclusione'].' +1 day'))).', "", '.prepare(date('Y-m-d', strtotime($rs[0]['data_conclusione'].' +'.$giorni_add.' day'))).', '.prepare($rs[0]['rinnovabile']).', '.prepare($rs[0]['giorni_preavviso_rinnovo']).', '.prepare($rs[0]['budget']).', '.prepare($rs[0]['descrizione']).', '.prepare($rs[0]['idstato']).', '.prepare($rs[0]['idreferente']).', '.prepare($rs[0]['validita']).', '.prepare($rs[0]['esclusioni']).', '.prepare($rs[0]['idanagrafica']).', '.prepare($rs[0]['idpagamento']).', '.prepare($rs[0]['costo_diritto_chiamata']).', '.prepare($rs[0]['ore_lavoro']).', '.prepare($rs[0]['costo_orario']).', '.prepare($rs[0]['costo_km']).', '.prepare($id_record).')')) {
$new_idcontratto = $dbo->lastInsertedID();
$dbo->query('INSERT INTO co_contratti_tipiintervento(idcontratto, idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico) SELECT '.prepare($new_idcontratto).', idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico FROM co_contratti_tipiintervento AS z WHERE idcontratto='.prepare($id_record));
// Replico le righe del contratto
$rs = $dbo->fetchArray('SELECT * FROM co_righe2_contratti WHERE idcontratto='.prepare($id_record));
$rs = $dbo->fetchArray('SELECT * FROM co_righe_contratti WHERE idcontratto='.prepare($id_record));
for ($i = 0; $i < sizeof($rs); ++$i) {
$dbo->query('INSERT INTO co_righe2_contratti(idcontratto, descrizione, subtotale, um, qta) VALUES('.prepare($new_idcontratto).', '.prepare($rs[$i]['descrizione']).', '.prepare($rs[$i]['subtotale']).', '.prepare($rs[$i]['um']).', '.prepare($rs[$i]['qta']).')');
$dbo->query('INSERT INTO co_righe_contratti(idcontratto, descrizione, subtotale, um, qta) VALUES('.prepare($new_idcontratto).', '.prepare($rs[$i]['descrizione']).', '.prepare($rs[$i]['subtotale']).', '.prepare($rs[$i]['um']).', '.prepare($rs[$i]['qta']).')');
}
// Replicazione degli impianti
@ -320,7 +319,7 @@ switch (get('op')) {
if (post('op') !== null && post('op') != 'update') {
aggiorna_sconto([
'parent' => 'co_contratti',
'row' => 'co_righe2_contratti',
'row' => 'co_righe_contratti',
], [
'parent' => 'id',
'row' => 'idcontratto',

View File

@ -2,17 +2,19 @@
include_once __DIR__.'/../../core.php';
$id_anagrafica = !empty(get('idanagrafica')) ? get('idanagrafica') : $user['idanagrafica'];
?><form action="" method="post" id="add-form">
<input type="hidden" name="op" value="add">
<input type="hidden" name="backto" value="record-edit">
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1, "value": "" ]}
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1 ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Cliente'); ?>", "name": "idanagrafica", "required": 1, "value": "<?php echo $idanagrafica; ?>", "ajax-source": "clienti" ]}
{[ "type": "select", "label": "<?php echo tr('Cliente'); ?>", "name": "idanagrafica", "required": 1, "value": "<?php echo $id_anagrafica; ?>", "ajax-source": "clienti" ]}
</div>
</div>

View File

@ -4,18 +4,27 @@ include_once __DIR__.'/../../../core.php';
switch ($resource) {
case 'contratti':
$query = 'SELECT co_contratti.id AS id, CONCAT(numero, " ", nome) AS descrizione FROM co_contratti INNER JOIN an_anagrafiche ON co_contratti.idanagrafica=an_anagrafiche.idanagrafica |where| ORDER BY id';
$query = 'SELECT co_contratti.id AS id, CONCAT("Contratto ", numero, " del ", DATE_FORMAT(data_bozza, "%d/%m/%Y"), " - ", nome, " [", (SELECT `descrizione` FROM `co_staticontratti` WHERE `co_staticontratti`.`id` = `idstato`) , "]") AS descrizione, (SELECT SUM(subtotale) FROM co_righe_contratti WHERE idcontratto=co_contratti.id) AS totale, (SELECT SUM(sconto) FROM co_righe_contratti WHERE idcontratto=co_contratti.id) AS sconto FROM co_contratti INNER JOIN an_anagrafiche ON co_contratti.idanagrafica=an_anagrafiche.idanagrafica |where| ORDER BY id';
foreach ($elements as $element) {
$filter[] = 'id='.prepare($element);
}
$where[] = 'an_anagrafiche.idanagrafica='.prepare($superselect['idanagrafica']);
$where[] = 'idstato IN (SELECT `id` FROM co_staticontratti WHERE pianificabile = 1)';
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'pianificabile';
$where[] = 'idstato IN (SELECT `id` FROM co_staticontratti WHERE '.$stato.' = 1)';
if (!empty($superselect['non_fatturato'])) {
$where[] = 'id NOT IN (SELECT idcontratto FROM co_righe_documenti WHERE idcontratto IS NOT NULL)';
}
if (!empty($search)) {
$search_fields[] = 'nome LIKE '.prepare('%'.$search.'%');
}
$custom['totale'] = 'totale';
$custom['sconto'] = 'sconto';
break;
}

View File

@ -2,13 +2,13 @@
include_once __DIR__.'/../../core.php';
$rs_documento = $dbo->fetchArray("SELECT * FROM co_righe_documenti WHERE idcontratto=".prepare($id_record));
if(sizeof($rs_documento)>0){
echo "
<button type=\"button\" class=\"btn btn-info\" disabled>
<i class=\"fa fa-magic\"></i> ".tr('Crea fattura').'...
$rs_documento = $dbo->fetchArray('SELECT * FROM co_righe_documenti WHERE idcontratto='.prepare($id_record));
if (sizeof($rs_documento) > 0) {
echo '
<button type="button" class="btn btn-info" disabled>
<i class="fa fa-magic"></i> '.tr('Crea fattura').'...
</button>';
}else{
} else {
echo "
<button type=\"button\" class=\"btn btn-info\" onclick=\"if( confirm('Creare una fattura per questo contratto?') ){fattura_da_contratto();}\">
<i class=\"fa fa-magic\"></i> ".tr('Crea fattura').'...

View File

@ -31,9 +31,9 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
{[ "type": "select", "label": "<?php echo tr('Cliente'); ?>", "name": "idanagrafica", "id": "idanagrafica_c", "required": 1, "value": "$idanagrafica$", "ajax-source": "clienti" ]}
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Sede'); ?>", "name": "idsede", "values": "query=SELECT 0 AS id, 'Sede legale' AS descrizione UNION SELECT id, CONCAT_WS( ' - ', nomesede, citta ) AS descrizione FROM an_sedi WHERE idanagrafica='$idanagrafica$'", "value": "$idsede$", "ajax-source": "sedi", "extra": "<?php echo $readonly; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Sede'); ?>", "name": "idsede", "values": "query=SELECT 0 AS id, 'Sede legale' AS descrizione UNION SELECT id, CONCAT_WS( ' - ', nomesede, citta ) AS descrizione FROM an_sedi WHERE idanagrafica='$idanagrafica$'", "value": "$idsede$", "ajax-source": "sedi" ]}
</div>
<div class="col-md-3">
@ -50,7 +50,7 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Referente'); ?>", "name": "idreferente", "value": "$idreferente$", "ajax-source": "referenti" ]}
</div>
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1, "value": "$nome$" ]}
</div>
@ -68,7 +68,7 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
<div class="col-md-2">
{[ "type": "number", "label": "<?php echo tr('Preavviso per rinnovo'); ?>", "name": "giorni_preavviso_rinnovo", "decimals": "0", "value": "$giorni_preavviso_rinnovo$", "icon-after": "giorni" ]}
</div>
<div class="col-md-2">
{[ "type": "date", "label": "<?php echo tr('Data bozza'); ?>", "maxlength": 10, "name": "data_bozza", "value": "$data_bozza$" ]}
</div>
@ -96,7 +96,7 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
</div>
<div class="col-md-3">
{[ "type": "select", "multiple": "1", "label": "<?php echo tr('Impianti'); ?>", "name": "matricolaimpianto[]", "values": "query=SELECT idanagrafica, id AS id, nome AS descrizione FROM my_impianti WHERE idanagrafica='$idanagrafica$' ORDER BY descrizione", "value": "$matricoleimpianti$" ]}
{[ "type": "select", "multiple": "1", "label": "<?php echo tr('Impianti'); ?>", "name": "matricolaimpianto[]", "values": "query=SELECT idanagrafica, id AS id, IF(nome = '', matricola, CONCAT(matricola, ' - ', nome)) AS descrizione FROM my_impianti WHERE idanagrafica='$idanagrafica$' ORDER BY descrizione", "value": "$matricoleimpianti$" ]}
</div>
</div>
@ -342,7 +342,7 @@ if (!empty($records[0]['idcontratto_prev'])) {
}
?>
<form action='<?=$rootdir?>/editor.php?id_module=<?=Modules::get('Fatture di vendita')['id']?>' method='post' id='form_creafattura'>
<form action='<?php echo $rootdir; ?>/editor.php?id_module=<?php echo Modules::get('Fatture di vendita')['id']; ?>' method='post' id='form_creafattura'>
<input type="hidden" name="backto" value="record-edit">
<input type='hidden' name='op' value='fattura_da_contratto'>
<input type="hidden" name="id_record" value="<?php echo $id_record; ?>">
@ -370,11 +370,11 @@ if (!empty($records[0]['idcontratto_prev'])) {
$("#data_accettazione").trigger("dp.change");
$("#data_rifiuto").trigger("dp.change");
});
function fattura_da_contratto(){
$('#form_creafattura').submit();
}
$('#idanagrafica_c').change( function(){
session_set('superselect,idanagrafica', $(this).val(), 0);
@ -418,7 +418,7 @@ if (!empty($fatture)) {
?>
{( "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; ?>", "ajax": "true" )}
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> <?php echo tr('Elimina'); ?>

View File

@ -1,137 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
/**
* Questa funzione rimuove un articolo dal ddt data e lo riporta in magazzino
* $idarticolo integer codice dell'articolo da scollegare dall'ordine
* $idordine integer codice dell'ordine da cui scollegare l'articolo.
*/
function rimuovi_articolo_dapreventivo($idarticolo, $idpreventivo, $idriga)
{
global $dbo;
global $dir;
// Leggo la quantità di questo articolo nell'ordine
$query = 'SELECT qta, subtotale FROM co_righe_preventivi WHERE id='.prepare($idriga);
$rs = $dbo->fetchArray($query);
$qta = floatval($rs[0]['qta']);
$subtotale = $rs[0]['subtotale'];
// Elimino la riga dall'ordine
$dbo->query('DELETE FROM co_righe_preventivi WHERE id='.prepare($idriga));
}
/**
* Ricalcola i costi aggiuntivi in ordine (rivalsa inps, ritenuta d'acconto, marca da bollo)
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
* $idordine int ID del ordine
* $idrivalsainps int ID della rivalsa inps da applicare. Se omesso viene utilizzata quella impostata di default
* $idritenutaacconto int ID della ritenuta d'acconto da applicare. Se omesso viene utilizzata quella impostata di default
* $bolli float Costi aggiuntivi delle marche da bollo. Se omesso verrà usata la cifra predefinita.
*/
function ricalcola_costiagg_preventivo($idpreventivo, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
{
global $dbo;
global $dir;
// Se ci sono righe nel ordine faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
$query = 'SELECT COUNT(id) AS righe FROM co_righe_preventivi WHERE idpreventivo='.prepare($idpreventivo);
$rs = $dbo->fetchArray($query);
if ($rs[0]['righe'] > 0) {
$totale_imponibile = get_imponibile_preventivo($idpreventivo);
$totale_preventivo = get_totale_preventivo($idpreventivo);
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
if ($dir == 'entrata') {
if (!empty($idrivalsainps)) {
$idrivalsainps = get_var('Percentuale rivalsa INPS');
}
}
$query = 'SELECT percentuale FROM co_rivalsainps WHERE id='.prepare($idrivalsainps);
$rs = $dbo->fetchArray($query);
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
// Aggiorno la rivalsa inps
// $dbo->query("UPDATE or_ordini SET rivalsainps='$rivalsainps' WHERE id='$idordine'");
// Leggo la ritenuta d'acconto se c'è
$totale_ordine = get_totale_ordine($idordine);
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
if (!empty($idritenutaacconto)) {
if ($dir == 'entrata') {
$idritenutaacconto = get_var("Percentuale ritenuta d'acconto");
}
}
$query = 'SELECT percentuale FROM co_ritenutaacconto WHERE id='.prepare($idritenutaacconto);
$rs = $dbo->fetchArray($query);
$ritenutaacconto = $totale_preventivo / 100 * $rs[0]['percentuale'];
$netto_a_pagare = $totale_preventivo - $ritenutaacconto;
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
$bolli = str_replace(',', '.', $bolli);
$bolli = floatval($bolli);
if ($dir == 'uscita') {
} else {
$bolli = str_replace(',', '.', get_var('Importo marca da bollo'));
if (abs($bolli) > 0 && abs($netto_a_pagare) > abs(get_var("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = str_replace(',', '.', $bolli);
} else {
$marca_da_bollo = 0.00;
}
// Se l'importo è negativo può essere una nota di accredito, quindi cambio segno alla marca da bollo
if ($netto_a_pagare < 0) {
$marca_da_bollo *= -1;
}
}
// $dbo->query("UPDATE or_ordini SET ritenutaacconto='$ritenutaacconto', bollo='$marca_da_bollo' WHERE id='$idordine'");
} else {
// $dbo->query("UPDATE or_ordini SET ritenutaacconto='0', bollo='0', sconto='0', rivalsainps='0' WHERE id='$idordine'");
}
}
/**
* Restituisce lo stato dell'ordine in base alle righe.
*/
function get_stato_preventivo($idpreventivo)
{
global $dbo;
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM co_righe_preventivi GROUP BY idpreventivo HAVING idpreventivo='.prepare($idpreventivo));
if ($rs[0]['qta_evasa'] > 0) {
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
return 'Parzialmente evaso';
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
return 'Evaso';
}
} else {
return 'Non evaso';
}
}
/**
* Aggiorna il budget del preventivo leggendo tutte le righe inserite.
*
* @deprecated 2.3
*/
function update_budget_preventivo($idpreventivo)
{
global $dbo;
// Totale articoli
$rs = $dbo->fetchArray('SELECT SUM(subtotale) AS totale FROM co_righe_preventivi GROUP BY idpreventivo HAVING idpreventivo='.prepare($idpreventivo));
$totale_articoli = $rs[0]['totale'];
// Totale costo ore, km e diritto di chiamata
$rs = $dbo->fetchArray('SELECT SUM(costo_orario*ore_lavoro + costo_diritto_chiamata) AS totale FROM co_preventivi GROUP BY id HAVING id='.prepare($idpreventivo));
$totale_lavoro = $rs[0]['totale'];
// Aggiorno il budget su co_preventivi
$dbo->query('UPDATE co_preventivi SET budget='.prepare($totale_articoli + $totale_lavoro).' WHERE id='.prepare($idpreventivo));
}

View File

@ -0,0 +1,194 @@
<?php
include_once __DIR__.'/../../../core.php';
include_once Modules::filepath('Fatture di vendita', 'modutil.php');
switch (post('op')) {
/*
GESTIONE ARTICOLI
*/
case 'editarticolo':
$idriga = post('idriga');
$idarticolo = post('idarticolo');
$idimpianto = post('idimpianto');
//$idautomezzo = post('idautomezzo');
//$idarticolo_originale = post('idarticolo_originale');
// Leggo la quantità attuale nell'intervento
$q = 'SELECT qta, idautomezzo, idimpianto FROM co_righe_contratti_articoli WHERE id='.prepare($idriga);
$rs = $dbo->fetchArray($q);
$old_qta = $rs[0]['qta'];
$idimpianto = $rs[0]['idimpianto'];
//$idautomezzo = $rs[0]['idautomezzo'];
//$serials = array_column($dbo->select('mg_prodotti', 'serial', ['id_riga_intervento' => $idriga]), 'serial');
//add_movimento_magazzino($idarticolo_originale, $old_qta, ['idautomezzo' => $idautomezzo, 'idintervento' => $id_record]);
// Elimino questo articolo dall'intervento
$dbo->query('DELETE FROM co_righe_contratti_articoli WHERE id='.prepare($idriga));
// Elimino il collegamento al componente
//$dbo->query('DELETE FROM my_impianto_componenti WHERE idimpianto='.prepare($idimpianto).' AND idintervento='.prepare($id_record));
/* Ricollego l'articolo modificato all'intervento */
/* ci può essere il caso in cui cambio idarticolo e anche qta */
//no break;
case 'addarticolo':
$idarticolo = post('idarticolo');
//$idautomezzo = post('idautomezzo');
$descrizione = post('descrizione');
$idimpianto = post('idimpianto');
$qta = post('qta');
$um = post('um');
$prezzo_vendita = post('prezzo_vendita');
$idiva = post('idiva');
$sconto_unitario = $post['sconto'];
$tipo_sconto = $post['tipo_sconto'];
$sconto = ($tipo_sconto == 'PRC') ? ($prezzo_vendita * $sconto_unitario) / 100 : $sconto_unitario;
$sconto = $sconto * $qta;
$idcontratto_riga = $post['idcontratto_riga'];
// Decremento la quantità
//add_movimento_magazzino($idarticolo, -$qta, ['idautomezzo' => $idautomezzo, 'idintervento' => $id_record]);
// Aggiorno l'automezzo dell'intervento
//$dbo->query('UPDATE in_interventi SET idautomezzo='.prepare($idautomezzo).' WHERE id='.prepare($id_record).' '.Modules::getAdditionalsQuery($id_module));
//$rsart = $dbo->fetchArray('SELECT abilita_serial, prezzo_acquisto FROM mg_articoli WHERE id='.prepare($idarticolo));
//$prezzo_acquisto = $rsart[0]['prezzo_acquisto'];
//Calcolo iva
$rs_iva = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare($idiva));
$desc_iva = $rs_iva[0]['descrizione'];
$iva = (($prezzo_vendita * $qta) - $sconto) * $rs_iva[0]['percentuale'] / 100;
// Aggiunto il collegamento fra l'articolo e l'intervento
$idriga = $dbo->query('INSERT INTO co_righe_contratti_articoli(idarticolo, id_riga_contratto, idimpianto, idautomezzo, descrizione, prezzo_vendita, prezzo_acquisto, sconto, sconto_unitario, tipo_sconto, idiva, desc_iva, iva, qta, um, abilita_serial) VALUES ('.prepare($idarticolo).', '.prepare($idcontratto_riga).', '.(empty($idimpianto) ? 'NULL' : prepare($idimpianto)).', '.prepare($idautomezzo).', '.prepare($descrizione).', '.prepare($prezzo_vendita).', '.prepare($prezzo_acquisto).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($qta).', '.prepare($um).', '.prepare($rsart[0]['abilita_serial']).')');
/*if (!empty($serials)) {
if ($old_qta > $qta) {
$serials = array_slice($serials, 0, $qta);
}
$dbo->sync('mg_prodotti', ['id_riga_intervento' => $idriga, 'dir' => 'entrata', 'id_articolo' => $idarticolo], ['serial' => $serials]);
}*/
//link_componente_to_articolo($id_record, $idimpianto, $idarticolo, $qta);
break;
case 'unlink_articolo':
$idriga = post('idriga');
//$idarticolo = post('idarticolo');
$dbo->query('DELETE FROM co_righe_contratti_articoli WHERE id='.prepare($idriga).' '.Modules::getAdditionalsQuery($id_module));
// Riporto la merce nel magazzino
if (!empty($idriga) && !empty($id_record)) {
// Leggo la quantità attuale nell'intervento
//$q = 'SELECT qta, idautomezzo, idarticolo, idimpianto FROM co_righe_contratti_articoli WHERE id='.prepare($idriga);
//$rs = $dbo->fetchArray($q);
//$qta = $rs[0]['qta'];
//$idarticolo = $rs[0]['idarticolo'];
//$idimpianto = $rs[0]['idimpianto'];
//$idautomezzo = $rs[0]['idautomezzo'];
// add_movimento_magazzino($idarticolo, $qta, ['idautomezzo' => $idautomezzo, 'idintervento' => $id_record]);
// Elimino questo articolo dall'intervento
//$dbo->query('DELETE FROM mg_articoli_interventi WHERE id='.prepare($idriga).' AND idintervento='.prepare($id_record));
// Elimino il collegamento al componente
//$dbo->query('DELETE FROM my_impianto_componenti WHERE idimpianto='.prepare($idimpianto).' AND idintervento='.prepare($id_record));
// Elimino i seriali utilizzati dalla riga
//$dbo->query('DELETE FROM `mg_prodotti` WHERE id_articolo = '.prepare($idarticolo).' AND id_riga_intervento = '.prepare($id_record));
}
break;
/*
Gestione righe generiche
*/
case 'addriga':
$descrizione = post('descrizione');
$qta = post('qta');
$um = post('um');
$idiva = post('idiva');
$prezzo_vendita = post('prezzo_vendita');
$prezzo_acquisto = post('prezzo_acquisto');
$sconto_unitario = $post['sconto'];
$tipo_sconto = $post['tipo_sconto'];
$sconto = ($tipo_sconto == 'PRC') ? ($prezzo_vendita * $sconto_unitario) / 100 : $sconto_unitario;
$sconto = $sconto * $qta;
//Calcolo iva
$rs_iva = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare($idiva));
$desc_iva = $rs_iva[0]['descrizione'];
$iva = (($prezzo_vendita * $qta) - $sconto) * $rs_iva[0]['percentuale'] / 100;
$idcontratto_riga = $post['idcontratto_riga'];
$dbo->query('INSERT INTO co_righe_contratti_materiali(descrizione, qta, um, prezzo_vendita, prezzo_acquisto, idiva, desc_iva, iva, sconto, sconto_unitario, tipo_sconto, id_riga_contratto) VALUES ('.prepare($descrizione).', '.prepare($qta).', '.prepare($um).', '.prepare($prezzo_vendita).', '.prepare($prezzo_acquisto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($idcontratto_riga).')');
break;
case 'editriga':
$idriga = post('idriga');
$descrizione = post('descrizione');
$qta = post('qta');
$um = post('um');
$idiva = post('idiva');
$prezzo_vendita = post('prezzo_vendita');
$prezzo_acquisto = post('prezzo_acquisto');
$sconto_unitario = $post['sconto'];
$tipo_sconto = $post['tipo_sconto'];
$sconto = ($tipo_sconto == 'PRC') ? ($prezzo_vendita * $sconto_unitario) / 100 : $sconto_unitario;
$sconto = $sconto * $qta;
//Calcolo iva
$rs_iva = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare($idiva));
$desc_iva = $rs_iva[0]['descrizione'];
$iva = (($prezzo_vendita * $qta) - $sconto) * $rs_iva[0]['percentuale'] / 100;
$dbo->query('UPDATE co_righe_contratti_materiali SET '.
' descrizione='.prepare($descrizione).','.
' qta='.prepare($qta).','.
' um='.prepare($um).','.
' prezzo_vendita='.prepare($prezzo_vendita).','.
' prezzo_acquisto='.prepare($prezzo_acquisto).','.
' idiva='.prepare($idiva).','.
' desc_iva='.prepare($desc_iva).','.
' iva='.prepare($iva).','.
' sconto='.prepare($sconto).','.
' sconto_unitario='.prepare($sconto_unitario).','.
' tipo_sconto='.prepare($tipo_sconto).
' WHERE id='.prepare($idriga));
break;
case 'delriga':
$idriga = post('idriga');
$dbo->query('DELETE FROM co_righe_contratti_materiali WHERE id='.prepare($idriga).' '.Modules::getAdditionalsQuery($id_module));
break;
}

View File

@ -0,0 +1,222 @@
<?php
include_once __DIR__.'/../../../core.php';
// Prezzo modificabile solo se l'utente loggato è un tecnico (+ può vedere i prezzi) o se è amministratore
$rs = $dbo->fetchArray('SELECT nome FROM zz_groups WHERE id IN(SELECT idgruppo FROM zz_users WHERE id='.prepare($_SESSION['id_utente']).')');
for ($i = 0; $i < count($rs); ++$i) {
$gruppi[$i] = $rs[$i]['nome'];
}
//$can_edit_prezzi = (in_array('Amministratori', $gruppi)) || (get_var('Mostra i prezzi al tecnico') == 1 && (in_array('Tecnici', $gruppi)));
$idriga = get('idriga');
//$idautomezzo = (get('idautomezzo') == 'undefined') ? '' : get('idautomezzo');
// Lettura idanagrafica cliente e percentuale di sconto/rincaro in base al listino
$rs = $dbo->fetchArray('SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record));
$idanagrafica = $rs[0]['idanagrafica'];
if (empty($idriga)) {
$op = 'addarticolo';
$button = '<i class="fa fa-plus"></i> '.tr('Aggiungi');
// valori default
$idarticolo = '';
$descrizione = '';
$qta = 1;
$um = '';
$prezzo_vendita = '0';
$sconto_unitario = 0;
$idimpianto = 0;
$listino = $dbo->fetchArray('SELECT prc_guadagno FROM mg_listini WHERE id = (SELECT idlistino_vendite FROM an_anagrafiche WHERE idanagrafica = '.prepare($idanagrafica).')');
if (!empty($listino[0]['prc_guadagno'])) {
$sconto_unitario = $listino[0]['prc_guadagno'];
$tipo_sconto = 'PRC';
}
(empty($idcontratto_riga)) ? $idcontratto_riga = $dbo->fetchArray('SELECT MAX(id) AS max_idcontratto_riga FROM `co_contratti_promemoria`')[0]['max_idcontratto_riga'] : '';
} else {
$op = 'editarticolo';
$button = '<i class="fa fa-edit"></i> '.tr('Modifica');
// carico record da modificare
$q = "SELECT *, (SELECT codice FROM mg_articoli WHERE id=co_righe_contratti_articoli.idarticolo) AS codice_articolo, (SELECT CONCAT(codice, ' - ', descrizione) FROM mg_articoli WHERE id=co_righe_contratti_articoli.idarticolo) AS descrizione_articolo FROM co_righe_contratti_articoli WHERE id=".prepare($idriga);
$rsr = $dbo->fetchArray($q);
$idarticolo = $rsr[0]['idarticolo'];
$codice_articolo = $rsr[0]['codice_articolo'];
$descrizione = $rsr[0]['descrizione'];
$qta = $rsr[0]['qta'];
$um = $rsr[0]['um'];
$idiva = $rsr[0]['idiva'];
$prezzo_vendita = $rsr[0]['prezzo_vendita'];
$sconto_unitario = $rsr[0]['sconto_unitario'];
$tipo_sconto = $rsr[0]['tipo_sconto'];
$idautomezzo = $rsr[0]['idautomezzo'];
$idimpianto = $rsr[0]['idimpianto'];
$idcontratto_riga = $rsr[0]['id_riga_contratto'];
}
/*
Form di inserimento
*/
echo '
<form id="add-articoli" action="'.$rootdir.'/modules/contratti/plugins/actions.php" method="post">
<input type="hidden" name="op" value="'.$op.'">
<input type="hidden" name="idriga" value="'.$idriga.'">
<input type="hidden" name="idcontratto_riga" value="'.$idcontratto_riga.'">';
if (!empty($idarticolo)) {
echo '
<input type="hidden" id="idarticolo_originale" name="idarticolo_originale" value="'.$idarticolo.'">';
}
// Articolo
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "'.tr('Articolo').'", "name": "idarticolo", "required": 1, "value": "'.$idarticolo.'", "ajax-source": "articoli" ]}
</div>
</div>';
// Descrizione
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione", "id": "descrizione_articolo", "required": 1, "value": '.json_encode($descrizione).' ]}
</div>
</div>
<br>';
// Quantità
echo '
<div class="row">
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.$qta.'", "decimals": "qta" ]}
</div>';
// Unità di misura
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Unità di misura').'", "name": "um", "value": "'.$um.'", "ajax-source": "misure" ]}
</div>';
// Impianto
echo '
<div class="col-md-4">
{[ "type": "select", "multiple": "0", "label": "'.tr('Impianto').'", "name": "idimpianto", "values": "query=SELECT my_impianti.id AS id, my_impianti.nome AS descrizione FROM my_impianti_contratti INNER JOIN my_impianti ON my_impianti_contratti.idimpianto = my_impianti.id WHERE my_impianti_contratti.idcontratto = '.$id_record.' ORDER BY descrizione", "value": "'.$matricoleimpianti.'", "extra":"'.$readonly.'" ]}
</div>
</div>';
// Iva
echo '
<div class="row">
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Iva').'", "name": "idiva", "required": 1, "value": "'.$idiva.'", "values": "query=SELECT * FROM co_iva ORDER BY descrizione ASC" ]}
</div>';
// Prezzo di vendita
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Costo unitario').'", "name": "prezzo_vendita", "required": 1, "value": "'.$prezzo_vendita.'", "icon-after": "&euro;" ]}
</div>';
// Sconto
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Sconto unitario').'", "name": "sconto", "icon-after": "choice|untprc|'.$tipo_sconto.'", "value": "'.$sconto_unitario.'" ]}
</div>
</div>';
// Informazioni aggiuntive
/*echo '
<div class="row" id="prezzi_articolo">
<div class="col-md-4 text-center">
<button type="button" class="btn btn-sm btn-info btn-block disabled" onclick="$(\'#prezzi\').toggleClass(\'hide\'); $(\'#prezzi\').load(\''.$rootdir."/ajax_complete.php?module=Articoli&op=getprezzi&idarticolo=' + $('#idarticolo option:selected').val() + '&idanagrafica=".$idanagrafica.'\');" disabled>
<i class="fa fa-search"></i> '.tr('Visualizza ultimi prezzi (cliente)').'
</button>
<div id="prezzi" class="hide"></div>
</div>
<div class="col-md-4 text-center">
<button type="button" class="btn btn-sm btn-info btn-block disabled" onclick="$(\'#prezziacquisto\').toggleClass(\'hide\'); $(\'#prezziacquisto\').load(\''.$rootdir."/ajax_complete.php?module=Articoli&op=getprezziacquisto&idarticolo=' + $('#idarticolo option:selected').val() + '&idanagrafica=".$idanagrafica.'\');" disabled>
<i class="fa fa-search"></i> '.tr('Visualizza ultimi prezzi (acquisto)').'
</button>
<div id="prezziacquisto" class="hide"></div>
</div>
<div class="col-md-4 text-center">
<button type="button" class="btn btn-sm btn-info btn-block disabled" onclick="$(\'#prezzivendita\').toggleClass(\'hide\'); $(\'#prezzivendita\').load(\''.$rootdir."/ajax_complete.php?module=Articoli&op=getprezzivendita&idarticolo=' + $('#idarticolo option:selected').val() + '&idanagrafica=".$idanagrafica.'\');" disabled>
<i class="fa fa-search"></i> '.tr('Visualizza ultimi prezzi (vendita)').'
</button>
<div id="prezzivendita" class="hide"></div>
</div>
</div>
<br>';*/
echo '
<script>
$(document).ready(function () {
$("#idarticolo").on("change", function(){
$("#prezzi_articolo button").attr("disabled", !$(this).val());
if($(this).val()){
$("#prezzi_articolo button").removeClass("disabled");
session_set("superselect,idarticolo", $(this).val(), 0);
$data = $(this).selectData();
$("#prezzo_vendita").val($data.prezzo_vendita);
$("#descrizione_articolo").val($data.descrizione);
$("#idiva").selectSet($data.idiva_vendita, $data.iva_vendita);
$("#um").selectSetNew($data.um, $data.um);
}else{
$("#prezzi_articolo button").addClass("disabled");
}
$("#prezzi").html("");
$("#prezzivendita").html("");
$("#prezziacquisto").html("");
});
});
</script>';
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary pull-right">'.$button.'</button>
</div>
</div>
</form>';
echo '
<script src="'.$rootdir.'/lib/init.js"></script>';
?>
<script type="text/javascript">
$(document).ready(function() {
$('#add-articoli').ajaxForm({
success: function(){
$('#bs-popup2').modal('hide');
// Ricarico gli articoli
$('#articoli').load(globals.rootdir + '/modules/contratti/plugins/ajax_articoli.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>&idcontratto_riga=<?php echo $idcontratto_riga; ?>');
}
});
});
</script>

View File

@ -0,0 +1,135 @@
<?php
include_once __DIR__.'/../../../core.php';
$idriga = filter('idriga');
//Lettura idanagrafica cliente e percentuale di sconto/rincaro in base al listino
//$rs = $dbo->fetchArray('SELECT idanagrafica, (SELECT prc_guadagno FROM mg_listini WHERE id=(SELECT idlistino_vendite FROM an_anagrafiche WHERE idanagrafica=.in_interventi.idanagrafica)) AS prc_sconto FROM in_interventi WHERE id='.prepare($id_record));
//$idanagrafica = $rs[0]['idanagrafica'];
//$prc_sconto = $rs[0]['prc_sconto'];
if (empty($idriga)) {
$op = 'addriga';
$button = '<i class="fa fa-plus"></i> '.tr('Aggiungi');
// valori default
$descrizione = '';
$qta = 1;
$um = '';
$prezzo_vendita = '0';
$prezzo_acquisto = '0';
if (!empty($rs[0]['prc_guadagno'])) {
$sconto_unitario = $rs[0]['prc_guadagno'];
$tipo_sconto = 'PRC';
}
(empty($idcontratto_riga)) ? $idcontratto_riga = $dbo->fetchArray('SELECT MAX(id) AS max_idcontratto_riga FROM `co_contratti_promemoria`')[0]['max_idcontratto_riga'] : '';
} else {
$op = 'editriga';
$button = '<i class="fa fa-edit"></i> '.tr('Modifica');
// carico record da modificare
$q = 'SELECT * FROM co_righe_contratti_materiali WHERE id='.prepare($idriga);
$rsr = $dbo->fetchArray($q);
$descrizione = $rsr[0]['descrizione'];
$qta = $rsr[0]['qta'];
$um = $rsr[0]['um'];
$idiva = $rsr[0]['idiva'];
$prezzo_vendita = $rsr[0]['prezzo_vendita'];
$prezzo_acquisto = $rsr[0]['prezzo_acquisto'];
$idcontratto_riga = $rsr[0]['id_riga_contratto'];
$sconto_unitario = $rsr[0]['sconto_unitario'];
$tipo_sconto = $rsr[0]['tipo_sconto'];
}
/*
Form di inserimento
<form id="add-righe" action="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&idcontratto_riga='.$idcontratto_riga.'" method="post">
*/
echo '
<form id="add-righe" action="'.$rootdir.'/modules/contratti/plugins/actions.php" method="post">
<input type="hidden" name="op" value="'.$op.'">
<input type="hidden" name="idriga" value="'.$idriga.'">
<input type="hidden" name="idcontratto_riga" value="'.$idcontratto_riga.'">';
// Descrizione
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "id": "descrizione_riga", "name": "descrizione", "required": 1, "value": '.json_encode($descrizione).' ]}
</div>
</div>
<br>';
// Quantità
echo '
<div class="row">
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.$qta.'", "decimals": "qta" ]}
</div>';
// Unità di misura
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Unità di misura').'", "name": "um", "value": "'.$um.'", "ajax-source": "misure" ]}
</div>';
// Iva
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Iva').'", "name": "idiva", "required": 1, "value": "'.$idiva.'", "values": "query=SELECT * FROM co_iva ORDER BY descrizione ASC" ]}
</div>
</div>';
// Prezzo di acquisto
echo '
<div class="row">
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Prezzo di acquisto (un.)').'", "name": "prezzo_acquisto", "required": 1, "value": "'.$prezzo_acquisto.'", "icon-after": "&euro;" ]}
</div>';
// Prezzo di vendita
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Prezzo di vendita (un.)').'", "name": "prezzo_vendita", "required": 1, "value": "'.$prezzo_vendita.'", "icon-after": "&euro;" ]}
</div>';
// Sconto unitario
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Sconto unitario').'", "name": "sconto", "icon-after": "choice|untprc|'.$tipo_sconto.'", "value": "'.$sconto_unitario.'" ]}
</div>
</div>';
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary pull-right">'.$button.'</button>
</div>
</div>
</form>';
echo '
<script src="'.$rootdir.'/lib/init.js"></script>';
?>
<script type="text/javascript">
$(document).ready(function() {
$('#add-righe').ajaxForm({
success: function(){
$('#bs-popup2').modal('hide');
// Ricarico le righe
$('#righe').load(globals.rootdir + '/modules/contratti/plugins/ajax_righe.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>&idcontratto_riga=<?php echo $idcontratto_riga; ?>');
}
});
});
</script>

View File

@ -19,22 +19,29 @@ echo '
// Data
echo '
<div class="row">
<div class="col-md-6">
{[ "type": "date", "label": "'.tr('Data').'", "name": "data", "required": 1, "class": "text-center", "value": "-now-", "extra": "" ]}
<div class="col-md-4">
{[ "type": "date", "label": "'.tr('Data').'", "name": "data", "required": 1, "class": "text-center", "value": "-now-" ]}
</div>';
// Tipo di documento
echo '
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Tipo di fattura').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT * FROM co_tipidocumento WHERE dir=\'entrata\'", "extra": "" ]}
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Tipo di fattura').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT * FROM co_tipidocumento WHERE dir=\'entrata\'" ]}
</div>';
// Sezionale
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.Modules::get('Fatture di vendita')['id'].' ORDER BY name", "value":"'.$_SESSION['m'.Modules::get('Fatture di vendita')['id']]['id_segment'].'" ]}
</div>
</div>';
// Note
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "note", "value": "Rata '.$n_rata.' del contratto numero '.$numero.', zona '.$zona.'", "extra": "" ]}
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "note", "value": "Rata '.$n_rata.' del contratto numero '.$numero.', zona '.$zona.'" ]}
</div>
</div>';

View File

@ -4,59 +4,170 @@ 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);
//nuovo promemoria
$data_richiesta = date('d/m/Y');
$disabled = '';
$hide = 'hide';
$op = 'edit-pianifica';
$data_richiesta = readDate($rsp[0]['data_richiesta']);
//mi ricavo informazioni del contratto
$data_conclusione = $dbo->fetchArray('SELECT `data_conclusione` FROM `co_contratti` WHERE `id` = '.prepare($id_record))[0]['data_conclusione'];
$idanagrafica = $dbo->fetchArray('SELECT `idanagrafica` FROM `co_contratti` WHERE `id` = '.prepare($id_record))[0]['idanagrafica'];
$list = '\"1\":\"'.tr('Pianificare a partire da oggi ').date('d/m/Y').'\"';
//promemoria esistente
if (!empty($get['idcontratto_riga'])) {
$idcontratto_riga = $get['idcontratto_riga'];
$qp = 'SELECT *, (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=co_contratti_promemoria.idtipointervento) AS tipointervento, (SELECT tempo_standard FROM in_tipiintervento WHERE idtipointervento = co_contratti_promemoria.idtipointervento) AS tempo_standard FROM co_contratti_promemoria WHERE id = '.$idcontratto_riga;
$rsp = $dbo->fetchArray($qp);
$data_richiesta = readDate($rsp[0]['data_richiesta']);
$matricoleimpianti = trim($rsp[0]['idimpianti']);
$idsede = $rsp[0]['idsede'];
$tempo_standard = $rsp[0]['tempo_standard'];
$readonly = 'readonly';
$hide = '';
$list .= ', \"0\":\"'.tr('Pianificare a partire da questo promemoria ').$data_richiesta.'\"';
$op = 'pianificazione';
}
//se non è impostata idcontratto_riga allora sono in fase di inserimento di nuovo promemoria e mi calcolo il prossimo id per co_contratti_promemoria
(empty($idcontratto_riga)) ? $idcontratto_riga = $dbo->fetchArray('SELECT MAX(id) AS max_idcontratto_riga FROM `co_contratti_promemoria`')[0]['max_idcontratto_riga'] : '';
(empty($idcontratto_riga)) ? $idcontratto_riga = 1 : '';
//orari inizio fine interventi (8h standard)
$orario_inizio = '09:00';
$orario_fine = '17:00';
$orario_fine = (!empty($tempo_standard)) ? date('H:i', strtotime($orario_inizio) + ((60 * 60) * $tempo_standard)) : '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">
<input type="hidden" name="op" value="'.$op.'">';
<div class="row">
<div class="col-md-7">
{[ "type": "select", "label": "'.tr('Tipo intervento').'", "name": "idtipointervento", "id": "idtipointervento_", "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "'.$rsp[0]['idtipointervento'].'", "extra": "disabled" ]}
echo '
<!-- DATI PROMEMORIA? -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">'.tr('Dati').'</h3>
</div>
<div class="panel-body">
<div class="col-md-5">
{[ "type": "number", "label": "'.tr('Intervallo').'", "name": "intervallo", "class": "", "decimals": 0, "required": 1, "icon-after": "GG", "min-value": "1" ]}
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "date", "label": "'.tr('Data promemoria').'", "name": "data_richiesta", "required": 1, "value": "'.$data_richiesta.'", "extra":"'.$readonly.'" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Tipo intervento').'", "name": "idtipointervento", "required": 1, "id": "idtipointervento_", "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "'.$rsp[0]['idtipointervento'].'", "extra": "'.$readonly.'", "ajax-source": "tipiintervento" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "select", "multiple": "1", "label": "'.tr('Impianti').'", "name": "idimpianti[]", "values": "query=SELECT my_impianti.id AS id, my_impianti.nome AS descrizione FROM my_impianti_contratti INNER JOIN my_impianti ON my_impianti_contratti.idimpianto = my_impianti.id WHERE my_impianti_contratti.idcontratto = '.$id_record.' ORDER BY descrizione", "value": "'.$matricoleimpianti.'", "extra":"'.$readonly.'" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Sede').'", "name": "idsede_c", "values": "query=SELECT 0 AS id, \'Sede legale\' AS descrizione UNION SELECT id, CONCAT( CONCAT_WS( \' (\', CONCAT_WS(\', \', `nomesede`, `citta`), `indirizzo` ), \')\') AS descrizione FROM an_sedi WHERE idanagrafica='.$idanagrafica.'", "value": "'.$idsede.'", "extra":"'.$readonly.'" ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "richiesta", "id": "richiesta_", "extra": "'.$readonly.'", "value": "'.$rsp[0]['richiesta'].'" ]}
</div>
</div>';
?>
<!-- ARTICOLI -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Materiale da utilizzare'); ?></h3>
</div>
<div class="panel-body">
<div id="articoli">
<?php include $docroot.'/modules/contratti/plugins/ajax_articoli.php'; ?>
</div>
<?php if (empty($readonly)) {
?>
<button type="button" class="btn btn-primary" data-title="<?php echo tr('Aggiungi articolo'); ?>" data-target="#bs-popup2" data-toggle="modal" data-href="<?php echo $rootdir; ?>/modules/contratti/plugins/add_articolo.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>&idcontratto_riga=<?php echo $idcontratto_riga; ?>" ><i class="fa fa-plus"></i> <?php echo tr('Aggiungi articolo'); ?>...</button>
<?php
} ?>
</div>
</div>
<!-- SPESE AGGIUNTIVE -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><?php echo tr('Altre spese previste'); ?></h3>
</div>
<div class="panel-body">
<div id="righe">
<?php include $docroot.'/modules/contratti/plugins/ajax_righe.php'; ?>
</div>
<?php if (empty($readonly)) {
?>
<button type="button" class="btn btn-primary" data-title="<?php echo tr('Aggiungi altre spese'); ?>" data-target="#bs-popup2" data-toggle="modal" data-href="<?php echo $rootdir; ?>/modules/contratti/plugins/add_righe.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>&idcontratto_riga=<?php echo $idcontratto_riga; ?>"><i class="fa fa-plus"></i> <?php echo tr('Aggiungi altre spese'); ?>...</button>
<?php
} ?>
</div>
</div>
<?php
echo '
{( "name": "filelist_and_upload", "id_record": "'.$idcontratto_riga.'", "id_module": "'.$id_module.'", "id_plugin": "'.$id_plugin.'", '.((!empty($readonly)) ? '"readonly": 1' : '"readonly": 0').' )}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "placeholder": "'.tr('Descrizione').'", "name": "richiesta", "id": "richiesta_", "extra": "readonly", "value": "'.$rsp[0]['richiesta'].'" ]}
</div>
</div>
<div class="row">
<!--div class="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-md-8">
{[ "type": "checkbox", "label": "'.tr('Pianifica anche date passate').'", "name": "date_passate", "value": "0", "placeholder": "'.tr('Pianificare promemoria anche con date precedenti ad oggi: ').date('d/m/Y').'" ]}
</div-->
';
echo '
<!-- PIANIFICAZIONE CICLICA? -->
<div class="panel panel-primary '.$hide.'">
<div class="panel-heading">
<h3 class="panel-title">'.tr('Promemoria ciclico?').'</h3>
</div>
<div class="panel-body">';
echo '<div class="row">
<div class="col-md-2">
{[ "type": "number", "label": "'.tr('Intervallo').'", "name": "intervallo", "decimals": 0, "required": 1, "icon-after": "GG", "min-value": "1" ]}
</div>';
?>
<div class="col-md-7">
{[ "type": "select", "label": "<?php echo tr('Inizio pianificazione'); ?>", "name": "parti_da_oggi", "values": "list= \"0\":\"<?php echo tr('Pianificare a partire da questo promemoria ').$data_richiesta; ?>\", \"1\":\"<?php echo tr('Pianificare a partire da oggi ').date('d/m/Y'); ?>\"", "value": "" ]}
{[ "type": "select", "label": "<?php echo tr('Inizio pianificazione'); ?>", "name": "parti_da_oggi", "values": "list=<?php echo $list; ?>" ]}
</div>
<?php
@ -64,21 +175,35 @@ echo '
echo '
<div class="col-md-5">
{[ "type": "date", "label": "'.tr('Fine pianificazione <small>(Data conclusione contratto)</small>').'", "name": "data_conclusione", "id": "data_conclusione_", "extra": "readonly", "value": "'.$rsp[0]['data_conclusione'].'" ]}
<div class="col-md-3">
{[ "type": "date", "label": "'.tr('Fine pianificazione').'", "help": "'.tr('Data conclusione contratto').'", "name": "data_conclusione", "id": "data_conclusione_", "extra": "readonly", "value": "'.$data_conclusione.'" ]}
</div>
</div>
</div>
</div>';
echo '
<!-- PIANIFICARE INTERVENTI? -->
<div class="panel panel-primary '.$hide.'">
<div class="panel-heading">
<h3 class="panel-title">'.tr('Pianificare interventi?').'</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-4">
{[ "type": "checkbox", "label": "'.tr('Pianifica anche l\'intervento').'", "name": "pianifica_intervento", "value": "0", "help": "", "placeholder": "'.tr('Pianificare già l\'intervento ').'" ]}
{[ "type": "checkbox", "label": "'.tr('Pianifica anche l\'intervento').'", "name": "pianifica_intervento", "value": "0", "placeholder": "'.tr('Pianificare già l\'intervento ').'" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Tecnici').'", "multiple": "1", "name": "idtecnico[]", "required": 0, "ajax-source": "tecnici", "value": "", "extra": "disabled" ]}
{[ "type": "select", "label": "'.tr('Tecnici').'", "multiple": "1", "name": "idtecnico[]", "required": 0, "ajax-source": "tecnici", "extra": "disabled" ]}
</div>
@ -90,13 +215,10 @@ echo '
{[ "type": "time", "label": "'.tr('Orario fine').'", "name": "orario_fine", "required": 0, "value": "'.$orario_fine.'", "extra": "disabled" ]}
</div>
</div>
</div>
</div>
<!-- PULSANTI -->
<div class="row">
@ -113,9 +235,9 @@ echo '
echo '
<script>
$( document ).ready(function() {
$(document).ready(function() {
$( "#pianifica_intervento" ).click(function() {
$("#pianifica_intervento").click(function() {
if ($(this).is(":checked")){
$("#idtecnico").removeAttr("disabled");

View File

@ -0,0 +1,165 @@
<?php
include_once __DIR__.'/../../../core.php';
include_once Modules::filepath('Articoli', 'modutil.php');
//$query = 'SELECT *, (SELECT codice FROM mg_articoli WHERE id=mg_articoli_interventi.idarticolo) AS codice, mg_articoli_interventi.id AS idriga, (SELECT prc_guadagno FROM mg_listini WHERE id=(SELECT idlistino_vendite FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM in_interventi WHERE id=mg_articoli_interventi.idintervento) ) ) AS prc_guadagno FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record).' '.Modules::getAdditionalsQuery('Magazzino');
//$rs = $dbo->fetchArray($query);
if (!empty($get['idcontratto_riga'])) {
$idcontratto_riga = $get['idcontratto_riga'];
}
$query = 'SELECT * FROM co_righe_contratti_articoli WHERE id_riga_contratto='.prepare($idcontratto_riga).' '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY id ASC';
$rs = $dbo->fetchArray($query);
if (!empty($rs)) {
echo '
<table class="table table-striped table-condensed table-hover table-bordered">
<tr>
<th>'.tr('Articolo').'</th>
<th width="8%">'.tr('Q.').'</th>';
if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') {
echo '
<th width="15%">'.tr('Prezzo di acquisto').'</th>';
}
if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') {
echo '
<th width="15%">'.tr('Prezzo di vendita').'</th>
<th width="10%">'.tr('Iva').'</th>
<th width="15%">'.tr('Imponibile').'</th>';
}
if (!$records[0]['flag_completato']) {
echo '
<th width="80"></th>';
}
echo '
</tr>';
foreach ($rs as $r) {
$extra = '';
$mancanti = 0;
// Individuazione dei seriali
if (!empty($r['idarticolo']) && !empty($r['abilita_serial'])) {
$serials = array_column($dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_intervento='.prepare($r['id'])), 'serial');
$mancanti = $r['qta'] - count($serials);
if ($mancanti > 0) {
$extra = 'class="warning"';
} else {
$mancanti = 0;
}
}
echo '
<tr '.$extra.'>
<td>
<input type="hidden" name="id" value="'.$r['id'].'">
'.Modules::link('Articoli', $r['idarticolo'], (!empty($r['codice']) ? $r['codice'].' - ' : '').$r['descrizione']);
// Info extra (lotto, serial, altro)
if (!empty($r['abilita_serial'])) {
if (!empty($mancanti)) {
echo '
<br><b><small class="text-danger">'.tr('_NUM_ serial mancanti', [
'_NUM_' => $mancanti,
]).'</small></b>';
}
if (!empty($serials)) {
echo '
<br>'.tr('SN').': '.implode(', ', $serials);
}
}
echo '
</td>';
// Quantità
echo '
<td class="text-right">
'.Translator::numberToLocale($r['qta'], 'qta').' '.$r['um'].'
</td>';
if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') {
echo '
<td class="text-right">
'.Translator::numberToLocale($r['prezzo_acquisto']).' &euro;
</td>';
}
if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') {
// Prezzo unitario
echo '
<td class="text-right">
'.Translator::numberToLocale($r['prezzo_vendita']).' &euro;';
if ($r['sconto_unitario'] > 0) {
echo '
<br><span class="label label-danger">
- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'
</span>';
}
echo '
</td>';
echo '
<td class="text-right">
<span>'.Translator::numberToLocale($r['iva']).'</span> &euro;';
echo '
</td>';
// Prezzo di vendita
echo '
<td class="text-right">
<span class="prezzo_articolo">'.Translator::numberToLocale(sum($r['prezzo_vendita'] * $r['qta'], -$r['sconto'])).'</span> &euro;
</td>';
}
// Pulsante per riportare nel magazzino centrale.
// Visibile solo se l'intervento non è stato nè fatturato nè completato.
if (!$records[0]['flag_completato']) {
echo '
<td>';
/*if ($r['abilita_serial']) {
echo '
<button type="button" class="btn btn-info btn-xs" data-toggle="tooltip" onclick="launch_modal(\''.tr('Modifica articoli').'\', \''.$rootdir.'/modules/fatture/add_serial.php?id_module='.$id_module.'&id_record='.$id_record.'&idarticolo='.$r['idriga'].'&idriga='.$r['id'].'\', 1);"><i class="fa fa-barcode"></i></button>';
}*/
if (empty($readonly)) {
echo '
<button type="button" class="btn btn-warning btn-xs" data-title="'.tr('Modifica spesa').'" onclick="launch_modal(\'Modifica spesa\', \''.$rootdir.'/modules/contratti/plugins/add_articolo.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'\', 1, \'#bs-popup2\');" >
<i class="fa fa-edit"></i></button>
<button type="button" class="btn btn-danger btn-xs" data-toggle="tooltip" title="'.tr('Elimina materiale').'" onclick="if(confirm(\''.tr('Eliminare questo materiale?').'\') ){ ritorna_al_magazzino(\''.$r['id'].'\'); }"><i class="fa fa-angle-double-left"></i> <i class="fa fa-truck"></i></button>';
}
echo '
</td>';
}
echo '
</tr>';
}
echo '
</table>';
}
?>
<script type="text/javascript">
function ritorna_al_magazzino( id ){
$.post(globals.rootdir + '/modules/contratti/plugins/actions.php', {op: 'unlink_articolo', idriga: id, id_record: '<?php echo $id_record; ?>', id_module: '<?php echo $id_module; ?>' }, function(data, result){
if( result == 'success' ){
// ricarico l'elenco degli articoli
$('#articoli').load(globals.rootdir + '/modules/contratti/plugins/ajax_articoli.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>&idcontratto_riga=<?php echo $idcontratto_riga; ?>');
}
});
}
</script>

View File

@ -0,0 +1,121 @@
<?php
include_once __DIR__.'/../../../core.php';
if (!empty($get['idcontratto_riga'])) {
$idcontratto_riga = $get['idcontratto_riga'];
}
$query = 'SELECT * FROM co_righe_contratti_materiali WHERE id_riga_contratto='.prepare($idcontratto_riga).' '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY id ASC';
$rs2 = $dbo->fetchArray($query);
if (count($rs2) > 0) {
echo '
<table class="table table-striped table-condensed table-hover table-bordered">
<tr>
<th>'.tr('Descrizione').'</th>
<th width="8%">'.tr('Q.').'</th>
<th width="15%">'.tr('Prezzo di acquisto').'</th>';
if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') {
echo '
<th width="15%">'.tr('Prezzo di vendita').'</th>
<th width="10%">'.tr('Iva').'</th>
<th width="15%">'.tr('Subtotale').'</th>';
}
if (!$records[0]['flag_completato']) {
echo '
<th width="80"></th>';
}
echo '
</tr>';
foreach ($rs2 as $r) {
echo '
<tr>
<td>
<input type="hidden" name="id" value="'.$r['id'].'">
'.nl2br($r['descrizione']).'
</td>';
// Quantità
echo '
<td class="text-right">
'.Translator::numberToLocale($r['qta'], 'qta').' '.$r['um'].'
</td>';
//Costo unitario
echo '
<td class="text-right">
'.Translator::numberToLocale($r['prezzo_acquisto']).' &euro;
</td>';
if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') {
// Prezzo unitario
$netto = $r['prezzo_vendita'] - $r['sconto_unitario'];
echo '
<td class="text-right">
'.Translator::numberToLocale($r['prezzo_vendita']).' &euro;';
if ($r['sconto_unitario'] > 0) {
echo '
<br><span class="label label-danger">
- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'
</span>';
}
echo '
</td>';
echo '
<td class="text-right">
<span>'.Translator::numberToLocale($r['iva']).'</span> &euro;';
echo '
</td>';
// Prezzo di vendita
echo '
<td class="text-right">
<span class="prezzo_articolo">'.Translator::numberToLocale(sum($r['prezzo_vendita'] * $r['qta'], -$r['sconto'])).'</span> &euro;
</td>';
}
// Pulsante per riportare nel magazzino centrale.
// Visibile solo se l'intervento non è stato nè fatturato nè completato.
if (empty($readonly)) {
echo '
<td>
<button type="button" class="btn btn-warning btn-xs" data-title="'.tr('Modifica spesa').'" onclick="launch_modal(\'Modifica spesa\', \''.$rootdir.'/modules/contratti/plugins/add_righe.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'\', 1, \'#bs-popup2\');" >
<i class="fa fa-edit"></i></button>
<button type="button" class="btn btn-danger btn-xs" data-toggle="tooltip" onclick="if(confirm(\''.tr('Eliminare questa spesa?').'\')){ elimina_riga( \''.$r['id'].'\' ); }"><i class="fa fa-trash"></i></button>
</td>';
}
echo '
</tr>';
}
echo '
</table>';
}
?>
<script type="text/javascript">
function elimina_riga( id ){
$.post(globals.rootdir + '/modules/contratti/plugins/actions.php', { op: 'delriga', idriga: id }, function(data, result){
if( result=='success' ){
//ricarico l'elenco delle righe
$('#righe').load( globals.rootdir + '/modules/contratti/plugins/ajax_righe.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>&idcontratto_riga=<?php echo $idcontratto_riga; ?>');
}
});
}
</script>

View File

@ -1,7 +1,8 @@
<?php
include_once __DIR__.'/../../../core.php';
include_once $docroot.'/modules/interventi/modutil.php';
include_once Modules::filepath('Interventi', 'modutil.php');
/*
CONSUNTIVO
@ -24,7 +25,7 @@ $totale = 0;
$totale_stato = [];
// Tabella con riepilogo interventi
$rsi = $dbo->fetchArray('SELECT *, in_interventi.id, (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS inizio, (SELECT SUM(ore) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS ore, (SELECT MIN(km) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS km FROM co_righe_contratti INNER JOIN in_interventi ON co_righe_contratti.idintervento=in_interventi.id WHERE co_righe_contratti.idcontratto='.prepare($id_record).' ORDER BY co_righe_contratti.idintervento DESC');
$rsi = $dbo->fetchArray('SELECT *, in_interventi.id, (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS inizio, (SELECT SUM(ore) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS ore, (SELECT MIN(km) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS km FROM co_contratti_promemoria INNER JOIN in_interventi ON co_contratti_promemoria.idintervento=in_interventi.id WHERE co_contratti_promemoria.idcontratto='.prepare($id_record).' ORDER BY co_contratti_promemoria.idintervento DESC');
if (!empty($rsi)) {
echo '
<table class="table table-bordered table-condensed">
@ -151,7 +152,7 @@ if (!empty($rsi)) {
<td>
'.Modules::link('Articoli', $r['idarticolo'], $r['descrizione']).(!empty($extra) ? '<small class="help-block">'.implode(', ', $extra).'</small>' : '').'
</td>
<td class="text-right">'.Translator::numberToLocale($r['qta']).'</td>
<td class="text-right">'.Translator::numberToLocale($r['qta'], 'qta').'</td>
<td class="text-right danger">'.Translator::numberToLocale($r['prezzo_acquisto'] * $r['qta']).'</td>
<td class="text-right success">'.Translator::numberToLocale($r['prezzo_vendita'] * $r['qta']).$sconto.'</td>
</tr>';
@ -184,7 +185,7 @@ if (!empty($rsi)) {
<td>
'.$r['descrizione'].'
</td>
<td class="text-right">'.Translator::numberToLocale($r['qta']).'</td>
<td class="text-right">'.Translator::numberToLocale($r['qta'], 'qta').'</td>
<td class="text-right danger">'.Translator::numberToLocale($r['prezzo_acquisto'] * $r['qta']).'</td>
<td class="text-right success">'.Translator::numberToLocale($r['prezzo_vendita'] * $r['qta']).$sconto.'</td>
</tr>';
@ -268,13 +269,14 @@ if (!empty($rsi)) {
/*
Bilancio del contratto
*/
$rs = $dbo->fetchArray('SELECT SUM(subtotale) AS budget FROM co_righe2_contratti WHERE idcontratto='.prepare($id_record));
$rs = $dbo->fetchArray('SELECT SUM(subtotale - sconto) AS budget FROM co_righe_contratti WHERE idcontratto='.prepare($id_record));
$budget = $rs[0]['budget'];
$rs = $dbo->fetchArray("SELECT SUM(qta) AS totale_ore FROM `co_righe2_contratti` WHERE um='ore' AND idcontratto=".prepare($id_record));
$rs = $dbo->fetchArray("SELECT SUM(qta) AS totale_ore FROM `co_righe_contratti` WHERE um='ore' AND idcontratto=".prepare($id_record));
$contratto_tot_ore = $rs[0]['totale_ore'];
$diff = floatval($budget) - floatval($totale);
$diff = sum($budget, -$totale_addebito);
if ($diff > 0) {
$bilancio = '<span class="text-success"><big>'.Translator::numberToLocale($diff).' &euro;</big></span>';
} elseif ($diff < 0) {

View File

@ -2,6 +2,8 @@
include_once __DIR__.'/../../../core.php';
include_once Modules::filepath('Fatture di vendita', 'modutil.php');
/*
GESTIONE ORDINI DI SERVIZIO
*/
@ -21,7 +23,7 @@ $mesi = [
];
// Pianificazione fatture
if ($get['op'] == 'add_fatturazione') {
if (get('op') == 'add_fatturazione') {
$prev_data = '';
// Azzero la pianificazione zone se era già stata fatta, per poter sostituire la pianificazione,
@ -50,7 +52,7 @@ if ($get['op'] == 'add_fatturazione') {
}
// Eliminazione pianificazione specifica
elseif ($get['op'] == 'del_pianificazione') {
elseif (get('op') == 'del_pianificazione') {
$idpianificazione = $get['idpianificazione'];
$n = $dbo->fetchNum('SELECT id FROM co_ordiniservizio_pianificazionefatture WHERE id='.prepare($idpianificazione));
@ -64,9 +66,7 @@ elseif ($get['op'] == 'del_pianificazione') {
}
// Creazione fattura pianificata
elseif ($get['op'] == 'addfattura') {
include $docroot.'/modules/fatture/modutil.php';
elseif (get('op') == 'addfattura') {
$idpianificazione = $get['idpianificazione'];
$descrizione = post('note');
$data = $post['data'];
@ -78,20 +78,31 @@ elseif ($get['op'] == 'addfattura') {
$idanagrafica = $rs[0]['idanagrafica'];
$dir = 'entrata';
$idconto = get_var('Conto predefinito fatture di vendita');
$numero = get_new_numerofattura($data);
$id_segment = post('id_segment');
$numero_esterno = get_new_numerosecondariofattura($data);
// Tipo di pagamento predefinito dall'anagrafica
$query = 'SELECT id FROM co_pagamenti WHERE id=(SELECT idpagamento_vendite FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica).')';
// Tipo di pagamento + banca predefinite dall'anagrafica
$query = 'SELECT id, (SELECT idbanca_vendite FROM an_anagrafiche WHERE idanagrafica = '.prepare($idanagrafica).') AS idbanca FROM co_pagamenti WHERE id = (SELECT idpagamento_vendite AS pagamento FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica).')';
$rs = $dbo->fetchArray($query);
$idpagamento = $rs[0]['id'];
$idbanca = $rs[0]['idbanca'];
// Se non è stato associato un pagamento predefinito al cliente leggo il pagamento dalle impostazioni
if ($idpagamento == '') {
// Se la fattura è di vendita e non è stato associato un pagamento predefinito al cliente leggo il pagamento dalle impostazioni
if ($dir == 'entrata' && $idpagamento == '') {
$idpagamento = get_var('Tipo di pagamento predefinito');
}
$query = 'INSERT INTO co_documenti(numero, numero_esterno, idanagrafica, idtipodocumento, idpagamento, data, idstatodocumento, note, idsede) VALUES ('.prepare($numero).', '.prepare($numero_esterno).', '.prepare($idanagrafica).', '.prepare($idtipodocumento).', '.prepare($idpagamento).', '.prepare($data).", (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`='Bozza'), ".prepare($note).', (SELECT idsede_fatturazione FROM an_anagrafiche WHERE idanagrafica='.prpeare($idanagrafica).') )';
// Se non è impostata la banca dell'anagrafica, uso quella del pagamento.
if (empty($idbanca)) {
// Banca predefinita del pagamento
$query = 'SELECT id FROM co_banche WHERE id_pianodeiconti3 = (SELECT idconto_vendite FROM co_pagamenti WHERE id = '.prepare($idpagamento).')';
$rs = $dbo->fetchArray($query);
$idbanca = $rs[0]['id'];
}
$query = 'INSERT INTO co_documenti(numero, numero_esterno, idanagrafica, idtipodocumento, idpagamento, data, idstatodocumento, note, idsede, id_segment, idconto, idbanca) VALUES ('.prepare($numero).', '.prepare($numero_esterno).', '.prepare($idanagrafica).', '.prepare($idtipodocumento).', '.prepare($idpagamento).', '.prepare($data).", (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`='Bozza'), ".prepare($note).', (SELECT idsede_fatturazione FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica).'), '.prepare($id_segment).', '.prepare($idconto).', '.prepare($idbanca).' )';
$dbo->query($query);
$iddocumento = $dbo->lastInsertedID();
@ -102,7 +113,7 @@ elseif ($get['op'] == 'addfattura') {
$rs = $dbo->fetchArray('SELECT id FROM co_ordiniservizio_pianificazionefatture WHERE idcontratto='.prepare($id_record));
// L'importo deve essere diviso per il numero di mesi
$rs2 = $dbo->fetchArray('SELECT SUM(subtotale) AS totale FROM co_righe2_contratti WHERE idcontratto='.prepare($id_record));
$rs2 = $dbo->fetchArray('SELECT SUM(subtotale) AS totale FROM co_righe_contratti WHERE idcontratto='.prepare($id_record));
$importo = $rs2[0]['totale'] / sizeof($rs);
// Lettura iva del cliente o predefinita
@ -140,7 +151,7 @@ echo '
/*
Fatture pianificate
*/
$rs = $dbo->fetchArray('SELECT *, (SELECT SUM(subtotale) FROM co_righe2_contratti WHERE idcontratto='.prepare($id_record).') AS budget_contratto, (SELECT descrizione FROM an_zone WHERE id=idzona) AS zona FROM co_ordiniservizio_pianificazionefatture WHERE idcontratto='.prepare($id_record).' ORDER BY data_scadenza ASC');
$rs = $dbo->fetchArray('SELECT *, (SELECT SUM(subtotale) FROM co_righe_contratti WHERE idcontratto='.prepare($id_record).') AS budget_contratto, (SELECT descrizione FROM an_zone WHERE id=idzona) AS zona FROM co_ordiniservizio_pianificazionefatture WHERE idcontratto='.prepare($id_record).' ORDER BY data_scadenza ASC');
if (empty($rs)) {
echo '
@ -322,7 +333,7 @@ else {
echo '
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Zone di cui pianificare la fatturazione').'", "name": "idzona[]", "value": "", "values": "query=SELECT id, descrizione FROM an_zone WHERE (id IN (SELECT idzona FROM an_sedi WHERE id IN (SELECT idsede FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).')))) OR ( id=(SELECT idzona FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record).') AND idzona=an_zone.id) ) UNION SELECT 0, \'Altro\'", "multiple": 1, "extra": "onchange=\"$(this).find(\'option\').each( function(){ if( $(this).is(\':selected\') ){ $(\'#zona_\'+$(this).val()).removeClass(\'hide\'); }else{ $(\'#zona_\'+$(this).val()).addClass(\'hide\'); } });\"" ]}
{[ "type": "select", "label": "'.tr('Zone per le quali pianificare la fatturazione').'", "name": "idzona[]", "values": "query=SELECT id, descrizione FROM an_zone WHERE (id IN (SELECT idzona FROM an_sedi WHERE id IN (SELECT idsede FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).')))) OR ( id=(SELECT idzona FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record).') AND idzona=an_zone.id) ) UNION SELECT 0, \'Altro\'", "multiple": 1, "extra": "onchange=\"$(this).find(\'option\').each( function(){ if( $(this).is(\':selected\') ){ $(\'#zona_\'+$(this).val()).removeClass(\'hide\'); }else{ $(\'#zona_\'+$(this).val()).addClass(\'hide\'); } });\"" ]}
</div>
</div>';

View File

@ -21,7 +21,7 @@ $mesi = [
];
// Generazione ordini di servizio
if ($get['op'] == 'add_ordineservizio') {
if (get('op') == 'add_ordineservizio') {
$prev_data = '';
// Ciclo fra le voci in arrivo dal form
@ -49,7 +49,7 @@ if ($get['op'] == 'add_ordineservizio') {
}
// Eliminazione pianificazione specifica
elseif ($get['op'] == 'del_ordineservizio') {
elseif (get('op') == 'del_ordineservizio') {
$idordineservizio = $get['idordineservizio'];
$n = $dbo->fetchNum('SELECT id FROM co_ordiniservizio WHERE id='.prepare($idordineservizio)." AND stato='aperto'");

View File

@ -2,30 +2,55 @@
include_once __DIR__.'/../../../core.php';
include_once Modules::filepath('Articoli', 'modutil.php');
// Pianificazione intervento
switch (filter('op')) {
case 'pianifica':
case 'add-pianifica':
$data_richiesta = filter('data_richiesta');
$query = 'INSERT INTO `co_contratti_promemoria` ( `idcontratto`, `data_richiesta` ) VALUES ('.prepare($id_record).', '.prepare($data_richiesta).')';
if ($dbo->query($query)) {
} else {
$_SESSION['errors'][] = tr("Errore durante l'aggiunta del promemoria!");
}
break;
case 'edit-pianifica':
$idcontratto_riga = filter('idcontratto_riga');
$data_richiesta = filter('data_richiesta');
$idtipointervento = filter('idtipointervento');
$richiesta = filter('richiesta');
$idsede = filter('idsede_c');
$idimpianti = implode(',', $post['idimpianti']);
$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).')';
$query = 'UPDATE co_contratti_promemoria SET idtipointervento='.prepare($idtipointervento).', data_richiesta='.prepare($data_richiesta).', richiesta='.prepare($richiesta).', idsede='.prepare($idsede).', idimpianti='.prepare($idimpianti).' WHERE id = '.prepare($idcontratto_riga);
if (isset($id_record)) {
if ($dbo->query($query)) {
$_SESSION['infos'][] = tr('Intervento pianificato!');
$_SESSION['infos'][] = tr('Promemoria inserito!');
} else {
$_SESSION['errors'][] = tr("Errore durante l'aggiunta dell'intervento!");
$_SESSION['errors'][] = tr('Errore durante la modifica del promemoria!');
}
}
redirect($rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'#tab_'.$id_plugin);
break;
// Eliminazione pianificazione
case 'depianifica':
$id = filter('id');
$dbo->query('DELETE FROM `co_righe_contratti` WHERE id='.prepare($id));
$dbo->query('DELETE FROM `co_contratti_promemoria` WHERE id='.prepare($id));
$dbo->query('DELETE FROM `co_righe_contratti_materiali` WHERE id_riga_contratto='.prepare($id));
$dbo->query('DELETE FROM `co_righe_contratti_articoli` WHERE id_riga_contratto='.prepare($id));
$_SESSION['infos'][] = tr('Pianificazione eliminata!');
redirect($rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'#tab_'.$id_plugin);
@ -35,14 +60,17 @@ switch (filter('op')) {
//Eliminazione tutti i promemoria di questo contratto con non hanno l'intervento associato
case 'delete-promemoria':
$dbo->query('DELETE FROM `co_righe_contratti` WHERE idcontratto = '.$id_record.' AND idintervento IS NULL');
$dbo->query('DELETE FROM `co_contratti_promemoria` WHERE idcontratto = '.$id_record.' AND idintervento IS NULL');
$dbo->query('DELETE FROM `co_righe_contratti_materiali` WHERE id_riga_contratto IN (SELECT id FROM `co_contratti_promemoria` WHERE idcontratto = '.$id_record.' AND idintervento IS NULL ) ');
$dbo->query('DELETE FROM `co_righe_contratti_articoli` WHERE id_riga_contratto IN (SELECT id FROM `co_contratti_promemoria` WHERE idcontratto = '.$id_record.' AND idintervento IS NULL ) ');
$_SESSION['errors'][] = tr('Tutti i promemoria non associati sono stati eliminati!');
redirect($rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'#tab_'.$id_plugin);
break;
//pianificazione
//pianificazione ciclica
case 'pianificazione':
$idcontratto_riga = filter('idcontratto_riga');
@ -50,19 +78,24 @@ switch (filter('op')) {
$parti_da_oggi = post('parti_da_oggi');
if (!empty($idcontratto_riga) && !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;
$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_contratti_promemoria.idtipointervento) AS tipointervento FROM co_contratti_promemoria '.
'WHERE co_contratti_promemoria.id = '.$idcontratto_riga;
$rsp = $dbo->fetchArray($qp);
$idtipointervento = $rsp[0]['idtipointervento'];
$idsede = $rsp[0]['idsede'];
$richiesta = $rsp[0]['richiesta'];
$data_richiesta = $rsp[0]['data_richiesta'];
$idimpianti = $rsp[0]['idimpianti'];
//mi serve per la pianificazione dei promemoria
$data_conclusione = $rsp[0]['data_conclusione'];
//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
@ -81,12 +114,19 @@ switch (filter('op')) {
//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) && (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 (count($dbo->fetchArray("SELECT id FROM co_contratti_promemoria WHERE data_richiesta = '".$data_richiesta."' AND idtipointervento = '".$idtipointervento."' AND idcontratto = '".$id_record."' ")) == 0) {
//inserisco il nuovo promemoria
$query = 'INSERT INTO `co_contratti_promemoria`(`idcontratto`, `idtipointervento`, `data_richiesta`, `richiesta`, `idsede`, `idimpianti` ) VALUES('.prepare($id_record).', '.prepare($idtipointervento).', '.prepare($data_richiesta).', '.prepare($richiesta).', '.prepare($idsede).', '.prepare($idimpianti).')';
if ($dbo->query($query)) {
$idriga = $dbo->lastInsertedID();
//copio anche righe materiali nel nuovo promemoria
$dbo->query('INSERT INTO co_righe_contratti_materiali (descrizione, qta,um,prezzo_vendita,prezzo_acquisto,idiva, desc_iva,iva,id_riga_contratto,sconto,sconto_unitario,tipo_sconto) SELECT descrizione, qta,um,prezzo_vendita,prezzo_acquisto,idiva, desc_iva,iva,'.$idriga.',sconto,sconto_unitario,tipo_sconto FROM co_righe_contratti_materiali WHERE id_riga_contratto = '.$idcontratto_riga.' ');
//copio righe articoli nel nuovo promemoria
$dbo->query('INSERT INTO co_righe_contratti_articoli (idarticolo, id_riga_contratto,descrizione,prezzo_acquisto,prezzo_vendita,sconto, sconto_unitario, tipo_sconto,idiva,desc_iva,iva,idautomezzo, qta, um, abilita_serial, idimpianto) SELECT idarticolo, '.$idriga.',descrizione,prezzo_acquisto,prezzo_vendita,sconto,sconto_unitario,tipo_sconto,idiva,desc_iva,iva,idautomezzo, qta, um, abilita_serial, idimpianto FROM co_righe_contratti_articoli WHERE id_riga_contratto = '.$idcontratto_riga.' ');
$_SESSION['infos'][] = tr('Promemoria intervento pianificato!');
//pianificare anche l' intervento?
@ -136,7 +176,25 @@ switch (filter('op')) {
}
//collego l'intervento ai promemoria
$dbo->query('UPDATE co_righe_contratti SET idintervento='.prepare($idintervento).' WHERE id='.prepare($idriga));
$dbo->query('UPDATE co_contratti_promemoria SET idintervento='.prepare($idintervento).' WHERE id='.prepare($idriga));
//copio le righe dal promemoria all'intervento
$dbo->query('INSERT INTO in_righe_interventi (descrizione, qta,um,prezzo_vendita,prezzo_acquisto,idiva,desc_iva,iva,idintervento,sconto,sconto_unitario,tipo_sconto) SELECT descrizione, qta,um,prezzo_vendita,prezzo_acquisto,idiva,desc_iva,iva,'.$idintervento.',sconto,sconto_unitario,tipo_sconto FROM co_righe_contratti_materiali WHERE id_riga_contratto = '.$idcontratto_riga.' ');
//copio gli articoli dal promemoria all'intervento
$dbo->query('INSERT INTO mg_articoli_interventi (idarticolo, idintervento,descrizione,prezzo_acquisto,prezzo_vendita,sconto, sconto_unitario, tipo_sconto,idiva,desc_iva,iva,idautomezzo, qta, um, abilita_serial, idimpianto) SELECT idarticolo, '.$idintervento.',descrizione,prezzo_acquisto,prezzo_vendita,sconto,sconto_unitario,tipo_sconto,idiva,desc_iva,iva,idautomezzo, qta, um, abilita_serial, idimpianto FROM co_righe_contratti_articoli WHERE id_riga_contratto = '.$idcontratto_riga.' ');
// Decremento la quantità per ogni articolo copiato
$rs_articoli = $dbo->fetchArray('SELECT * FROM mg_articoli_interventi WHERE idintervento = '.$idintervento.' ');
foreach ($rs_articoli as $rs_articolo) {
add_movimento_magazzino($rs_articolo['idarticolo'], -force_decimal($rs_articolo['qta']), ['idautomezzo' => $rs_articolo['idautomezzo'], 'idintervento' => $idintervento]);
}
// Collego gli impianti del promemoria all' intervento appena inserito
$rs_idimpianti = explode(',', $idimpianti);
foreach ($rs_idimpianti as $idimpianto) {
$dbo->query('INSERT INTO my_impianti_interventi (idintervento, idimpianto) VALUES ('.$idintervento.', '.$idimpianto.' )');
}
// $_SESSION['infos'][] = tr('Intervento '.$codice.' pianificato correttamente.');
@ -154,7 +212,7 @@ switch (filter('op')) {
}
//fine ciclo while
} else {
$_SESSION['errors'][] = tr('Nessuna data di conclusione del contratto oppure quest\'ultima è già trascorsa, impossibile pianificare nuovi promemoria.');
$_SESSION['errors'][] = tr('Nessuna data di conclusione del contratto oppure quest\'ultima è già trascorsa, impossibile pianificare nuovi promemoria.'.$qp);
}
//fine controllo data_conclusione
} else {
@ -166,7 +224,7 @@ switch (filter('op')) {
}
// Righe già inserite
$qp = 'SELECT *, (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=co_righe_contratti.idtipointervento) AS tipointervento FROM co_righe_contratti WHERE idcontratto='.prepare($id_record).' ORDER BY data_richiesta ASC';
$qp = 'SELECT *, (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=co_contratti_promemoria.idtipointervento) AS tipointervento FROM co_contratti_promemoria WHERE idcontratto='.prepare($id_record).' ORDER BY data_richiesta ASC';
$rsp = $dbo->fetchArray($qp);
$pianificabile = $dbo->fetchNum('SELECT id FROM co_staticontratti WHERE pianificabile = 1 AND descrizione = '.prepare($records[0]['stato']));
@ -186,12 +244,15 @@ if (count($rsp) != 0) {
<table class="table table-condensed table-striped table-hover">
<thead>
<tr>
<th>'.tr('Entro il').'</th>
<th>'.tr('Data').'</th>
<th>'.tr('Tipo intervento').'</th>
<th>'.tr('Descrizione').'</th>
<th>'.tr('Intervento collegato').'</th>
<th>'.tr('Intervento').'</th>
<th>'.tr('Sede').'</th>
<th>'.tr('Opzioni').'</th>
<th>'.tr('Impianti').'</th>
<th>'.tr('Materiali').'</th>
<th>'.tr('Allegati').'</th>
<th class="text-right" >'.tr('Opzioni').'</th>
</tr>
</thead>
<tbody>';
@ -224,9 +285,55 @@ if (count($rsp) != 0) {
$disabled = '';
}
//data_conclusione contratto
if (date('Y', strtotime($records[0]['data_conclusione'])) < 1971) {
$records[0]['data_conclusione'] = '';
}
//info impianti
$info_impianti = '';
if (!empty($rsp[$i]['idimpianti'])) {
$rsp3 = $dbo->fetchArray('SELECT id, matricola, nome FROM my_impianti WHERE id IN ('.($rsp[$i]['idimpianti']).')');
if (!empty($rsp3)) {
for ($a = 0; $a < count($rsp3); ++$a) {
$info_impianti .= Modules::link('MyImpianti', $rsp3[$a]['id'], tr('_NOME_ (_MATRICOLA_)', [
'_NOME_' => $rsp3[$a]['nome'],
'_MATRICOLA_' => $rsp3[$a]['matricola'],
])).'<br>';
}
}
}
//info materiali/articoli
$rsp4 = $dbo->fetchArray('SELECT id, descrizione,qta,um,prezzo_vendita, \'\' AS idarticolo FROM co_righe_contratti_materiali WHERE id_riga_contratto = '.prepare($rsp[$i]['id']).'
UNION SELECT id, descrizione,qta,um,prezzo_vendita, idarticolo FROM co_righe_contratti_articoli WHERE id_riga_contratto = '.prepare($rsp[$i]['id']));
$info_materiali = '';
if (!empty($rsp4)) {
for ($b = 0; $b < count($rsp4); ++$b) {
$info_materiali .= tr(' _QTA_ _UM_ x _DESC_', [
'_DESC_' => ((!empty($rsp4[$b]['idarticolo'])) ? Modules::link('Articoli', $rsp4[$b]['idarticolo'], $rsp4[$b]['descrizione']) : $rsp4[$b]['descrizione']),
'_QTA_' => Translator::numberToLocale($rsp4[$b]['qta']),
'_UM_' => $rsp4[$b]['um'],
'_PREZZO_' => $rsp4[$b]['prezzo_vendita'],
]).'<br>';
}
}
//info allegati
$rsp5 = $dbo->fetchArray('SELECT nome, original FROM zz_files WHERE id_record = '.prepare($rsp[$i]['id']).' AND id_plugin = '.$id_plugin);
$info_allegati = '';
if (!empty($rsp5)) {
for ($b = 0; $b < count($rsp5); ++$b) {
$info_allegati .= tr(' _NOME_ (_ORIGINAL_)', [
'_ORIGINAL_' => $rsp5[$b]['original'],
'_NOME_' => $rsp5[$b]['nome'],
]).'<br>';
}
}
echo '
<tr>
<td>'.Translator::dateToLocale($rsp[$i]['data_richiesta']).'<!--br><small>'.Translator::dateToLocale($records[0]['data_conclusione']).'</small--></td>
@ -234,6 +341,9 @@ if (count($rsp) != 0) {
<td>'.nl2br($rsp[$i]['richiesta']).'</td>
<td>'.$info_intervento.'</td>
<td>'.$info_sede.'</td>
<td>'.$info_impianti.'</td>
<td>'.$info_materiali.'</td>
<td>'.$info_allegati.'</td>
<td align="right">';
echo '
@ -255,17 +365,25 @@ if (count($rsp) != 0) {
</tbody>
</table>';
echo '<br><div class="pull-right">';
if (count($rsp) > 0) {
echo '<br><div class="pull-right"><button type="button" title="Elimina tutti i promemoria per questo contratto che non sono associati ad intervento." class="btn btn-danger ask tip" data-op="delete-promemoria" >
<i class="fa fa-trash"></i> '.tr('Elimina promemoria').'
</button></div>';
echo ' <button type="button" title="Elimina tutti i promemoria per questo contratto che non sono associati ad intervento." class="btn btn-danger ask tip" data-op="delete-promemoria" >
<i class="fa fa-trash"></i> '.tr('Elimina promemoria').'
</button>';
}
echo '</div>';
}
echo ' <button type="button" title="Aggiungi un nuovo promemoria da pianificare." data-toggle="tooltip" class="btn btn-primary" id="add_promemoria">
<i class="fa fa-plus"></i> '.tr('Nuovo promemoria').'
</button>';
/*
Nuovo intervento
*/
echo '
/*echo '
<br><h5>'.tr('Pianifica un nuovo promemoria per un intervento').':</h5>
<form action="" method="post">
<input type="hidden" name="backto" value="record-edit">
@ -283,7 +401,7 @@ echo '
<tbody>
<tr>
<td>
{[ "type": "date", "placeholder": "'.tr('Entro il').'", "name": "data_richiesta", "required": 1, "value": "" ]}
{[ "type": "date", "placeholder": "'.tr('Entro il').'", "name": "data_richiesta", "required": 1 ]}
</td>
<td>
{[ "type": "select", "placeholder": "'.tr('Tipo intervento').'", "name": "idtipointervento", "required": 1, "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "'.$rsp[0]['idtipointervento'].'" ]}
@ -302,6 +420,42 @@ echo '
<button type="submit" class="btn btn-primary"><i class="fa fa-plus"></i> '.tr('Aggiungi').'</button>
</div>
<div class="clearfix"></div>
</form>
</form>';*/
echo '
</div>
</div>';
?>
<script type="text/javascript">
$( "#add_promemoria" ).click(function() {
swal({
title: '<?php echo tr('Aggiungere un nuovo promemoria?'); ?>',
type: "info",
showCancelButton: true,
confirmButtonText: '<?php echo tr('Aggiungi'); ?>',
confirmButtonClass: 'btn btn-lg btn-success',
}).then(
function (result) {
prev_html = $("#add_promemoria").html();
$("#add_promemoria").html("<i class='fa fa-spinner fa-pulse fa-fw'></i> <?php echo tr('Attendere...'); ?>");
$("#add_promemoria").prop('disabled', true);
$.post( "<?php echo $rootdir; ?>/editor.php?id_module=<?php echo Modules::get('Contratti')['id']; ?>&id_record=<?php echo $id_record; ?>", { backto: "record-edit", op: "add-pianifica", data_richiesta: '<?php echo date('Y-m-d'); ?>' })
.done(function( data ) {
launch_modal('Nuovo promemoria', '<?php echo $rootdir; ?>/modules/contratti/plugins/addpianficazione.php?id_module=<?php echo Modules::get('Contratti')['id']; ?>&id_plugin=<?php echo Plugins::get('Pianificazione interventi')['id']; ?>&ref=interventi_contratti&id_record=<?php echo $id_record; ?>', 1, '#bs-popup');
$("#add_promemoria").html(prev_html);
$("#add_promemoria").prop('disabled', false);
});
},
function (dismiss) {}
);
});
</script>

View File

@ -15,7 +15,7 @@ $options = [
];
// Dati della riga
$rsr = $dbo->fetchArray('SELECT * FROM co_righe2_contratti WHERE idcontratto='.prepare($id_record).' AND id='.prepare($get['idriga']));
$rsr = $dbo->fetchArray('SELECT * FROM co_righe_contratti WHERE idcontratto='.prepare($id_record).' AND id='.prepare($get['idriga']));
$result = $rsr[0];
$result['prezzo'] = $rsr[0]['subtotale'] / $rsr[0]['qta'];

View File

@ -2,115 +2,105 @@
include_once __DIR__.'/../../core.php';
// Mostro le righe del preventivo
$totale_preventivo = 0.00;
$totale_imponibile = 0.00;
$totale_iva = 0.00;
$totale_da_evadere = 0.00;
/*
ARTICOLI
ARTICOLI + RIGHE GENERICHE
*/
$rs_art = $dbo->fetchArray('SELECT *, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo), "") AS codice FROM co_righe2_contratti WHERE idcontratto='.prepare($id_record).' ORDER BY `order`');
$imponibile_art = 0.0;
$iva_art = 0.0;
$rs = $dbo->fetchArray('SELECT *, round(sconto_unitario,'.Settings::get('Cifre decimali per importi').') AS sconto_unitario, round(sconto,'.Settings::get('Cifre decimali per importi').') AS sconto, round(subtotale,'.Settings::get('Cifre decimali per importi').') AS subtotale, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo), "") AS codice FROM co_righe_contratti WHERE idcontratto='.prepare($id_record).' ORDER BY `order`');
echo '
<table class="table table-striped table-hover table-condensed table-bordered">
<thead>
<tr>
<th>'.tr('Descrizione').'</th>
<th width="10%" class="text-center">'.tr('Q.').'</th>
<th width="10%" class="text-center">'.tr('U.m.').'</th>
<th width="12%" class="text-center">'.tr('Costo unitario').'</th>
<th width="12%" class="text-center">'.tr('Iva').'</th>
<th width="10%" class="text-center">'.tr('Imponibile').'</th>
<th width="80"></th>
</tr>
</thead>
<tr>
<th>'.tr('Descrizione').'</th>
<th width="120">'.tr('Q.').'</th>
<th width="80">'.tr('U.m.').'</th>
<th width="120">'.tr('Costo unitario').'</th>
<th width="120">'.tr('Iva').'</th>
<th width="120">'.tr('Imponibile').'</th>
<th width="60"></th>
</tr>
</thead>
<tbody class="sortable">';
// se ho almeno un articolo caricato mostro la riga
if (!empty($rs_art)) {
foreach ($rs_art as $r) {
// descrizione
echo '
foreach ($rs as $r) {
// Descrizione
echo '
<tr data-id="'.$r['id'].'">
<td>';
if (!empty($r['idarticolo'])) {
echo Modules::link('Articoli', $r['idarticolo'], $r['codice'].' - '.$r['descrizione']);
} else {
echo nl2br($r['descrizione']);
}
if (!empty($r['idarticolo'])) {
echo Modules::link('Articoli', $r['idarticolo'], $r['codice'].' - '.$r['descrizione']);
} else {
echo nl2br($r['descrizione']);
}
echo '
echo '
</td>';
// q.tà
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['qta']);
}
// Q.tà
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['qta'], 'qta');
}
echo '
</td>';
// um
echo '
// um
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo '
if (empty($r['is_descrizione'])) {
echo '
'.$r['um'];
}
echo '
}
echo '
</td>';
// costo unitario
// Costo unitario
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['subtotale'] / $r['qta']).' &euro;';
}
echo'
</td>';
// iva
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
if ($r['sconto_unitario'] > 0) {
echo '
'.Translator::numberToLocale($r['iva'])." &euro;<br>
<small class='help-block'>".$r['desc_iva'].'</small>';
}
echo '
</td>';
// Imponibile
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['subtotale']).' &euro;';
if ($r['sconto_unitario'] > 0) {
echo '
<br><small class="label label-danger">- '.tr('sconto _TOT_ _TYPE_', [
<br><small class="label label-danger">'.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'</small>';
}
}
echo '
}
echo'
</td>';
// Possibilità di rimuovere una riga solo se il preventivo non è stato pagato
// IVA
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['iva'])." &euro;<br>
<small class='help-block'>".$r['desc_iva'].'</small>';
}
echo '
</td>';
// Imponibile
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['subtotale'] - $r['sconto']).' &euro;';
}
echo '
</td>';
// Possibilità di rimuovere una riga solo se il preventivo non è stato pagato
echo '
<td class="text-center">';
if ($records[0]['stato'] != 'Pagato' && empty($r['sconto_globale'])) {
echo '
if ($records[0]['stato'] != 'Pagato' && empty($r['sconto_globale'])) {
echo '
<form action="'.$rootdir.'/editor.php?id_module='.Modules::get('Contratti')['id'].'&id_record='.$id_record.'" method="post" id="delete-form-'.$r['id'].'" role="form">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="id_record" value="'.$id_record.'">
@ -120,38 +110,44 @@ if (!empty($rs_art)) {
<div class="btn-group">';
echo "
echo "
<a class='btn btn-xs btn-warning' onclick=\"launch_modal('Modifica riga', '".$rootdir.'/modules/contratti/row-edit.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id']."', 1 );\"><i class='fa fa-edit'></i></a>
<a href='javascript:;' class='btn btn-xs btn-danger' title='Rimuovi questa riga' onclick=\"if( confirm('Rimuovere questa riga dal contratto?') ){ $('#delete-form-".$r['id']."').submit(); }\"><i class='fa fa-trash'></i></a>";
echo '
echo '
</div>
</form>';
}
}
if (empty($r['sconto_globale'])) {
echo '
if (empty($r['sconto_globale'])) {
echo '
<div class="handle clickable" style="padding:10px">
<i class="fa fa-sort"></i>
</div>';
}
}
echo '
echo '
</td>
</tr>';
$iva_art += $r['iva'];
$imponibile_art += $r['subtotale'] - $r['sconto'];
$imponibile_nosconto += $r['subtotale'];
$sconto_art += $r['sconto'];
}
}
// Calcoli
$imponibile = sum(array_column($rs, 'subtotale'));
$sconto = sum(array_column($rs, 'sconto'));
$iva = sum(array_column($rs, 'iva'));
$imponibile_scontato = sum($imponibile, -$sconto);
$totale = sum([
$imponibile_scontato,
$iva,
]);
echo '
</tbody>';
// SCONTO
if (abs($sconto_art) > 0) {
if (abs($sconto) > 0) {
// Totale imponibile scontato
echo '
<tr>
@ -159,7 +155,7 @@ if (abs($sconto_art) > 0) {
<b>'.tr('Imponibile', [], ['upper' => true]).':</b>
</td>
<td class="text-right">
<span id="budget">'.Translator::numberToLocale($imponibile_nosconto).' &euro;</span>
<span id="budget">'.Translator::numberToLocale($imponibile).' &euro;</span>
</td>
<td></td>
</tr>';
@ -170,7 +166,7 @@ if (abs($sconto_art) > 0) {
<b>'.tr('Sconto', [], ['upper' => true]).':</b>
</td>
<td class="text-right">
'.Translator::numberToLocale($sconto_art).' &euro;
'.Translator::numberToLocale($sconto).' &euro;
</td>
<td></td>
</tr>';
@ -182,7 +178,7 @@ if (abs($sconto_art) > 0) {
<b>'.tr('Imponibile scontato', [], ['upper' => true]).':</b>
</td>
<td class="text-right">
'.Translator::numberToLocale($imponibile_art).' &euro;
'.Translator::numberToLocale($imponibile_scontato).' &euro;
</td>
<td></td>
</tr>';
@ -194,7 +190,7 @@ if (abs($sconto_art) > 0) {
<b>'.tr('Imponibile', [], ['upper' => true]).':</b>
</td>
<td class="text-right">
<span id="budget">'.Translator::numberToLocale($imponibile_art).' &euro;</span>
<span id="budget">'.Translator::numberToLocale($imponibile).' &euro;</span>
</td>
<td></td>
</tr>';
@ -207,7 +203,7 @@ echo '
<b>'.tr('Iva', [], ['upper' => true]).':</b>
</td>
<td class="text-right">
'.Translator::numberToLocale($iva_art).' &euro;
'.Translator::numberToLocale($iva).' &euro;
</td>
<td></td>
</tr>';
@ -219,7 +215,7 @@ echo '
<b>'.tr('Totale', [], ['upper' => true]).':</b>
</td>
<td class="text-right">
'.Translator::numberToLocale($imponibile_art + $iva_art).' &euro;
'.Translator::numberToLocale($totale).' &euro;
</td>
<td></td>
</tr>';

Some files were not shown because too many files have changed in this diff Show More