From 4e9da1707206a79884da90e8ace9d9f0a56fc98d Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Fri, 7 Dec 2018 12:10:55 +0100 Subject: [PATCH] Miglioramenti numerazione automatica --- modules/fatture/edit.php | 2 +- modules/fatture/src/Fattura.php | 69 ++++++--------------------- src/Util/Generator.php | 84 +++++++++++++++++++++++++++++---- src/Util/XML.php | 2 +- 4 files changed, 90 insertions(+), 67 deletions(-) diff --git a/modules/fatture/edit.php b/modules/fatture/edit.php index ae582f840..8459c1eda 100644 --- a/modules/fatture/edit.php +++ b/modules/fatture/edit.php @@ -66,7 +66,7 @@ if ($dir == 'entrata') {
{[ "type": "text", "label": "'.tr('Numero fattura/protocollo').'", "required": 1, "name": "numero","class": "text-center alphanumeric-mask", "value": "$numero$" ]}
'; - $label = tr('Numero fornitore'); + $label = tr('Numero fattura del fornitore'); } else { $label = tr('Numero fattura'); } diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index 1c9d8ae12..b8334e053 100644 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -110,8 +110,8 @@ class Fattura extends Model $direzione = $this->tipo->dir; $data = $this->data; - $this->numero = static::getNumero($data, $direzione, $value); - $this->numero_esterno = static::getNumeroSecondario($data, $direzione, $value); + $this->numero = static::getNextNumero($data, $direzione, $value); + $this->numero_esterno = static::getNextNumeroSecondario($data, $direzione, $value); } } @@ -124,20 +124,23 @@ class Fattura extends Model * * @return string */ - public static function getNumero($data, $direzione, $id_segment) + public static function getNextNumero($data, $direzione, $id_segment) { + if ($direzione == 'entrata') { + return ''; + } + $database = database(); - //$maschera = $direzione == 'uscita' ? static::getMaschera($id_segment) : '#'; // Recupero maschera per questo segmento - $maschera = static::getMaschera($id_segment); + $maschera = Generator::getMaschera($id_segment); - $ultima_fattura = $database->fetchOne('SELECT numero FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.static::getMascheraOrder($maschera, 'numero'), [ + $ultima_fattura = $database->fetchOne('SELECT numero FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.Generator::getMascheraOrder($maschera, 'numero'), [ ':year' => date('Y', strtotime($data)), ':id_segment' => $id_segment, ]); - $numero = Generator::generate($maschera, $ultima_fattura['numero']); + $numero = Generator::generate($maschera, $ultima_fattura['numero'], 1, Generator::dateToPattern($data)); return $numero; } @@ -151,7 +154,7 @@ class Fattura extends Model * * @return string */ - public static function getNumeroSecondario($data, $direzione, $id_segment) + public static function getNextNumeroSecondario($data, $direzione, $id_segment) { if ($direzione == 'uscita') { return ''; @@ -160,62 +163,18 @@ class Fattura extends Model $database = database(); // Recupero maschera per questo segmento - $maschera = static::getMaschera($id_segment); + $maschera = Generator::getMaschera($id_segment); - $ultima_fattura = $database->fetchOne('SELECT numero_esterno FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.static::getMascheraOrder($maschera, 'numero_esterno'), [ + $ultima_fattura = $database->fetchOne('SELECT numero_esterno FROM co_documenti WHERE YEAR(data) = :year AND id_segment = :id_segment '.Generator::getMascheraOrder($maschera, 'numero_esterno'), [ ':year' => date('Y', strtotime($data)), ':id_segment' => $id_segment, ]); - $numero_esterno = Generator::generate($maschera, $ultima_fattura['numero_esterno']); + $numero_esterno = Generator::generate($maschera, $ultima_fattura['numero_esterno'], 1, Generator::dateToPattern($data)); return $numero_esterno; } - /** - * Restituisce la maschera specificata per il segmento indicato. - * - * @param int $id_segment - * - * @return string - */ - protected static function getMaschera($id_segment) - { - $database = database(); - - $maschera = $database->fetchOne('SELECT pattern FROM zz_segments WHERE id = :id_segment', [ - ':id_segment' => $id_segment, - ])['pattern']; - - return $maschera; - } - - /** - * Metodo per l'individuazione del tipo di ordine da impostare per la corretta interpretazione della maschera. - * Esempi: - * - maschere con testo iniziale (FT-####-YYYY) necessitano l'ordinamento alfabetico - * - maschere di soli numeri (####-YYYY) è necessario l'ordinamento numerico forzato. - * - * @param string $maschera - * - * @return string - */ - protected static function getMascheraOrder($maschera, $order_by) - { - // Estraggo blocchi di caratteri standard - preg_match('/[#]+/', $maschera, $m1); - //preg_match('/[Y]+/', $maschera, $m2); - - $pos1 = strpos($maschera, $m1[0]); - if ($pos1 == 0) { - $query = 'ORDER BY CAST('.$order_by.' AS UNSIGNED) DESC'; - } else { - $query = 'ORDER BY '.$order_by.' DESC'; - } - - return $query; - } - /** * Restituisce la collezione di righe e articoli con valori rilevanti per i conti. * diff --git a/src/Util/Generator.php b/src/Util/Generator.php index 1cf002c22..d26b9ded8 100644 --- a/src/Util/Generator.php +++ b/src/Util/Generator.php @@ -35,21 +35,19 @@ class Generator ]; /** - * Predispone la struttura per il salvataggio dei contenuti INI a partire da una struttura precedente. + * Genera un pattern sulla base del precedente. * * @param string $pattern * @param string $last - * @param array|int $quantity + * @param int $quantity + * @param array $values * * @return string */ - public static function generate($pattern, $last = null, $quantity = 1) + public static function generate($pattern, $last = null, $quantity = 1, $values = []) { // Costruzione del pattern - $replaces = self::getReplaces(); - $regexs = array_column($replaces, 'regex'); - - $result = self::complete($pattern); + $result = self::complete($pattern, $values); $length = substr_count($result, '#'); // Individuazione dei valori precedenti @@ -70,13 +68,15 @@ class Generator * * @return string */ - public static function complete($pattern) + public static function complete($pattern, $values = []) { // Costruzione del pattern - $replaces = self::getReplaces(); + $replaces = array_merge(self::getReplaces(), $values); + + $keys = array_keys($replaces); $values = array_column($replaces, 'value'); - $result = str_replace(array_keys($replaces), array_values($values), $pattern); + $result = str_replace($keys, $values, $pattern); return $result; } @@ -132,4 +132,68 @@ class Generator return $replaces; } + + /** + * Interpreta una data specifica per la sostituzione nei pattern. + * + * @return array + */ + public static function dateToPattern($date) + { + $replaces = self::$replaces; + + $date = strtotime($date); + $results = []; + + foreach ($replaces as $key => $value) { + if (isset($replaces[$key]['date'])) { + $results[$key]['value'] = date($replaces[$key]['date'], $date); + } + } + + return $results; + } + + /** + * Restituisce la maschera specificata per il segmento indicato. + * + * @param int $id_segment + * + * @return string + */ + public static function getMaschera($id_segment) + { + $database = database(); + + $maschera = $database->fetchOne('SELECT pattern FROM zz_segments WHERE id = :id_segment', [ + ':id_segment' => $id_segment, + ]); + + return $maschera['pattern']; + } + + /** + * Metodo per l'individuazione del tipo di ordine da impostare per la corretta interpretazione della maschera. + * Esempi: + * - maschere con testo iniziale (FT-####-YYYY) necessitano l'ordinamento alfabetico + * - maschere di soli numeri (####-YYYY) è necessario l'ordinamento numerico forzato. + * + * @param string $maschera + * + * @return string + */ + public static function getMascheraOrder($maschera, $filed) + { + // Estraggo blocchi di caratteri standard + preg_match('/[#]+/', $maschera, $m1); + + $pos1 = strpos($maschera, $m1[0]); + if ($pos1 == 0) { + $query = 'ORDER BY CAST('.$filed.' AS UNSIGNED) DESC'; + } else { + $query = 'ORDER BY '.$filed.' DESC'; + } + + return $query; + } } diff --git a/src/Util/XML.php b/src/Util/XML.php index 7fff7ed24..606431250 100644 --- a/src/Util/XML.php +++ b/src/Util/XML.php @@ -42,7 +42,7 @@ class XML /** * Removes the PKCS#7 header and the signature info footer from a digitally-signed .xml.p7m file using CAdES format. * - * TODO: controllare il funzionamento con gli allegati. + * TODO: controllare il funzionamento con gli allegati (https://forum.italia.it/t/in-produzione-xml-ricevuto-non-leggibile/5695/2). * * @param string $string File content * @return string An arguably-valid XML string with the .p7m header and footer stripped away.