Merge branch 'master' of https://github.com/devcode-it/openstamanager
This commit is contained in:
commit
dbb45a9584
|
@ -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
|
||||
|
|
|
@ -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'].'"';
|
||||
}
|
||||
|
|
|
@ -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 '
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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'];
|
||||
|
|
|
@ -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>';
|
|
@ -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_', [
|
||||
|
|
|
@ -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 [];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ use API\Resource;
|
|||
|
||||
class Revisione extends Resource implements RetrieveInterface
|
||||
{
|
||||
const REVISION = '6';
|
||||
const REVISION = '7';
|
||||
|
||||
public function retrieve($request)
|
||||
{
|
||||
|
|
|
@ -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>';
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue