This commit is contained in:
Luca 2021-02-05 16:20:34 +01:00
commit 871fc15ba5
11 changed files with 38 additions and 75 deletions

View File

@ -47,9 +47,12 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
- Aggiunta possibilità di notificare al cliente/tecnico in modo automatico quando viene cambiato lo stato dell'intervento
- Aggiunta flag per escludere la generazione scadenza di una ritenuta d'acconto se viene versata dal fornitore
### Modificato (Changed)
### Modificato (Changed)
- Impostazione CAP automatico a 99999 nella FE per clienti esteri
### Fixed
- Correzione movimenti di magazzino con sedi diverse
## 2.4.21 (2021-01-14)
### Aggiunto (Added)

View File

@ -106,8 +106,8 @@ switch ($resource) {
// Se c'è una sede settata, carico tutti gli articoli presenti in quella sede
if (!$sedi_non_impostate) {
$query .= '
LEFT JOIN (SELECT idarticolo, idsede_azienda, idsede_controparte FROM mg_movimenti GROUP BY idarticolo) movimenti ON movimenti.idarticolo=mg_articoli.id
LEFT JOIN an_sedi ON an_sedi.id = movimenti.idsede_azienda';
LEFT JOIN (SELECT idarticolo, idsede FROM mg_movimenti GROUP BY idarticolo) movimenti ON movimenti.idarticolo=mg_articoli.id
LEFT JOIN an_sedi ON an_sedi.id = movimenti.idsede';
}
$query .= '
@ -154,20 +154,11 @@ switch ($resource) {
// IVA da impostazioni
foreach ($rs as $k => $r) {
// Lettura movimenti delle mie sedi
$qta_azienda = $dbo->fetchOne('SELECT SUM(mg_movimenti.qta) AS qta FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_azienda WHERE mg_movimenti.idarticolo = '.prepare($r['id']).' AND idsede_azienda = '.prepare($superselect['idsede_partenza']));
// Lettura eventuali movimenti ad una propria sede (nel caso di movimenti fra sedi della mia azienda) per il calcolo corretto delle quantità
if ($superselect['idsede_partenza'] != 0) {
$qta_controparte = $dbo->fetchOne('SELECT SUM(mg_movimenti.qta) AS qta FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte WHERE mg_movimenti.idarticolo = '.prepare($r['id']).' AND idsede_controparte = '.prepare($superselect['idsede_partenza']));
} else {
$qta_controparte = $dbo->fetchOne('SELECT SUM(mg_movimenti.qta) AS qta FROM ((( mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte ) LEFT JOIN dt_ddt ON mg_movimenti.idddt = dt_ddt.id ) LEFT JOIN co_documenti ON mg_movimenti.iddocumento = co_documenti.id ) WHERE mg_movimenti.idarticolo = '.prepare($r['id']).' AND idsede_controparte = '.prepare($superselect['idsede_partenza']).' AND IFNULL(dt_ddt.idanagrafica, co_documenti.idanagrafica) = '.prepare(setting('Azienda predefinita')));
}
$qta = $qta_azienda['qta'] - $qta_controparte['qta'];
$qta_sede = $dbo->fetchOne('SELECT SUM(mg_movimenti.qta) AS qta FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede WHERE mg_movimenti.idarticolo = '.prepare($r['id']).' AND idsede = '.prepare($superselect['idsede_partenza']))['qta'];
$rs[$k] = array_merge($r, [
'text' => $r['codice'].' - '.$r['descrizione'].' '.(!$r['servizio'] ? '('.Translator::numberToLocale($qta).(!empty($r['um']) ? ' '.$r['um'] : '').')' : ''),
'disabled' => $r['qta'] <= 0 && !$permetti_movimenti_sotto_zero && !$r['servizio'],
'text' => $r['codice'].' - '.$r['descrizione'].' '.(!$r['servizio'] ? '('.Translator::numberToLocale($qta_sede).(!empty($r['um']) ? ' '.$r['um'] : '').')' : ''),
'disabled' => $qta_sede <= 0 && !$permetti_movimenti_sotto_zero && !$r['servizio'],
]);
}

View File

@ -121,23 +121,20 @@ function aggiorna_sedi_movimenti($module, $id)
if ($module == 'ddt') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM dt_ddt INNER JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($id));
$idsede_azienda = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$idsede_controparte = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_partenza'] : $rs[0]['idsede_destinazione'];
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$dbo->query('UPDATE mg_movimenti SET idsede_azienda='.prepare($idsede_azienda).', idsede_controparte='.prepare($idsede_controparte).' WHERE idddt='.prepare($id));
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\DDT\DDT').' AND reference_id='.prepare($id));
} elseif ($module == 'documenti') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione, dir FROM co_documenti INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento WHERE co_documenti.id='.prepare($id));
$idsede_azienda = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$idsede_controparte = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_partenza'] : $rs[0]['idsede_destinazione'];
$idsede = ($rs[0]['dir'] == 'uscita') ? $rs[0]['idsede_destinazione'] : $rs[0]['idsede_partenza'];
$dbo->query('UPDATE mg_movimenti SET idsede_azienda='.prepare($idsede_azienda).', idsede_controparte='.prepare($idsede_controparte).' WHERE iddocumento='.prepare($id));
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Fatture\Fattura').' AND reference_id='.prepare($id));
} elseif ($module == 'interventi') {
$rs = $dbo->fetchArray('SELECT idsede_partenza, idsede_destinazione FROM in_interventi WHERE in_interventi.id='.prepare($id));
$idsede_azienda = $rs[0]['idsede_partenza'];
$idsede_controparte = $rs[0]['idsede_destinazione'];
$idsede = $rs[0]['idsede_partenza'];
$dbo->query('UPDATE mg_movimenti SET idsede_azienda='.prepare($idsede_azienda).', idsede_controparte='.prepare($idsede_controparte).' WHERE idintervento='.prepare($id));
$dbo->query('UPDATE mg_movimenti SET idsede='.prepare($idsede).' WHERE reference_type='.prepare('Modules\Interventi\Intervento').' AND reference_id='.prepare($id));
}
}

