Modifica modutil per permettere aggiunta custom

This commit is contained in:
Pek5892 2023-12-06 16:48:54 +01:00
parent 09fe13d5d9
commit 0c41dc9bb8
13 changed files with 1314 additions and 1195 deletions

View File

@ -22,20 +22,38 @@
*
* @return array
*/
function customStructure()
{
$results = [];
$dirs = [
'modules',
'templates',
'plugins',
];
if (!function_exists('customStructure')) {
function customStructure()
{
$results = [];
// Controlli di personalizzazione fisica
foreach ($dirs as $dir) {
$files = glob(base_dir().'/'.$dir.'/*/custom/*.{php,html}', GLOB_BRACE);
$recursive_files = glob(base_dir().'/'.$dir.'/*/custom/**/*.{php,html}', GLOB_BRACE);
$dirs = [
'modules',
'templates',
'plugins',
];
// Controlli di personalizzazione fisica
foreach ($dirs as $dir) {
$files = glob(base_dir().'/'.$dir.'/*/custom/*.{php,html}', GLOB_BRACE);
$recursive_files = glob(base_dir().'/'.$dir.'/*/custom/**/*.{php,html}', GLOB_BRACE);
$files = array_merge($files, $recursive_files);
foreach ($files as $file) {
$file = str_replace(base_dir().'/', '', $file);
$result = explode('/custom/', $file)[0];
if (!in_array($result, $results)) {
$results[] = $result;
}
}
}
// Gestione cartella include
$files = glob(base_dir().'/include/custom/*.{php,html}', GLOB_BRACE);
$recursive_files = glob(base_dir().'/include/custom/**/*.{php,html}', GLOB_BRACE);
$files = array_merge($files, $recursive_files);
@ -47,24 +65,9 @@ function customStructure()
$results[] = $result;
}
}
return $results;
}
// Gestione cartella include
$files = glob(base_dir().'/include/custom/*.{php,html}', GLOB_BRACE);
$recursive_files = glob(base_dir().'/include/custom/**/*.{php,html}', GLOB_BRACE);
$files = array_merge($files, $recursive_files);
foreach ($files as $file) {
$file = str_replace(base_dir().'/', '', $file);
$result = explode('/custom/', $file)[0];
if (!in_array($result, $results)) {
$results[] = $result;
}
}
return $results;
}
/**
@ -72,20 +75,22 @@ function customStructure()
*
* @return array
*/
function customTables()
{
$tables = include base_dir().'/update/tables.php';
if (!function_exists('customTables')) {
function customTables()
{
$tables = include base_dir().'/update/tables.php';
$names = [];
foreach ($tables as $table) {
$names[] = prepare($table);
$names = [];
foreach ($tables as $table) {
$names[] = prepare($table);
}
$database = database();
$results = $database->fetchArray('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '.prepare($database->getDatabaseName()).' AND TABLE_NAME NOT IN ('.implode(',', $names).") AND TABLE_NAME != 'updates'");
return array_column($results, 'TABLE_NAME');
}
$database = database();
$results = $database->fetchArray('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '.prepare($database->getDatabaseName()).' AND TABLE_NAME NOT IN ('.implode(',', $names).") AND TABLE_NAME != 'updates'");
return array_column($results, 'TABLE_NAME');
}
/**
@ -93,44 +98,49 @@ function customTables()
*
* @return array
*/
function customDatabase()
{
$database = database();
$modules = $database->fetchArray("SELECT name, CONCAT('modules/', directory) AS directory FROM zz_modules WHERE options2 != ''");
$plugins = $database->fetchArray("SELECT name, CONCAT('plugins/', directory) AS directory FROM zz_plugins WHERE options2 != ''");
$results = array_merge($modules, $plugins);
if (!function_exists('customDatabase')) {
function customDatabase()
{
$database = database();
$modules = $database->fetchArray("SELECT name, CONCAT('modules/', directory) AS directory FROM zz_modules WHERE options2 != ''");
$plugins = $database->fetchArray("SELECT name, CONCAT('plugins/', directory) AS directory FROM zz_plugins WHERE options2 != ''");
return $results;
$results = array_merge($modules, $plugins);
return $results;
}
}
function customComponents()
{
$database_check = customDatabase();
$structure_check = customStructure();
if (!function_exists('customComponents')) {
function customComponents()
{
$database_check = customDatabase();
$structure_check = customStructure();
$list = [];
foreach ($database_check as $element) {
$pos = array_search($element['directory'], $structure_check);
$list = [];
foreach ($database_check as $element) {
$pos = array_search($element['directory'], $structure_check);
$list[] = [
'path' => $element['directory'],
'database' => true,
'directory' => $pos !== false,
];
$list[] = [
'path' => $element['directory'],
'database' => true,
'directory' => $pos !== false,
];
if ($pos !== false) {
unset($structure_check[$pos]);
if ($pos !== false) {
unset($structure_check[$pos]);
}
}
}
foreach ($structure_check as $element) {
$list[] = [
'path' => $element,
'database' => false,
'directory' => true,
];
}
foreach ($structure_check as $element) {
$list[] = [
'path' => $element,
'database' => false,
'directory' => true,
];
}
return $list;
}
return $list;
}
}

View File

@ -22,27 +22,29 @@ include_once __DIR__.'/../../core.php';
/**
* Funzione per aggiornare le sedi nei movimenti di magazzino.
*/
function aggiorna_sedi_movimenti($module, $id)
{
$dbo = database();
if (!function_exists('aggiorna_sedi_movimenti')) {
function aggiorna_sedi_movimenti($module, $id)
{
$dbo = database();
if ($module == 'ddt') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM dt_ddt INNER JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($id));
if ($module == 'ddt') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM dt_ddt INNER JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($id));
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\DDT\DDT').' AND reference_id='.prepare($id));
} elseif ($module == 'documenti') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM co_documenti INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($id));
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\DDT\DDT').' AND reference_id='.prepare($id));
} elseif ($module == 'documenti') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM co_documenti INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($id));
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Fatture\Fattura').' AND reference_id='.prepare($id));
} elseif ($module == 'interventi') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione FROM in_interventi WHERE in_interventi.id='.prepare($id));
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Fatture\Fattura').' AND reference_id='.prepare($id));
} elseif ($module == 'interventi') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione FROM in_interventi WHERE in_interventi.id='.prepare($id));
$idsede = $rs[0]['idsede_partenza'];
$idsede = $rs[0]['idsede_partenza'];
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Interventi\Intervento').' AND reference_id='.prepare($id));
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Interventi\Intervento').' AND reference_id='.prepare($id));
}
}
}
}

View File

