Miglioramenti numerazione automatica
This commit is contained in:
parent
c56df15e97
commit
4e9da17072
|
@ -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');
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue