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">
{[ "type": "text", "label": "'.tr('Numero fattura/protocollo').'", "required": 1, "name": "numero","class": "text-center alphanumeric-mask", "value": "$numero$" ]}
</div>';
$label = tr('Numero fornitore');
$label = tr('Numero fattura del fornitore');
} else {
$label = tr('Numero fattura');
}

View File

@ -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.
*

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 $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;
}
}

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.
*
* 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.