Compare commits

...

6 Commits

Author SHA1 Message Date
MatteoPistorello e7a2d336a9 Merge 2021-07-14 18:16:02 +02:00
MatteoPistorello 642219ab46 Aggiunto gestione conto come "costo e ricavo" 2021-07-14 17:22:25 +02:00
MatteoPistorello 544744d461 Fix tipo intervento in attività 2021-07-14 17:21:41 +02:00
MatteoPistorello 387db5543f Aggiunto ripristino conto eliminato da anagrafica 2021-07-14 17:18:41 +02:00
Dasc3er bd0ff319fa Fix minori 2021-07-14 17:13:24 +02:00
Dasc3er 129260bc94 Aggiunta segnalazione bug per Applicazione da API
Correzioni minori sulle API relative.
2021-07-14 16:49:30 +02:00
11 changed files with 196 additions and 28 deletions

View File

@ -41,15 +41,16 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
- Aggiunta nel calendario della Dashboard visualizzazione dei preventivi pianificabili in corrispondenza alla data di accettazione e conclusione.
- Aggiunta impostazione per la visualizzazione delle ore nella stampa intervento (Decimale, Sessantesimi).
- Aggiunta possibilità di selezionare la sede di partenza della merce in fase di aggiunta articolo da un'attività
- Sostituito plugin **Componenti** nel modulo Impianti con la possibilità di inserire gli articoli di magazzino
- Aggiunta colonna Scaduto nel modulo Scadenzario
- Aggiunto campi confermato, data e ora evasione nel modulo **Preventivi**
- Aggiunta possibilità di creare un nuovi conti di secondo livello dal modulo **Piano dei conti**
- Aggiunta impostazione per la rimozione del blocco sulle quantità massime importabili fra documenti
- Aggiunta colonna **Rif. fattura** nei moduli Ordini cliente e fornitore
- Aggiunta gestione come costo e ricavo per i conti di secondo livello
### Fixed
-
- Sostituito plugin **Componenti** nel modulo Impianti con la possibilità di inserire gli articoli di magazzino
- Possibilità di ripristinare un conto cliente/fornitore dal modulo **Anagrafiche** se eliminato
## 2.4.23 (2021-05-18)

View File

@ -39,9 +39,6 @@ switch (post('op')) {
$sede->provincia = post('provincia');
$sede->km = post('km');
$sede->id_nazione = post('id_nazione') ?: null;
$sede->gaddress = post('gaddress');
$sede->lat = post('lat');
$sede->lng = post('lng');
$sede->telefono = post('telefono');
$sede->cellulare = post('cellulare');
$sede->fax = post('fax');
@ -327,6 +324,18 @@ switch (post('op')) {
flash()->info(tr('Anagrafica eliminata!'));
}
break;
case 'risolvi_conto':
$anagrafica = Anagrafica::find($id_record);
$tipo = post('tipo');
if($tipo=='cliente'){
$anagrafica->fixCliente($anagrafica);
} else{
$anagrafica->fixfornitore($anagrafica);
}
break;
}

View File

