mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-03-03 02:37:43 +01:00
Aggiunta possibilità di specificare IVA di vendita e di acquisto predefinita per le anagrafiche. Aggiunto nuovo modulo per le Stampe contabili. Modifica nella gestione dei diritti di chiamata, ora applicati solo sulla prima sessione di lavoro della giornata (se questa viene eliminata, il diritto chiamata viene rimosso di conseguenza anche con altre sessioni presenti).
246 lines
9.5 KiB
PHP
246 lines
9.5 KiB
PHP
<?php
|
|
|
|
include_once __DIR__.'/../../core.php';
|
|
|
|
/**
|
|
* Recupera il totale delle ore spese per un intervento.
|
|
*
|
|
* @param [type] $idintervento
|
|
*/
|
|
function get_ore_intervento($idintervento)
|
|
{
|
|
$dbo = Database::getConnection();
|
|
$totale_ore = 0;
|
|
|
|
$rs = $dbo->fetchArray('SELECT idintervento, TIMESTAMPDIFF( MINUTE, orario_inizio, orario_fine ) / 60 AS tot_ore FROM in_interventi_tecnici WHERE idintervento = '.prepare($idintervento));
|
|
|
|
for ($i = 0; $i < count($rs); ++$i) {
|
|
$totale_ore = $totale_ore + $rs[$i]['tot_ore'];
|
|
}
|
|
|
|
return $totale_ore;
|
|
}
|
|
|
|
/**
|
|
* Funzione per collegare gli articoli, usati in un intervento, ai rispettivi impianti.
|
|
*
|
|
* @param [type] $idintervento
|
|
* @param [type] $idimpianto
|
|
* @param [type] $idarticolo
|
|
* @param [type] $qta
|
|
*/
|
|
function link_componente_to_articolo($idintervento, $idimpianto, $idarticolo, $qta)
|
|
{
|
|
global $docroot;
|
|
$dbo = Database::getConnection();
|
|
|
|
if (!empty($idimpianto) && !empty($idintervento)) {
|
|
//Leggo la data dell'intervento
|
|
$rs = $dbo->fetchArray("SELECT DATE_FORMAT(MIN(orario_inizio),'%Y-%m-%d') AS data FROM in_interventi_tecnici WHERE idintervento=".prepare($idintervento));
|
|
$data = $rs[0]['data'];
|
|
|
|
$rs = $dbo->fetchArray('SELECT componente_filename, contenuto FROM mg_articoli WHERE id='.prepare($idarticolo));
|
|
|
|
//Se l'articolo aggiunto è collegato a un file .ini, aggiungo il componente all'impianto selezionato
|
|
if (count($rs) == 1 && $rs[0]['componente_filename'] != '') {
|
|
//Inserisco il componente tante volte quante la quantità degli articoli inseriti
|
|
for ($q = 0; $q < $qta; ++$q) {
|
|
$dbo->query('INSERT INTO my_impianto_componenti(idimpianto, idintervento, nome, data, filename, contenuto) VALUES ('.prepare($idimpianto).', '.prepare($idintervento).', '.prepare(\Util\Ini::getValue($rs[0]['componente_filename'], 'Nome')).', '.prepare($data).', '.prepare($rs[0]['componente_filename']).', '.prepare($rs[0]['contenuto']).')');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function add_tecnico($idintervento, $idtecnico, $inizio, $fine, $idcontratto)
|
|
{
|
|
$dbo = Database::getConnection();
|
|
|
|
$rs = $dbo->fetchArray('SELECT idsede, idtipointervento FROM in_interventi WHERE id='.prepare($idintervento));
|
|
$idtipointervento = $rs[0]['idtipointervento'];
|
|
$idsede = $rs[0]['idsede'];
|
|
|
|
// Calcolo km in base a quelli impostati nell'anagrafica
|
|
// Nessuna sede
|
|
if ($idsede == '-1') {
|
|
$km = 0;
|
|
}
|
|
|
|
// Sede legale
|
|
elseif (empty($idsede)) {
|
|
$rs2 = $dbo->fetchArray('SELECT km FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica));
|
|
$km = $rs2[0]['km'];
|
|
}
|
|
|
|
// Sede secondaria
|
|
else {
|
|
$rs2 = $dbo->fetchArray('SELECT km FROM an_sedi WHERE id='.prepare($idsede));
|
|
$km = $rs2[0]['km'];
|
|
}
|
|
|
|
$km = empty($km) ? 0 : $km;
|
|
|
|
// Calcolo il totale delle ore lavorate
|
|
$diff = date_diff(date_create($inizio), date_create($fine));
|
|
$ore = $diff->h + $diff->m / 60;
|
|
|
|
// Leggo i costi unitari dalle tariffe se almeno un valore è stato impostato
|
|
$rsc = $dbo->fetchArray('SELECT * FROM in_tariffe WHERE idtecnico='.prepare($idtecnico).' AND idtipointervento='.prepare($idtipointervento));
|
|
|
|
if ($rsc[0]['costo_ore'] != 0 || $rsc[0]['costo_km'] != 0 || $rsc[0]['costo_dirittochiamata'] != 0 || $rsc[0]['costo_ore_tecnico'] != 0 || $rsc[0]['costo_km_tecnico'] != 0 || $rsc[0]['costo_dirittochiamata_tecnico'] != 0) {
|
|
$costo_ore = $rsc[0]['costo_ore'];
|
|
$costo_km = $rsc[0]['costo_km'];
|
|
$costo_dirittochiamata = $rsc[0]['costo_dirittochiamata'];
|
|
|
|
$costo_ore_tecnico = $rsc[0]['costo_ore_tecnico'];
|
|
$costo_km_tecnico = $rsc[0]['costo_km_tecnico'];
|
|
$costo_dirittochiamata_tecnico = $rsc[0]['costo_dirittochiamata_tecnico'];
|
|
}
|
|
|
|
// ...altrimenti se non c'è una tariffa per il tecnico leggo i costi globali
|
|
else {
|
|
$rsc = $dbo->fetchArray('SELECT * FROM in_tipiintervento WHERE idtipointervento='.prepare($idtipointervento));
|
|
|
|
$costo_ore = $rsc[0]['costo_orario'];
|
|
$costo_km = $rsc[0]['costo_km'];
|
|
$costo_dirittochiamata = $rsc[0]['costo_diritto_chiamata'];
|
|
|
|
$costo_ore_tecnico = $rsc[0]['costo_orario_tecnico'];
|
|
$costo_km_tecnico = $rsc[0]['costo_km_tecnico'];
|
|
$costo_dirittochiamata_tecnico = $rsc[0]['costo_diritto_chiamata_tecnico'];
|
|
}
|
|
|
|
// Leggo i costi unitari da contratto se l'intervento è legato ad un contratto e c'è almeno un record...
|
|
if (!empty($idcontratto)) {
|
|
$rsc = $dbo->fetchArray('SELECT * FROM co_contratti_tipiintervento WHERE idcontratto='.prepare($idcontratto).' AND idtipointervento='.prepare($idtipointervento));
|
|
|
|
if (count($rsc) == 1) {
|
|
$costo_ore = $rsc[0]['costo_ore'];
|
|
$costo_km = $rsc[0]['costo_km'];
|
|
$costo_dirittochiamata = $rsc[0]['costo_dirittochiamata'];
|
|
|
|
$costo_ore_tecnico = $rsc[0]['costo_ore_tecnico'];
|
|
$costo_km_tecnico = $rsc[0]['costo_km_tecnico'];
|
|
$costo_dirittochiamata_tecnico = $rsc[0]['costo_dirittochiamata_tecnico'];
|
|
}
|
|
}
|
|
|
|
// Azzeramento forzato del diritto di chiamata nel caso questa non sia la prima sessione dell'intervento per il giorno di inizio [Luca]
|
|
$rs = $dbo->fetchArray('SELECT id FROM in_interventi_tecnici WHERE (DATE(orario_inizio)=DATE('.prepare($inizio).') OR DATE(orario_fine)=DATE('.prepare($inizio).')) AND idintervento='.prepare($idintervento));
|
|
if (!empty($rs)) {
|
|
$costo_dirittochiamata_tecnico = 0;
|
|
$costo_dirittochiamata = 0;
|
|
}
|
|
|
|
// Inserisco le ore dei tecnici nella tabella "in_interventi_tecnici"
|
|
$dbo->insert('in_interventi_tecnici', [
|
|
'idintervento' => $idintervento,
|
|
'idtipointervento' => $idtipointervento,
|
|
'idtecnico' => $idtecnico,
|
|
'km' => $km,
|
|
'orario_inizio' => $inizio,
|
|
'orario_fine' => $fine,
|
|
'ore' => $ore,
|
|
'prezzo_ore_unitario' => $costo_ore,
|
|
'prezzo_km_unitario' => $costo_km,
|
|
|
|
'prezzo_ore_consuntivo' => $costo_ore * $ore + $costo_dirittochiamata,
|
|
'prezzo_km_consuntivo' => 0,
|
|
'prezzo_dirittochiamata' => $costo_dirittochiamata,
|
|
|
|
'prezzo_ore_unitario_tecnico' => $costo_ore_tecnico,
|
|
'prezzo_km_unitario_tecnico' => $costo_km_tecnico,
|
|
|
|
'prezzo_ore_consuntivo_tecnico' => $costo_ore_tecnico * $ore + $costo_dirittochiamata_tecnico,
|
|
'prezzo_km_consuntivo_tecnico' => 0,
|
|
'prezzo_dirittochiamata_tecnico' => $costo_dirittochiamata_tecnico,
|
|
]);
|
|
}
|
|
|
|
function get_costi_intervento($id_intervento)
|
|
{
|
|
$dbo = Database::getConnection();
|
|
|
|
$decimals = Settings::get('Cifre decimali per importi');
|
|
|
|
$tecnici = $dbo->fetchArray('SELECT
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_ore_consuntivo_tecnico, '.$decimals.')
|
|
), 0) AS manodopera_costo,
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_ore_consuntivo, '.$decimals.')
|
|
), 0) AS manodopera_addebito,
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_ore_consuntivo, '.$decimals.') - ROUND(sconto, '.$decimals.')
|
|
), 0) AS manodopera_scontato,
|
|
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_km_consuntivo_tecnico, '.$decimals.')
|
|
), 0) AS viaggio_costo,
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_km_consuntivo, '.$decimals.')
|
|
), 0) viaggio_addebito,
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_km_consuntivo, '.$decimals.') - ROUND(scontokm, '.$decimals.')
|
|
), 0) AS viaggio_scontato
|
|
|
|
FROM in_interventi_tecnici WHERE idintervento='.prepare($id_intervento));
|
|
|
|
$articoli = $dbo->fetchArray('SELECT
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_acquisto, '.$decimals.') * ROUND(qta, '.$decimals.')
|
|
), 0) AS ricambi_costo,
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_vendita, '.$decimals.') * ROUND(qta, '.$decimals.')
|
|
), 0) AS ricambi_addebito,
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_vendita, '.$decimals.') * ROUND(qta, '.$decimals.') - ROUND(sconto, '.$decimals.')
|
|
), 0) AS ricambi_scontato
|
|
|
|
FROM mg_articoli_interventi WHERE idintervento='.prepare($id_intervento));
|
|
|
|
$altro = $dbo->fetchArray('SELECT
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_acquisto, '.$decimals.') * ROUND(qta, '.$decimals.')
|
|
), 0) AS altro_costo,
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_vendita, '.$decimals.') * ROUND(qta, '.$decimals.')
|
|
), 0) AS altro_addebito,
|
|
COALESCE(SUM(
|
|
ROUND(prezzo_vendita, '.$decimals.') * ROUND(qta, '.$decimals.') - ROUND(sconto, '.$decimals.')
|
|
), 0) AS altro_scontato
|
|
|
|
FROM in_righe_interventi WHERE idintervento='.prepare($id_intervento));
|
|
|
|
$result = array_merge($tecnici[0], $articoli[0], $altro[0]);
|
|
|
|
$result['totale_costi'] = sum([
|
|
$result['manodopera_costo'],
|
|
$result['viaggio_costo'],
|
|
$result['ricambi_costo'],
|
|
$result['altro_costo'],
|
|
]);
|
|
|
|
$result['totale_addebito'] = sum([
|
|
$result['manodopera_addebito'],
|
|
$result['viaggio_addebito'],
|
|
$result['ricambi_addebito'],
|
|
$result['altro_addebito'],
|
|
]);
|
|
|
|
$result['totale_scontato'] = sum([
|
|
$result['manodopera_scontato'],
|
|
$result['viaggio_scontato'],
|
|
$result['ricambi_scontato'],
|
|
$result['altro_scontato'],
|
|
]);
|
|
|
|
// Calcolo dello sconto globale
|
|
$sconto = $dbo->fetchArray('SELECT sconto_globale, tipo_sconto_globale FROM in_interventi WHERE id='.prepare($id_intervento))[0];
|
|
$result['sconto_globale'] = ($sconto['tipo_sconto_globale'] == 'PRC') ? $result['totale_scontato'] * $sconto['sconto_globale'] / 100 : $sconto['sconto_globale'];
|
|
$result['sconto_globale'] = round($result['sconto_globale'], $decimals);
|
|
|
|
$result['totale'] = sum($result['totale_scontato'], -$result['sconto_globale']);
|
|
|
|
return $result;
|
|
}
|