@ -17,185 +17,191 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
function renderChecklist($check, $level = 1, $parent = 0)
{
global $structure;
if (!function_exists('renderChecklist')) {
function renderChecklist($check, $level = 1, $parent = 0)
{
global $structure;
$user = auth()->getUser();
$enabled = $check->assignedUsers ? ($check->assignedUsers->pluck('id')->search($user->id) !== false || ($user->idgruppo) == 1) : true;
$user = auth()->getUser();
$enabled = $check->assignedUsers ? ($check->assignedUsers->pluck('id')->search($user->id) !== false || ($user->idgruppo) == 1) : true;
$margin = ($level * 20);
$margin = ($level * 20);
$result = '
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tr>';
if ($check->is_titolo) {
$result .= '
<td style="width:40px;"></td>
<td colspan="3" style="border-top:0px;">
<span class="text unblockable"><big>'.$check->content.'</big></span>
</td>';
} else {
$result .= '
<td style="width:40px;text-align:center;border-top:0px;border-left:3px solid #eaeaea;">
<input type="checkbox" class="checkbox unblockable" data-id="'.$check->id.'" value="'.(!empty($check->checked_at) ? '1' : '0').'" '.(!empty($check->checked_at) ? 'checked' : '').' '.(!$enabled ? 'disabled' : '').'>
</td>';
$result .= '
<td style="border-top:0px;">
<span class="text unblockable" style="'.(!empty($check->checked_at) ? 'text-decoration:line-through;' : '').'">'.$check->content.' </span>
</td>';
$result .= '
<td style="border-top:0px;">
<span class="label label-default pull-right verificato '.(!$check->checked_at ? 'hidden' : '').'" style="margin-right:5px;padding:6px 8px;">'.(!empty($check->checked_at) ? tr('Verificato da _NAME_ il _DATE_', [
'_NAME_' => $check->checkUser->username,
'_DATE_' => timestampFormat($check->checked_at),
]) : '').'
</span>
</td>';
$result .= '
<td style="width:500px;border-top:0px;">
{[ "type": "textarea", "class": "unblockable", "name": "note_checklist", "placeholder": "'.tr('Note').'...", "id": "note_'.$check->id.'", "value": "'.$check->note.'" ]}
</td>';
$result .= '
<td style="width:150px;border-top:0px;">
<button class="btn btn-default btn-xs '.(!$enabled ? 'disabled' : '').' save-nota" onclick="saveNota(\''.$check->id.'\')"><i class="fa fa-check"></i> '.tr('Salva nota').'</button>';
if (intval($check->assignedUsers->pluck('id')->toArray()) > 0) {
$result .= ' <span class="label label-info pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="Assegnato a '.implode(', ', $check->assignedUsers->pluck('username')->toArray()).'"><i class="fa fa-user"></i></span>';
$result = '
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tr>';
if ($check->is_titolo) {
$result .= '
<td style="width:40px;"></td>
<td colspan="3" style="border-top:0px;">
<span class="text unblockable"><big>'.$check->content.'</big></span>
</td>';
} else {
$result .= ' <span class="label label-danger pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="'.tr('Nessun utente assegnato').'"><i class="fa fa-user-times"></i></span>';
$result .= '
<td style="width:40px;text-align:center;border-top:0px;border-left:3px solid #eaeaea;">
<input type="checkbox" class="checkbox unblockable" data-id="'.$check->id.'" value="'.(!empty($check->checked_at) ? '1' : '0').'" '.(!empty($check->checked_at) ? 'checked' : '').' '.(!$enabled ? 'disabled' : '').'>
</td>';
$result .= '
<td style="border-top:0px;">
<span class="text unblockable" style="'.(!empty($check->checked_at) ? 'text-decoration:line-through;' : '').'">'.$check->content.' </span>
</td>';
$result .= '
<td style="border-top:0px;">
<span class="label label-default pull-right verificato '.(!$check->checked_at ? 'hidden' : '').'" style="margin-right:5px;padding:6px 8px;">'.(!empty($check->checked_at) ? tr('Verificato da _NAME_ il _DATE_', [
'_NAME_' => $check->checkUser->username,
'_DATE_' => timestampFormat($check->checked_at),
]) : '').'
</span>
</td>';
$result .= '
<td style="width:500px;border-top:0px;">
{[ "type": "textarea", "class": "unblockable", "name": "note_checklist", "placeholder": "'.tr('Note').'...", "id": "note_'.$check->id.'", "value": "'.$check->note.'" ]}
</td>';
$result .= '
<td style="width:150px;border-top:0px;">
<button class="btn btn-default btn-xs '.(!$enabled ? 'disabled' : '').' save-nota" onclick="saveNota(\''.$check->id.'\')"><i class="fa fa-check"></i> '.tr('Salva nota').'</button>';
if (intval($check->assignedUsers->pluck('id')->toArray()) > 0) {
$result .= ' <span class="label label-info pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="Assegnato a '.implode(', ', $check->assignedUsers->pluck('username')->toArray()).'"><i class="fa fa-user"></i></span>';
} else {
$result .= ' <span class="label label-danger pull-right" style="padding:6px 8px;" data-toggle="tooltip" title="'.tr('Nessun utente assegnato').'"><i class="fa fa-user-times"></i></span>';
}
$result .= '
</td>';
}
$result .= '
</td>';
}
<td style="width:10px;text-align:center;border-top:0px;">
<div class="input-group-btn">
<button class="btn btn-warning btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
<button class="btn btn-danger btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true"><i class="fa fa-sort"></i></button>
</div>
</td>';
$result .= '
<td style="width:10px;text-align:center;border-top:0px;">
<div class="input-group-btn">
<button class="btn btn-warning btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
<button class="btn btn-danger btn-xs '.(!$enabled ? 'disabled' : '').'" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true"><i class="fa fa-sort"></i></button>
</div>
</td>';
$result .= '
</tr>';
if (sizeof($check->children) > 0) {
$result .= '
<tr>
<td colspan="5" style="padding-left:'.$margin.'px;padding-right:10px;padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tbody class="sort" data-sonof="'.$check->id.'">';
$children = $structure->checks()->where('id_parent', $check->id)->orderBy('order')->get();
</tr>';
if (sizeof($check->children) > 0) {
$result .= '
<tr>
<td colspan="5" style="padding-left:'.$margin.'px;padding-right:10px;padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tbody class="sort" data-sonof="'.$check->id.'">';
$children = $structure->checks()->where('id_parent', $check->id)->orderBy('order')->get();
foreach ($children as $child) {
$result .= renderChecklist($child, $level + 1, $check->id);
}
$result .= '
</tbody>
</table>
</td>
</tr>';
}
$result .= '
</table>
</td>
</tr>';
return $result;
}
}
if (!function_exists('renderChecklistInserimento')) {
function renderChecklistInserimento($check, $level = 1, $parent = 0)
{
global $record;
$margin = ($level * 20);
$result = '
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tr>';
$result .= '
<td style="width:40px;border-top:0px;border-left:3px solid #eaeaea;">';
$result .= '
<span class="text">'.$check->content.'</span>';
$result .= '
</td>';
$result .= '
<td style="width:40px;text-align:right;border-top:0px;">
<div class="input-group-btn">
<button class="btn btn-warning btn-xs" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
<button class="btn btn-danger btn-xs" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
</div>
</td>';
$result .= '
</tr>';
if (sizeof($check->children) > 0) {
$result .= '
<tr>
<td colspan="4" style="padding-left:'.$margin.'px;padding-right:0px;padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tbody class="sort" data-sonof="'.$check->id.'">';
$children = $record->checks()->where('id_parent', $check->id)->orderBy('order')->get();
foreach ($children as $child) {
$result .= renderChecklistInserimento($child, $level + 1, $check->id);
}
$result .= '
</tbody>
</table>
</td>
</tr>';
}
$result .= '
</table>
</td>
<td style="width:40px;text-align:center;border-top:0px;">
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true">
<i class="fa fa-sort"></i>
</button>
</td>
</tr>';
return $result;
}
}
if (!function_exists('renderChecklistHtml')) {
function renderChecklistHtml($check, $level = 0)
{
$user = auth()->getUser();
$enabled = $check->assignedUsers ? $check->assignedUsers->pluck('id')->search($user->id) !== false : true;
$width = 10 + 20 * $level;
$result = '
<tr>
<td class="text-center" style="width:30px;">
'.(!empty($check->checked_at) ? '<img src="'.ROOTDIR.'/templates/interventi/check.png" style="width:10px;">' : '').'
</td>
<td style="padding-left:'.$width.'px;">
<span class="text"><b>'.$check->content.'</b>'.(!empty($check->value) ? ': '.$check->value : '').'</span>
</td>
</tr>';
$children = $check->children;
foreach ($children as $child) {
$result .= renderChecklist($child, $level + 1, $check->id);
$result .= renderChecklistHtml($child, $level + 1);
}
$result .= '
</tbody>
</table>
</td>
</tr>';
return $result;
}
$result .= '
</table>
</td>
</tr>';
return $result;
}
function renderChecklistInserimento($check, $level = 1, $parent = 0)
{
global $record;
$margin = ($level * 20);
$result = '
<tr id="check_'.$check->id.'" data-id="'.$check->id.'" class="sortablerow sonof_'.$parent.'" >
<td style="padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tr>';
$result .= '
<td style="width:40px;border-top:0px;border-left:3px solid #eaeaea;">';
$result .= '
<span class="text">'.$check->content.'</span>';
$result .= '
</td>';
$result .= '
<td style="width:40px;text-align:right;border-top:0px;">
<div class="input-group-btn">
<button class="btn btn-warning btn-xs" onclick="edit_check(\''.$check->id.'\')"><i class="fa fa-edit"></i></button>
<button class="btn btn-danger btn-xs" onclick="delete_check(\''.$check->id.'\')"><i class="fa fa-trash"></i></button>
</div>
</td>';
$result .= '
</tr>';
if (sizeof($check->children) > 0) {
$result .= '
<tr>
<td colspan="4" style="padding-left:'.$margin.'px;padding-right:0px;padding-top:0px;padding-bottom:0px;border-top:0px;">
<table class="table" style="margin-bottom:0px;">
<tbody class="sort" data-sonof="'.$check->id.'">';
$children = $record->checks()->where('id_parent', $check->id)->orderBy('order')->get();
foreach ($children as $child) {
$result .= renderChecklistInserimento($child, $level + 1, $check->id);
}
$result .= '
</tbody>
</table>
</td>
</tr>';
}
$result .= '
</table>
</td>
<td style="width:40px;text-align:center;border-top:0px;">
<button class="btn btn-xs btn-default handle" title="Modifica ordine delle righe" draggable="true">
<i class="fa fa-sort"></i>
</button>
</td>
</tr>';
return $result;
}
function renderChecklistHtml($check, $level = 0)
{
$user = auth()->getUser();
$enabled = $check->assignedUsers ? $check->assignedUsers->pluck('id')->search($user->id) !== false : true;
$width = 10 + 20 * $level;
$result = '
<tr>
<td class="text-center" style="width:30px;">
'.(!empty($check->checked_at) ? '<img src="'.ROOTDIR.'/templates/interventi/check.png" style="width:10px;">' : '').'
</td>
<td style="padding-left:'.$width.'px;">
<span class="text"><b>'.$check->content.'</b>'.(!empty($check->value) ? ': '.$check->value : '').'</span>
</td>
</tr>';
$children = $check->children;
foreach ($children as $child) {
$result .= renderChecklistHtml($child, $level + 1);
}
return $result;
}

View File

