This commit is contained in:
MatteoPistorello 2023-06-06 16:53:41 +02:00
commit dbb45a9584
10 changed files with 207 additions and 37 deletions

View File

@ -4,7 +4,7 @@ Tutti i maggiori cambiamenti di questo progetto saranno documentati in questo fi
Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://keepachangelog.com/), e il progetto segue il [Semantic Versioning](http://semver.org/) per definire le versioni delle release.
- [2.4.46 (2023-05-12)](#2445-2023-06-01)
- [2.4.46 (2023-06-01)](#2446-2023-06-01)
- [2.4.45 (2023-05-12)](#2445-2023-05-12)
- [2.4.44 (2023-04-21)](#2444-2023-04-21)
- [2.4.43 (2023-03-31)](#2443-2023-03-31)
@ -59,7 +59,6 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
## 2.4.46 (2023-06-01)
### Aggiunto (Added)
- Aggiunta codice destinatario per anagrafiche con nazione San Marino
- Aggiunta stampa DDT in entrata

View File

@ -62,9 +62,39 @@ switch ($resource) {
$ids = [];
echo '<small>';
// Ultime 5 vendite totali
$documenti = $dbo->fetchArray('SELECT iddocumento AS id, "Fattura" AS tipo, "Fatture di vendita" AS modulo, (subtotale-sconto)/qta AS costo_unitario, (SELECT numero FROM co_documenti WHERE id=iddocumento) AS n_documento, (SELECT numero_esterno FROM co_documenti WHERE id=iddocumento) AS n2_documento, (SELECT data FROM co_documenti WHERE id=iddocumento) AS data_documento FROM co_righe_documenti WHERE idarticolo='.prepare($idarticolo).' AND iddocumento IN(SELECT id FROM co_documenti WHERE idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir="entrata"))
$documenti = $dbo->fetchArray('
SELECT
iddocumento AS id,
co_tipidocumento.descrizione AS tipo,
"Fatture di vendita" AS modulo,
((subtotale - sconto) / qta * IF(co_tipidocumento.reversed, -1, 1)) AS costo_unitario,
co_documenti.numero AS n_documento,
co_documenti.numero_esterno AS n2_documento,
co_documenti.data AS data_documento
FROM
co_righe_documenti
INNER JOIN co_documenti ON co_documenti.id = co_righe_documenti.iddocumento
INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento
WHERE
idarticolo = '.prepare($idarticolo).' AND dir = "entrata"
UNION
SELECT idddt AS id, "Ddt" AS tipo, "Ddt di vendita" AS modulo, (subtotale-sconto)/qta AS costo_unitario, (SELECT numero FROM dt_ddt WHERE id=idddt) AS n_documento, (SELECT numero_esterno FROM dt_ddt WHERE id=idddt) AS n2_documento, (SELECT data FROM dt_ddt WHERE id=idddt) AS data_documento FROM dt_righe_ddt WHERE idarticolo='.prepare($idarticolo).' AND idddt IN(SELECT id FROM dt_ddt WHERE idtipoddt IN(SELECT id FROM dt_tipiddt WHERE dir="entrata")) ORDER BY id DESC LIMIT 0,'.$limit.'');
SELECT
idddt AS id,
dt_tipiddt.descrizione AS tipo,
"Ddt di vendita" AS modulo,
(subtotale - sconto) / qta AS costo_unitario,
dt_ddt.numero AS n_documento,
dt_ddt.numero_esterno AS n2_documento,
dt_ddt.data AS data_documento
FROM
dt_righe_ddt
INNER JOIN dt_ddt ON dt_ddt.id = dt_righe_ddt.idddt
INNER JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt
WHERE
idarticolo = '.prepare($idarticolo).' AND dir = "entrata"
ORDER BY
id
DESC');
if (sizeof($documenti) > 0) {
echo "<table class='table table-striped table-bordered table-extra-condensed' >\n";
@ -75,7 +105,7 @@ switch ($resource) {
($documenti[$i]['n2_documento'] != '') ? $n_documento = $documenti[$i]['n2_documento'] : $n_documento = $documenti[$i]['n_documento'];
$link_id = Modules::get($documenti[$i]['modulo'])['id'];
echo "<tr><td class='first_cell text-left'><a href='".base_path().'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].'. n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
echo "<tr><td class='first_cell text-left'><a href='".base_path().'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].' n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
echo "<td class='table_cell text-right'>".moneyFormat($documenti[$i]['costo_unitario'])."</td></tr>\n";
$ids[] = '"'.$documenti[$i]['id'].'"';
}
@ -91,9 +121,39 @@ switch ($resource) {
$ids = [];
echo '<small>';
// Ultimi 5 acquisti totali
$documenti = $dbo->fetchArray('SELECT iddocumento AS id, "Fattura" AS tipo, "Fatture di acquisto" AS modulo, (subtotale-sconto)/qta AS costo_unitario, (SELECT numero FROM co_documenti WHERE id=iddocumento) AS n_documento, (SELECT numero_esterno FROM co_documenti WHERE id=iddocumento) AS n2_documento, (SELECT data FROM co_documenti WHERE id=iddocumento) AS data_documento FROM co_righe_documenti WHERE idarticolo='.prepare($idarticolo).' AND iddocumento IN(SELECT id FROM co_documenti WHERE idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir="uscita"))
$documenti = $dbo->fetchArray('
SELECT
iddocumento AS id,
co_tipidocumento.descrizione AS tipo,
"Fatture di acquisto" AS modulo,
((subtotale - sconto) / qta * IF(co_tipidocumento.reversed, -1, 1)) AS costo_unitario,
co_documenti.numero AS n_documento,
co_documenti.numero_esterno AS n2_documento,
co_documenti.data AS data_documento
FROM
co_righe_documenti
INNER JOIN co_documenti ON co_documenti.id = co_righe_documenti.iddocumento
INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento
WHERE
idarticolo = '.prepare($idarticolo).' AND dir = "uscita"
UNION
SELECT idddt AS id, "Ddt" AS tipo, "Ddt di acquisto" AS modulo, (subtotale-sconto)/qta AS costo_unitario, (SELECT numero FROM dt_ddt WHERE id=idddt) AS n_documento, (SELECT numero_esterno FROM dt_ddt WHERE id=idddt) AS n2_documento, (SELECT data FROM dt_ddt WHERE id=idddt) AS data_documento FROM dt_righe_ddt WHERE idarticolo='.prepare($idarticolo).' AND idddt IN(SELECT id FROM dt_ddt WHERE idtipoddt IN(SELECT id FROM dt_tipiddt WHERE dir="uscita")) ORDER BY id DESC LIMIT 0,'.$limit.'');
SELECT
idddt AS id,
dt_tipiddt.descrizione AS tipo,
"Ddt di acquisto" AS modulo,
(subtotale - sconto) / qta AS costo_unitario,
dt_ddt.numero AS n_documento,
dt_ddt.numero_esterno AS n2_documento,
dt_ddt.data AS data_documento
FROM
dt_righe_ddt
INNER JOIN dt_ddt ON dt_ddt.id = dt_righe_ddt.idddt
INNER JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt
WHERE
idarticolo = '.prepare($idarticolo).' AND dir = "uscita"
ORDER BY
id
DESC');
if (sizeof($documenti) > 0) {
echo "<table class='table table-striped table-bordered table-extra-condensed' >\n";
@ -104,7 +164,7 @@ switch ($resource) {
($documenti[$i]['n2_documento'] != '') ? $n_documento = $documenti[$i]['n2_documento'] : $n_documento = $documenti[$i]['n_documento'];
$link_id = Modules::get($documenti[$i]['modulo'])['id'];
echo "<tr><td class='first_cell text-left'><a href='".base_path().'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].'. n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
echo "<tr><td class='first_cell text-left'><a href='".base_path().'/editor.php?id_module='.$link_id.'&id_record='.$documenti[$i]['id']."' target=\"_blank\" title=\"Apri il documento su una nuova finestra\">".$documenti[$i]['tipo'].' n. '.$n_documento.' del '.Translator::dateToLocale($documenti[$i]['data_documento'])." </a></td>\n";
echo "<td class='table_cell text-right'>".moneyFormat($documenti[$i]['costo_unitario'])."</td></tr>\n";
$ids[] = '"'.$documenti[$i]['id'].'"';
}

View File

@ -121,7 +121,7 @@ $options['id_ritenuta_acconto_predefined'] = $ritenuta_acconto['id_ritenuta_acco
echo App::internalLoad('conti.php', [], $options);
// Leggo l'iva predefinita dall'anagrafica e se non c'è leggo quella predefinita generica
$idiva = $fattura->anagrafica->idiva_vendite ?: setting('Iva predefinita');
$id_iva = $fattura->anagrafica->idiva_vendite ?: setting('Iva predefinita');
// Iva
echo '

View File

@ -756,5 +756,45 @@ switch (post('op')) {
flash()->warning(tr('Nessun prezzo modificato!'));
}
break;
// Duplica ordine
case 'copy':
$new = $ordine->replicate();
$new->numero = Ordine::getNextNumero(post('data'), $ordine->tipo->dir, $ordine->id_segment);
$new->numero_esterno = Ordine::getNextNumeroSecondario(post('data'), $ordine->tipo->dir, $ordine->id_segment);
$new->idstatoordine = post('idstatoordine');
$new->data = post('data');
$new->save();
$id_record = $new->id;
if( !empty(post('copia_righe')) ){
$righe = $ordine->getRighe();
foreach ($righe as $riga) {
$new_riga = $riga->replicate();
$new_riga->setDocument($new);
$new_riga->qta_evasa = 0;
$new_riga->save();
}
}
//copia allegati
if (!empty(post('copia_allegati'))) {
$allegati = $ordine->uploads();
foreach ($allegati as $allegato) {
$allegato->copia([
'id_module' => $new->getModule()->id,
'id_record' => $new->id,
]);
}
}
flash()->info(tr('Aggiunto ordine numero _NUM_!', [
'_NUM_' => $new->numero,
]));
break;
}

View File

@ -19,6 +19,18 @@
include_once __DIR__.'/../../core.php';
// Duplica ordine
echo '
<button type="button" class="btn btn-primary " onclick="duplicaOrdine()">
<i class="fa fa-copy"></i> '.tr('Duplica ordine').'
</button>
<script>
function duplicaOrdine() {
openModal("'.tr('Duplica ordine').'", "'.$module->fileurl('modals/duplicazione.php').'?id_module='.$id_module.'&id_record='.$id_record.'");
}
</script>';
$stati = $dbo->fetchArray('SELECT descrizione FROM `or_statiordine` WHERE `is_fatturabile` = 1');
foreach ($stati as $stato) {
$stati_importabili[] = $stato['descrizione'];

View File

@ -0,0 +1,57 @@
<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
include_once __DIR__.'/../../../core.php';
echo '
<form action="" method="post" id="copia-ordine">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="copy">
<div class="row">
<div class="col-md-3">
{[ "type": "timestamp", "label": "'.tr('Data').'", "name": "data", "value": "-now-", "required":1 ]}
</div>
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Stato').'", "name": "idstatoordine", "required": 1, "values": "query=SELECT * FROM or_statiordine WHERE descrizione IN(\'Bozza\', \'Accettato\', \'In attesa di conferma\')", "value": "1" ]}
</div>
<div class="col-md-3">
{["type": "checkbox", "label": "'.tr('Duplica righe').'", "name": "copia_righe", "help": "'.tr('Selezione per riportare anche le righe nella nuova attività').'" ]}
</div>
<div class="col-md-3">
{["type": "checkbox", "label": "'.tr('Duplica allegati').'", "name": "copia_allegati", "help": "'.tr('Selezione per riportare anche gli allegati nella nuova attività').'", "value": 1 ]}
</div>
</div>
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary">
<i class="fa fa-copy"></i> '.tr('Duplica').'
</button>
</div>
</div>
</form>';
echo '
<script>$(document).ready(init)</script>';

View File

@ -71,7 +71,8 @@ class ReceiptHook extends Manager
// Caricamento elenco di ricevute imporate
$completed = $completed_cache->content;
$count = count($todo);
$count = (is_array($todo) ? count($todo) : 0);
// Esecuzione di 10 imporazioni
for ($i = 0; $i < 10 && $i < $count; ++$i) {
@ -98,8 +99,8 @@ class ReceiptHook extends Manager
$todo_cache = Cache::pool('Ricevute Elettroniche');
$completed_cache = Cache::pool('Ricevute Elettroniche importate');
$completed_number = count($completed_cache->content);
$total_number = $completed_number + count($todo_cache->content);
$completed_number = (is_array($completed_cache->content) ? count($completed_cache->content) : 0 );
$total_number = $completed_number + (is_array($todo_cache->content) ? count($todo_cache->content) : 0);
// Messaggio di importazione
$message = tr('Sono state importate _NUM_ ricevute su _TOT_', [

View File

@ -24,7 +24,9 @@ use Auth;
use Carbon\Carbon;
use Modules\Checklists\Checklist;
use Modules\Checklists\ChecklistItem;
use Modules\Checklists\Check;
use Modules\Interventi\Intervento;
use Models\User;
class Checklists extends AppResource
{
@ -52,14 +54,18 @@ class Checklists extends AppResource
INNER JOIN in_interventi ON zz_checks.id_record = in_interventi.id
INNER JOIN in_interventi_tecnici ON in_interventi_tecnici.idintervento = in_interventi.id
INNER JOIN zz_modules ON zz_checks.id_module = zz_modules.id
INNER JOIN zz_check_user ON zz_checks.id = zz_check_user.id_check
WHERE
zz_modules.name="Interventi"
AND
zz_check_user.id_utente = :id_tecnico
AND
in_interventi.id IN ('.implode(',', $interventi).')
OR (orario_fine NOT BETWEEN :period_start AND :period_end)';
$records = database()->fetchArray($query, [
':period_end' => $end,
':period_start' => $start,
':id_tecnico' => $user->id
]);
$da_interventi = array_column($records, 'id');
}
@ -86,14 +92,19 @@ class Checklists extends AppResource
return [];
}
$user = Auth::user();
$id_tecnico = $user->id_anagrafica;
$id_interventi = array_keys($interventi);
$query = 'SELECT zz_checks.id
FROM zz_checks
INNER JOIN in_interventi ON zz_checks.id_record = in_interventi.id
INNER JOIN in_interventi_tecnici ON in_interventi_tecnici.idintervento = in_interventi.id
INNER JOIN zz_modules ON zz_checks.id_module = zz_modules.id
INNER JOIN zz_check_user ON zz_checks.id = zz_check_user.id_check
WHERE
zz_modules.name="Interventi"
AND zz_check_user.id_utente = :id_tecnico
AND in_interventi.id IN ('.implode(',', $id_interventi).')
AND (orario_fine BETWEEN :period_start AND :period_end)';
@ -104,6 +115,7 @@ class Checklists extends AppResource
$records = database()->fetchArray($query, [
':period_start' => $start,
':period_end' => $end,
':id_tecnico' => $user->id
]);
return $this->mapModifiedRecords($records);
@ -117,8 +129,9 @@ class Checklists extends AppResource
zz_checks.checked_at,
zz_checks.content,
zz_checks.note,
zz_checks.id_parent,
zz_checks.checked_by
IF(zz_checks.id_parent IS NULL, 0, zz_checks.id_parent) AS id_parent,
zz_checks.checked_by,
zz_checks.order AS ordine
FROM zz_checks
WHERE zz_checks.id = ".prepare($id);
@ -129,9 +142,16 @@ class Checklists extends AppResource
public function updateRecord($data)
{
$check = ChecklistItem::find($data['id']);
$check = Check::find($data['id']);
$check->checked_at = (!empty($data['checked_at']) ? $data['checked_at'] : NULL);
$check->content = $data['content'];
$check->note = $data['note'];
$user = User::where('idanagrafica', $data['checked_by'])->first();
if(!empty($user)){
$check->checked_by = $user->id;
}
$this->aggiornaCheck($check, $data);
$check->save();
return [];
@ -141,23 +161,4 @@ class Checklists extends AppResource
{
return new Interventi();
}
/**
* Aggiorna i dati della check sulla base dei dati caricati dall'applicazione.
*
* @param $check
* @param $data
*
* @return array
*/
protected function aggiornaCheck($check, $data)
{
// Campi di base
$check->checked_at = $data['checked_at'];
$check->content = $data['content'];
$check->note = $data['note'];
$check->checked_by = $data['checked_by'];
return [];
}
}

View File

@ -24,7 +24,7 @@ use API\Resource;
class Revisione extends Resource implements RetrieveInterface
{
const REVISION = '6';
const REVISION = '7';
public function retrieve($request)
{

View File

@ -363,7 +363,7 @@ echo '
'.$firma.'<br>';
if (empty($documento['firma_file'])) {
echo ' <i>('.tr('Timbro e firma leggibile').'.)</i>';
echo ' <i>('.tr('Timbro e firma leggibile').')</i>';
} else {
echo ' <i>'.$documento['firma_nome'].'</i>';
}