@ -53,16 +53,16 @@ $nazione_anagrafica = $anagrafica->sedeLegale->nazione;
// Avvisi problemi scheda anagrafica
$problemi_anagrafica = [];
if ($is_cliente && empty($record['idconto_cliente'])) {
array_push($problemi_anagrafica, ' Piano dei conti mancante per il cliente');
$problemi_anagrafica[] = '<div class="row" style="margin-bottom:5px;"><div class="col-md-3">'.tr('Piano dei conti mancante per il cliente').'</div><button type="button" class="btn btn-xs btn-success" onclick="risolviConto(\'cliente\')"><i class="fa fa-cog"></i> '.tr('Risolvi').'</button></div>';
}
if ($is_fornitore && empty($record['idconto_fornitore'])) {
array_push($problemi_anagrafica, ' Piano dei conti mancante per il fornitore');
$problemi_anagrafica[] = '<div class="row"><div class="col-md-3">'.tr('Piano dei conti mancante per il fornitore').'</div><button type="button" class="btn btn-xs btn-success" onclick="risolviConto(\'fornitore\')"><i class="fa fa-cog"></i> '.tr('Risolvi').'</button></div>';
}
if (sizeof($problemi_anagrafica) > 0) {
echo '<div class="alert alert-warning"><i class="fa fa-warning"></i> '.tr('Attenzione: _CAMPI_', [
'_CAMPI_' => implode(', ', $problemi_anagrafica),
echo '<div class="alert alert-warning"><i class="fa fa-warning"></i> '.tr('ATTENZIONE: <br>_CAMPI_', [
'_CAMPI_' => implode('', $problemi_anagrafica),
]).'</div>';
}
@ -373,6 +373,28 @@ echo '
});
});
}
function risolviConto(tipo){
$.ajax({
url: globals.rootdir + "/actions.php",
type: "POST",
dataType: "json",
data: {
id_module: globals.id_module,
id_record: globals.id_record,
tipo: tipo,
op: "risolvi_conto",
},
success: function (response) {
location.reload();
},
error: function() {
location.reload();
}
});
}
</script>';
if ($is_cliente or $is_fornitore or $is_tecnico) {

View File

@ -291,7 +291,7 @@ echo '
<!-- RIGA 4 -->
<div class="row">
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Tipo attività'); ?>", "name": "idtipointervento", "required": 1, "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento", "value": "$idtipointervento$", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Tipo attività'); ?>", "name": "idtipointervento", "required": 1, "ajax-source": "tipiintervento", "value": "$idtipointervento$", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
</div>
<div class="col-md-4">
@ -631,8 +631,10 @@ $(document).ready(function() {
// session_set("superselect,idzona", $(this).selectData().idzona, 0);
// Impostazione del tipo intervento da anagrafica
input("idtipointervento").getElement()
.selectSetNew(data.idtipointervento, data.idtipointervento_descrizione);
if (data.idtipointervento) {
input("idtipointervento").getElement()
.selectSet(data.idtipointervento);
}
}
});
@ -672,8 +674,12 @@ $(document).ready(function() {
contratto.getElement().selectReset();
ordine.getElement().selectReset();
input("idtipointervento").getElement()
.selectSetNew($(this).selectData().idtipointervento, $(this).selectData().idtipointervento_descrizione);
// Impostazione del tipo intervento da preventivo
var data = (this).selectData()
if (data.idtipointervento) {
input("idtipointervento").getElement()
.selectSet(data.idtipointervento);
}
}
});

View File

