Supporto Parcella e Note FE

This commit is contained in:
Thomas Zilio 2019-07-22 12:52:48 +02:00
parent 6598ab8a52
commit 82cd9203cd
10 changed files with 144 additions and 33 deletions

View File

@ -12,6 +12,7 @@ if ($module['name'] == 'Ddt di vendita') {
unset($_SESSION['superselect']['idanagrafica']); unset($_SESSION['superselect']['idanagrafica']);
unset($_SESSION['superselect']['idsede_partenza']); unset($_SESSION['superselect']['idsede_partenza']);
unset($_SESSION['superselect']['idsede_destinazione']); unset($_SESSION['superselect']['idsede_destinazione']);
unset($_SESSION['superselect']['codice_modalita_pagamento_fe']);
$_SESSION['superselect']['idanagrafica'] = $record['idanagrafica']; $_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
$_SESSION['superselect']['idsede_partenza'] = $record['idsede_partenza']; $_SESSION['superselect']['idsede_partenza'] = $record['idsede_partenza'];
$_SESSION['superselect']['idsede_destinazione'] = $record['idsede_destinazione']; $_SESSION['superselect']['idsede_destinazione'] = $record['idsede_destinazione'];
@ -152,7 +153,7 @@ $_SESSION['superselect']['idsede_destinazione'] = $record['idsede_destinazione']
<div class="row"> <div class="row">
<div class="col-md-3"> <div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Pagamento'); ?>", "name": "idpagamento", "values": "query=SELECT id, descrizione FROM co_pagamenti GROUP BY descrizione ORDER BY descrizione ASC", "value": "$idpagamento$", "readonly": "<?php echo $record['flag_completato']; ?>" ]} {[ "type": "select", "label": "<?php echo tr('Pagamento'); ?>", "name": "idpagamento", "ajax-source": "pagamenti", "value": "$idpagamento$", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
</div> </div>
<div class="col-md-3"> <div class="col-md-3">

View File

@ -13,9 +13,11 @@ echo '
<i class="fa fa-copy"></i> '.tr('Duplica fattura').' <i class="fa fa-copy"></i> '.tr('Duplica fattura').'
</button>'; </button>';
if ($record['stato'] != 'Emessa' && $record['stato'] != 'Parzialmente pagato' && $record['stato'] != 'Pagato') { if ($module->name == 'Fatture di vendita') {
$attributi_visibili = $record['stato'] != 'Emessa' && $record['stato'] != 'Parzialmente pagato' && $record['stato'] != 'Pagato';
echo ' echo '
<a class="btn btn-info" data-toggle="modal" data-title="'.tr('Dati Fattura Elettronica').'" data-href="'.$structure->fileurl('fe/document-fe.php').'?id_module='.$id_module.'&id_record='.$id_record.'"> <a class="btn btn-info '.($attributi_visibili ? '' : 'disabled').'" data-toggle="modal" data-title="'.tr('Dati Fattura Elettronica').'" data-href="'.$structure->fileurl('fe/document-fe.php').'?id_module='.$id_module.'&id_record='.$id_record.'" '.($attributi_visibili ? '' : 'disabled').'>
<i class="fa fa-file-code-o"></i> '.tr('Attributi avanzati').' <i class="fa fa-file-code-o"></i> '.tr('Attributi avanzati').'
</a>'; </a>';
} }

View File

@ -11,6 +11,7 @@ $tipodoc = $rs[0]['descrizione'];
unset($_SESSION['superselect']['idanagrafica']); unset($_SESSION['superselect']['idanagrafica']);
unset($_SESSION['superselect']['idsede_partenza']); unset($_SESSION['superselect']['idsede_partenza']);
unset($_SESSION['superselect']['idsede_destinazione']); unset($_SESSION['superselect']['idsede_destinazione']);
unset($_SESSION['superselect']['codice_modalita_pagamento_fe']);
$_SESSION['superselect']['idsede_partenza'] = $record['idsede_partenza']; $_SESSION['superselect']['idsede_partenza'] = $record['idsede_partenza'];
$_SESSION['superselect']['idsede_destinazione'] = $record['idsede_destinazione']; $_SESSION['superselect']['idsede_destinazione'] = $record['idsede_destinazione'];
$_SESSION['superselect']['idanagrafica'] = $record['idanagrafica']; $_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
@ -201,7 +202,7 @@ if (empty($record['is_fiscale'])) {
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Pagamento'); ?>", "name": "idpagamento", "required": 1, "values": "query=SELECT id, CONCAT_WS(' - ', codice_modalita_pagamento_fe, descrizione) AS descrizione, (SELECT id FROM co_banche WHERE id_pianodeiconti3 = co_pagamenti.idconto_<?php echo $conto; ?> LIMIT 0,1) AS idbanca FROM co_pagamenti GROUP BY descrizione ORDER BY descrizione ASC", "value": "$idpagamento$", "extra": "onchange=\"$('#idbanca').val( $(this).find('option:selected').data('idbanca') ).change(); \" " ]} {[ "type": "select", "label": "<?php echo tr('Pagamento'); ?>", "name": "idpagamento", "required": 1, "ajax-source": "pagamenti", "value": "$idpagamento$", "extra": "onchange=\"$('#idbanca').val($(this).selectData().id_banca_<?php echo $conto; ?>).change(); \" " ]}
</div> </div>
<div class="col-md-3"> <div class="col-md-3">

View File

@ -9,6 +9,7 @@ if ($module['name'] == 'Ordini cliente') {
$dir = 'uscita'; $dir = 'uscita';
} }
unset($_SESSION['superselect']['codice_modalita_pagamento_fe']);
$_SESSION['superselect']['idanagrafica'] = $record['idanagrafica']; $_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
?><form action="" method="post" id="edit-form"> ?><form action="" method="post" id="edit-form">
@ -81,7 +82,7 @@ $_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Pagamento'); ?>", "name": "idpagamento", "required": 1, "values": "query=SELECT id, descrizione FROM co_pagamenti GROUP BY descrizione ORDER BY descrizione ASC", "value": "$idpagamento$", "readonly": "<?php echo $record['flag_completato']; ?>" ]} {[ "type": "select", "label": "<?php echo tr('Pagamento'); ?>", "name": "idpagamento", "required": 1, "ajax-source": "pagamenti", "value": "$idpagamento$", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
</div> </div>
</div> </div>

View File

@ -0,0 +1,26 @@
<?php
include_once __DIR__.'/../../../core.php';
switch ($resource) {
case 'pagamenti':
$query = "SELECT id,
CONCAT_WS(' - ', codice_modalita_pagamento_fe, descrizione) AS descrizione,
(SELECT id FROM co_banche WHERE id_pianodeiconti3 = co_pagamenti.idconto_vendite LIMIT 1) AS id_banca_vendite,
(SELECT id FROM co_banche WHERE id_pianodeiconti3 = co_pagamenti.idconto_acquisti LIMIT 1) AS id_banca_acquisti
FROM co_pagamenti |where| GROUP BY descrizione ORDER BY descrizione ASC";
foreach ($elements as $element) {
$filter[] = 'co_pagamenti.id = '.prepare($element);
}
if (!empty($superselect['codice_modalita_pagamento_fe'])) {
$where[] = 'codice_modalita_pagamento_fe = '.prepare($superselect['codice_modalita_pagamento_fe']);
}
if (!empty($search)) {
$search_fields[] = 'descrizione LIKE '.prepare('%'.$search.'%');
}
break;
}

View File

@ -95,10 +95,12 @@ if (in_array($dati_generali['TipoDocumento'], ['TD04', 'TD05'])){
$query = "SELECT $query = "SELECT
co_documenti.id, co_documenti.id,
CONCAT('Fattura num. ', co_documenti.numero_esterno, ' del ', DATE_FORMAT(co_documenti.data, '%d/%m/%Y')) AS descrizione CONCAT('Fattura num. ', co_documenti.numero_esterno, ' del ', DATE_FORMAT(co_documenti.data, '%d/%m/%Y')) AS descrizione
FROM FROM co_documenti
co_documenti INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento
WHERE WHERE
co_tipidocumento.dir = 'uscita' AND co_tipidocumento.dir = 'uscita' AND
(co_documenti.data BETWEEN NOW() - INTERVAL 1 YEAR AND NOW()) AND
co_documenti.idstatodocumento IN (SELECT id FROM co_statidocumento WHERE co_tipidocumento.descrizione != 'Bozza') AND
co_documenti.idanagrafica = ".prepare($anagrafica->id); co_documenti.idanagrafica = ".prepare($anagrafica->id);
echo ' echo '
@ -107,10 +109,21 @@ if (in_array($dati_generali['TipoDocumento'], ['TD04', 'TD05'])){
</div>'; </div>';
} elseif ($dati_generali['TipoDocumento'] == 'TD06') { } elseif ($dati_generali['TipoDocumento'] == 'TD06') {
$anagrafica = $fattura_pa->saveAnagrafica(); $anagrafica = $fattura_pa->saveAnagrafica();
$query = "SELECT
co_documenti.id,
CONCAT('Fattura num. ', co_documenti.numero_esterno, ' del ', DATE_FORMAT(co_documenti.data, '%d/%m/%Y')) AS descrizione
FROM co_documenti
INNER JOIN co_tipidocumento ON co_tipidocumento.id = co_documenti.idtipodocumento
WHERE
co_tipidocumento.dir = 'uscita' AND
(co_documenti.data BETWEEN NOW() - INTERVAL 1 YEAR AND NOW()) AND
co_documenti.idstatodocumento IN (SELECT id FROM co_statidocumento WHERE co_tipidocumento.descrizione != 'Bozza') AND
co_documenti.id_segment = (SELECT id FROM zz_segments WHERE name = 'Fatture pro-forma' AND id_module = ".prepare($id_module).') AND
co_documenti.idanagrafica = '.prepare($anagrafica->id);
echo ' echo '
<div class="col-md-6"> <div class="col-md-6">
{[ "type": "select", "label": "'.tr('Fattura collegata').'", "name": "ref_fattura", "values": "query='.$query.'" ]} {[ "type": "select", "label": "'.tr('Fattura pro-forma').'", "name": "ref_fattura", "values": "query='.$query.'" ]}
</div>'; </div>';
} }
@ -155,18 +168,19 @@ if (!empty($pagamenti)) {
</ol>'; </ol>';
} }
// prc '.($pagamenti['CondizioniPagamento'] == 'TP01' ? '!' : '').'= 100 AND
$query = 'SELECT id, CONCAT (descrizione, IF((codice_modalita_pagamento_fe IS NULL), \"\", CONCAT( \" (\", codice_modalita_pagamento_fe, \")\" ) )) as descrizione FROM co_pagamenti';
if (!empty($codice_modalita_pagamento)) { if (!empty($codice_modalita_pagamento)) {
$query .= ' WHERE codice_modalita_pagamento_fe = '.prepare($codice_modalita_pagamento); $_SESSION['superselect']['codice_modalita_pagamento_fe'] = $codice_modalita_pagamento;
} }
$query .= ' GROUP BY descrizione ORDER BY descrizione ASC';
// Pagamento // Pagamento
echo ' echo '
<div class="row" > <div class="row" >
<div class="col-md-6"> <div class="col-md-6">
{[ "type": "select", "label": "'.tr('Pagamento').'", "name": "pagamento", "required": 1, "values": "query='.$query.'" ]} <button type="button" class="btn btn-info btn-xs pull-right" onclick="session_set(\'superselect,codice_modalita_pagamento_fe\', \'\', 0)">
<i class="fa fa-refresh"></i> '.tr('Reset modalità').'
</button>
{[ "type": "select", "label": "'.tr('Pagamento').'", "name": "pagamento", "required": 1, "ajax-source": "pagamenti" ]}
</div>'; </div>';
// Movimentazioni // Movimentazioni

View File

@ -110,14 +110,17 @@ class FatturaElettronica
public static function manage($name) public static function manage($name)
{ {
try { try {
$fattura = new FatturaOrdinaria($name); $manager = new FatturaOrdinaria($name);
return $fattura; $tipo = $manager->getBody()['DatiGenerali']['DatiGeneraliDocumento']['TipoDocumento'];
} catch (UnexpectedValueException $e) { if ($tipo == 'TD06') {
$fattura = new FatturaSemplificata($name); $manager = new Parcella($name);
return $fattura;
} }
} catch (UnexpectedValueException $e) {
$manager = new FatturaSemplificata($name);
}
return $manager;
} }
public function getHeader() public function getHeader()
@ -188,6 +191,7 @@ class FatturaElettronica
* Restituisce l'anagrafica collegata alla fattura, eventualmente generandola con i dati forniti. * Restituisce l'anagrafica collegata alla fattura, eventualmente generandola con i dati forniti.
* *
* @param string $type * @param string $type
*
* @return Anagrafica * @return Anagrafica
*/ */
public function saveAnagrafica($type = 'Fornitore') public function saveAnagrafica($type = 'Fornitore')
@ -281,21 +285,17 @@ class FatturaElettronica
* *
* @return Fattura * @return Fattura
*/ */
public function saveFattura($id_pagamento, $id_sezionale, $id_tipo, $data_registrazione, $ref_fattura = null) public function saveFattura($id_pagamento, $id_sezionale, $id_tipo, $data_registrazione, $ref_fattura)
{ {
$anagrafica = $this->saveAnagrafica();
$dati_generali = $this->getBody()['DatiGenerali']['DatiGeneraliDocumento']; $dati_generali = $this->getBody()['DatiGenerali']['DatiGeneraliDocumento'];
$data = $dati_generali['Data']; $data = $dati_generali['Data'];
$fattura = $this->prepareFattura($id_tipo, $data, $id_sezionale, $ref_fattura);
$this->fattura = $fattura;
$numero_esterno = $dati_generali['Numero']; $numero_esterno = $dati_generali['Numero'];
$progressivo_invio = $this->getHeader()['DatiTrasmissione']['ProgressivoInvio']; $progressivo_invio = $this->getHeader()['DatiTrasmissione']['ProgressivoInvio'];
$tipo = TipoFattura::where('id', $id_tipo)->first();
$fattura = Fattura::build($anagrafica, $tipo, $data, $id_sezionale);
$this->fattura = $fattura;
$fattura->progressivo_invio = $progressivo_invio; $fattura->progressivo_invio = $progressivo_invio;
$fattura->numero_esterno = $numero_esterno; $fattura->numero_esterno = $numero_esterno;
$fattura->idpagamento = $id_pagamento; $fattura->idpagamento = $id_pagamento;
@ -360,6 +360,21 @@ class FatturaElettronica
return $this->getFattura()->id; return $this->getFattura()->id;
} }
protected function prepareFattura($id_tipo, $data, $id_sezionale, $ref_fattura)
{
$anagrafica = $this->saveAnagrafica();
$tipo = TipoFattura::where('id', $id_tipo)->first();
$fattura = Fattura::build($anagrafica, $tipo, $data, $id_sezionale);
$this->fattura = $fattura;
// Riferimento per nota di credito e debito
$fattura->ref_documento = $ref_fattura ?: null;
return $fattura;
}
protected function forceArray($result) protected function forceArray($result)
{ {
$result = isset($result[0]) ? $result : [$result]; $result = isset($result[0]) ? $result : [$result];

View File

@ -0,0 +1,48 @@
<?php
namespace Plugins\ImportFE;
use Modules\Fatture\Fattura;
use Modules\Fatture\Tipo as TipoFattura;
use Util\XML;
/**
* Classe per la gestione delle parcelle in XML.
*
* @since 2.4.11
*/
class Parcella extends FatturaOrdinaria
{
/**
* Prepara la fattura elettronica come fattura del gestionale.
*
* @param int $id_tipo
* @param string $data
* @param int $id_sezionale
* @param int $ref_fattura
*
* @return Fattura
*/
public function prepareFattura($id_tipo, $data, $id_sezionale, $ref_fattura)
{
if (empty($ref_fattura)) {
return parent::prepareFattura($id_tipo, $data, $id_sezionale, $ref_fattura);
}
$anagrafica = $this->saveAnagrafica();
$tipo = TipoFattura::where('id', $id_tipo)->first();
$fattura = Fattura::find($ref_fattura);
// Rimozione righe precedenti (query per evitare procedure automatiche di compensazione)
database()->query('DELETE FROM co_righe_documenti WHERE iddocumento = '.prepare($fattura->id));
$fattura->anagrafica()->associate($anagrafica);
$fattura->tipo()->associate($tipo);
$fattura->data = $data;
$fattura->id_segment = $id_sezionale;
return $fattura;
}
}

View File

@ -116,3 +116,6 @@ INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `e
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES
(NULL, 'OSMCloud Services API Version', 'v2', 'string', 0, 'Fatturazione Elettronica', 11); (NULL, 'OSMCloud Services API Version', 'v2', 'string', 0, 'Fatturazione Elettronica', 11);
DELETE FROM `zz_settings` WHERE `nome` = 'apilayer API key for Email'; DELETE FROM `zz_settings` WHERE `nome` = 'apilayer API key for Email';
-- Fatture pro-forma di acquisto
INSERT INTO `zz_segments` (`id`, `id_module`, `name`, `clause`, `position`, `pattern`, `is_fiscale`) VALUES (NULL, '15', 'Fatture pro-forma', '1=1', 'WHR', 'PRO-###', '1');