View File

@ -204,12 +204,12 @@ class Articolo extends Model
{
return $this->movimenti()
->select(
'idsede_azienda',
'idsede',
database()->raw('SUM(qta) AS qta')
)->groupBy(['idsede_azienda'])
)->groupBy(['idsede'])
->get()
->mapToGroups(function ($item, $key) {
return [$item->idsede_azienda => (float) $item->attributes['qta']];
return [$item->idsede => (float) $item->attributes['qta']];
})
->flatten()
->toArray();

View File

@ -291,8 +291,7 @@ class CSV extends CSVImporter
$qta_movimento = $qta_registrata - $giacenze[$id_sede];
$articolo->movimenta($qta_movimento, tr('Movimento da importazione'), new Carbon(), false, [
'idsede_azienda' => $id_sede,
'idsede_controparte' => 0,
'idsede' => $id_sede,
]);
}

View File

@ -24,12 +24,6 @@ use Illuminate\Database\Eloquent\Model;
/*
* Classe dedicata alla gestione dei movimenti di magazzino degli articoli.
*
* Alcuni appunti sull'utilizzo dei campi *idsede_azienda* e *idsede_controparte*
* Il campo *idsede_azienda* è relativo alla sede dell'Azienda che è interessata dal movimento, mentre *idsede_controparte* indica la sede del Cliente/Fornitore controparte.
* La natura effettiva del movimento (e di *idsede_controparte*) è quindi identificabile dal valore del campo *qta*: se positivo il magazzino è aumentatao (movimento da *idsede_controparte* a *idsede_azienda*), se negativo il magazzino è diminuito (movimento da *idsede_azienda* a *idsede_controparte*).
*
* Si noti che il valore "0" per i campi *idsede_* indica solitamente una Sede legale dell'Anagrafica di riferimento. Solo se il movimento non è associato ad alcun documento il campo *idsede_controparte* non segue questo significato, poichè il movimento in questo caso è considerato manuale.
*/
class Movimento extends Model
{

View File

@ -1,26 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
switch (post('op')) {
case 'aggiorna-listino':
$sconto = post('sconto');
foreach ($id_records as $id_record) {
$dbo->query('UPDATE mg_prezzi_articoli SET sconto_percentuale='.prepare($sconto).' WHERE id='.prepare($id_record));
}
flash()->info(tr('Sconti modificati correttamente!'));
break;
}
return [
'aggiorna-listino' => [
'text' => '<span>'.tr('Modifica sconto').'</span>',
'data' => [
'title' => tr('Inserisci lo sconto per questi articoli'),
'msg' => '{[ "type": "text", "label": "<small>'.tr('Nuovo sconto').'</small>","icon-after":"%", "name": "sconto" ]}',
'button' => tr('Modifica'),
'class' => 'btn btn-lg btn-warning',
'blank' => false,
],
],
];

View File

@ -45,20 +45,17 @@ switch (post('op')) {
// Registrazione del movimento con variazione della quantità
$articolo->movimenta($qta, $descrizione, $data, 1, [
'idsede_controparte' => $id_sede_controparte,
'idsede_azienda' => $id_sede_azienda,
'idsede' => $id_sede_azienda,
]);
} elseif ($tipo_movimento == 'spostamento') {
// Registrazione del movimento verso la sede di destinazione
$articolo->registra($qta, $descrizione, $data, 1, [
'idsede_controparte' => 0,
'idsede_azienda' => $idsede_destinazione,
'idsede' => $idsede_destinazione,
]);
// Registrazione del movimento dalla sede di origine
$articolo->registra(-$qta, $descrizione, $data, 1, [
'idsede_controparte' => 0,
'idsede_azienda' => $idsede_partenza,
'idsede' => $idsede_partenza,
]);
}

View File

@ -245,7 +245,7 @@ if (!empty($anagrafica)) {
if (in_array($dati_generali['TipoDocumento'], ['TD04', 'TD05'])) {
echo '
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Fattura collegata').'", "name": "ref_fattura", "required": 1, "values": "query='.$query.'" ]}
{[ "type": "select", "label": "'.tr('Fattura collegata').'", "name": "ref_fattura", "required": 0, "values": "query='.$query.'" ]}
</div>';
} elseif ($dati_generali['TipoDocumento'] == 'TD06') {
$query .= "AND co_documenti.id_segment = (SELECT id FROM zz_segments WHERE name = 'Fatture pro-forma' AND id_module = ".prepare($id_module).')';

View File

@ -277,8 +277,7 @@ abstract class Article extends Accounting
$qta_movimento = $documento->direzione == 'uscita' ? $qta : -$qta;
$movimento = Movimento::descrizioneMovimento($qta_movimento, $documento->direzione).' - '.$documento->getReference();
$partenza = $documento->direzione == 'uscita' ? $documento->idsede_destinazione : $documento->idsede_partenza;
$arrivo = $documento->direzione == 'uscita' ? $documento->idsede_partenza : $documento->idsede_destinazione;
$idsede = $documento->direzione == 'uscita' ? $documento->idsede_destinazione : $documento->idsede_partenza;
// Fix per valori di sede a NULL
$partenza = $partenza ?: 0;
@ -287,8 +286,7 @@ abstract class Article extends Accounting
$this->articolo->movimenta($qta_movimento, $movimento, $data, false, [
'reference_type' => get_class($documento),
'reference_id' => $documento->id,
'idsede_azienda' => $partenza,
'idsede_controparte' => $arrivo,
'idsede' => $idsede,
]);
}

View File

@ -12,7 +12,7 @@ ALTER TABLE `mg_movimenti` ADD INDEX(`idarticolo`);
UPDATE `zz_settings` SET `tipo`='query=SELECT idstatointervento AS id, descrizione AS text FROM in_statiintervento' WHERE `nome`='Stato dell''attività dopo la firma';
-- Aggiunto filtro N3.% nella scelta aliquota per le dichiarazioni d'intento
UPDATE `zz_settings` SET `tipo` = 'query=SELECT id, descrizione FROM `co_iva` WHERE codice_natura_fe LIKE \'N3.%\' AND deleted_at IS NULL ORDER BY descrizione ASC' WHERE `zz_settings`.`nome` = 'Iva per lettere d''intento';
UPDATE `zz_settings` SET `tipo` = 'query=SELECT id, descrizione FROM `co_iva` WHERE codice_natura_fe LIKE ''N3.%'' AND deleted_at IS NULL ORDER BY descrizione ASC' WHERE `zz_settings`.`nome` = 'Iva per lettere d''intento';
-- Aggiunte descrizioni aliquote IVA con codice natura 2.1
@ -91,7 +91,7 @@ INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `e
ALTER TABLE `co_documenti` ADD `is_ritenuta_pagata` BOOLEAN NOT NULL AFTER `id_ricevuta_principale`;
-- Modificato options modulo scadenzario
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_scadenziario`\r\n LEFT JOIN `co_documenti` ON `co_scadenziario`.`iddocumento` = `co_documenti`.`id`\r\n LEFT JOIN `an_anagrafiche` ON `co_documenti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\r\n LEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`\r\n LEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`\r\n LEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`\r\nWHERE 1=1 AND\r\n (`co_statidocumento`.`descrizione` IS NULL OR `co_statidocumento`.`descrizione` IN(\'Emessa\',\'Parzialmente pagato\',\'Pagato\'))\r\nHAVING 2=2\r\nORDER BY `scadenza` ASC' WHERE `zz_modules`.`id` = (SELECT `id` FROM `zz_modules` WHERE `name`='Scadenzario');
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_scadenziario`\r\n LEFT JOIN `co_documenti` ON `co_scadenziario`.`iddocumento` = `co_documenti`.`id`\r\n LEFT JOIN `an_anagrafiche` ON `co_documenti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\r\n LEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`\r\n LEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`\r\n LEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`\r\nWHERE 1=1 AND\r\n (`co_statidocumento`.`descrizione` IS NULL OR `co_statidocumento`.`descrizione` IN(\'Emessa\',\'Parzialmente pagato\',\'Pagato\'))\r\nHAVING 2=2\r\nORDER BY `scadenza` ASC' WHERE `zz_modules`.`name`='Scadenzario';
-- Modificato nome segmento
UPDATE `zz_segments` SET `name` = 'Scadenzario completo per periodo' WHERE `zz_segments`.`name` = 'Scadenzario completo';
@ -99,4 +99,14 @@ UPDATE `zz_segments` SET `name` = 'Scadenzario completo per periodo' WHERE `zz_s
-- Fix stampe predefinite Preventivi e Contratti
UPDATE `zz_prints` SET `predefined` = '0' WHERE `zz_prints`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Preventivi') AND `zz_prints`.`name` = 'Consuntivo preventivo';
UPDATE `zz_prints` SET `predefined` = '0' WHERE `zz_prints`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Contratti') AND `zz_prints`.`name` = 'Consuntivo contratto';
UPDATE `zz_prints` SET `predefined` = '0' WHERE `zz_prints`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Contratti') AND `zz_prints`.`name` = 'Ordine di servizio';
UPDATE `zz_prints` SET `predefined` = '0' WHERE `zz_prints`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Contratti') AND `zz_prints`.`name` = 'Ordine di servizio';
-- Eliminata colonna idsede_controparte e rinominata idsede_azienda in idsede
ALTER TABLE `mg_movimenti` CHANGE `idsede_azienda` `idsede` INT(11) NOT NULL;
ALTER TABLE `mg_movimenti` DROP `idsede_controparte`;
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `mg_movimenti` JOIN `mg_articoli` ON `mg_articoli`.id = `mg_movimenti`.`idarticolo` LEFT JOIN `an_sedi` ON `mg_movimenti`.`idsede` = `an_sedi`.`id` WHERE 1=1 HAVING 2=2 ORDER BY mg_movimenti.data DESC, mg_movimenti.created_at DESC' WHERE `zz_modules`.`name` = 'Movimenti';
UPDATE `zz_views` SET `query` = 'IF( mg_movimenti.idsede=0, \'Sede legale\', an_sedi.nomesede )' WHERE `zz_views`.`name` = 'Sede' 'Movimenti' AND `zz_views`.`id_module`= (SELECT `id` FROM `zz_modules` WHERE `name`='Movimenti');
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `mg_articoli`\r\n LEFT OUTER JOIN an_anagrafiche ON mg_articoli.id_fornitore = an_anagrafiche.idanagrafica\r\n LEFT OUTER JOIN co_iva ON mg_articoli.idiva_vendita = co_iva.id\r\n LEFT OUTER JOIN (\r\n SELECT SUM(qta - qta_evasa) AS qta_impegnata, idarticolo FROM or_righe_ordini\r\n INNER JOIN or_ordini ON or_righe_ordini.idordine = or_ordini.id\r\n WHERE idstatoordine IN (SELECT id FROM or_statiordine WHERE completato = 0)\r\n GROUP BY idarticolo\r\n ) ordini ON ordini.idarticolo = mg_articoli.id\r\n LEFT OUTER JOIN (SELECT `idarticolo`, `idsede`, SUM(`qta`) AS `qta` FROM `mg_movimenti` WHERE `idsede` = |giacenze_sedi_idsede| GROUP BY `idarticolo`, `idsede`) movimenti ON `mg_articoli`.`id` = `movimenti`.`idarticolo`\r\nWHERE 1=1 AND `mg_articoli`.`deleted_at` IS NULL HAVING 2=2 AND `Q.tà` > 0 ORDER BY `descrizione`' WHERE `zz_modules`.`name` = 'Giacenze sedi';
-- Rimozione campo idsede_azienda
UPDATE `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` SET `zz_views`.`query` = 'IF( mg_movimenti.idsede=0, \'Sede legale\', an_sedi.nomesede )' WHERE `zz_views`.`name` = 'Sede' AND `zz_modules`.`name` = 'Movimenti';