@ -77,7 +77,7 @@ switch ($resource) {
$filter[] = 'co_pianodeiconti3.id='.prepare($element);
}
$where[] = "co_pianodeiconti2.dir='entrata'";
$where[] = "(co_pianodeiconti2.dir='entrata' OR co_pianodeiconti2.dir='entrata/uscita')";
if (!empty($search)) {
$search_fields[] = "CONCAT( co_pianodeiconti2.numero, '.', co_pianodeiconti3.numero, ' ', co_pianodeiconti3.descrizione ) LIKE ".prepare('%'.$search.'%');
@ -92,7 +92,7 @@ switch ($resource) {
$filter[] = 'co_pianodeiconti3.id='.prepare($element);
}
$where[] = "co_pianodeiconti2.dir='uscita'";
$where[] = "(co_pianodeiconti2.dir='uscita' OR co_pianodeiconti2.dir='entrata/uscita')";
if (!empty($search)) {
$search_fields[] = "CONCAT( co_pianodeiconti2.numero, '.', co_pianodeiconti3.numero, ' ', co_pianodeiconti3.descrizione ) LIKE ".prepare('%'.$search.'%');

View File

@ -54,7 +54,7 @@ $info = $dbo->fetchOne($query);
</div>
<div class="col-md-4 <?php echo intval($lvl != 2) ? 'hidden' : ''; ?>">
{[ "type": "select", "label": "<?php echo tr('Utilizza come'); ?>", "name": "dir", "value": "<?php echo $info['dir']; ?>", "values": "list=\"entrata\":\"Ricavo\", \"uscita\":\"Costo\", \"\": \"Non usare\"" ]}
{[ "type": "select", "label": "<?php echo tr('Utilizza come'); ?>", "name": "dir", "value": "<?php echo $info['dir']; ?>", "values": "list=\"entrata\":\"Ricavo\", \"uscita\":\"Costo\", \"entrata/uscita\":\"Ricavo e Costo\", \"\": \"Non usare\"" ]}
</div>
</div>
<br>

View File

@ -46,7 +46,7 @@ class Clienti extends AppResource
// Elenco di interventi di interesse
$risorsa_interventi = $this->getRisorsaInterventi();
// Da applicazione, i Clienti sono sincronizzati prima degli Interventi: last_sync_at permette di identificare le stesse modifiche
$interventi = $risorsa_interventi->getModifiedRecords($last_sync_at);
$interventi = $risorsa_interventi->getModifiedRecords(null);
if (empty($interventi)) {
return [];
}

View File

@ -149,6 +149,7 @@ class Interventi extends AppResource
codice,
richiesta,
data_richiesta,
data_scadenza,
descrizione,
idanagrafica AS id_cliente,
id_contratto,

View File

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

View File

@ -0,0 +1,79 @@
<?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/>.
*/
namespace API\App\v1;
use API\Interfaces\CreateInterface;
use API\Interfaces\RetrieveInterface;
use API\Resource;
use Modules\Emails\Account;
use Modules\Emails\Mail;
use Modules\Emails\Template;
use Notifications\EmailNotification;
class SegnalazioneBug extends Resource implements RetrieveInterface, CreateInterface
{
protected static $bug_email = 'info@openstamanager.com';
public function retrieve($request)
{
$account = Account::where('predefined', true)->first();
return [
'sender' => [
'name' => $account['from_name'],
'email' => $account['from_address'],
],
'receiver' => self::$bug_email,
];
}
public function create($request)
{
$account = Account::where('predefined', true)->first();
// Preparazione email
$mail = new EmailNotification($account);
// Destinatario
$mail->AddAddress(self::$bug_email);
// Oggetto
$mail->subject = 'Segnalazione bug App OSM '.$request['version'];
$infos = [
];
$body = '';
foreach ($infos as $key => $value) {
$body .= '<p>'.$key.': '.$value.'</p>';
}
// Contenuti
$mail->content = $body;
// Tentativo di invio diretto
$email_success = $mail->send();
return [
'sent' => $email_success,
];
}
}

View File

@ -7,14 +7,14 @@ UPDATE `zz_views` SET `format`=1 WHERE `zz_views`.`name`='Data' AND `zz_views`.`
-- Colonna stato per newsletter
INSERT INTO `zz_views` ( `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES
((SELECT `id` FROM `zz_modules` WHERE name='Newsletter'), 'Stato', 'IF(em_newsletters.state = \'DEV\', \'Bozza\', IF(em_newsletters.state = \'WAIT\', \'Invio in corso\', \'Completata\'))', 4, 1, 0, 0, '', '', 1, 0, 0);
((SELECT `id` FROM `zz_modules` WHERE name='Newsletter'), 'Stato', 'IF(em_newsletters.state = ''DEV'', ''Bozza'', IF(em_newsletters.state = ''WAIT'', ''Invio in corso'', ''Completata''))', 4, 1, 0, 0, '', '', 1, 0, 0);
-- Colonna destinatari per newsletter
INSERT INTO `zz_views` ( `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES
((SELECT `id` FROM `zz_modules` WHERE name='Newsletter'), 'Destinatari', '(SELECT COUNT(*) FROM `em_newsletter_anagrafica` WHERE `em_newsletter_anagrafica`.`id_newsletter` = `em_newsletters`.`id`)', 5, 1, 0, 0, '', '', 1, 0, 0);
-- Aggiorno colonna completato per newsletter
UPDATE `zz_views` SET `query` = 'IF(completed_at IS NULL, \'No\', CONCAT(\' \', \'(\', DATE_FORMAT(completed_at, \'%d/%m/%Y %H:%i:%s\' ), \')\'))', `order` = 6 WHERE `zz_views`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Newsletter') AND `name` = 'Completato';
UPDATE `zz_views` SET `query` = 'IF(completed_at IS NULL, ''No'', CONCAT('''', ''('', DATE_FORMAT(completed_at, ''%d/%m/%Y %H:%i:%s'' ), '')''))', `order` = 6 WHERE `zz_views`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Newsletter') AND `name` = 'Completato';
-- Visualizza informazioni aggiuntive sul calendario
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Visualizza informazioni aggiuntive sul calendario', '0', 'boolean', '1', 'Dashboard', '1', 'Visualizza sul calendario il box Tutto il giorno dove possono essere presenti informazioni aggiuntve');
@ -46,7 +46,7 @@ INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `
-- Aggiunta vista scaduto in scadenzario
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES
((SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name`='Scadenzario' ), 'Scaduto', 'IF(pagato = da_pagare, \'NO\', IF(data_concordata IS NOT NULL AND data_concordata > NOW(), \'NO\', IF(scadenza < NOW(), \'\', \'NO\')))', 14, 1, 0, 0, '', '', 1, 0, 0);
((SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name`='Scadenzario' ), 'Scaduto', 'IF(pagato = da_pagare, ''NO'', IF(data_concordata IS NOT NULL AND data_concordata > NOW(), ''NO'', IF(scadenza < NOW(), '''', ''NO'')))', 14, 1, 0, 0, '', '', 1, 0, 0);
INSERT INTO `zz_group_view` (`id_gruppo`, `id_vista`) (SELECT `zz_groups`.`id`, `zz_views`.`id` FROM `zz_groups`, `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` WHERE `zz_modules`.`name` = 'Scadenzario' AND `zz_views`.`name` = 'Scaduto');
@ -63,7 +63,7 @@ UPDATE `co_righe_preventivi` SET `confermato` = 1;
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Conferma automaticamente le quantità nei preventivi', '1', 'boolean', '1', 'Preventivi', NULL, NULL);
-- Aggiunta vista "Esigibilità" per il modulo "IVA"
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES
(NULL, (SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name`='IVA'), 'Esigibilità', 'IF(esigibilita=\'I\', \'IVA ad esigibilità immediata\', IF(esigibilita=\'D\', \'IVA ad esigibilità differita\', \'Scissione dei pagamenti\'))', 5, 1, 0, 0, '', '', 1, 0, 0);
(NULL, (SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name`='IVA'), 'Esigibilità', 'IF(esigibilita=''I'', ''IVA ad esigibilità immediata'', IF(esigibilita=''D'', ''IVA ad esigibilità differita'', ''Scissione dei pagamenti''))', 5, 1, 0, 0, '', '', 1, 0, 0);
-- Gestione righe da documenti esterni
INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES ('Permetti il superamento della soglia quantità dei documenti di origine', '0', 'boolean', '1', 'Generali', '20', NULL);
@ -73,9 +73,57 @@ INSERT INTO `zz_views` ( `id_module`, `name`, `query`, `order`, `search`, `slow`
((SELECT `id` FROM `zz_modules` WHERE name='Ordini cliente'), 'Rif. fattura', 'fattura.info', 11, 1, 0, 0, '', '', 1, 0, 0),
((SELECT `id` FROM `zz_modules` WHERE name='Ordini fornitore'), 'Rif. fattura', 'fattura.info', 8, 1, 0, 0, '', '', 1, 0, 0);
UPDATE `zz_modules` SET `options` = 'SELECT |select|\nFROM `or_ordini`\n LEFT JOIN `an_anagrafiche` ON `or_ordini`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\n LEFT JOIN `or_tipiordine` ON `or_ordini`.`idtipoordine` = `or_tipiordine`.`id`\n LEFT JOIN (\n SELECT `idordine`,\n SUM(`qta` - `qta_evasa`) AS `qta_da_evadere`,\n SUM(`subtotale` - `sconto`) AS `totale_imponibile`,\n SUM(`subtotale` - `sconto` + `iva`) AS `totale`\n FROM `or_righe_ordini`\n GROUP BY `idordine`\n ) AS righe ON `or_ordini`.`id` = `righe`.`idordine`\n LEFT JOIN (\n SELECT `idordine`,\n MIN(`data_evasione`) AS `data_evasione`\n FROM `or_righe_ordini`\n WHERE (`qta` - `qta_evasa`)>0\n GROUP BY `idordine`\n ) AS `righe_da_evadere` ON `righe`.`idordine`=`righe_da_evadere`.`idordine`\n LEFT JOIN (\n SELECT GROUP_CONCAT(co_documenti.numero_esterno SEPARATOR \", \") AS info, co_righe_documenti.idordine FROM co_documenti INNER JOIN co_righe_documenti ON co_documenti.id = co_righe_documenti.iddocumento GROUP BY idordine\n) AS fattura ON fattura.idordine = or_ordini.id\nWHERE 1=1 AND `dir` = \'entrata\' |date_period(`data`)|\nHAVING 2=2\nORDER BY `data` DESC, CAST(`numero_esterno` AS UNSIGNED) DESC' WHERE `zz_modules`.`name` = 'Ordini cliente';
UPDATE `zz_modules` SET `options` = 'SELECT |select|
FROM `or_ordini`
LEFT JOIN `an_anagrafiche` ON `or_ordini`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`
LEFT JOIN `or_tipiordine` ON `or_ordini`.`idtipoordine` = `or_tipiordine`.`id`
LEFT JOIN (
SELECT `idordine`,
SUM(`qta` - `qta_evasa`) AS `qta_da_evadere`,
SUM(`subtotale` - `sconto`) AS `totale_imponibile`,
SUM(`subtotale` - `sconto` + `iva`) AS `totale`
FROM `or_righe_ordini`
GROUP BY `idordine`
) AS righe ON `or_ordini`.`id` = `righe`.`idordine`
LEFT JOIN (
SELECT `idordine`,
MIN(`data_evasione`) AS `data_evasione`
FROM `or_righe_ordini`
WHERE (`qta` - `qta_evasa`)>0
GROUP BY `idordine`
) AS `righe_da_evadere` ON `righe`.`idordine`=`righe_da_evadere`.`idordine`
LEFT JOIN (
SELECT GROUP_CONCAT(co_documenti.numero_esterno SEPARATOR \", \") AS info, co_righe_documenti.idordine FROM co_documenti INNER JOIN co_righe_documenti ON co_documenti.id = co_righe_documenti.iddocumento GROUP BY idordine
) AS fattura ON fattura.idordine = or_ordini.id
WHERE 1=1 AND `dir` = ''entrata'' |date_period(`data`)|
HAVING 2=2
ORDER BY `data` DESC, CAST(`numero_esterno` AS UNSIGNED) DESC' WHERE `zz_modules`.`name` = 'Ordini cliente';
UPDATE `zz_modules` SET `options` = 'SELECT |select|\nFROM `or_ordini`\n LEFT JOIN `an_anagrafiche` ON `or_ordini`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\n LEFT JOIN `or_tipiordine` ON `or_ordini`.`idtipoordine` = `or_tipiordine`.`id`\n LEFT JOIN (\n SELECT `idordine`,\n SUM(`qta` - `qta_evasa`) AS `qta_da_evadere`,\n SUM(`subtotale` - `sconto`) AS `totale_imponibile`,\n SUM(`subtotale` - `sconto` + `iva`) AS `totale`\n FROM `or_righe_ordini`\n GROUP BY `idordine`\n ) AS righe ON `or_ordini`.`id` = `righe`.`idordine`\n LEFT JOIN (\n SELECT `idordine`,\n MIN(`data_evasione`) AS `data_evasione`\n FROM `or_righe_ordini`\n WHERE (`qta` - `qta_evasa`)>0\n GROUP BY `idordine`\n ) AS `righe_da_evadere` ON `righe`.`idordine`=`righe_da_evadere`.`idordine`\n LEFT JOIN (\n SELECT GROUP_CONCAT(co_documenti.numero_esterno SEPARATOR \", \") AS info, co_righe_documenti.idordine FROM co_documenti INNER JOIN co_righe_documenti ON co_documenti.id = co_righe_documenti.iddocumento GROUP BY idordine\n) AS fattura ON fattura.idordine = or_ordini.id\nWHERE 1=1 AND `dir` = \'uscita\' |date_period(`data`)|\nHAVING 2=2\nORDER BY `data` DESC, CAST(`numero_esterno` AS UNSIGNED) DESC' WHERE `zz_modules`.`name` = 'Ordini fornitore';
UPDATE `zz_modules` SET `options` = 'SELECT |select|
FROM `or_ordini`
LEFT JOIN `an_anagrafiche` ON `or_ordini`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`
LEFT JOIN `or_tipiordine` ON `or_ordini`.`idtipoordine` = `or_tipiordine`.`id`
LEFT JOIN (
SELECT `idordine`,
SUM(`qta` - `qta_evasa`) AS `qta_da_evadere`,
SUM(`subtotale` - `sconto`) AS `totale_imponibile`,
SUM(`subtotale` - `sconto` + `iva`) AS `totale`
FROM `or_righe_ordini`
GROUP BY `idordine`
) AS righe ON `or_ordini`.`id` = `righe`.`idordine`
LEFT JOIN (
SELECT `idordine`,
MIN(`data_evasione`) AS `data_evasione`
FROM `or_righe_ordini`
WHERE (`qta` - `qta_evasa`)>0
GROUP BY `idordine`
) AS `righe_da_evadere` ON `righe`.`idordine`=`righe_da_evadere`.`idordine`
LEFT JOIN (
SELECT GROUP_CONCAT(co_documenti.numero_esterno SEPARATOR \", \") AS info, co_righe_documenti.idordine FROM co_documenti INNER JOIN co_righe_documenti ON co_documenti.id = co_righe_documenti.iddocumento GROUP BY idordine
) AS fattura ON fattura.idordine = or_ordini.id
WHERE 1=1 AND `dir` = ''uscita'' |date_period(`data`)|
HAVING 2=2
ORDER BY `data` DESC, CAST(`numero_esterno` AS UNSIGNED) DESC' WHERE `zz_modules`.`name` = 'Ordini fornitore';
INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `enabled`) VALUES
(NULL, 'app-v1', 'retrieve', 'sedi-azienda', 'API\\App\\v1\\SediAzienda', '1'),
@ -83,4 +131,6 @@ INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `e
(NULL, 'app-v1', 'retrieve', 'sede-azienda', 'API\\App\\v1\\SediAzienda', '1'),
(NULL, 'app-v1', 'retrieve', 'movimenti-manuali', 'API\\App\\v1\\MovimentiManuali', '1'),
(NULL, 'app-v1', 'retrieve', 'movimenti-manuali-cleanup', 'API\\App\\v1\\MovimentiManuali', '1'),
(NULL, 'app-v1', 'create', 'movimento-manuale', 'API\\App\\v1\\MovimentiManuali', '1');
(NULL, 'app-v1', 'create', 'movimento-manuale', 'API\\App\\v1\\MovimentiManuali', '1'),
(NULL, 'app-v1', 'retrieve', 'segnalazione-bug', 'API\\App\\v1\\SegnalazioneBug', '1'),
(NULL, 'app-v1', 'create', 'segnalazione-bug', 'API\\App\\v1\\SegnalazioneBug', '1');