1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-06-05 22:09:38 +02:00
This commit is contained in:
Fabio Lovato
2019-04-11 18:26:51 +02:00
34 changed files with 686 additions and 171 deletions

View File

@@ -21,17 +21,17 @@
"type": "project",
"require": {
"php": ">=5.6",
"ext-mbstring": "*",
"ext-json": "*",
"ext-pdo": "*",
"ext-zip": "*",
"ext-intl": "*",
"ext-simplexml": "*",
"ext-libxml": "*",
"ext-dom": "*",
"ext-curl": "*",
"ext-dom": "*",
"ext-intl": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-openssl": "*",
"ext-pdo": "*",
"ext-simplexml": "*",
"ext-xsl": "*",
"ext-zip": "*",
"aluguest/ical-easy-reader": "^1.5",
"danielstjules/stringy": "^3.1",
"davidepastore/codice-fiscale": "^0.4.0",

View File

@@ -106,17 +106,11 @@ if (!empty($righe)) {
echo '
</tr>';
$totale = 0.00;
foreach ($righe as $i => $r) {
// Descrizione
echo '
<tr>
<td>
<input type="hidden" name="abilita_serial['.$r['id'].']" value="'.$r['abilita_serial'].'" />
<input type="hidden" id="idarticolo_'.$i.'" name="idarticolo['.$r['id'].']" value="'.$r['idarticolo'].'" />
<input type="hidden" id="descrizione_'.$i.'" name="descrizione['.$r['id'].']" value="'.$r['descrizione'].'" />';
<td>';
// Checkbox - da evadere?
echo '
@@ -133,7 +127,6 @@ if (!empty($righe)) {
echo '
<td>
<input type="hidden" id="qtamax_'.$i.'" value="'.($r['qta'] - $r['qta_evasa']).'" />
<input type="hidden" id="um_'.$i.'" name="um['.$r['id'].']" value="'.$r['um'].'" />
<p class="text-center">'.Translator::numberToLocale($r['qta_rimanente']).'</p>
</td>';
@@ -152,7 +145,6 @@ if (!empty($righe)) {
<td>
<input type="hidden" id="subtot_'.$i.'" name="subtot['.$r['id'].']" value="'.str_replace('.', ',', ($r['subtotale'] / $r['qta'])).'" />
<input type="hidden" id="sconto_'.$i.'" name="sconto['.$r['id'].']" value="'.str_replace('.', ',', ($r['sconto'] / $r['qta'])).'" />
<input type="hidden" id="idiva_'.$i.'" name="idiva['.$r['id'].']" value="'.$r['idiva'].'" />
<input type="hidden" id="iva_'.$i.'" name="iva['.$r['id'].']" value="'.str_replace('.', ',', ($r['iva'] / $r['qta'])).'" />
<big id="subtotale_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto + $iva).' &euro;</big><br/>
@@ -185,8 +177,6 @@ if (!empty($righe)) {
echo '
</tr>';
$totale += $subtotale - $sconto + $iva;
}
// Totale
@@ -196,7 +186,7 @@ if (!empty($righe)) {
<b>'.tr('Totale').':</b>
</td>
<td class="text-right" colspan="2">
<big id="totale">'.Translator::numberToLocale($totale).' &euro;</big>
<big id="totale"></big>
</td>
</tr>
</table>';
@@ -285,7 +275,9 @@ echo '
subtot = subtot - sconto;
totale += subtot * qta + iva * qta;
if(subtot) {
totale += subtot * qta + iva * qta;
}
r++;
@@ -306,4 +298,6 @@ echo '
?>
}
ricalcola_totale();
</script>

View File

@@ -16,6 +16,7 @@ abstract class Description extends Model
if (!$bypass) {
$model->is_descrizione = 1;
$model->qta = 1;
}
$model->setParent($document);
@@ -42,6 +43,16 @@ abstract class Description extends Model
return $diff;
}
/**
* Restituisce la quantità rimanente dell'elemento.
*
* @return float
*/
public function getQtaRimanenteAttribute()
{
return $this->qta - $this->qta_evasa;
}
public function delete()
{
$this->evasione(-$this->qta);
@@ -62,8 +73,6 @@ abstract class Description extends Model
if (empty($this->disableOrder)) {
$this->order = orderValue($this->table, $this->getParentID(), $document->id);
}
$this->save();
}
/**
@@ -163,6 +172,7 @@ abstract class Description extends Model
protected function customInitCopiaIn($original)
{
$this->is_descrizione = $original->is_descrizione;
$this->is_sconto = $original->is_sconto;
}
/**

View File

@@ -2,10 +2,23 @@
namespace Common\Components;
use Common\Document;
use Illuminate\Database\Eloquent\Builder;
abstract class Discount extends Row
{
protected $guarded = [];
public static function build(Document $document)
{
$model = parent::build($document, true);
$model->is_sconto = 1;
$model->qta = 1;
return $model;
}
public function getIvaAttribute()
{
return $this->attributes['iva'];
@@ -31,7 +44,7 @@ abstract class Discount extends Row
parent::boot(true);
static::addGlobalScope('discounts', function (Builder $builder) {
$builder->where('subtotale', '=', 0);
$builder->where('is_sconto', '=', 1);
});
}
}

View File

@@ -179,7 +179,7 @@ abstract class Row extends Description
});
static::addGlobalScope('not_discounts', function (Builder $builder) {
$builder->where('subtotale', '!=', 0);
$builder->where('is_sconto', '=', 0);
});
}
}

View File

@@ -126,8 +126,8 @@ switch (post('op')) {
}
break;
// Duplica contratto
// Duplica contratto
case 'copy':
$dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM co_contratti WHERE id = '.prepare($id_record));
$dbo->query('ALTER TABLE tmp DROP id');
@@ -146,14 +146,13 @@ switch (post('op')) {
$dbo->query('UPDATE tmp SET idcontratto = '.prepare($id_record));
$dbo->query('INSERT INTO co_righe_contratti SELECT NULL,tmp.* FROM tmp');
$dbo->query('DROP TEMPORARY TABLE tmp');
//Azzero eventuale quantità evasa
$dbo->query('UPDATE co_righe_contratti SET qta_evasa=0 WHERE id='.prepare($id_record));
//Azzero eventuale quantità evasa
$dbo->query('UPDATE co_righe_contratti SET qta_evasa=0 WHERE id='.prepare($id_record));
flash()->info(tr('Contratto duplicato correttamente!'));
break;
break;
case 'manage_sconto':
if (post('idriga') != null) {
@@ -162,8 +161,6 @@ switch (post('op')) {
$sconto = Sconto::build($contratto);
}
$sconto->qta = 1;
$sconto->descrizione = post('descrizione');
$sconto->id_iva = post('idiva');

View File

@@ -26,10 +26,9 @@ if ($record['rinnovabile']) {
</div>';
}
// Duplica contratto
echo '
<form action="" method="post" id="copia-contratto">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="copy">
</form>';
</form>';

View File

@@ -2,7 +2,11 @@
include_once __DIR__.'/../../core.php';
use Modules\Contratti\Contratto;
if (isset($id_record)) {
$contratto = Contratto::find($id_record);
$record = $dbo->fetchOne('SELECT *,
(SELECT tipo FROM an_anagrafiche WHERE idanagrafica = co_contratti.idanagrafica) AS tipo_anagrafica,
(SELECT is_fatturabile FROM co_staticontratti WHERE id=idstato) AS is_fatturabile,

View File

@@ -188,8 +188,6 @@ switch (post('op')) {
$sconto = Sconto::build($ddt);
}
$sconto->qta = 1;
$sconto->descrizione = post('descrizione');
$sconto->id_iva = post('idiva');

View File

@@ -299,7 +299,7 @@ switch (post('op')) {
$articolo->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto') ?: null;
$articolo->id_ritenuta_acconto = post('id_ritenuta_acconto') ?: null;
$articolo->ritenuta_contributi = post('ritenuta_contributi');
$articolo->ritenuta_contributi = boolval(post('ritenuta_contributi'));
$articolo->id_rivalsa_inps = post('id_rivalsa_inps') ?: null;
$articolo->prezzo_unitario_acquisto = post('prezzo_acquisto') ?: 0;
@@ -339,8 +339,6 @@ switch (post('op')) {
$sconto = Sconto::build($fattura);
}
$sconto->qta = 1;
$sconto->descrizione = post('descrizione');
$sconto->id_iva = post('idiva');
@@ -348,7 +346,7 @@ switch (post('op')) {
$sconto->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto') ?: null;
$sconto->id_ritenuta_acconto = post('id_ritenuta_acconto') ?: null;
$sconto->ritenuta_contributi = post('ritenuta_contributi');
$sconto->ritenuta_contributi = boolval(post('ritenuta_contributi'));
$sconto->id_rivalsa_inps = post('id_rivalsa_inps') ?: null;
$sconto->sconto_unitario = post('sconto_unitario');
@@ -387,7 +385,7 @@ switch (post('op')) {
$riga->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto') ?: null;
$riga->id_ritenuta_acconto = post('id_ritenuta_acconto') ?: null;
$riga->ritenuta_contributi = post('ritenuta_contributi');
$riga->ritenuta_contributi = boolval(post('ritenuta_contributi'));
$riga->id_rivalsa_inps = post('id_rivalsa_inps') ?: null;
$riga->prezzo_unitario_acquisto = post('prezzo_acquisto') ?: 0;

View File

@@ -139,12 +139,26 @@ switch (post('op')) {
}
}
break;
case 'registra-contabile':
break;
}
$bulk = [
'delete-bulk' => tr('Elimina selezionati'),
];
$bulk['registra-contabile'] = [
'text' => tr('Registra contabile pagamento'),
'data' => [
'msg' => tr('Vuoi aggiungere un movimento contabile per le fatture selezionate?'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
if ($module->name == 'Fatture di vendita') {
$bulk['export-bulk'] = [
'text' => tr('Esporta stampe'),

View File

@@ -47,6 +47,13 @@ if (empty($record['is_fiscale'])) {
<?php
if (!empty($record['is_fiscale'])) {
//Aggiunta insoluto
if (!empty($record['riba']) && ($record['stato'] == 'Emessa' || $record['stato'] == 'Parzialmente pagato' || $record['stato'] == 'Pagato') && $dir == 'entrata') {
?>
<button type="button" class="btn btn-primary" onclick="launch_modal( '<?php echo tr('Registra insoluto'); ?>', '<?php echo $rootdir; ?>/add.php?id_module=<?php echo Modules::get('Prima nota')['id']; ?>&iddocumento=<?php echo $id_record; ?>&dir=<?php echo $dir; ?>&insoluto=1', 1 );"><i class="fa fa-euro"></i> <?php echo tr('Registra insoluto'); ?>...</button>
<?php
}
// Aggiunta prima nota solo se non c'è già, se non si è in bozza o se il pagamento non è completo
$n2 = $dbo->fetchNum('SELECT id FROM co_movimenti WHERE iddocumento='.prepare($id_record).' AND primanota=1');

View File

@@ -29,6 +29,7 @@ if (isset($id_record)) {
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
LEFT JOIN co_pagamenti ON co_documenti.idpagamento=co_pagamenti.id
WHERE co_tipidocumento.dir = '.prepare($dir).' AND co_documenti.id='.prepare($id_record));
$note_accredito = $dbo->fetchArray("SELECT co_documenti.id, IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM co_documenti JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE reversed = 1 AND ref_documento=".prepare($id_record));

View File

@@ -122,49 +122,95 @@ function aggiorna_scadenziario($iddocumento, $totale_pagato, $data_pagamento)
{
$dbo = database();
// Lettura righe scadenziario
$query = "SELECT * FROM co_scadenziario WHERE iddocumento='$iddocumento' AND ABS(pagato) < ABS(da_pagare) ORDER BY scadenza ASC";
$rs = $dbo->fetchArray($query);
$netto_fattura = get_netto_fattura($iddocumento);
$rimanente = $netto_fattura;
$rimanente_da_pagare = abs($rs[0]['pagato']) + $totale_pagato;
if ($totale_pagato > 0) {
// Lettura righe scadenziario
$query = "SELECT * FROM co_scadenziario WHERE iddocumento='$iddocumento' AND ABS(pagato) < ABS(da_pagare) ORDER BY scadenza ASC";
$rs = $dbo->fetchArray($query);
$rimanente_da_pagare = abs($rs[0]['pagato']) + $totale_pagato;
// Verifico se la fattura è di acquisto o di vendita per scegliere che segno mettere nel totale
$query2 = 'SELECT dir FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
$rs2 = $dbo->fetchArray($query2);
$dir = $rs2[0]['dir'];
// Verifico se la fattura è di acquisto o di vendita per scegliere che segno mettere nel totale
$query2 = 'SELECT dir FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
$rs2 = $dbo->fetchArray($query2);
$dir = $rs2[0]['dir'];
// Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato.
// Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive
for ($i = 0; $i < sizeof($rs); ++$i) {
if ($rimanente_da_pagare != 0) {
// ...riempio il pagato della rata con il totale della rata stessa se ho ricevuto un pagamento superiore alla rata stessa
if (abs($rimanente_da_pagare) >= abs($rs[$i]['da_pagare'])) {
$pagato = abs($rs[$i]['da_pagare']);
$rimanente_da_pagare -= abs($rs[$i]['da_pagare']);
} else {
// Se si inserisce una somma maggiore al dovuto, tengo valido il rimanente per saldare il tutto...
if (abs($rimanente_da_pagare) > abs($rs[$i]['da_pagare'])) {
// Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato.
// Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive
for ($i = 0; $i < sizeof($rs); ++$i) {
if ($rimanente_da_pagare > 0) {
// ...riempio il pagato della rata con il totale della rata stessa se ho ricevuto un pagamento superiore alla rata stessa
if (abs($rimanente_da_pagare) >= abs($rs[$i]['da_pagare'])) {
$pagato = abs($rs[$i]['da_pagare']);
$rimanente_da_pagare -= abs($rs[$i]['da_pagare']);
}
// ...altrimenti aggiungo l'importo pagato
else {
$pagato = abs($rimanente_da_pagare);
$rimanente_da_pagare -= abs($rimanente_da_pagare);
}
}
if ($dir == 'uscita') {
$rimanente_da_pagare = -$rimanente_da_pagare;
}
if ($pagato > 0) {
if ($dir == 'uscita') {
$dbo->query('UPDATE co_scadenziario SET pagato='.prepare(-$pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id']));
} else {
$dbo->query('UPDATE co_scadenziario SET pagato='.prepare($pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id']));
// Se si inserisce una somma maggiore al dovuto, tengo valido il rimanente per saldare il tutto...
if (abs($rimanente_da_pagare) > abs($rs[$i]['da_pagare'])) {
$pagato = abs($rs[$i]['da_pagare']);
$rimanente_da_pagare -= abs($rs[$i]['da_pagare']);
}
// ...altrimenti aggiungo l'importo pagato
else {
$pagato = abs($rimanente_da_pagare);
$rimanente_da_pagare -= abs($rimanente_da_pagare);
}
}
if ($dir == 'uscita') {
$rimanente_da_pagare = -$rimanente_da_pagare;
}
if ($pagato > 0) {
if ($dir == 'uscita') {
$dbo->query('UPDATE co_scadenziario SET pagato='.prepare(-$pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id']));
} else {
$dbo->query('UPDATE co_scadenziario SET pagato='.prepare($pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id']));
}
}
}
}
} else {
// Lettura righe scadenziario
$query = "SELECT * FROM co_scadenziario WHERE iddocumento='$iddocumento' AND ABS(pagato)>0 ORDER BY scadenza DESC";
$rs = $dbo->fetchArray($query);
$residuo_pagato = abs($rs[0]['pagato']) + $totale_pagato;
// Verifico se la fattura è di acquisto o di vendita per scegliere che segno mettere nel totale
$query2 = 'SELECT dir FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
$rs2 = $dbo->fetchArray($query2);
$dir = $rs2[0]['dir'];
// Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato.
// Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive
for ($i = 0; $i < sizeof($rs); ++$i) {
if ($residuo_pagato >= 0) {
// ...riempio il pagato della rata con il totale della rata stessa se ho ricevuto un pagamento superiore alla rata stessa
if (abs($residuo_pagato) <= abs($rs[$i]['pagato'])) {
$pagato = 0;
$residuo_pagato -= abs($rs[$i]['pagato']);
} else {
// Se si inserisce una somma maggiore al dovuto, tengo valido il rimanente per saldare il tutto...
if (abs($residuo_pagato) < abs($rs[$i]['pagato'])) {
$pagato = 0;
$residuo_pagato -= abs($rs[$i]['pagato']);
}
// ...altrimenti aggiungo l'importo pagato
else {
$pagato = abs($residuo_pagato);
$residuo_pagato -= abs($residuo_pagato);
}
}
if ($dir == 'uscita') {
$residuo_pagato = -$residuo_pagato;
}
if ($pagato >= 0) {
if ($dir == 'uscita') {
$dbo->query('UPDATE co_scadenziario SET pagato='.prepare(-$pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id']));
} else {
$dbo->query('UPDATE co_scadenziario SET pagato='.prepare($pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id']));
}
}
}
}

View File

@@ -2,6 +2,8 @@
$r = $dbo->fetchOne('SELECT co_documenti.*,
an_anagrafiche.email,
an_anagrafiche.idconto_cliente,
an_anagrafiche.idconto_fornitore,
an_anagrafiche.pec,
an_anagrafiche.ragione_sociale,
(SELECT pec FROM zz_smtps WHERE zz_smtps.id='.prepare($template['id_smtp']).') AS is_pec
@@ -9,6 +11,17 @@ FROM co_documenti INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anag
$logo_azienda = str_replace(DOCROOT, ROOTDIR, App::filepath('templates/base|custom|/logo_azienda.jpg'));
//cliente
if ($r['idconto_cliente'] != '') {
$conto = $r['idconto_cliente'];
$conto_descrizione = $dbo->fetchOne('SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) AS descrizione FROM co_pianodeiconti3 WHERE id='.prepare($conto))['descrizione'];
}
//Fornitore
elseif ($r['idconto_fornitore'] != '') {
$conto = $r['idconto_fornitore'];
$conto_descrizione = $dbo->fetchOne('SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) AS descrizione FROM co_pianodeiconti3 WHERE id='.prepare($conto))['descrizione'];
}
// Variabili da sostituire
return [
'email' => $r['is_pec'] ? $r['pec'] : $r['email'],
@@ -18,4 +31,6 @@ return [
'note' => $r['note'],
'data' => Translator::dateToLocale($r['data']),
'logo_azienda' => !empty($logo_azienda) ? '<img src="'.$logo_azienda.'" />' : '',
'conto' => $conto,
'conto_descrizione' => $conto_descrizione,
];

View File

@@ -332,8 +332,6 @@ switch (post('op')) {
$sconto = Riga::build($intervento);
}
$sconto->qta = 1;
$sconto->descrizione = post('descrizione');
$sconto->id_iva = post('idiva');

View File

@@ -324,15 +324,6 @@ function get_costi_intervento($id_intervento)
$result['altro_scontato'] + ($result['altro_scontato'] * $result['altro_iva'] / 100),
]);
// Calcolo dello sconto incondizionato
$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_scontato'] = sum($result['totale_scontato'], -$result['sconto_globale']);
$result['iva_totale'] = sum($result['iva_totale'], -($result['sconto_globale'] * $rs_iva[0]['percentuale'] / 100));
$result['totale'] = sum($result['totale'], -($result['sconto_globale'] + ($result['sconto_globale'] * $rs_iva[0]['percentuale'] / 100)));
return $result;
}

View File

@@ -0,0 +1,196 @@
<?php
namespace Modules\Interventi\Components;
use Common\Model;
use Modules\Interventi\Intervento;
/**
* Notazione: i costi sono rivolti all'azienda, i prezzi al cliente.
*
* @since 2.4.9
*/
class Sessione extends Model
{
use RelationTrait;
protected $table = 'in_interventi_tecnici';
public function getParentID()
{
return 'idintervento';
}
public function parent()
{
return $this->belongsTo(Intervento::class, $this->getParentID());
}
// Costi per l'azienda
/**
* Restituisce il costo orario (per l'azienda) per la sessione del tecnico.
*
* @return float
*/
public function getCostoOrarioAttribute()
{
return $this->attributes['prezzo_ore_unitario_tecnico'];
}
/**
* Restituisce il costo del diritto di chiamata (per l'azienda) per la sessione del tecnico.
*
* @return float
*/
public function getCostoDirittoChiamataAttribute()
{
return $this->attributes['prezzo_dirittochiamata_tecnico'];
}
/**
* Restituisce il costo chilometrico (per l'azienda) del viaggio del tecnico.
*
* @return float
*/
public function getCostoChilometricoAttribute()
{
return $this->attributes['prezzo_km_unitario_tecnico'];
}
/**
* Restituisce il costo totale della manodopera escluso il diritto di chiamata (per l'azienda) per la sessione del tecnico.
*
* @return float
*/
public function getCostoManodoperaAttribute()
{
return $this->costo_orario * $this->ore;
}
/**
* Restituisce il costo totale (per l'azienda) del viaggio del tecnico.
*
* @return float
*/
public function getCostoViaggioAttribute()
{
return $this->costo_chilometrico * $this->km;
}
// Prezzi per il cliente
/**
* Restituisce il prezzo del diritto di chiamata (per il cliente) per la sessione del tecnico.
*
* @return float
*/
public function getPrezzoDirittoChiamataAttribute()
{
return $this->attributes['prezzo_dirittochiamata'];
}
/**
* Restituisce il prezzo del diritto di chiamata (per il cliente) per la sessione del tecnico.
*
* @return float
*/
public function getPrezzoChilometricoAttribute()
{
return $this->attributes['prezzo_km_unitario'];
}
/**
* Restituisce il prezzo del diritto di chiamata (per il cliente) per la sessione del tecnico.
*
* @return float
*/
public function getPrezzoOrarioAttribute()
{
return $this->attributes['prezzo_ore_unitario'];
}
/**
* Restituisce il prezzo totale della manodopera escluso il diritto di chiamata (per il cliente) per la sessione del tecnico.
*
* @return float
*/
public function getPrezzoManodoperaAttribute()
{
return $this->prezzo_orario * $this->ore;
}
/**
* Restituisce lo sconto totale km in euro.
*
* @return float
*/
public function getScontoTotaleManodoperaAttribute()
{
return calcola_sconto([
'sconto' => $this->sconto_unitario,
'prezzo' => $this->prezzo_manodopera,
'tipo' => $this->tipo_sconto,
]);
}
/**
* Restituisce il prezzo totale scontato (per il cliente) del viaggio del tecnico.
*
* @return float
*/
public function getPrezzoManodoperaScontatoAttribute()
{
return $this->prezzo_manodopera - $this->sconto_totale_manodopera;
}
/**
* Restituisce il prezzo totale (per il cliente) del viaggio del tecnico.
*
* @return float
*/
public function getPrezzoViaggioAttribute()
{
return $this->prezzo_chilometrico * $this->km;
}
/**
* Restituisce lo sconto totale km in euro.
*
* @return float
*/
public function getScontoTotaleKmAttribute()
{
return calcola_sconto([
'sconto' => $this->scontokm_unitario,
'prezzo' => $this->prezzo_viaggio,
'tipo' => $this->tipo_scontokm,
]);
}
/**
* Restituisce il prezzo totale scontato (per il cliente) del viaggio del tecnico.
*
* @return float
*/
public function getPrezzoViaggioScontatoAttribute()
{
return $this->prezzo_viaggio - $this->sconto_totale_km;
}
/**
* Crea un nuova sessione collegata ad un intervento.
*
* @param Intervento $intervento
*
* @return self
*/
public static function build(Intervento $intervento)
{
$model = parent::build($intervento);
$model->parent()->associate($intervento);
return $model;
}
}

View File

@@ -5,8 +5,6 @@ namespace Modules\Interventi;
use Common\Document;
use Modules\Anagrafiche\Anagrafica;
use Modules\Contratti\Contratto;
use Modules\Interventi\Components\Articolo;
use Modules\Interventi\Components\Riga;
use Modules\Preventivi\Preventivo;
use Util\Generator;
@@ -67,12 +65,12 @@ class Intervento extends Document
public function articoli()
{
return $this->hasMany(Articolo::class, 'idintervento');
return $this->hasMany(Components\Articolo::class, 'idintervento');
}
public function righe()
{
return $this->hasMany(Riga::class, 'idintervento');
return $this->hasMany(Components\Riga::class, 'idintervento');
}
public function sconti()
@@ -85,6 +83,11 @@ class Intervento extends Document
return $this->righe()->where('prezzo_vendita', 0);
}
public function sessioni()
{
return $this->hasMany(Components\Sessione::class, 'idintervento');
}
// Metodi statici
/**

View File

@@ -6,12 +6,15 @@ switch (post('op')) {
case 'add':
$idmastrino = get_new_idmastrino('co_movimenti_modelli');
$descrizione = post('descrizione');
$nome = post('nome');
for ($i = 0; $i < sizeof(post('idconto')); ++$i) {
$idconto = post('idconto')[$i];
$query = 'INSERT INTO co_movimenti_modelli(idmastrino, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($descrizione).', '.prepare($idconto).')';
if ($dbo->query($query)) {
$id_record = $dbo->lastInsertedID();
if (!empty($idconto)) {
$query = 'INSERT INTO co_movimenti_modelli(idmastrino, nome, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($nome).', '.prepare($descrizione).', '.prepare($idconto).')';
if ($dbo->query($query)) {
$id_record = $idmastrino;
}
}
}
@@ -20,15 +23,18 @@ switch (post('op')) {
case 'editriga':
$idmastrino = post('idmastrino');
$descrizione = post('descrizione');
$nome = post('nome');
// Eliminazione prima nota
$dbo->query('DELETE FROM co_movimenti_modelli WHERE idmastrino='.prepare($idmastrino));
for ($i = 0; $i < sizeof(post('idconto')); ++$i) {
$idconto = post('idconto')[$i];
$query = 'INSERT INTO co_movimenti_modelli(idmastrino, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($descrizione).', '.prepare($idconto).')';
if ($dbo->query($query)) {
$id_record = $dbo->lastInsertedID();
if (!empty($idconto)) {
$query = 'INSERT INTO co_movimenti_modelli(idmastrino, nome, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($nome).', '.prepare($descrizione).', '.prepare($idconto).')';
if ($dbo->query($query)) {
$id_record = $idmastrino;
}
}
}

View File

@@ -7,8 +7,11 @@ include_once __DIR__.'/../../core.php';
<input type="hidden" name="backto" value="record-edit">
<div class="row">
<div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1 ]}
<div class="col-md-5">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1 ]}
</div>
<div class="col-md-7">
{[ "type": "text", "label": "<?php echo tr('Causale'); ?>", "name": "descrizione", "required": 1 ]}
</div>
</div>
@@ -40,7 +43,36 @@ include_once __DIR__.'/../../core.php';
echo '
</table>';
?>
// Variabili utilizzabili
$variables = include Modules::filepath(Modules::get('Fatture di vendita')['id'], 'variables.php');
echo '
<!-- Istruzioni per il contenuto -->
<div class="box box-info">
<div class="box-body">';
if (!empty($variables)) {
echo '
<p>'.tr("Puoi utilizzare le seguenti sequenze di testo all'interno del campo causale, verranno sostituite in fase generazione prima nota dalla fattura.").':</p>
<ul>';
foreach ($variables as $variable => $value) {
echo '
<li><code>{'.$variable.'}</code></li>';
}
echo '
</ul>';
} else {
echo '
<p><i class="fa fa-warning"></i> '.tr('Non sono state definite variabili da utilizzare nel template').'.</p>';
}
echo '
</div>
</div>';
?>
<!-- PULSANTI -->
<div class="row">

View File

@@ -11,8 +11,11 @@ include_once __DIR__.'/../../core.php';
<div class="row">
<div class="col-md-12">
{[ "type": "text", "label": "<?php echo tr('Causale predefinita'); ?>", "name": "descrizione", "required": 1, "value": "$descrizione$" ]}
<div class="col-md-5">
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1, "value": "$nome$" ]}
</div>
<div class="col-md-7">
{[ "type": "text", "label": "<?php echo tr('Causale'); ?>", "name": "descrizione", "required": 1, "value": "$descrizione$" ]}
</div>
</div>
@@ -52,7 +55,7 @@ for ($i = 0; $i < 10; ++$i) {
echo '
<tr>
<td>
{[ "type": "select", "name": "idconto['.$i.']", "value": "'.$rs[$i]['idconto'].'", "ajax-source": "conti", "required": "'.$required.'" ]}
{[ "type": "select", "name": "idconto['.$i.']", "value": "'.$rs[$i]['idconto'].'", "ajax-source": "conti-modelliprimanota", "required": "'.$required.'" ]}
</td>
</tr>';
}
@@ -80,6 +83,50 @@ echo '
</form>
<?php
// Variabili utilizzabili
$variables = include Modules::filepath(Modules::get('Fatture di vendita')['id'], 'variables.php');
echo '
<!-- Istruzioni per il contenuto -->
<div class="box box-info">
<div class="box-body">';
if (!empty($variables)) {
echo '
<p>'.tr("Puoi utilizzare le seguenti sequenze di testo all'interno del campo causale, verranno sostituite in fase generazione prima nota dalla fattura.").':</p>
<ul>';
foreach ($variables as $variable => $value) {
echo '
<li><code>{'.$variable.'}</code></li>';
}
echo '
</ul>';
} else {
echo '
<p><i class="fa fa-warning"></i> '.tr('Non sono state definite variabili da utilizzare nel template').'.</p>';
}
echo '
</div>
</div>';
?>
<a class="btn btn-danger ask" data-backto="record-list" data-idmastrino="<?php echo $record['idmastrino']; ?>">
<i class="fa fa-trash"></i> <?php echo tr('Elimina'); ?>
</a>
<script>
$('select[name=idconto]').each(function(){
this.selectAdd([{
'value': -1,
'text': "Conto cliente fattura",
}]);
});
</Script>

View File

@@ -1,7 +1,5 @@
<?php
include_once __DIR__.'/../../core.php';
if (isset($id_record)) {
$record = $dbo->fetchOne('SELECT * FROM co_movimenti_modelli WHERE id='.prepare($id_record));
$record = $dbo->fetchOne('SELECT * FROM co_movimenti_modelli WHERE idmastrino='.prepare($id_record));
}

View File

@@ -220,6 +220,7 @@ switch (post('op')) {
flash()->info(tr('Riga rimossa!'));
}
break;
case 'manage_sconto':
@@ -229,8 +230,6 @@ switch (post('op')) {
$sconto = Sconto::build($ordine);
}
$sconto->qta = 1;
$sconto->descrizione = post('descrizione');
$sconto->id_iva = post('idiva');

View File

@@ -84,4 +84,57 @@ switch ($resource) {
}
break;
case 'conti-modelliprimanota':
$query = 'SELECT co_pianodeiconti2.* FROM co_pianodeiconti2 LEFT JOIN co_pianodeiconti3 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id |where| GROUP BY co_pianodeiconti2.id';
if ($search != '') {
$wh = 'WHERE (co_pianodeiconti3.descrizione LIKE '.prepare('%'.$search.'%')." OR CONCAT( co_pianodeiconti2.numero, '.', co_pianodeiconti3.numero ) LIKE ".prepare('%'.$search.'%').')';
} else {
$wh = '';
}
$query = str_replace('|where|', $wh, $query);
$rs = $dbo->fetchArray($query);
foreach ($rs as $r) {
$results[] = ['text' => $r['numero'].' '.$r['descrizione'], 'children' => []];
$subquery = 'SELECT co_pianodeiconti3.* FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id |where|';
$where = [];
$filter = [];
$search_fields = [];
foreach ($elements as $element) {
$filter[] = 'co_pianodeiconti3.id='.prepare($element);
}
if (!empty($filter)) {
$where[] = '('.implode(' OR ', $filter).')';
}
$where[] = 'idpianodeiconti2='.prepare($r['id']);
if (!empty($search)) {
$search_fields[] = '(co_pianodeiconti3.descrizione LIKE '.prepare('%'.$search.'%')." OR CONCAT(co_pianodeiconti2.numero, '.', co_pianodeiconti3.numero) LIKE ".prepare('%'.$search.'%').')';
}
if (!empty($search_fields)) {
$where[] = '('.implode(' OR ', $search_fields).')';
}
$wh = '';
if (count($where) != 0) {
$wh = 'WHERE '.implode(' AND ', $where);
}
$subquery = str_replace('|where|', $wh, $subquery);
$rs2 = $dbo->fetchArray($subquery);
foreach ($rs2 as $r2) {
$results[count($results) - 1]['children'][] = ['id' => $r2['id'], 'text' => $r['numero'].'.'.$r2['numero'].' '.$r2['descrizione']];
}
$results[] = ['text' => 'Conto cliente/fornitore fattura', 'children' => []];
$results[count($results) - 1]['children'][] = ['id' => '-1', 'text' => '{Conto cliente/fornitore fattura}'];
}
break;
}

View File

@@ -32,7 +32,7 @@ switch (post('op')) {
$idstato = post('idstato');
$nome = post('nome');
$idanagrafica = post('idanagrafica');
$idsede = post('idsede');
$idsede = post('idsede');
$idagente = post('idagente');
$idreferente = post('idreferente');
$idpagamento = post('idpagamento');
@@ -70,7 +70,7 @@ switch (post('op')) {
$query = 'UPDATE co_preventivi SET idstato='.prepare($idstato).','.
' nome='.prepare($nome).','.
' idanagrafica='.prepare($idanagrafica).','.
' idsede='.prepare($idsede).','.
' idsede='.prepare($idsede).','.
' idagente='.prepare($idagente).','.
' idreferente='.prepare($idreferente).','.
' idpagamento='.prepare($idpagamento).','.
@@ -116,9 +116,9 @@ switch (post('op')) {
$dbo->query('UPDATE tmp SET idpreventivo = '.prepare($id_record));
$dbo->query('INSERT INTO co_righe_preventivi SELECT NULL,tmp.* FROM tmp');
$dbo->query('DROP TEMPORARY TABLE tmp');
//Azzero eventuale quantità evasa
$dbo->query('UPDATE co_righe_preventivi SET qta_evasa=0 WHERE id='.prepare($id_record));
//Azzero eventuale quantità evasa
$dbo->query('UPDATE co_righe_preventivi SET qta_evasa=0 WHERE id='.prepare($id_record));
flash()->info(tr('Preventivo duplicato correttamente!'));
@@ -243,8 +243,6 @@ switch (post('op')) {
$sconto = Sconto::build($preventivo);
}
$sconto->qta = 1;
$sconto->descrizione = post('descrizione');
$sconto->id_iva = post('idiva');
@@ -371,7 +369,6 @@ switch (post('op')) {
'sconto' => $rs_righe_preventivo[$i]['sconto'],
'sconto_unitario' => $rs_righe_preventivo[$i]['sconto_unitario'],
'tipo_sconto' => $rs_righe_preventivo[$i]['tipo_sconto'],
'sconto_globale' => $rs_righe_preventivo[$i]['sconto_globale'],
'um' => $rs_righe_preventivo[$i]['um'],
'qta' => $rs_righe_preventivo[$i]['qta'],
'order' => $rs_righe_preventivo[$i]['order'],

View File

@@ -9,6 +9,7 @@ switch (post('op')) {
$data = post('data');
$idmastrino = get_new_idmastrino();
$descrizione = post('descrizione');
$insoluto = post('insoluto');
// Lettura info fattura
$query = 'SELECT *, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipodoc` 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);
@@ -42,9 +43,12 @@ switch (post('op')) {
}
}
// Inserisco nello scadenziario il totale pagato
if ($totale_pagato != 0) {
if ($totale_pagato != 0 && empty($insoluto)) {
// Inserisco nello scadenziario il totale pagato
aggiorna_scadenziario($iddocumento, abs($totale_pagato), $data);
} elseif (!empty($insoluto)) {
//Rimuovo dallo scadenzario l'insoluto
aggiorna_scadenziario($iddocumento, -abs($totale_pagato), $data);
}
// Se non va a buon fine qualcosa elimino il mastrino per non lasciare incongruenze nel db
@@ -61,8 +65,10 @@ switch (post('op')) {
// Aggiorno lo stato della fattura
if (abs($rs[0]['tot_pagato']) == abs($rs[0]['tot_da_pagare'])) {
$dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Pagato') WHERE id=".prepare($iddocumento));
} else {
} elseif (abs($rs[0]['tot_pagato']) != abs($rs[0]['tot_da_pagare']) && abs($rs[0]['tot_pagato']) != '0') {
$dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Parzialmente pagato') WHERE id=".prepare($iddocumento));
} else {
$dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Emessa') WHERE id=".prepare($iddocumento));
}
// Aggiorno lo stato dei preventivi collegati alla fattura se ce ne sono
@@ -101,7 +107,7 @@ switch (post('op')) {
for ($i = 0; $i < sizeof(post('idconto')); ++$i) {
$idconto = post('idconto')[$i];
$query = 'INSERT INTO co_movimenti_modelli(idmastrino, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($descrizione).', '.prepare($idconto).')';
$query = 'INSERT INTO co_movimenti_modelli(idmastrino, nome, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($descrizione).', '.prepare($descrizione).', '.prepare($idconto).')';
$dbo->query($query);
}
}

View File

@@ -5,7 +5,7 @@ include_once __DIR__.'/../../core.php';
?><form action="<?php echo ROOTDIR; ?>/controller.php?id_module=<?php echo Modules::get('Prima nota')['id']; ?>" method="post" id="add-form">
<input type="hidden" name="op" value="add">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="iddocumento" value="<?php echo get('iddocumento'); ?>">
<input type="hidden" name="iddocumento" id="iddocumento" value="<?php echo get('iddocumento'); ?>">
<input type="hidden" name="crea_modello" id="crea_modello" value="0">
<input type="hidden" name="idmastrino" id="idmastrino" value="0">
@@ -13,6 +13,15 @@ include_once __DIR__.'/../../core.php';
$idconto = get('idconto');
$iddocumento = get('iddocumento');
$dir = get('dir');
$insoluto = get('insoluto');
if (!empty($insoluto)) {
echo '<input type="hidden" name="insoluto" value="1">';
}
// Lettura delle variabili nei singoli moduli
$id_record = $iddocumento;
$variables = include Modules::filepath(Modules::get('Fatture di vendita')['id'], 'variables.php');
if (!empty($iddocumento)) {
// Lettura numero e tipo di documento
@@ -33,7 +42,14 @@ include_once __DIR__.'/../../core.php';
$tipo_doc = 'fattura';
}
$descrizione = tr('Pag. _DOC_ num. _NUM_ del _DATE_ (_NAME_)', [
if (!empty($insoluto)) {
$operation = 'Registrazione insoluto';
} else {
$operation = 'Pag.';
}
$descrizione = tr('_OP_ _DOC_ num. _NUM_ del _DATE_ (_NAME_)', [
'_OP_' => $operation,
'_DOC_' => $tipo_doc,
'_NUM_' => $numero_doc,
'_DATE_' => Translator::dateToLocale($rs[0]['data']),
@@ -74,7 +90,11 @@ include_once __DIR__.'/../../core.php';
$query = 'SELECT SUM(pagato) AS tot_pagato, SUM(da_pagare) AS tot_da_pagare FROM co_scadenziario GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$importo_conto_aziendale = abs($rs[0]['tot_da_pagare']) - abs($rs[0]['tot_pagato']);
if (!empty($insoluto)) {
$importo_conto_aziendale = abs($rs[0]['tot_da_pagare']);
} else {
$importo_conto_aziendale = abs($rs[0]['tot_da_pagare']) - abs($rs[0]['tot_pagato']);
}
$totale_dare = $importo_conto_aziendale;
}
@@ -124,7 +144,7 @@ include_once __DIR__.'/../../core.php';
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "<?php echo tr('Modello primanota'); ?>", "id": "modello_primanota", "values": "query=SELECT idmastrino AS id, descrizione FROM co_movimenti_modelli GROUP BY idmastrino" ]}
{[ "type": "select", "label": "<?php echo tr('Modello primanota'); ?>", "id": "modello_primanota", "values": "query=SELECT idmastrino AS id, nome AS descrizione, descrizione as causale FROM co_movimenti_modelli GROUP BY idmastrino" ]}
</div>
</div>
@@ -195,7 +215,7 @@ include_once __DIR__.'/../../core.php';
}
// Se è una nota di credito, inverto i valori
if ($nota_credito) {
if ($nota_credito || $insoluto) {
$tmp = $value_dare;
$value_dare = $value_avere;
$value_avere = $tmp;
@@ -350,26 +370,53 @@ include_once __DIR__.'/../../core.php';
$('#bs-popup #idmastrino').val(0);
}
var idmastrino = $(this).val();
var idmastrino = $(this).val();
var variables = <?php echo json_encode($variables); ?>;
var replaced = 0;
if(idmastrino!=''){
var causale = $(this).find('option:selected').text();
var causale = $(this).find('option:selected').data('causale');
if($('#iddocumento').val()!=''){
for (i in variables){
if(causale.includes('{'+i+'}')){
replaced++;
causale = causale.replace('{'+i+'}', variables[i]);
}
}
}else{
for (i in variables){
causale = causale.replace('{'+i+'}', '_');
}
}
//aggiornava erroneamente anche la causale ed eventuale numero di fattura e data
<?php if (empty($iddocumento)) {
?>
$('#bs-popup #desc').val(causale);
<?php
} ?>
//aggiornava erroneamente anche la causale ed eventuale numero di fattura e data
if(replaced>0 || $('#iddocumento').val()==''){
$('#bs-popup #desc').val(causale);
}
$.get('<?php echo $rootdir; ?>/ajax_complete.php?op=get_conti&idmastrino='+idmastrino, function(data){
var conti = data.split(',');
for(i=0;i<conti.length;i++){
var conto = conti[i].split(';');
var option = $("<option selected></option>").val(conto[0]).text(conto[1]);
$('#bs-popup #conto'+i).selectReset();
$('#bs-popup #conto'+i).append(option).trigger('change');
}
var conto = conti[i].split(';');
//Sostituzione conto cliente/fornitore
if(conto[0]==-1){
if($('#iddocumento').val()!=''){
var option = $("<option selected></option>").val(variables['conto']).text(variables['conto_descrizione']);
$('#bs-popup #conto'+i).selectReset();
$('#bs-popup #conto'+i).append(option).trigger('change');
}
}else{
var option = $("<option selected></option>").val(conto[0]).text(conto[1]);
$('#bs-popup #conto'+i).selectReset();
$('#bs-popup #conto'+i).append(option).trigger('change');
}
}
for(i=9;i>=conti.length;i--){
$('#bs-popup #conto'+i).selectReset();
console.log('#bs-popup #conto'+i);
}
});
}
});

View File

@@ -6,7 +6,7 @@ switch ($resource) {
case 'get_conti':
$idmastrino = get('idmastrino');
$conti = [];
$rs_conti = $dbo->fetchArray('SELECT *, (SELECT descrizione FROM co_pianodeiconti3 WHERE id=co_movimenti_modelli.idconto) AS descrizione_conto FROM co_movimenti_modelli WHERE idmastrino='.prepare($idmastrino).' GROUP BY id');
$rs_conti = $dbo->fetchArray('SELECT *, (SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) FROM co_pianodeiconti3 WHERE id=co_movimenti_modelli.idconto) AS descrizione_conto FROM co_movimenti_modelli WHERE idmastrino='.prepare($idmastrino).' GROUP BY id ORDER BY id');
for ($i = 0; $i < sizeof($rs_conti); ++$i) {
$conti[$i] = $rs_conti[$i]['idconto'].';'.$rs_conti[$i]['descrizione_conto'];

View File

@@ -127,8 +127,10 @@ echo '
?>
</table>
<a onclick="launch_modal( 'Aggiungi prima nota', '<?php echo $rootdir; ?>/add.php?id_module=<?php echo Modules::get('Prima nota')['id']; ?>&iddocumento=<?php echo $record['iddocumento']; ?>&dir=<?php echo $dir; ?>', 1 );" class="btn btn-sm btn-primary pull-right"><i class="fa fa-euro"></i> <?php echo tr('Aggiungi prima nota...'); ?></a>
<div class='pull-right'>
<a onclick="launch_modal( 'Aggiungi prima nota', '<?php echo $rootdir; ?>/add.php?id_module=<?php echo Modules::get('Prima nota')['id']; ?>&iddocumento=<?php echo $record['iddocumento']; ?>&dir=<?php echo $dir; ?>', 1 );" class="btn btn-sm btn-primary"><i class="fa fa-euro"></i> <?php echo tr('Aggiungi prima nota...'); ?></a>
</div>
<div class="clearfix"></div>

View File

@@ -72,7 +72,7 @@ switch (post('op')) {
case 'test':
$mail = new Mail($id_record);
echo json_encode( [
echo json_encode([
'test' => $mail->testSMTP(),
]);

View File

@@ -689,22 +689,6 @@ class FatturaElettronica
// Sconto globale (2.1.1.8)
// Disabilitazione per aggiornamento sconti
/*
$documento['sconto_globale'] = floatval($documento['sconto_globale']);
if (!empty($documento['sconto_globale'])) {
$sconto = [
'Tipo' => $documento['sconto_globale'] > 0 ? 'SC' : 'MG',
];
if ($documento['tipo_sconto_globale'] == 'PRC') {
$sconto['Percentuale'] = $documento['sconto_globale'];
} else {
$sconto['Importo'] = $documento['sconto_globale'];
}
$result['ScontoMaggiorazione'] = $sconto;
}
*/
// Importo Totale Documento (2.1.1.9)
// Valorizzare limporto complessivo lordo della fattura (onnicomprensivo di Iva, bollo, contributi previdenziali, ecc…)

View File

@@ -61,6 +61,7 @@ foreach ($interventi as $intervento) {
'sconto' => $sconto_globale,
'sconto_unitario' => $sconto_globale,
'tipo_sconto' => 'UNT',
'is_sconto' => 1,
'idiva' => $id_iva['id'],
'desc_iva' => $iva['descrizione'],
'iva' => $valore_iva,

View File

@@ -117,24 +117,29 @@ ALTER TABLE `co_contratti` DROP `sconto_globale`, DROP `tipo_sconto_globale`;
ALTER TABLE `or_ordini` DROP `sconto_globale`, DROP `tipo_sconto_globale`;
ALTER TABLE `dt_ddt` DROP `sconto_globale`, DROP `tipo_sconto_globale`;
UPDATE `co_righe_documenti` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT' WHERE `sconto_globale` != 0;
ALTER TABLE `co_righe_documenti` ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`;
UPDATE `co_righe_documenti` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT', `is_sconto` = 1 WHERE `sconto_globale` != 0;
ALTER TABLE `co_righe_documenti` DROP `sconto_globale`;
UPDATE `co_righe_preventivi` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT' WHERE `sconto_globale` != 0;
ALTER TABLE `co_righe_preventivi` ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`;
UPDATE `co_righe_preventivi` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT', `is_sconto` = 1 WHERE `sconto_globale` != 0;
ALTER TABLE `co_righe_preventivi` DROP `sconto_globale`;
UPDATE `co_righe_contratti` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT' WHERE `sconto_globale` != 0;
ALTER TABLE `co_righe_contratti` ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`;
UPDATE `co_righe_contratti` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT', `is_sconto` = 1 WHERE `sconto_globale` != 0;
ALTER TABLE `co_righe_contratti` DROP `sconto_globale`;
UPDATE `or_righe_ordini` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT' WHERE `sconto_globale` != 0;
ALTER TABLE `or_righe_ordini` ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`;
UPDATE `or_righe_ordini` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT', `is_sconto` = 1 WHERE `sconto_globale` != 0;
ALTER TABLE `or_righe_ordini` DROP `sconto_globale`;
UPDATE `dt_righe_ddt` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT' WHERE `sconto_globale` != 0;
ALTER TABLE `dt_righe_ddt` ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`;
UPDATE `dt_righe_ddt` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT', `is_sconto` = 1 WHERE `sconto_globale` != 0;
ALTER TABLE `dt_righe_ddt` DROP `sconto_globale`;
-- Fix per la tabella in_righe_interventi
ALTER TABLE `in_righe_interventi` ADD `is_descrizione` TINYINT(1) NOT NULL AFTER `idintervento`, ADD `idarticolo` INT(11) AFTER `idintervento`, ADD FOREIGN KEY (`idarticolo`) REFERENCES `mg_articoli`(`id`);
ALTER TABLE `mg_articoli_interventi` ADD `is_descrizione` TINYINT(1) NOT NULL AFTER `idintervento`;
ALTER TABLE `in_righe_interventi` ADD `is_descrizione` TINYINT(1) NOT NULL AFTER `idintervento`, ADD `idarticolo` INT(11) AFTER `idintervento`, ADD FOREIGN KEY (`idarticolo`) REFERENCES `mg_articoli`(`id`), ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`;
ALTER TABLE `mg_articoli_interventi` ADD `is_descrizione` TINYINT(1) NOT NULL AFTER `idintervento`, ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`;
-- Rimozione campi inutilizzati co_ritenutaacconto
ALTER TABLE `co_ritenutaacconto` DROP `esente`, DROP `indetraibile`;
@@ -144,4 +149,58 @@ UPDATE `co_ritenutaacconto` SET `percentuale_imponibile` = 100;
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS('' '', REPLACE(REPLACE(REPLACE(FORMAT((SELECT ABS(SUM(da_pagare-pagato))), 2), '','', ''#''), ''.'', '',''),''#'', ''.''), ''&euro;'') AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=''uscita'' AND co_documenti.idstatodocumento!=1 |segment| AND 1=1' WHERE `zz_widgets`.`name` = 'Debiti verso fornitori';
-- Aggiunta idsede anche preventivi (completamento 2.4.1)
ALTER TABLE `co_preventivi` ADD `idsede` INT NOT NULL AFTER `idanagrafica`;
ALTER TABLE `co_preventivi` ADD `idsede` INT NOT NULL AFTER `idanagrafica`;
-- Aggiunta flag riba per tipi di pagamento Ri.Ba.
ALTER TABLE `co_pagamenti` ADD `riba` TINYINT(1) NOT NULL DEFAULT '0' AFTER `codice_modalita_pagamento_fe`;
UPDATE `co_pagamenti` SET `riba` = 1 WHERE `descrizione` LIKE 'Ri.Ba.%';
-- Creazione nuovo conto per anticipi Ri.Ba.
INSERT INTO `co_pianodeiconti3` (`id`, `numero`, `descrizione`, `idpianodeiconti2`, `dir`, `can_delete`, `can_edit`) VALUES (NULL, '000021', 'Banca C/C (conto anticipi)', '1', '', '0', '0');
-- Aggiunta colonna nome per i modelli primanota
ALTER TABLE `co_movimenti_modelli` ADD `nome` VARCHAR(255) NOT NULL AFTER `idmastrino`;
UPDATE `zz_views` SET `name` = 'Nome', `query` = 'co_movimenti_modelli.nome' WHERE `zz_views`.`id_module` = (SELECT id FROM zz_modules WHERE name='Modelli prima nota') AND `zz_views`.`name`='Causale predefinita';
UPDATE `zz_views` SET `query` = 'co_movimenti_modelli.idmastrino' WHERE `zz_views`.`id_module` = (SELECT id FROM zz_modules WHERE name='Modelli prima nota') AND `zz_views`.`name`='id';
-- Modelli primanota default
INSERT INTO `co_movimenti_modelli` (`id`, `idmastrino`, `nome`, `descrizione`, `idconto`) VALUES
(NULL, 1, 'Anticipo fattura', 'Anticipo fattura num. {numero} del {data}', -1),
(NULL, 1, 'Anticipo fattura', 'Anticipo fattura num. {numero} del {data}', (SELECT id FROM co_pianodeiconti3 WHERE descrizione = 'Banca C/C (conto anticipi)')),
(NULL, 1, 'Anticipo fattura', 'Anticipo fattura num. {numero} del {data}', (SELECT id FROM co_pianodeiconti3 WHERE descrizione = 'Spese bancarie')),
(NULL, 2, 'Accredito anticipo', 'Accredito anticipo fattura num. {numero} del {data}', (SELECT id FROM co_pianodeiconti3 WHERE descrizione = 'Banca C/C (conto anticipi)')),
(NULL, 2, 'Accredito anticipo', 'Accredito anticipo fattura num. {numero} del {data}', (SELECT id FROM co_pianodeiconti3 WHERE descrizione = 'Banca C/C'));
-- Segmenti per modulo scadenzario
INSERT INTO `zz_segments` (`id`, `id_module`, `name`, `clause`, `position`, `pattern`, `note`, `predefined`, `predefined_accredito`, `predefined_addebito`, `is_fiscale`) VALUES
(NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario totale', '1=1', 'WHR', '####', '', 1, 0, 0, 1),
(NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario clienti', '((SELECT dir FROM co_tipidocumento WHERE co_tipidocumento.id=co_documenti.idtipodocumento)=\'entrata\')', 'WHR', '####', '', 0, 0, 0, 0),
(NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario fornitori', '((SELECT dir FROM co_tipidocumento WHERE co_tipidocumento.id=co_documenti.idtipodocumento)=\'uscita\')', 'WHR', '####', '', 0, 0, 0, 0),
(NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario Ri.Ba.', 'co_pagamenti.riba=1', 'WHR', '####', '', 0, 0, 0, 0);
-- Fix vari
ALTER TABLE `co_righe_documenti` CHANGE `um` `um` VARCHAR(20) NULL;
UPDATE `co_righe_documenti` SET `um` = NULL WHERE `um` = '';
ALTER TABLE `co_righe_documenti` CHANGE `idritenutaacconto` `idritenutaacconto` INT(11) NULL, CHANGE `idrivalsainps` `idrivalsainps` INT(11) NULL;
UPDATE `co_righe_documenti` SET `idritenutaacconto` = NULL WHERE `idritenutaacconto` = 0;
UPDATE `co_righe_documenti` SET `idrivalsainps` = NULL WHERE `idrivalsainps` = 0;
ALTER TABLE `co_righe_preventivi` CHANGE `um` `um` VARCHAR(20) NULL;
UPDATE `co_righe_preventivi` SET `um` = NULL WHERE `um` = '';
ALTER TABLE `co_righe_contratti` CHANGE `um` `um` VARCHAR(20) NULL;
UPDATE `co_righe_contratti` SET `um` = NULL WHERE `um` = '';
ALTER TABLE `or_righe_ordini` CHANGE `um` `um` VARCHAR(20) NULL;
UPDATE `or_righe_ordini` SET `um` = NULL WHERE `um` = '';
ALTER TABLE `dt_righe_ddt` CHANGE `um` `um` VARCHAR(20) NULL;
UPDATE `dt_righe_ddt` SET `um` = NULL WHERE `um` = '';
ALTER TABLE `in_righe_interventi` CHANGE `um` `um` VARCHAR(20) NULL;
UPDATE `in_righe_interventi` SET `um` = NULL WHERE `um` = '';
ALTER TABLE `mg_articoli_interventi` CHANGE `um` `um` VARCHAR(20) NULL;
UPDATE `mg_articoli_interventi` SET `um` = NULL WHERE `um` = '';