Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gestione articoli concatenati #1257

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 14 additions & 0 deletions migration.sql
@@ -0,0 +1,14 @@
INSERT INTO `zz_plugins` (`name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`, `created_at`, `updated_at`) VALUES
('Articoli concatenati', 'Articoli concatenati', 21, 21, 'tab', 'articoli.concatenati.php', 1, 1, 0, '', '', NULL, NULL, '', '', '2022-03-07 10:22:56', '2022-03-07 10:22:56');

CREATE TABLE `mg_articoli_concatenati` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_articolo` int(11) NOT NULL,
`id_articolo_concatenato` int(11) NOT NULL,
`prezzo` float NOT NULL DEFAULT 0,
`idiva` int(11) NOT NULL DEFAULT 0,
`prezzo_ivato` float NOT NULL DEFAULT 0,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
`updated_at` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
46 changes: 44 additions & 2 deletions modules/articoli/actions.php
Expand Up @@ -72,7 +72,7 @@
$articolo->um = post('um');
$articolo->um_secondaria = post('um_secondaria');
$articolo->fattore_um_secondaria = post('fattore_um_secondaria');

$articolo->save();

// Aggiornamento delle varianti per i campi comuni
Expand Down Expand Up @@ -244,7 +244,7 @@
// Duplica articolo
case 'copy':
$new = $articolo->replicate();

//Se non specifico il codice articolo lo imposto uguale all'id della riga
if (empty(post('codice'))) {
$codice = $dbo->fetchOne('SELECT MAX(id) as codice FROM mg_articoli')['codice'] + 1;
Expand Down Expand Up @@ -407,6 +407,48 @@
]);
}

break;

case 'add_concatenato':
$id_articolo = post('id_articolo');
$id_articolo_concatenato = post('id_articolo_concatenato');

$articolo = $dbo->fetchOne('SELECT prezzo_vendita, idiva_vendita FROM mg_articoli WHERE id='.prepare($id_articolo_concatenato));
$prezzo = floatval($articolo['prezzo_vendita']);

$iva = $dbo->fetchOne('SELECT percentuale FROM co_iva WHERE id='.prepare($articolo['idiva_vendita']))['percentuale'];
$iva = ($iva) ? $iva : 0;

$dbo->insert('mg_articoli_concatenati', [
'id_articolo' => $id_articolo,
'id_articolo_concatenato' => $id_articolo_concatenato,
'prezzo' => $prezzo,
'iva' => $iva,
'prezzo_ivato' => $prezzo + ($prezzo / 100 * $iva),
]);

break;

case 'update_concatenato':
$id = post('id');
$iva = post('iva');
$prezzo = post('prezzo');

$dbo->update('mg_articoli_concatenati', [
'prezzo' => $prezzo,
'iva' => $iva,
'prezzo_ivato' => $prezzo + ($prezzo / 100 * $iva),
], [
'id' => $id,
]);

break;

case 'remove_concatenato':
$id = post('id');

$dbo->query('DELETE FROM mg_articoli_concatenati WHERE id='.prepare($id));

break;
}

Expand Down
63 changes: 63 additions & 0 deletions modules/articoli/plugins/articoli.concatenati.edit.php
@@ -0,0 +1,63 @@
<?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';

$articolo_concatenato = $dbo->fetchOne('SELECT * FROM mg_articoli_concatenati WHERE id = '.prepare($_GET['id']));

echo '
<input type="hidden" id="id" value="'.$articolo_concatenato['id'].'">
<div class="row">
<div id="prezzo" class="col-md-6">
{[ "type": "number", "label": "'.tr('Prezzo').'", "name": "prezzo", "value": "'.$articolo_concatenato['prezzo'].'", "icon-after": "'.currency().'" ]}
</div>';

echo '
</div>

<div class="row">
<div class="col-md-12">
<button class="btn btn-primary pull-right btn-save">
<i class="fa fa-edit"></i> '.tr('Salva').'
</button>
</div>
</div>';

echo '
<script>
$(document).ready(function(){
$("body").on("click", ".btn-save", function(){
$.ajax({
url: "'.$rootdir.'/modules/articoli/actions.php",
type: "post",
data: {
op: "update_concatenato",
prezzo: $("#prezzo").find("input").val(),
id: $("#id").val(),
},
success: function(data){
//reload page
setTimeout(function(){
location.reload();
}, 1000);
},
});
});
});
</script>';
135 changes: 135 additions & 0 deletions modules/articoli/plugins/articoli.concatenati.php
@@ -0,0 +1,135 @@
<?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';

//get articoli concatenati by id_record
$concatenati = $dbo->fetchArray(
'SELECT mg_articoli_concatenati.*, mg_articoli.descrizione AS descrizione_concatenato
FROM mg_articoli_concatenati
JOIN mg_articoli ON mg_articoli.id=mg_articoli_concatenati.id_articolo_concatenato
WHERE id_articolo='.prepare($id_record)
);


echo '
<div class="row">
<div class="col-md-5">
{[ "type":"select", "id":"select-articolo", "label":"'.tr('Articolo').'", "ajax-source": "articoli" ]}
</div>

<div class="col-md-1">
<div class="btn-group btn-group-flex">
<button type="button" class="btn btn-primary" style="margin-top:25px;" onclick="aggiungiArticolo(this)">
<i class="fa fa-plus"></i> '.tr('Aggiungi').'
</button>
</div>
</div>
</div>

<table class="table table-hover table-condensed table-bordered" id="tbl-concatenati">
<thead>
<tr>
<th class="text-center" width="100">'.tr('Cod. articolo concatenato').'</th>
<th class="text-center" width="450">'.tr('Descrizone articolo concatenato').'</th>
<th class="text-center" width="95">'.tr('Prezzo').'</th>
<th class="text-center" width="95">'.tr('Prezzo ivato').'</th>
<th class="text-center" width="40"></th>
</tr>
</thead>
<tbody>';
foreach($concatenati as $concatenato) {
echo '
<tr>
<td><a href="'.base_path().'/controller.php?id_module='.$id_module.'&id_record='.$concatenato['id_articolo_concatenato'].'" target="_blank">'.$concatenato['id_articolo_concatenato'].'</a></td>
<td>'.$concatenato['descrizione_concatenato'].'</td>
<td class="text-right">'.moneyFormat($concatenato['prezzo']).'</td>
<td class="text-right">'.moneyFormat($concatenato['prezzo_ivato']).'</td>
<td class="text-center">
<div class="input-group-btn">
<a class="btn btn-xs btn-warning" title="'.tr('Modifica riga').'" onclick="modificaRiga(\''.$concatenato['id'].'\')">
<i class="fa fa-edit"></i>
</a>

<a class="btn btn-xs btn-danger" title="'.tr('Rimuovi riga').'" onclick="rimuoviRiga(\''.$concatenato['id'].'\')">
<i class="fa fa-trash"></i>
</a>
</div>
</td>
</tr>';
}
echo '
</tbody>
</table>

<!--<div class="btn-group">
<button type="button" class="btn btn-xs btn-default disabled" id="elimina_righe" onclick="rimuoviArticolo(getSelectData());">
<i class="fa fa-trash"></i>
</button>
</div>-->


<script>
async function aggiungiArticolo(button) {
id_articolo = $("#select-articolo").val();

$.ajax({
url: "'.$rootdir.'/modules/articoli/actions.php",
type: "post",
data: {
op: "add_concatenato",
id_articolo: globals.id_record,
id_articolo_concatenato: id_articolo,
},
success: function(data){
location.reload();
},
});
}

async function modificaRiga(id) {
openModal("'.tr('Dettagli').'", "'.$rootdir.'/modules/articoli/plugins/articoli.concatenati.edit.php?id_module=" + globals.id_module + "&id_record=" + globals.id_record + "&id_plugin='.$id_plugin.'&id=" + id);
}

async function rimuoviRiga(id) {
swal({
title: "'.tr('Attenzione').'",
text: "'.tr('Sei sicuro di voler eliminare questa riga?').'",
type: "warning",
showCancelButton: true,
confirmButtonColor: "#DD6B55",
confirmButtonText: "'.tr('Sì').'",
cancelButtonText: "'.tr('No').'",
}).then((result) => { //click su si
$.ajax({
url: "'.$rootdir.'/modules/articoli/actions.php",
type: "post",
data: {
op: "remove_concatenato",
id: id,
},
success: function(data){
location.reload();
},
});
}).catch((err) => { //click su no

});
}
</script>';
26 changes: 22 additions & 4 deletions modules/ddt/actions.php
Expand Up @@ -197,6 +197,24 @@
$originale = ArticoloOriginale::find(post('idarticolo'));
$articolo = Articolo::build($ddt, $originale);
$articolo->id_dettaglio_fornitore = post('id_dettaglio_fornitore') ?: null;

//check if the item have linked items
$concatenati = $dbo->fetchArray('SELECT * FROM mg_articoli_concatenati WHERE id_articolo='.prepare($articolo->idarticolo));

foreach ($concatenati as $concatenato) {
$concatenato_originale = ArticoloOriginale::find($concatenato['id_articolo_concatenato']);
$riga_concatenato = Articolo::build($ddt, $concatenato_originale);

try {
$riga_concatenato->qta = post('qta');
} catch (UnexpectedValueException $e) {
flash()->error(tr('Alcuni serial number sono già stati utilizzati!'));
}

$riga_concatenato->setPrezzoUnitario($concatenato['prezzo'], $concatenato['idiva']);

$riga_concatenato->save();
}
}

$articolo->descrizione = post('descrizione');
Expand All @@ -209,7 +227,7 @@
if ($dir == 'entrata') {
$articolo->setProvvigione(post('provvigione'), post('tipo_provvigione'));
}

try {
$articolo->qta = post('qta');
} catch (UnexpectedValueException $e) {
Expand Down Expand Up @@ -403,7 +421,7 @@
// Eliminazione riga
case 'delete_riga':
$id_righe = (array)post('righe');

foreach ($id_righe as $id_riga) {
$riga = Articolo::find($id_riga) ?: Riga::find($id_riga);
$riga = $riga ?: Descrizione::find($id_riga);
Expand All @@ -425,7 +443,7 @@
// Duplicazione riga
case 'copy_riga':
$id_righe = (array)post('righe');

foreach ($id_righe as $id_riga) {
$riga = Articolo::find($id_riga) ?: Riga::find($id_riga);
$riga = $riga ?: Descrizione::find($id_riga);
Expand Down Expand Up @@ -461,7 +479,7 @@
$riga_trasporto->movimenta(-$riga_trasporto->qta);
}
}

$ddt->delete();

flash()->info(tr('Ddt eliminato!'));
Expand Down
21 changes: 20 additions & 1 deletion modules/fatture/actions.php
Expand Up @@ -264,7 +264,7 @@
'stored' => round($totale_documento,2),
'calculated' => round($fattura->totale,2),
]);

break;

// Elenco fatture in stato Bozza per il cliente
Expand Down Expand Up @@ -501,6 +501,25 @@
$originale = ArticoloOriginale::find(post('idarticolo'));
$articolo = Articolo::build($fattura, $originale);
$articolo->id_dettaglio_fornitore = post('id_dettaglio_fornitore') ?: null;

//check if the item have linked items
$concatenati = $dbo->fetchArray('SELECT * FROM mg_articoli_concatenati WHERE id_articolo='.prepare($articolo->idarticolo));

foreach ($concatenati as $concatenato) {
$concatenato_originale = ArticoloOriginale::find($concatenato['id_articolo_concatenato']);
$riga_concatenato = Articolo::build($fattura, $concatenato_originale);

try {
$riga_concatenato->qta = post('qta');
} catch (UnexpectedValueException $e) {
flash()->error(tr('Alcuni serial number sono già stati utilizzati!'));
}

$riga_concatenato->idconto = $concatenato_originale->idconto_vendita;
$riga_concatenato->setPrezzoUnitario($concatenato['prezzo'], $concatenato['idiva']);

$riga_concatenato->save();
}
}

$qta = post('qta');
Expand Down