Miglioramenti numerazione automatica

This commit is contained in:
Thomas Zilio 2018-12-07 12:10:55 +01:00
parent c56df15e97
commit 4e9da17072
4 changed files with 90 additions and 67 deletions

View File

@ -66,7 +66,7 @@ if ($dir == 'entrata') {
<div class="col-md-3"> <div class="col-md-3">
{[ "type": "text", "label": "'.tr('Numero fattura/protocollo').'", "required": 1, "name": "numero","class": "text-center alphanumeric-mask", "value": "$numero$" ]} {[ "type": "text", "label": "'.tr('Numero fattura/protocollo').'", "required": 1, "name": "numero","class": "text-center alphanumeric-mask", "value": "$numero$" ]}
</div>'; </div>';
$label = tr('Numero fornitore'); $label = tr('Numero fattura del fornitore');
} else { } else {
$label = tr('Numero fattura'); $label = tr('Numero fattura');
} }

View File

@ -110,8 +110,8 @@ class Fattura extends Model
$direzione = $this->tipo->dir; $direzione = $this->tipo->dir;
$data = $this->data; $data = $this->data;
$this->numero = static::getNumero($data, $direzione, $value); $this->numero = static::getNextNumero($data, $direzione, $value);
$this->numero_esterno = static::getNumeroSecondario($data, $direzione, $value); $this->numero_esterno = static::getNextNumeroSecondario($data, $direzione, $value);
} }
} }
@ -124,20 +124,23 @@ class Fattura extends Model
* *
* @return string * @return string
*/ */
public static function getNumero($data, $direzione, $id_segment) public static function getNextNumero($data, $direzione, $id_segment)
{ {
if ($direzione == 'entrata') {
return '';
}
$database = database(); $database = database();
//$maschera = $direzione == 'uscita' ? static::getMaschera($id_segment) : '#';
// Recupero maschera per questo segmento // 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)), ':year' => date('Y', strtotime($data)),
':id_segment' => $id_segment, ':id_segment' => $id_segment,
]); ]);
$numero = Generator::generate($maschera, $ultima_fattura['numero']); $numero = Generator::generate($maschera, $ultima_fattura['numero'], 1, Generator::dateToPattern($data));
return $numero; return $numero;
} }
@ -151,7 +154,7 @@ class Fattura extends Model
* *
* @return string * @return string
*/ */
public static function getNumeroSecondario($data, $direzione, $id_segment) public static function getNextNumeroSecondario($data, $direzione, $id_segment)
{ {
if ($direzione == 'uscita') { if ($direzione == 'uscita') {
return ''; return '';
@ -160,62 +163,18 @@ class Fattura extends Model
$database = database(); $database = database();
// Recupero maschera per questo segmento // 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)), ':year' => date('Y', strtotime($data)),
':id_segment' => $id_segment, ':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; 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. * Restituisce la collezione di righe e articoli con valori rilevanti per i conti.
* *

View File

@ -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 $pattern
* @param string $last * @param string $last
* @param array|int $quantity * @param int $quantity
* @param array $values
* *
* @return string * @return string
*/ */
public static function generate($pattern, $last = null, $quantity = 1) public static function generate($pattern, $last = null, $quantity = 1, $values = [])
{ {
// Costruzione del pattern // Costruzione del pattern
$replaces = self::getReplaces(); $result = self::complete($pattern, $values);
$regexs = array_column($replaces, 'regex');
$result = self::complete($pattern);
$length = substr_count($result, '#'); $length = substr_count($result, '#');
// Individuazione dei valori precedenti // Individuazione dei valori precedenti
@ -70,13 +68,15 @@ class Generator
* *
* @return string * @return string
*/ */
public static function complete($pattern) public static function complete($pattern, $values = [])
{ {
// Costruzione del pattern // Costruzione del pattern
$replaces = self::getReplaces(); $replaces = array_merge(self::getReplaces(), $values);
$keys = array_keys($replaces);
$values = array_column($replaces, 'value'); $values = array_column($replaces, 'value');
$result = str_replace(array_keys($replaces), array_values($values), $pattern); $result = str_replace($keys, $values, $pattern);
return $result; return $result;
} }
@ -132,4 +132,68 @@ class Generator
return $replaces; 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;
}
} }

View File

@ -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. * 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 * @param string $string File content
* @return string An arguably-valid XML string with the .p7m header and footer stripped away. * @return string An arguably-valid XML string with the .p7m header and footer stripped away.