@ -7,22 +7,24 @@
*
* @return array|array[]
*/
function cartesian($input)
{
$result = [[]];
if (!function_exists('cartesian')) {
function cartesian($input)
{
$result = [[]];
foreach ($input as $key => $values) {
$append = [];
foreach ($input as $key => $values) {
$append = [];
foreach ($result as $product) {
foreach ($values as $item) {
$product[$key] = $item;
$append[] = $product;
foreach ($result as $product) {
foreach ($values as $item) {
$product[$key] = $item;
$append[] = $product;
}
}
$result = $append;
}
$result = $append;
return $result;
}
return $result;
}
}

View File

@ -25,19 +25,23 @@ use Modules\Interventi\Intervento;
/**
* Calcolo imponibile contratto (totale_righe - sconto).
*/
function get_imponibile_contratto($idcontratto)
{
$contratto = Contratto::find($idcontratto);
if (!function_exists('get_imponibile_contratto')) {
function get_imponibile_contratto($idcontratto)
{
$contratto = Contratto::find($idcontratto);
return $contratto->totale_imponibile;
return $contratto->totale_imponibile;
}
}
function get_totale_interventi_contratto($idcontratto)
{
$interventi = Intervento::where('id_contratto', $idcontratto)->get();
$array_interventi = $interventi->toArray();
if (!function_exists('get_totale_interventi_contratto')) {
function get_totale_interventi_contratto($idcontratto)
{
$interventi = Intervento::where('id_contratto', $idcontratto)->get();
$array_interventi = $interventi->toArray();
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
return $totale;
}
return $totale;
}
}

View File

@ -27,11 +27,13 @@ use Util\Generator;
*
* @deprecated 2.4.5
*/
function get_new_numeroddt($data)
{
global $dir;
if (!function_exists('get_new_numeroddt')) {
function get_new_numeroddt($data)
{
global $dir;
return DDT::getNextNumero($data, $dir);
return DDT::getNextNumero($data, $dir);
}
}
/**
@ -39,12 +41,14 @@ function get_new_numeroddt($data)
*
* @deprecated 2.4.5
*/
function get_new_numerosecondarioddt($data)
{
global $dir;
global $id_segment;
if (!function_exists('get_new_numerosecondarioddt')) {
function get_new_numerosecondarioddt($data)
{
global $dir;
global $id_segment;
return DDT::getNextNumeroSecondario($data, $dir, $id_segment);
return DDT::getNextNumeroSecondario($data, $dir, $id_segment);
}
}
/**
@ -52,11 +56,13 @@ function get_new_numerosecondarioddt($data)
*
* @deprecated 2.4.5
*/
function get_imponibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
if (!function_exists('get_imponibile_ddt')) {
function get_imponibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
return $ddt->imponibile;
return $ddt->imponibile;
}
}
/**
@ -64,23 +70,26 @@ function get_imponibile_ddt($id_ddt)
*
* @deprecated 2.4.5
*/
function get_totale_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
if (!function_exists('get_totale_ddt')) {
function get_totale_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
return $ddt->totale;
return $ddt->totale;
}
}
/**
* Calcolo netto a pagare ddt (totale - ritenute - bolli).
*
* @deprecated 2.4.5
*/
function get_netto_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
if (!function_exists('get_netto_ddt')) {
function get_netto_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
return $ddt->netto;
return $ddt->netto;
}
}
/**
@ -88,11 +97,13 @@ function get_netto_ddt($id_ddt)
*
* @deprecated 2.4.5
*/
function get_ivadetraibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
if (!function_exists('get_ivadetraibile_ddt')) {
function get_ivadetraibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
return $ddt->iva_detraibile;
return $ddt->iva_detraibile;
}
}
/**
@ -100,11 +111,13 @@ function get_ivadetraibile_ddt($id_ddt)
*
* @deprecated 2.4.5
*/
function get_ivaindetraibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
if (!function_exists('get_ivaindetraibile_ddt')) {
function get_ivaindetraibile_ddt($id_ddt)
{
$ddt = DDT::find($id_ddt);
return $ddt->iva_indetraibile;
return $ddt->iva_indetraibile;
}
}
/**
@ -115,148 +128,154 @@ function get_ivaindetraibile_ddt($id_ddt)
* $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_ddt($idddt, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
{
global $dir;
if (!function_exists('ricalcola_costiagg_ddt')) {
function ricalcola_costiagg_ddt($idddt, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
{
global $dir;
$dbo = database();
$dbo = database();
// Se ci sono righe nel ddt faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
$query = "SELECT COUNT(id) AS righe FROM dt_righe_ddt WHERE idddt='$idddt'";
$rs = $dbo->fetchArray($query);
if ($rs[0]['righe'] > 0) {
$totale_imponibile = get_imponibile_ddt($idddt);
$totale_ddt = get_totale_ddt($idddt);
// Leggo gli id dei costi aggiuntivi
if ($dir == 'uscita') {
$query2 = "SELECT idrivalsainps, idritenutaacconto, bollo FROM dt_ddt WHERE id='$idddt'";
$rs2 = $dbo->fetchArray($query2);
$idrivalsainps = $rs2[0]['idrivalsainps'];
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
$bollo = $rs2[0]['bollo'];
}
// Leggo la rivalsa inps se c'è (per i ddt di vendita lo leggo dalle impostazioni)
if ($dir == 'entrata') {
if (!empty($idrivalsainps)) {
$idrivalsainps = setting('Cassa previdenziale predefinita');
}
}
$query = "SELECT percentuale FROM co_rivalse WHERE id='".$idrivalsainps."'";
// Se ci sono righe nel ddt faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
$query = "SELECT COUNT(id) AS righe FROM dt_righe_ddt WHERE idddt='$idddt'";
$rs = $dbo->fetchArray($query);
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
if ($rs[0]['righe'] > 0) {
$totale_imponibile = get_imponibile_ddt($idddt);
$totale_ddt = get_totale_ddt($idddt);
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
$qi = "SELECT percentuale FROM co_iva WHERE id='".setting('Iva predefinita')."'";
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
// Leggo gli id dei costi aggiuntivi
if ($dir == 'uscita') {
$query2 = "SELECT idrivalsainps, idritenutaacconto, bollo FROM dt_ddt WHERE id='$idddt'";
$rs2 = $dbo->fetchArray($query2);
$idrivalsainps = $rs2[0]['idrivalsainps'];
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
$bollo = $rs2[0]['bollo'];
}
// Aggiorno la rivalsa inps
$dbo->query("UPDATE dt_ddt SET rivalsainps='$rivalsainps', iva_rivalsainps='$iva_rivalsainps' WHERE id='$idddt'");
$totale_ddt = get_totale_ddt($idddt);
// Leggo la ritenuta d'acconto se c'è (per i ddt di vendita lo leggo dalle impostazioni)
if (!empty($idritenutaacconto)) {
// Leggo la rivalsa inps se c'è (per i ddt di vendita lo leggo dalle impostazioni)
if ($dir == 'entrata') {
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
}
}
$query = "SELECT percentuale FROM co_ritenutaacconto WHERE id='".$idritenutaacconto."'";
$rs = $dbo->fetchArray($query);
$ritenutaacconto = $totale_ddt / 100 * $rs[0]['percentuale'];
$netto_a_pagare = $totale_ddt - $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') {
if ($bolli != 0.00) {
$bolli = str_replace(',', '.', $bolli);
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = str_replace(',', '.', $bolli);
} else {
$marca_da_bollo = 0.00;
if (!empty($idrivalsainps)) {
$idrivalsainps = setting('Cassa previdenziale predefinita');
}
}
} else {
$marca_da_bollo = 0.00;
}
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='$ritenutaacconto', bollo='$marca_da_bollo' WHERE id='$idddt'");
} else {
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id='$idddt'");
$query = "SELECT percentuale FROM co_rivalse WHERE id='".$idrivalsainps."'";
$rs = $dbo->fetchArray($query);
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
$qi = "SELECT percentuale FROM co_iva WHERE id='".setting('Iva predefinita')."'";
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
// Aggiorno la rivalsa inps
$dbo->query("UPDATE dt_ddt SET rivalsainps='$rivalsainps', iva_rivalsainps='$iva_rivalsainps' WHERE id='$idddt'");
$totale_ddt = get_totale_ddt($idddt);
// Leggo la ritenuta d'acconto se c'è (per i ddt di vendita lo leggo dalle impostazioni)
if (!empty($idritenutaacconto)) {
if ($dir == 'entrata') {
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
}
}
$query = "SELECT percentuale FROM co_ritenutaacconto WHERE id='".$idritenutaacconto."'";
$rs = $dbo->fetchArray($query);
$ritenutaacconto = $totale_ddt / 100 * $rs[0]['percentuale'];
$netto_a_pagare = $totale_ddt - $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') {
if ($bolli != 0.00) {
$bolli = str_replace(',', '.', $bolli);
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = str_replace(',', '.', $bolli);
} else {
$marca_da_bollo = 0.00;
}
}
} else {
$marca_da_bollo = 0.00;
}
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='$ritenutaacconto', bollo='$marca_da_bollo' WHERE id='$idddt'");
} else {
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id='$idddt'");
}
}
}
/**
* Restituisce lo stato del ddt in base alle righe.
*/
function get_stato_ddt($idddt)
{
$dbo = database();
if (!function_exists('get_stato_ddt')) {
function get_stato_ddt($idddt)
{
$dbo = database();
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM dt_righe_ddt GROUP BY idddt HAVING idddt='.prepare($idddt));
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM dt_righe_ddt GROUP BY idddt HAVING idddt='.prepare($idddt));
if ($rs[0]['qta'] == 0) {
return 'Bozza';
} else {
if ($rs[0]['qta_evasa'] > 0) {
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
return 'Parzialmente fatturato';
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
return 'Fatturato';
}
if ($rs[0]['qta'] == 0) {
return 'Bozza';
} else {
return 'Evaso';
if ($rs[0]['qta_evasa'] > 0) {
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
return 'Parzialmente fatturato';
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
return 'Fatturato';
}
} else {
return 'Evaso';
}
}
}
}
function verifica_numero_ddt(DDT $ddt)
{
global $dbo;
if (!function_exists('verifica_numero_ddt')) {
function verifica_numero_ddt(DDT $ddt)
{
global $dbo;
$data = $ddt->data;
$tipo = $ddt->tipo;
$dir = $ddt->direzione;
$numero = ($dir == 'entrata' ? $ddt->numero_esterno : $ddt->numero);
$campo = ($dir == 'entrata' ? 'numero_esterno' : 'numero');
$data = $ddt->data;
$tipo = $ddt->tipo;
$dir = $ddt->direzione;
$numero = ($dir == 'entrata' ? $ddt->numero_esterno : $ddt->numero);
$campo = ($dir == 'entrata' ? 'numero_esterno' : 'numero');
if (empty($numero)) {
return null;
}
$documenti = DDT::where('idtipoddt', $tipo->id)
->where('data', $data)
->get();
// Recupero maschera per questo segmento
$maschera = setting('Formato numero secondario ddt');
$ultimo = Generator::getPreviousFrom($maschera, 'dt_ddt', $campo, [
'data < '.prepare(date('Y-m-d', strtotime($data))),
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
'idtipoddt = '.prepare($tipo->id),
], $data);
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->numero_esterno == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $ddt->numero_esterno);
if (empty($numero)) {
return null;
}
$documenti = DDT::where('idtipoddt', $tipo->id)
->where('data', $data)
->get();
// Recupero maschera per questo segmento
$maschera = setting('Formato numero secondario ddt');
$ultimo = Generator::getPreviousFrom($maschera, 'dt_ddt', $campo, [
'data < '.prepare(date('Y-m-d', strtotime($data))),
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
'idtipoddt = '.prepare($tipo->id),
], $data);
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->numero_esterno == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $ddt->numero_esterno);
return null;
}
}

View File

@ -25,12 +25,14 @@ use Util\Generator;
*
* @deprecated 2.4.5
*/
function get_new_numerofattura($data)
{
global $dir;
global $id_segment;
if (!function_exists('get_new_numerofattura')) {
function get_new_numerofattura($data)
{
global $dir;
global $id_segment;
return Fattura::getNextNumero($data, $dir, $id_segment);
return Fattura::getNextNumero($data, $dir, $id_segment);
}
}
/**
@ -38,12 +40,15 @@ function get_new_numerofattura($data)
*
* @deprecated 2.4.5
*/
function get_new_numerosecondariofattura($data)
{
global $dir;
global $id_segment;
return Fattura::getNextNumeroSecondario($data, $dir, $id_segment);
if (!function_exists('get_new_numerosecondariofattura')) {
function get_new_numerosecondariofattura($data)
{
global $dir;
global $id_segment;
return Fattura::getNextNumeroSecondario($data, $dir, $id_segment);
}
}
/**
@ -51,11 +56,14 @@ function get_new_numerosecondariofattura($data)
*
* @deprecated 2.4.5
*/
function get_imponibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->imponibile;
if (!function_exists('get_imponibile_fattura')) {
function get_imponibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->imponibile;
}
}
/**
@ -63,23 +71,26 @@ function get_imponibile_fattura($iddocumento)
*
* @deprecated 2.4.5
*/
function get_totale_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
if (!function_exists('get_totale_fattura')) {
function get_totale_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->totale;
return $fattura->totale;
}
}
/**
* Calcolo netto a pagare fattura (totale - ritenute - bolli).
*
* @deprecated 2.4.5
*/
function get_netto_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
if (!function_exists('get_netto_fattura')) {
function get_netto_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->netto;
return $fattura->netto;
}
}
/**
@ -87,11 +98,13 @@ function get_netto_fattura($iddocumento)
*
* @deprecated 2.4.5
*/
function get_ivadetraibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
if (!function_exists('get_ivadetraibile_fattura')) {
function get_ivadetraibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->iva_detraibile;
return $fattura->iva_detraibile;
}
}
/**
@ -99,11 +112,14 @@ function get_ivadetraibile_fattura($iddocumento)
*
* @deprecated 2.4.5
*/
function get_ivaindetraibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->iva_indetraibile;
if (!function_exists('get_ivaindetraibile_fattura')) {
function get_ivaindetraibile_fattura($iddocumento)
{
$fattura = Fattura::find($iddocumento);
return $fattura->iva_indetraibile;
}
}
/**
@ -111,13 +127,14 @@ function get_ivaindetraibile_fattura($iddocumento)
*
* @deprecated 2.4.17
*/
function elimina_scadenze($iddocumento)
{
$fattura = Fattura::find($iddocumento);
if (!function_exists('elimina_scadenze')) {
function elimina_scadenze($iddocumento)
{
$fattura = Fattura::find($iddocumento);
$fattura->rimuoviScadenze();
$fattura->rimuoviScadenze();
}
}
/**
* Funzione per ricalcolare lo scadenzario di una determinata fattura
* $iddocumento string E' l'id del documento di cui ricalcolare lo scadenzario
@ -126,11 +143,13 @@ function elimina_scadenze($iddocumento)
*
* @deprecated 2.4.17
*/
function aggiungi_scadenza($iddocumento, $pagamento = '', $pagato = false)
{
$fattura = Fattura::find($iddocumento);
if (!function_exists('aggiungi_scadenza')) {
function aggiungi_scadenza($iddocumento, $pagamento = '', $pagato = false)
{
$fattura = Fattura::find($iddocumento);
$fattura->registraScadenze($pagato);
$fattura->registraScadenze($pagato);
}
}
/**
@ -142,14 +161,17 @@ function aggiungi_scadenza($iddocumento, $pagamento = '', $pagato = false)
*
* @deprecated 2.4.17
*/
function elimina_movimenti($id_documento, $prima_nota = 0)
{
$dbo = database();
$idmastrino = $dbo->fetchOne('SELECT idmastrino FROM co_movimenti WHERE iddocumento='.prepare($id_documento).' AND primanota='.prepare($prima_nota))['idmastrino'];
if (!function_exists('elimina_movimenti')) {
function elimina_movimenti($id_documento, $prima_nota = 0)
{
$dbo = database();
$query2 = 'DELETE FROM co_movimenti WHERE idmastrino='.prepare($idmastrino).' AND primanota='.prepare($prima_nota);
$dbo->query($query2);
$idmastrino = $dbo->fetchOne('SELECT idmastrino FROM co_movimenti WHERE iddocumento='.prepare($id_documento).' AND primanota='.prepare($prima_nota))['idmastrino'];
$query2 = 'DELETE FROM co_movimenti WHERE idmastrino='.prepare($idmastrino).' AND primanota='.prepare($prima_nota);
$dbo->query($query2);
}
}
/**
@ -160,218 +182,221 @@ function elimina_movimenti($id_documento, $prima_nota = 0)
*
* @deprecated 2.4.17
*/
function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
{
$dbo = database();
if (!function_exists('aggiungi_movimento')) {
function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
{
$dbo = database();
$fattura = Modules\Fatture\Fattura::find($iddocumento);
$is_nota = $fattura->isNota();
$fattura = Modules\Fatture\Fattura::find($iddocumento);
$is_nota = $fattura->isNota();
// Totale marca da bollo, inps, ritenuta, idagente
$query = 'SELECT data, bollo, ritenutaacconto, rivalsainps, split_payment FROM co_documenti WHERE id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$totale_bolli = $is_nota ? -$rs[0]['bollo'] : $rs[0]['bollo'];
$totale_ritenutaacconto = $is_nota ? -$rs[0]['ritenutaacconto'] : $rs[0]['ritenutaacconto'];
$totale_ritenutacontributi = $is_nota ? -$fattura->totale_ritenuta_contributi : $fattura->totale_ritenuta_contributi;
$totale_rivalsainps = $is_nota ? -$rs[0]['rivalsainps'] : $rs[0]['rivalsainps'];
$data_documento = $rs[0]['data'];
$split_payment = $rs[0]['split_payment'];
$netto_fattura = get_netto_fattura($iddocumento);
$totale_fattura = get_totale_fattura($iddocumento);
$totale_fattura = $is_nota ? -$totale_fattura : $totale_fattura;
$imponibile_fattura = get_imponibile_fattura($iddocumento);
// Calcolo l'iva della rivalsa inps
$iva_rivalsainps = 0;
$rsr = $dbo->fetchArray('SELECT idiva, rivalsainps FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento));
for ($r = 0; $r < sizeof($rsr); ++$r) {
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare($rsr[$r]['idiva']);
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps += $rsr[$r]['rivalsainps'] / 100 * $rsi[0]['percentuale'];
}
// Lettura iva indetraibile fattura
$query = 'SELECT SUM(iva_indetraibile) AS iva_indetraibile FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$iva_indetraibile_fattura = $is_nota ? -$rs[0]['iva_indetraibile'] : $rs[0]['iva_indetraibile'];
// Lettura iva delle righe in fattura
$query = 'SELECT iva FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$iva_fattura = sum(array_column($rs, 'iva'), null) + $iva_rivalsainps - $iva_indetraibile_fattura;
$iva_fattura = $is_nota ? -$iva_fattura : $iva_fattura;
// Imposto i segni + e - in base se la fattura è di acquisto o vendita
if ($dir == 'uscita') {
$segno_mov1_cliente = -1;
$segno_mov2_ricavivendite = 1;
$segno_mov3_iva = 1;
$segno_mov4_inps = 1;
$segno_mov5_ritenutaacconto = -1;
// Lettura conto fornitore
$query = 'SELECT idconto_fornitore FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
// Totale marca da bollo, inps, ritenuta, idagente
$query = 'SELECT data, bollo, ritenutaacconto, rivalsainps, split_payment FROM co_documenti WHERE id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$idconto_controparte = $rs[0]['idconto_fornitore'];
$totale_bolli = $is_nota ? -$rs[0]['bollo'] : $rs[0]['bollo'];
$totale_ritenutaacconto = $is_nota ? -$rs[0]['ritenutaacconto'] : $rs[0]['ritenutaacconto'];
$totale_ritenutacontributi = $is_nota ? -$fattura->totale_ritenuta_contributi : $fattura->totale_ritenuta_contributi;
$totale_rivalsainps = $is_nota ? -$rs[0]['rivalsainps'] : $rs[0]['rivalsainps'];
$data_documento = $rs[0]['data'];
$split_payment = $rs[0]['split_payment'];
if ($idconto_controparte == '') {
$idconto_controparte = setting('Conto per Riepilogativo fornitori');
$netto_fattura = get_netto_fattura($iddocumento);
$totale_fattura = get_totale_fattura($iddocumento);
$totale_fattura = $is_nota ? -$totale_fattura : $totale_fattura;
$imponibile_fattura = get_imponibile_fattura($iddocumento);
// Calcolo l'iva della rivalsa inps
$iva_rivalsainps = 0;
$rsr = $dbo->fetchArray('SELECT idiva, rivalsainps FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento));
for ($r = 0; $r < sizeof($rsr); ++$r) {
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare($rsr[$r]['idiva']);
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps += $rsr[$r]['rivalsainps'] / 100 * $rsi[0]['percentuale'];
}
} else {
$segno_mov1_cliente = 1;
$segno_mov2_ricavivendite = -1;
$segno_mov3_iva = -1;
$segno_mov4_inps = -1;
$segno_mov5_ritenutaacconto = 1;
// Lettura conto cliente
$query = 'SELECT idconto_cliente FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
// Lettura iva indetraibile fattura
$query = 'SELECT SUM(iva_indetraibile) AS iva_indetraibile FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$idconto_controparte = $rs[0]['idconto_cliente'];
$iva_indetraibile_fattura = $is_nota ? -$rs[0]['iva_indetraibile'] : $rs[0]['iva_indetraibile'];
if ($idconto_controparte == '') {
$idconto_controparte = setting('Conto per Riepilogativo clienti');
// Lettura iva delle righe in fattura
$query = 'SELECT iva FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$iva_fattura = sum(array_column($rs, 'iva'), null) + $iva_rivalsainps - $iva_indetraibile_fattura;
$iva_fattura = $is_nota ? -$iva_fattura : $iva_fattura;
// Imposto i segni + e - in base se la fattura è di acquisto o vendita
if ($dir == 'uscita') {
$segno_mov1_cliente = -1;
$segno_mov2_ricavivendite = 1;
$segno_mov3_iva = 1;
$segno_mov4_inps = 1;
$segno_mov5_ritenutaacconto = -1;
// Lettura conto fornitore
$query = 'SELECT idconto_fornitore FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$idconto_controparte = $rs[0]['idconto_fornitore'];
if ($idconto_controparte == '') {
$idconto_controparte = setting('Conto per Riepilogativo fornitori');
}
} else {
$segno_mov1_cliente = 1;
$segno_mov2_ricavivendite = -1;
$segno_mov3_iva = -1;
$segno_mov4_inps = -1;
$segno_mov5_ritenutaacconto = 1;
// Lettura conto cliente
$query = 'SELECT idconto_cliente FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$idconto_controparte = $rs[0]['idconto_cliente'];
if ($idconto_controparte == '') {
$idconto_controparte = setting('Conto per Riepilogativo clienti');
}
}
}
// Lettura info fattura
$query = 'SELECT *, co_documenti.data_competenza, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipo` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$n = sizeof($rs);
$data = $rs[0]['data_competenza'];
$idanagrafica = $rs[0]['idanagrafica'];
$ragione_sociale = $rs[0]['ragione_sociale'];
$stato = $rs[0]['stato'];
// Lettura info fattura
$query = 'SELECT *, co_documenti.data_competenza, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipo` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$n = sizeof($rs);
$data = $rs[0]['data_competenza'];
$idanagrafica = $rs[0]['idanagrafica'];
$ragione_sociale = $rs[0]['ragione_sociale'];
$stato = $rs[0]['stato'];
$idmastrino = get_new_idmastrino();
$idmastrino = get_new_idmastrino();
// Prendo il numero doc. esterno se c'è, altrimenti quello normale
if (!empty($rs[0]['numero_esterno'])) {
$numero = $rs[0]['numero_esterno'];
} else {
$numero = $rs[0]['numero'];
}
// Prendo il numero doc. esterno se c'è, altrimenti quello normale
if (!empty($rs[0]['numero_esterno'])) {
$numero = $rs[0]['numero_esterno'];
} else {
$numero = $rs[0]['numero'];
}
// Abbreviazioni contabili dei movimenti
$tipodoc = '';
if ($rs[0]['descrizione_tipo'] == 'Nota di credito') {
$tipodoc = 'Nota di credito';
} elseif ($rs[0]['descrizione_tipo'] == 'Nota di debito') {
$tipodoc = 'Nota di debito';
} else {
$tipodoc = 'Fattura';
}
// Abbreviazioni contabili dei movimenti
$tipodoc = '';
if ($rs[0]['descrizione_tipo'] == 'Nota di credito') {
$tipodoc = 'Nota di credito';
} elseif ($rs[0]['descrizione_tipo'] == 'Nota di debito') {
$tipodoc = 'Nota di debito';
} else {
$tipodoc = 'Fattura';
}
$descrizione = $tipodoc.' num. '.$numero;
$descrizione = $tipodoc.' num. '.$numero;
/*
Il mastrino si apre con almeno 3 righe di solito (esempio fattura di vendita):
1) dare imponibile+iva al conto cliente
2) avere imponibile sul conto dei ricavi
3) avere iva sul conto dell'iva a credito (ed eventuale iva indetraibile sul rispettivo conto)
/*
Il mastrino si apre con almeno 3 righe di solito (esempio fattura di vendita):
1) dare imponibile+iva al conto cliente
2) avere imponibile sul conto dei ricavi
3) avere iva sul conto dell'iva a credito (ed eventuale iva indetraibile sul rispettivo conto)
aggiuntivo:
4) eventuale rivalsa inps
5) eventuale ritenuta d'acconto
*/
// 1) Aggiungo la riga del conto cliente
$importo_cliente = $totale_fattura;
aggiuntivo:
4) eventuale rivalsa inps
5) eventuale ritenuta d'acconto
*/
// 1) Aggiungo la riga del conto cliente
$importo_cliente = $totale_fattura;
if ($split_payment) {
$importo_cliente = sum($importo_cliente, -$iva_fattura, 2);
}
if ($split_payment) {
$importo_cliente = sum($importo_cliente, -$iva_fattura, 2);
}
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($importo_cliente + $totale_bolli) * $segno_mov1_cliente).', '.prepare($primanota).' )';
$dbo->query($query2);
// 2) Aggiungo il totale sul conto dei ricavi/spese scelto
// Lettura descrizione conto ricavi/spese per ogni riga del documento
$righe = $dbo->fetchArray('SELECT idconto, SUM(subtotale - sconto) AS imponibile FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento).' GROUP BY idconto');
foreach ($righe as $riga) {
// Retrocompatibilità
$idconto_riga = !empty($riga['idconto']) ? $riga['idconto'] : $idconto;
$riga['imponibile'] = $is_nota ? -$riga['imponibile'] : $riga['imponibile'];
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_riga).', '.prepare($riga['imponibile'] * $segno_mov2_ricavivendite).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 3) Aggiungo il totale sul conto dell'iva
// Lettura id conto iva
if ($iva_fattura != 0 && !$split_payment) {
$descrizione_conto_iva = ($dir == 'entrata') ? 'Iva su vendite' : 'Iva su acquisti';
$idconto_iva = setting('Conto per '.$descrizione_conto_iva);
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva).', '.prepare($iva_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$dbo->query($query2);
}
// Lettura id conto iva indetraibile
if ($iva_indetraibile_fattura != 0 && !$split_payment) {
$idconto_iva2 = setting('Conto per Iva indetraibile');
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva2).', '.prepare($iva_indetraibile_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 4) Aggiungo la rivalsa INPS se c'è
// Lettura id conto inps
if ($totale_rivalsainps != 0) {
$idconto_inps = setting('Conto per Erario c/INPS');
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_inps).', '.prepare($totale_rivalsainps * $segno_mov4_inps).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 5) Aggiungo la ritenuta d'acconto se c'è
// Lettura id conto ritenuta e la storno subito
if ($totale_ritenutaacconto != 0) {
$idconto_ritenutaacconto = setting("Conto per Erario c/ritenute d'acconto");
// DARE nel conto ritenuta
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaacconto).', '.prepare($totale_ritenutaacconto * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($importo_cliente + $totale_bolli) * $segno_mov1_cliente).', '.prepare($primanota).' )';
$dbo->query($query2);
// AVERE nel riepilogativo clienti
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutaacconto * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 2) Aggiungo il totale sul conto dei ricavi/spese scelto
// Lettura descrizione conto ricavi/spese per ogni riga del documento
$righe = $dbo->fetchArray('SELECT idconto, SUM(subtotale - sconto) AS imponibile FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento).' GROUP BY idconto');
// 6) Aggiungo la ritenuta enasarco se c'è
// Lettura id conto ritenuta e la storno subito
if ($totale_ritenutacontributi != 0) {
$idconto_ritenutaenasarco = setting('Conto per Erario c/enasarco');
foreach ($righe as $riga) {
// Retrocompatibilità
$idconto_riga = !empty($riga['idconto']) ? $riga['idconto'] : $idconto;
$riga['imponibile'] = $is_nota ? -$riga['imponibile'] : $riga['imponibile'];
// DARE nel conto ritenuta
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaenasarco).', '.prepare($totale_ritenutacontributi * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$dbo->query($query2);
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_riga).', '.prepare($riga['imponibile'] * $segno_mov2_ricavivendite).', '.prepare($primanota).')';
$dbo->query($query2);
}
// AVERE nel riepilogativo clienti
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutacontributi * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$dbo->query($query2);
// 3) Aggiungo il totale sul conto dell'iva
// Lettura id conto iva
if ($iva_fattura != 0 && !$split_payment) {
$descrizione_conto_iva = ($dir == 'entrata') ? 'Iva su vendite' : 'Iva su acquisti';
$idconto_iva = setting('Conto per '.$descrizione_conto_iva);
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva).', '.prepare($iva_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$dbo->query($query2);
}
// Lettura id conto iva indetraibile
if ($iva_indetraibile_fattura != 0 && !$split_payment) {
$idconto_iva2 = setting('Conto per Iva indetraibile');
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_iva2).', '.prepare($iva_indetraibile_fattura * $segno_mov3_iva).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 4) Aggiungo la rivalsa INPS se c'è
// Lettura id conto inps
if ($totale_rivalsainps != 0) {
$idconto_inps = setting('Conto per Erario c/INPS');
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_inps).', '.prepare($totale_rivalsainps * $segno_mov4_inps).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 5) Aggiungo la ritenuta d'acconto se c'è
// Lettura id conto ritenuta e la storno subito
if ($totale_ritenutaacconto != 0) {
$idconto_ritenutaacconto = setting("Conto per Erario c/ritenute d'acconto");
// DARE nel conto ritenuta
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaacconto).', '.prepare($totale_ritenutaacconto * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$dbo->query($query2);
// AVERE nel riepilogativo clienti
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutaacconto * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$dbo->query($query2);
}
// 6) Aggiungo la ritenuta enasarco se c'è
// Lettura id conto ritenuta e la storno subito
if ($totale_ritenutacontributi != 0) {
$idconto_ritenutaenasarco = setting('Conto per Erario c/enasarco');
// DARE nel conto ritenuta
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_ritenutaenasarco).', '.prepare($totale_ritenutacontributi * $segno_mov5_ritenutaacconto).', '.prepare($primanota).')';
$dbo->query($query2);
// AVERE nel riepilogativo clienti
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_ritenutacontributi * $segno_mov5_ritenutaacconto) * -1).', '.prepare($primanota).')';
$dbo->query($query2);
}
}
}
/**
* Funzione per generare un nuovo codice per il mastrino.
*
* @deprecated 2.4.17
*/
function get_new_idmastrino($table = 'co_movimenti')
{
$dbo = database();
if (!function_exists('get_new_idmastrino')) {
function get_new_idmastrino($table = 'co_movimenti')
{
$dbo = database();
$query = 'SELECT MAX(idmastrino) AS maxidmastrino FROM '.$table;
$rs = $dbo->fetchArray($query);
$query = 'SELECT MAX(idmastrino) AS maxidmastrino FROM '.$table;
$rs = $dbo->fetchArray($query);
return intval($rs[0]['maxidmastrino']) + 1;
return intval($rs[0]['maxidmastrino']) + 1;
}
}
/**
@ -381,12 +406,15 @@ function get_new_idmastrino($table = 'co_movimenti')
*
* @deprecated 2.4.17
*/
function ricalcola_costiagg_fattura($iddocumento)
{
global $dir;
if (!function_exists('ricalcola_costiagg_fattura')) {
function ricalcola_costiagg_fattura($iddocumento)
{
global $dir;
$fattura = Fattura::find($iddocumento);
$fattura->save();
$fattura = Fattura::find($iddocumento);
$fattura->save();
}
}
/**
@ -395,42 +423,44 @@ function ricalcola_costiagg_fattura($iddocumento)
*
* @return bool|string
*/
function verifica_numero_fattura(Fattura $fattura)
{
if (empty($fattura->numero_esterno)) {
return null;
}
$id_segment = $fattura->id_segment;
$data = $fattura->data;
$documenti = Fattura::where('id_segment', '=', $id_segment)
->where('data', '=', $data)
->get();
// Recupero maschera per questo segmento
$maschera = Generator::getMaschera($id_segment);
$ultimo = Generator::getPreviousFrom($maschera, 'co_documenti', 'numero_esterno', [
'data < '.prepare(date('Y-m-d', strtotime($data))),
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
'id_segment = '.prepare($id_segment),
], $data);
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->numero_esterno == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
if (!function_exists('verifica_numero_fattura')) {
function verifica_numero_fattura(Fattura $fattura)
{
if (empty($fattura->numero_esterno)) {
return null;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $fattura->numero_esterno);
$id_segment = $fattura->id_segment;
$data = $fattura->data;
return null;
}
$documenti = Fattura::where('id_segment', '=', $id_segment)
->where('data', '=', $data)
->get();
// Recupero maschera per questo segmento
$maschera = Generator::getMaschera($id_segment);
$ultimo = Generator::getPreviousFrom($maschera, 'co_documenti', 'numero_esterno', [
'data < '.prepare(date('Y-m-d', strtotime($data))),
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
'id_segment = '.prepare($id_segment),
], $data);
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->numero_esterno == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $fattura->numero_esterno);
return null;
}
}

View File

@ -21,18 +21,20 @@ use Util\Ini;
include_once __DIR__.'/../../core.php';
function crea_form_componente($contenuto)
{
$fields = Ini::getFields($contenuto);
$title = array_shift($fields);
if (!function_exists('crea_form_componente')) {
function crea_form_componente($contenuto)
{
$fields = Ini::getFields($contenuto);
$title = array_shift($fields);
foreach ($fields as $key => $value) {
$fields[$key] = '<div class="col-md-4">'.$value.'</div>';
foreach ($fields as $key => $value) {
$fields[$key] = '<div class="col-md-4">'.$value.'</div>';
}
echo $title.'
<div class="row">
'.implode(PHP_EOL, $fields).'
<script>restart_inputs()</script>
</div>';
}
echo $title.'
<div class="row">
'.implode(PHP_EOL, $fields).'
<script>restart_inputs()</script>
</div>';
}
}

View File

@ -39,11 +39,14 @@ use Util\Ini;
*
* @deprecated
*/
function get_ore_intervento($id_intervento)
{
$intervento = Intervento::find($id_intervento);
return $intervento->ore_totali;
if (!function_exists('get_ore_intervento')) {
function get_ore_intervento($id_intervento)
{
$intervento = Intervento::find($id_intervento);
return $intervento->ore_totali;
}
}
/**
@ -56,77 +59,81 @@ function get_ore_intervento($id_intervento)
*
* @deprecated 2.4.25
*/
function link_componente_to_articolo($id_intervento, $id_impianto, $id_articolo, $qta)
{
if (empty($id_impianto) || empty($id_intervento)) {
return;
}
if (!function_exists('link_componente_to_articolo')) {
function link_componente_to_articolo($id_intervento, $id_impianto, $id_articolo, $qta)
{
if (empty($id_impianto) || empty($id_intervento)) {
return;
}
$dbo = database();
$intervento = Intervento::find($id_intervento);
$dbo = database();
$intervento = Intervento::find($id_intervento);
// Data di inizio dell'intervento (data_richiesta in caso di assenza di sessioni)
$data = $intervento->inizio ?: $intervento->data_richiesta;
// Data di inizio dell'intervento (data_richiesta in caso di assenza di sessioni)
$data = $intervento->inizio ?: $intervento->data_richiesta;
// Se l'articolo aggiunto è collegato a un componente, aggiungo il componente all'impianto selezionato
$componente_articolo = $dbo->fetchOne('SELECT componente_filename, contenuto FROM mg_articoli WHERE id = '.prepare($id_articolo));
if (!empty($componente_articolo) && !empty($componente_articolo['componente_filename'])) {
$contenuto_ini = Ini::read($componente_articolo['contenuto']);
$nome_componente = Ini::getValue($contenuto_ini, 'Nome');
// Se l'articolo aggiunto è collegato a un componente, aggiungo il componente all'impianto selezionato
$componente_articolo = $dbo->fetchOne('SELECT componente_filename, contenuto FROM mg_articoli WHERE id = '.prepare($id_articolo));
if (!empty($componente_articolo) && !empty($componente_articolo['componente_filename'])) {
$contenuto_ini = Ini::read($componente_articolo['contenuto']);
$nome_componente = Ini::getValue($contenuto_ini, 'Nome');
$dati = [
'idimpianto' => $id_impianto,
'idintervento' => $id_intervento,
'nome' => $nome_componente,
'data' => $data,
'filename' => $componente_articolo['componente_filename'],
'contenuto' => $componente_articolo['contenuto'],
];
$dati = [
'idimpianto' => $id_impianto,
'idintervento' => $id_intervento,
'nome' => $nome_componente,
'data' => $data,
'filename' => $componente_articolo['componente_filename'],
'contenuto' => $componente_articolo['contenuto'],
];
// Inserisco il componente tante volte quante la quantità degli articoli inseriti
for ($q = 0; $q < $qta; ++$q) {
$dbo->insert('my_impianto_componenti', $dati);
// Inserisco il componente tante volte quante la quantità degli articoli inseriti
for ($q = 0; $q < $qta; ++$q) {
$dbo->insert('my_impianto_componenti', $dati);
}
}
}
}
function add_tecnico($id_intervento, $idtecnico, $inizio, $fine, $idcontratto = null)
{
$intervento = Intervento::find($id_intervento);
$anagrafica = Anagrafica::find($idtecnico);
if (!function_exists('add_tecnico')) {
function add_tecnico($id_intervento, $idtecnico, $inizio, $fine, $idcontratto = null)
{
$intervento = Intervento::find($id_intervento);
$anagrafica = Anagrafica::find($idtecnico);
$sessione = Sessione::build($intervento, $anagrafica, $inizio, $fine);
$sessione = Sessione::build($intervento, $anagrafica, $inizio, $fine);
// Notifica nuovo intervento al tecnico
if (setting('Notifica al tecnico l\'aggiunta della sessione nell\'attività')) {
if (!empty($anagrafica['email'])) {
$template = Template::pool('Notifica intervento');
// Notifica nuovo intervento al tecnico
if (setting('Notifica al tecnico l\'aggiunta della sessione nell\'attività')) {
if (!empty($anagrafica['email'])) {
$template = Template::pool('Notifica intervento');
if (!empty($template)) {
$mail = Mail::build(auth()->getUser(), $template, $id_intervento);
$mail->addReceiver($anagrafica['email']);
$mail->save();
if (!empty($template)) {
$mail = Mail::build(auth()->getUser(), $template, $id_intervento);
$mail->addReceiver($anagrafica['email']);
$mail->save();
}
}
}
//Inserisco le righe aggiuntive previste dal tipo di intervento
$righe_aggiuntive = database()->fetchArray('SELECT * FROM in_righe_tipiinterventi WHERE id_tipointervento='.prepare($sessione->idtipointervento));
foreach ($righe_aggiuntive as $riga_aggiuntiva) {
$riga = RigaIntervento::build($intervento);
$riga->descrizione = $riga_aggiuntiva['descrizione'];
$riga->um = $riga_aggiuntiva['um'];
$riga->costo_unitario = $riga_aggiuntiva['prezzo_acquisto'];
$riga->setPrezzoUnitario($riga_aggiuntiva['prezzo_vendita'], $riga_aggiuntiva['idiva']);
$riga->qta = $riga_aggiuntiva['qta'];
$riga->save();
}
return true;
}
//Inserisco le righe aggiuntive previste dal tipo di intervento
$righe_aggiuntive = database()->fetchArray('SELECT * FROM in_righe_tipiinterventi WHERE id_tipointervento='.prepare($sessione->idtipointervento));
foreach ($righe_aggiuntive as $riga_aggiuntiva) {
$riga = RigaIntervento::build($intervento);
$riga->descrizione = $riga_aggiuntiva['descrizione'];
$riga->um = $riga_aggiuntiva['um'];
$riga->costo_unitario = $riga_aggiuntiva['prezzo_acquisto'];
$riga->setPrezzoUnitario($riga_aggiuntiva['prezzo_vendita'], $riga_aggiuntiva['idiva']);
$riga->qta = $riga_aggiuntiva['qta'];
$riga->save();
}
return true;
}
/**
@ -139,190 +146,194 @@ function add_tecnico($id_intervento, $idtecnico, $inizio, $fine, $idcontratto =
*
* @deprecated
*/
function calcola_ore_intervento($orario_inizio, $orario_fine)
{
$inizio = new DateTime($orario_inizio);
$diff = $inizio->diff(new DateTime($orario_fine));
if (!function_exists('calcola_ore_intervento')) {
function calcola_ore_intervento($orario_inizio, $orario_fine)
{
$inizio = new DateTime($orario_inizio);
$diff = $inizio->diff(new DateTime($orario_fine));
$ore = $diff->i / 60 + $diff->h + ($diff->days * 24);
$ore = $diff->i / 60 + $diff->h + ($diff->days * 24);
return $ore;
return $ore;
}
}
function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizione, $id_iva, $id_conto, $id_rivalsa_inps = false, $id_ritenuta_acconto = false, $calcolo_ritenuta_acconto = false)
{
$dbo = database();
if (!function_exists('aggiungi_intervento_in_fattura')) {
function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizione, $id_iva, $id_conto, $id_rivalsa_inps = false, $id_ritenuta_acconto = false, $calcolo_ritenuta_acconto = false)
{
$dbo = database();
$id_rivalsa_inps = $id_rivalsa_inps !== false ? $id_rivalsa_inps : setting('Cassa previdenziale predefinita');
$id_ritenuta_acconto = $id_ritenuta_acconto !== false ? $id_ritenuta_acconto : setting("Ritenuta d'acconto predefinita");
$calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto !== false ? $calcolo_ritenuta_acconto : setting("Metodologia calcolo ritenuta d'acconto predefinito");
$id_rivalsa_inps = $id_rivalsa_inps !== false ? $id_rivalsa_inps : setting('Cassa previdenziale predefinita');
$id_ritenuta_acconto = $id_ritenuta_acconto !== false ? $id_ritenuta_acconto : setting("Ritenuta d'acconto predefinita");
$calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto !== false ? $calcolo_ritenuta_acconto : setting("Metodologia calcolo ritenuta d'acconto predefinito");
$fattura = Fattura::find($id_fattura);
$intervento = Intervento::find($id_intervento);
$fattura = Fattura::find($id_fattura);
$intervento = Intervento::find($id_intervento);
$data = $intervento->fine;
$codice = $intervento->codice;
$data = $intervento->fine;
$codice = $intervento->codice;
// Riga di descrizione
$riga = Descrizione::build($fattura);
$riga->descrizione = $descrizione;
$riga->idintervento = $id_intervento;
$riga->save();
// Riga di descrizione
$riga = Descrizione::build($fattura);
$riga->descrizione = $descrizione;
$riga->idintervento = $id_intervento;
$riga->save();
// Ore di lavoro raggruppate per costo orario
$sessioni = $intervento->sessioni;
// Ore di lavoro raggruppate per costo orario
$sessioni = $intervento->sessioni;
if (empty($sessioni)) {
flash()->warning(tr("L'attività _NUM_ non ha sessioni di lavoro!", [
'_NUM_' => $codice,
]));
} else {
$decimals = setting('Cifre decimali per quantità');
$ore_di_lavoro = $sessioni->groupBy(function ($item, $key) {
return $item['prezzo_orario'].'|'.$item['sconto_unitario'].'|'.$item['tipo_sconto'];
});
foreach ($ore_di_lavoro as $gruppo) {
$sessione = $gruppo->first();
$riga = Riga::build($fattura);
$riga->descrizione = tr("Ore di lavoro dell'attività _NUM_ del _DATE_", [
if (empty($sessioni)) {
flash()->warning(tr("L'attività _NUM_ non ha sessioni di lavoro!", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
$riga->um = 'ore';
]));
} else {
$decimals = setting('Cifre decimali per quantità');
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$ore_di_lavoro = $sessioni->groupBy(function ($item, $key) {
return $item['prezzo_orario'].'|'.$item['sconto_unitario'].'|'.$item['tipo_sconto'];
});
foreach ($ore_di_lavoro as $gruppo) {
$sessione = $gruppo->first();
$riga = Riga::build($fattura);
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
$riga->descrizione = tr("Ore di lavoro dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
$riga->um = 'ore';
$riga->prezzo_unitario = $sessione->prezzo_orario;
$riga->costo_unitario = $sessione->prezzo_ore_unitario_tecnico;
//Calcolo lo sconto unitario della sessione in base all'impostazione sui prezzi ivati
$iva = $dbo->table('co_iva')->where('id', $id_iva)->first();
if ($sessione->tipo_sconto == 'UNT' && setting('Utilizza prezzi di vendita comprensivi di IVA')) {
$sconto_unitario = $sessione->sconto_unitario + (($sessione->sconto_unitario * $iva->percentuale) / 100);
} else {
$sconto_unitario = $sessione->sconto_unitario;
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
$riga->prezzo_unitario = $sessione->prezzo_orario;
$riga->costo_unitario = $sessione->prezzo_ore_unitario_tecnico;
//Calcolo lo sconto unitario della sessione in base all'impostazione sui prezzi ivati
$iva = $dbo->table('co_iva')->where('id', $id_iva)->first();
if ($sessione->tipo_sconto == 'UNT' && setting('Utilizza prezzi di vendita comprensivi di IVA')) {
$sconto_unitario = $sessione->sconto_unitario + (($sessione->sconto_unitario * $iva->percentuale) / 100);
} else {
$sconto_unitario = $sessione->sconto_unitario;
}
$riga->setSconto($sconto_unitario, $sessione->tipo_sconto);
$qta_gruppo = $gruppo->sum('ore');
$riga->qta = round($qta_gruppo, $decimals);
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->save();
}
$riga->setSconto($sconto_unitario, $sessione->tipo_sconto);
// Diritti di chiamata raggruppati per costo
$diritti_chiamata = $sessioni->where('prezzo_diritto_chiamata', '>', 0)->groupBy(function ($item, $key) {
return $item['prezzo_diritto_chiamata'];
});
foreach ($diritti_chiamata as $gruppo) {
$diritto_chiamata = $gruppo->first();
$riga = Riga::build($fattura);
$qta_gruppo = $gruppo->sum('ore');
$riga->qta = round($qta_gruppo, $decimals);
$riga->descrizione = tr("Diritto di chiamata dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
//$riga->um = 'ore';
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$riga->save();
}
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
// Diritti di chiamata raggruppati per costo
$diritti_chiamata = $sessioni->where('prezzo_diritto_chiamata', '>', 0)->groupBy(function ($item, $key) {
return $item['prezzo_diritto_chiamata'];
});
foreach ($diritti_chiamata as $gruppo) {
$diritto_chiamata = $gruppo->first();
$riga = Riga::build($fattura);
$riga->prezzo_unitario = $diritto_chiamata->prezzo_diritto_chiamata;
$riga->costo_unitario = $sessione->prezzo_dirittochiamata_tecnico;
$riga->qta = $gruppo->count();
$riga->descrizione = tr("Diritto di chiamata dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
//$riga->um = 'ore';
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
$riga->prezzo_unitario = $diritto_chiamata->prezzo_diritto_chiamata;
$riga->costo_unitario = $sessione->prezzo_dirittochiamata_tecnico;
$riga->qta = $gruppo->count();
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->save();
}
// Viaggi raggruppati per costo
$viaggi = $sessioni->where('prezzo_km_unitario', '>', 0)->groupBy(function ($item, $key) {
return $item['prezzo_km_unitario'].'|'.$item['scontokm_unitario'].'|'.$item['tipo_scontokm'];
});
foreach ($viaggi as $gruppo) {
$qta_trasferta = $gruppo->sum('km');
if ($qta_trasferta == 0) {
continue;
$riga->save();
}
$viaggio = $gruppo->first();
$riga = Riga::build($fattura);
// Viaggi raggruppati per costo
$viaggi = $sessioni->where('prezzo_km_unitario', '>', 0)->groupBy(function ($item, $key) {
return $item['prezzo_km_unitario'].'|'.$item['scontokm_unitario'].'|'.$item['tipo_scontokm'];
});
foreach ($viaggi as $gruppo) {
$qta_trasferta = $gruppo->sum('km');
if ($qta_trasferta == 0) {
continue;
}
$riga->descrizione = tr("Trasferta dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
$riga->um = 'km';
$viaggio = $gruppo->first();
$riga = Riga::build($fattura);
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$riga->descrizione = tr("Trasferta dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);
$riga->idintervento = $id_intervento;
$riga->um = 'km';
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
$riga->id_iva = $id_iva;
$riga->idconto = $id_conto;
$riga->prezzo_unitario = $viaggio->prezzo_km_unitario;
$riga->costo_unitario = $sessione->prezzo_km_unitario_tecnico;
$riga->setSconto($viaggio->scontokm_unitario, $viaggio->tipo_scontokm);
$riga->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$riga->id_ritenuta_acconto = $id_ritenuta_acconto;
$riga->id_rivalsa_inps = $id_rivalsa_inps;
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->prezzo_unitario = $viaggio->prezzo_km_unitario;
$riga->costo_unitario = $sessione->prezzo_km_unitario_tecnico;
$riga->setSconto($viaggio->scontokm_unitario, $viaggio->tipo_scontokm);
$riga->qta = $qta_trasferta;
// Riferimento al documento di origine
$riga->original_document_type = get_class($intervento);
$riga->original_document_id = $intervento->id;
$riga->save();
}
}
$riga->qta = $qta_trasferta;
// Articoli, righe, sconti e descrizioni collegati all'intervento
$righe = $intervento->getRighe();
foreach ($righe as $riga) {
$qta = $riga->qta;
$copia = $riga->copiaIn($fattura, $qta);
$copia->id_conto = $id_conto;
$copia->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$copia->id_ritenuta_acconto = $id_ritenuta_acconto;
$copia->id_rivalsa_inps = $id_rivalsa_inps;
// Aggiornamento seriali dalla riga dell'ordine
if ($copia->isArticolo()) {
$copia->serials = $riga->serials;
$articolo = ArticoloOriginale::find($copia->idarticolo);
$copia->id_conto = ($articolo->idconto_vendita ? $articolo->idconto_vendita : $id_conto);
$riga->save();
}
}
$copia->save();
// Articoli, righe, sconti e descrizioni collegati all'intervento
$righe = $intervento->getRighe();
foreach ($righe as $riga) {
$qta = $riga->qta;
$copia = $riga->copiaIn($fattura, $qta);
$copia->id_conto = $id_conto;
$copia->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
$copia->id_ritenuta_acconto = $id_ritenuta_acconto;
$copia->id_rivalsa_inps = $id_rivalsa_inps;
// Aggiornamento seriali dalla riga dell'ordine
if ($copia->isArticolo()) {
$copia->serials = $riga->serials;
$articolo = ArticoloOriginale::find($copia->idarticolo);
$copia->id_conto = ($articolo->idconto_vendita ? $articolo->idconto_vendita : $id_conto);
}
$copia->save();
}
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura($id_fattura);
// Metto l'intervento in stato "Fatturato"
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE codice='FAT') WHERE id=".prepare($id_intervento));
}
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura($id_fattura);
// Metto l'intervento in stato "Fatturato"
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE codice='FAT') WHERE id=".prepare($id_intervento));
}
/**
@ -331,44 +342,46 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
*
* @return bool|string
*/
function verifica_numero_intervento(Intervento $intervento)
{
if (empty($intervento->codice)) {
return null;
}
$data = $intervento->data_richiesta;
$documenti = Intervento::whereDate('data_richiesta', '=', $data->format('Y-m-d'))
->get();
// Recupero maschera per questo segmento
$maschera = setting('Formato codice attività');
if ((strpos($maschera, 'YYYY') == false) or (strpos($maschera, 'yy') == false)) {
$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice', [
'DATE(data_richiesta) < '.prepare($data->format('Y-m-d')),
'YEAR(data_richiesta) = '.prepare($data->format('Y')),
], $data);
} else {
$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice', [
'DATE(data_richiesta) < '.prepare($data->format('Y-m-d')),
]);
}
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data), $data);
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->codice == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
if (!function_exists('verifica_numero_intervento')) {
function verifica_numero_intervento(Intervento $intervento)
{
if (empty($intervento->codice)) {
return null;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $intervento->codice);
$data = $intervento->data_richiesta;
$documenti = Intervento::whereDate('data_richiesta', '=', $data->format('Y-m-d'))
->get();
return null;
}
// Recupero maschera per questo segmento
$maschera = setting('Formato codice attività');
if ((strpos($maschera, 'YYYY') == false) or (strpos($maschera, 'yy') == false)) {
$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice', [
'DATE(data_richiesta) < '.prepare($data->format('Y-m-d')),
'YEAR(data_richiesta) = '.prepare($data->format('Y')),
], $data);
} else {
$ultimo = Generator::getPreviousFrom($maschera, 'in_interventi', 'codice', [
'DATE(data_richiesta) < '.prepare($data->format('Y-m-d')),
]);
}
do {
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data), $data);
$filtered = $documenti->reject(function ($item, $key) use ($numero) {
return $item->codice == $numero;
});
if ($documenti->count() == $filtered->count()) {
return $numero;
}
$documenti = $filtered;
$ultimo = $numero;
} while ($numero != $intervento->codice);
return null;
}
}

View File

@ -27,11 +27,13 @@ use Modules\Ordini\Ordine;
*
* @deprecated 2.4.5
*/
function get_new_numeroordine($data)
{
global $dir;
if (!function_exists('get_new_numeroordine')) {
function get_new_numeroordine($data)
{
global $dir;
return Ordine::getNextNumero($data, $dir);
return Ordine::getNextNumero($data, $dir);
}
}
/**
@ -39,12 +41,15 @@ function get_new_numeroordine($data)
*
* @deprecated 2.4.5
*/
function get_new_numerosecondarioordine($data)
{
global $dir;
global $id_segment;
return Ordine::getNextNumeroSecondario($data, $dir, $id_segment);
if (!function_exists('get_new_numerosecondarioordine')) {
function get_new_numerosecondarioordine($data)
{
global $dir;
global $id_segment;
return Ordine::getNextNumeroSecondario($data, $dir, $id_segment);
}
}
/**
@ -52,11 +57,14 @@ function get_new_numerosecondarioordine($data)
*
* @deprecated 2.4.5
*/
function get_imponibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->imponibile;
if (!function_exists('get_imponibile_ordine')) {
function get_imponibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->imponibile;
}
}
/**
@ -64,11 +72,13 @@ function get_imponibile_ordine($idordine)
*
* @deprecated 2.4.5
*/
function get_totale_ordine($idordine)
{
$ordine = Ordine::find($idordine);
if (!function_exists('get_totale_ordine')) {
function get_totale_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->totale;
return $ordine->totale;
}
}
/**
@ -76,23 +86,27 @@ function get_totale_ordine($idordine)
*
* @deprecated 2.4.5
*/
function get_netto_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->netto;
if (!function_exists('get_netto_ordine')) {
function get_netto_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->netto;
}
}
/**
* Calcolo iva detraibile ordine.
*
* @deprecated 2.4.5
*/
function get_ivadetraibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
if (!function_exists('get_ivadetraibile_ordine')) {
function get_ivadetraibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->iva_detraibile;
return $ordine->iva_detraibile;
}
}
/**
@ -100,13 +114,14 @@ function get_ivadetraibile_ordine($idordine)
*
* @deprecated 2.4.5
*/
function get_ivaindetraibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
if (!function_exists('get_ivaindetraibile_ordine')) {
function get_ivaindetraibile_ordine($idordine)
{
$ordine = Ordine::find($idordine);
return $ordine->iva_indetraibile;
return $ordine->iva_indetraibile;
}
}
/**
* 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
@ -115,140 +130,145 @@ function get_ivaindetraibile_ordine($idordine)
* $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_ordine($idordine, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
{
global $dir;
if (!function_exists('ricalcola_costiagg_ordine')) {
function ricalcola_costiagg_ordine($idordine, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
{
global $dir;
$dbo = database();
$dbo = database();
// 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 or_righe_ordini WHERE idordine='.prepare($idordine);
$rs = $dbo->fetchArray($query);
if ($rs[0]['righe'] > 0) {
$totale_imponibile = get_imponibile_ordine($idordine);
$totale_ordine = get_totale_ordine($idordine);
// Leggo gli id dei costi aggiuntivi
if ($dir == 'uscita') {
$query2 = 'SELECT idrivalsainps, idritenutaacconto, bollo FROM or_ordini WHERE id='.prepare($idordine);
$rs2 = $dbo->fetchArray($query2);
$idrivalsainps = $rs2[0]['idrivalsainps'];
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
$bollo = $rs2[0]['bollo'];
}
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
if ($dir == 'entrata') {
if (!empty($idrivalsainps)) {
$idrivalsainps = setting('Cassa previdenziale predefinita');
}
}
$query = 'SELECT percentuale FROM co_rivalse WHERE id='.prepare($idrivalsainps);
// 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 or_righe_ordini WHERE idordine='.prepare($idordine);
$rs = $dbo->fetchArray($query);
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
if ($rs[0]['righe'] > 0) {
$totale_imponibile = get_imponibile_ordine($idordine);
$totale_ordine = get_totale_ordine($idordine);
// Aggiorno la rivalsa inps
$dbo->query("UPDATE or_ordini SET rivalsainps='$rivalsainps' WHERE id=".prepare($idordine));
// Leggo gli id dei costi aggiuntivi
if ($dir == 'uscita') {
$query2 = 'SELECT idrivalsainps, idritenutaacconto, bollo FROM or_ordini WHERE id='.prepare($idordine);
$rs2 = $dbo->fetchArray($query2);
$idrivalsainps = $rs2[0]['idrivalsainps'];
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
$bollo = $rs2[0]['bollo'];
}
// 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)) {
// Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
if ($dir == 'entrata') {
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
}
}
$query = 'SELECT percentuale FROM co_ritenutaacconto WHERE id='.prepare($idritenutaacconto);
$rs = $dbo->fetchArray($query);
$ritenutaacconto = $totale_ordine / 100 * $rs[0]['percentuale'];
$netto_a_pagare = $totale_ordine - $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') {
if ($bolli != 0.00) {
$bolli = str_replace(',', '.', $bolli);
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = str_replace(',', '.', $bolli);
} else {
$marca_da_bollo = 0.00;
if (!empty($idrivalsainps)) {
$idrivalsainps = setting('Cassa previdenziale predefinita');
}
}
$query = 'SELECT percentuale FROM co_rivalse 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=".prepare($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 = setting("Ritenuta d'acconto predefinita");
}
}
$query = 'SELECT percentuale FROM co_ritenutaacconto WHERE id='.prepare($idritenutaacconto);
$rs = $dbo->fetchArray($query);
$ritenutaacconto = $totale_ordine / 100 * $rs[0]['percentuale'];
$netto_a_pagare = $totale_ordine - $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') {
if ($bolli != 0.00) {
$bolli = str_replace(',', '.', $bolli);
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
$marca_da_bollo = str_replace(',', '.', $bolli);
} else {
$marca_da_bollo = 0.00;
}
}
} else {
$marca_da_bollo = 0.00;
}
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare(setting('Iva predefinita'));
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
$dbo->query('UPDATE or_ordini SET ritenutaacconto='.prepare($ritenutaacconto).', bollo='.prepare($marca_da_bollo).', iva_rivalsainps='.prepare($iva_rivalsainps).' WHERE id='.prepare($idordine));
} else {
$marca_da_bollo = 0.00;
$dbo->query("UPDATE or_ordini SET ritenutaacconto='0', bollo='0', rivalsainps='0' WHERE id=".prepare($idordine));
}
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare(setting('Iva predefinita'));
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps = $rivalsainps / 100 * $rsi[0]['percentuale'];
$dbo->query('UPDATE or_ordini SET ritenutaacconto='.prepare($ritenutaacconto).', bollo='.prepare($marca_da_bollo).', iva_rivalsainps='.prepare($iva_rivalsainps).' WHERE id='.prepare($idordine));
} else {
$dbo->query("UPDATE or_ordini SET ritenutaacconto='0', bollo='0', rivalsainps='0' WHERE id=".prepare($idordine));
}
}
/**
* Restituisce lo stato dell'ordine in base alle righe.
*/
function get_stato_ordine($idordine)
{
$dbo = database();
if (!function_exists('get_stato_ordine')) {
function get_stato_ordine($idordine)
{
$dbo = database();
$rs_ordine = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM or_righe_ordini WHERE idordine='".$idordine."'");
$qta_ordine = $rs_ordine[0]['qta'];
$rs_ordine = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM or_righe_ordini WHERE idordine='".$idordine."'");
$qta_ordine = $rs_ordine[0]['qta'];
//Righe dell'ordine in ddt
$rs_ddt = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM dt_righe_ddt WHERE idordine='.prepare($idordine));
$qta_ddt = $rs_ddt[0]['qta'];
//Righe dell'ordine in ddt
$rs_ddt = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM dt_righe_ddt WHERE idordine='.prepare($idordine));
$qta_ddt = $rs_ddt[0]['qta'];
//Righe dell'ordine in fattura
$rs_fattura = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idordine='.prepare($idordine));
$qta_fattura = $rs_fattura[0]['qta'];
//Righe dell'ordine in fattura
$rs_fattura = $dbo->fetchArray('SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idordine='.prepare($idordine));
$qta_fattura = $rs_fattura[0]['qta'];
//Righe dell'ordine in fattura passando da ddt
$rs_ddt_fattura = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idddt IN(SELECT DISTINCT idddt FROM dt_righe_ddt WHERE idordine='".$idordine."')");
$qta_ddt_fattura = $rs_ddt_fattura[0]['qta'];
//Righe dell'ordine in fattura passando da ddt
$rs_ddt_fattura = $dbo->fetchArray("SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idddt IN(SELECT DISTINCT idddt FROM dt_righe_ddt WHERE idordine='".$idordine."')");
$qta_ddt_fattura = $rs_ddt_fattura[0]['qta'];
if ($qta_ddt == 0) {
$stato = 'Accettato';
}
if ($qta_fattura == 0) {
$stato = 'Accettato';
}
if ($qta_ddt > 0 && $qta_ddt < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente evaso';
}
if ($qta_ddt == $qta_ordine && $qta_ordine > 0) {
$stato = 'Evaso';
}
if ($qta_fattura > 0 && $qta_fattura < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente fatturato';
}
if ($qta_fattura == $qta_ordine && $qta_ordine > 0) {
$stato = 'Fatturato';
}
if ($qta_ddt_fattura > 0 && $qta_ddt_fattura < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente fatturato';
}
if ($qta_ddt_fattura == $qta_ordine && $qta_ordine > 0) {
$stato = 'Fatturato';
}
if ($qta_ddt == 0) {
$stato = 'Accettato';
}
if ($qta_fattura == 0) {
$stato = 'Accettato';
}
if ($qta_ddt > 0 && $qta_ddt < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente evaso';
}
if ($qta_ddt == $qta_ordine && $qta_ordine > 0) {
$stato = 'Evaso';
}
if ($qta_fattura > 0 && $qta_fattura < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente fatturato';
}
if ($qta_fattura == $qta_ordine && $qta_ordine > 0) {
$stato = 'Fatturato';
}
if ($qta_ddt_fattura > 0 && $qta_ddt_fattura < $qta_ordine && $qta_ordine > 0) {
$stato = 'Parzialmente fatturato';
}
if ($qta_ddt_fattura == $qta_ordine && $qta_ordine > 0) {
$stato = 'Fatturato';
}
return $stato;
return $stato;
}
}
function get_totale_interventi_ordine($idordine)
{
$interventi = Intervento::where('id_ordine', $idordine)->get();
$array_interventi = $interventi->toArray();
if (!function_exists('get_totale_interventi_ordine')) {
function get_totale_interventi_ordine($idordine)
{
$interventi = Intervento::where('id_ordine', $idordine)->get();
$array_interventi = $interventi->toArray();
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
return $totale;
}
return $totale;
}
}

View File

@ -22,39 +22,46 @@ include_once __DIR__.'/../../core.php';
use Modules\Interventi\Intervento;
use Modules\Preventivi\Preventivo;
if (!function_exists('get_imponibile_preventivo')) {
function get_imponibile_preventivo($idpreventivo)
{
$preventivo = Preventivo::find($idpreventivo);
{
$preventivo = Preventivo::find($idpreventivo);
return $preventivo->totale_imponibile;
return $preventivo->totale_imponibile;
}
}
/**
* Restituisce lo stato del preventivo in base alle righe.
*/
function get_stato_preventivo($idpreventivo)
{
$dbo = database();
$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 (!function_exists('get_stato_preventivo')) {
function get_stato_preventivo($idpreventivo)
{
$dbo = database();
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';
$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';
}
} else {
return 'Non evaso';
}
}
function get_totale_interventi_preventivo($idpreventivo)
{
$interventi = Intervento::where('id_preventivo', $idpreventivo)->get();
$array_interventi = $interventi->toArray();
if (!function_exists('get_totale_interventi_preventivo')) {
function get_totale_interventi_preventivo($idpreventivo)
{
$interventi = Intervento::where('id_preventivo', $idpreventivo)->get();
$array_interventi = $interventi->toArray();
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
$totale = sum(array_column($array_interventi, 'totale_imponibile'));
return $totale;
}
return $totale;
}
}

View File

@ -19,53 +19,55 @@
include_once __DIR__.'/../../core.php';
function menuSelection($element, $group_id, $depth, $permessi_disponibili)
{
$dbo = database();
++$depth;
if (!function_exists('menuSelection')) {
function menuSelection($element, $group_id, $depth, $permessi_disponibili)
{
$dbo = database();
++$depth;
// Permessi impostati per il gruppo
$permesso_salvato = $dbo->fetchOne('SELECT permessi FROM zz_permissions WHERE idgruppo = '.prepare($group_id).' AND idmodule = '.prepare($element['id']));
// Permessi impostati per il gruppo
$permesso_salvato = $dbo->fetchOne('SELECT permessi FROM zz_permissions WHERE idgruppo = '.prepare($group_id).' AND idmodule = '.prepare($element['id']));
$permessi = $permesso_salvato ? $permesso_salvato['permessi'] : '-';
$permessi = $permesso_salvato ? $permesso_salvato['permessi'] : '-';
$result = '
<tr>
<td>'.str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $depth).'<span>'.$element['title'].'</span></td>
<td>
<select name="permesso_'.$element['id'].'" id="permesso_'.$element['id'].'" class="form-control superselect openstamanager-input select-input" onchange="update_permissions('.$element['id'].', $(this).find(\'option:selected\').val(), $(this).find(\'option:selected\').data(\'color\'))">';
$result = '
<tr>
<td>'.str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $depth).'<span>'.$element['title'].'</span></td>
<td>
<select name="permesso_'.$element['id'].'" id="permesso_'.$element['id'].'" class="form-control superselect openstamanager-input select-input" onchange="update_permissions('.$element['id'].', $(this).find(\'option:selected\').val(), $(this).find(\'option:selected\').data(\'color\'))">';
foreach ($permessi_disponibili as $id => $nome) {
switch ($id) {
case 'rw':
$bgcolor = 'green';
break;
case 'r':
$bgcolor = 'orange';
break;
case '-':
$bgcolor = 'red';
break;
default:
break;
foreach ($permessi_disponibili as $id => $nome) {
switch ($id) {
case 'rw':
$bgcolor = 'green';
break;
case 'r':
$bgcolor = 'orange';
break;
case '-':
$bgcolor = 'red';
break;
default:
break;
}
$attr = ($id == $permessi) ? ' selected="selected"' : '';
$result .= '
<option data-color="text-'.$bgcolor.'" _bgcolor_="'.$bgcolor.'" value="'.$id.'" '.$attr.'>'.$nome.'</option>';
}
$attr = ($id == $permessi) ? ' selected="selected"' : '';
$result .= '
<option data-color="text-'.$bgcolor.'" _bgcolor_="'.$bgcolor.'" value="'.$id.'" '.$attr.'>'.$nome.'</option>';
}
</select>
</td>
</tr>';
$result .= '
</select>
</td>
</tr>';
$submenus = $element['all_children'];
if (!empty($submenus)) {
foreach ($submenus as $submenu) {
$result .= menuSelection($submenu, $group_id, $depth, $permessi_disponibili, $perms_names);
$submenus = $element['all_children'];
if (!empty($submenus)) {
foreach ($submenus as $submenu) {
$result .= menuSelection($submenu, $group_id, $depth, $permessi_disponibili, $perms_names);
}
}
}
return $result;
}
return $result;
}
}

View File

@ -2,40 +2,42 @@
include_once __DIR__.'/../../core.php';
function variables($descrizione = '', $inizio = null, $fine = null, $rata = null, $numero_fatture = null)
{
$mese = [
'01' => 'Gennaio',
'02' => 'Febbraio',
'03' => 'Marzo',
'04' => 'Aprile',
'05' => 'Maggio',
'06' => 'Giugno',
'07' => 'Luglio',
'08' => 'Agosto',
'09' => 'Settembre',
'10' => 'Ottobre',
'11' => 'Novembre',
'12' => 'Dicembre',
];
if (!function_exists('variables')) {
function variables($descrizione = '', $inizio = null, $fine = null, $rata = null, $numero_fatture = null)
{
$mese = [
'01' => 'Gennaio',
'02' => 'Febbraio',
'03' => 'Marzo',
'04' => 'Aprile',
'05' => 'Maggio',
'06' => 'Giugno',
'07' => 'Luglio',
'08' => 'Agosto',
'09' => 'Settembre',
'10' => 'Ottobre',
'11' => 'Novembre',
'12' => 'Dicembre',
];
$result['list'] = '<ul>
<li><code>{periodo}</code></li>
<li><code>{data_inizio}</code></li>
<li><code>{data_fine}</code></li>
<li><code>{mese_fatturazione}</code></li>
<li><code>{rata_attuale}</code></li>
<li><code>{numero_rate}</code></li>
</ul>';
$result['list'] = '<ul>
<li><code>{periodo}</code></li>
<li><code>{data_inizio}</code></li>
<li><code>{data_fine}</code></li>
<li><code>{mese_fatturazione}</code></li>
<li><code>{rata_attuale}</code></li>
<li><code>{numero_rate}</code></li>
</ul>';
if (!empty($descrizione)) {
$result['descrizione'] = str_replace('{periodo}', 'durata dal '.Translator::dateToLocale($inizio).' al '.Translator::dateToLocale($fine), $descrizione);
$result['descrizione'] = str_replace('{data_inizio}', Translator::dateToLocale($inizio), $result['descrizione']);
$result['descrizione'] = str_replace('{data_fine}', Translator::dateToLocale($fine), $result['descrizione']);
$result['descrizione'] = str_replace('{mese_fatturazione}', $mese[date('m', strtotime($inizio))], $result['descrizione']);
$result['descrizione'] = str_replace('{rata_attuale}', $rata, $result['descrizione']);
$result['descrizione'] = str_replace('{numero_rate}', $numero_fatture, $result['descrizione']);
if (!empty($descrizione)) {
$result['descrizione'] = str_replace('{periodo}', 'durata dal '.Translator::dateToLocale($inizio).' al '.Translator::dateToLocale($fine), $descrizione);
$result['descrizione'] = str_replace('{data_inizio}', Translator::dateToLocale($inizio), $result['descrizione']);
$result['descrizione'] = str_replace('{data_fine}', Translator::dateToLocale($fine), $result['descrizione']);
$result['descrizione'] = str_replace('{mese_fatturazione}', $mese[date('m', strtotime($inizio))], $result['descrizione']);
$result['descrizione'] = str_replace('{rata_attuale}', $rata, $result['descrizione']);
$result['descrizione'] = str_replace('{numero_rate}', $numero_fatture, $result['descrizione']);
}
return $result;
}
return $result;
}
}