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