diff --git a/modules/anagrafiche/actions.php b/modules/anagrafiche/actions.php
index 80ef57fc2..d6e16ac28 100644
--- a/modules/anagrafiche/actions.php
+++ b/modules/anagrafiche/actions.php
@@ -87,6 +87,8 @@ switch (post('op')) {
// Validazione della Partita IVA
$partita_iva = $anagrafica->partita_iva;
+ $partita_iva = strlen($partita_iva) == 9 ? $anagrafica->nazione->iso2.$partita_iva : $partita_iva;
+
$check_vat_number = Validate::isValidVatNumber($partita_iva);
if (empty($check_vat_number)) {
flash()->warning(tr('Attenzione: la partita IVA _IVA_ sembra non essere valida. Per conferma il servizio Verifica partita iva del sito dell\'agenzia delle entrate.', [
@@ -95,15 +97,15 @@ switch (post('op')) {
}
// Validazione del Codice Fiscale, solo per anagrafiche Private e Aziende, ignoro controllo se codice fiscale e settato uguale alla p.iva
- $codice_fiscale = $anagrafica->codice_fiscale;
- if (post('tipo') != 'Ente pubblico' and $codice_fiscale != $partita_iva){
- $check_codice_fiscale = Validate::isValidTaxCode($codice_fiscale);
- if (empty($check_codice_fiscale)) {
- flash()->warning(tr('Attenzione: il codice fiscale _COD_ sembra non essere valido', [
- '_COD_' => $codice_fiscale,
- ]));
- }
- }
+ $codice_fiscale = $anagrafica->codice_fiscale;
+ if ($anagrafica->tipo != 'Ente pubblico' and $codice_fiscale != $partita_iva) {
+ $check_codice_fiscale = Validate::isValidTaxCode($codice_fiscale);
+ if (empty($check_codice_fiscale)) {
+ flash()->warning(tr('Attenzione: il codice fiscale _COD_ sembra non essere valido', [
+ '_COD_' => $codice_fiscale,
+ ]));
+ }
+ }
// Aggiorno il codice anagrafica se non è già presente, altrimenti lo ignoro
if ($anagrafica->codice != post('codice')) {
diff --git a/modules/anagrafiche/ajax/select.php b/modules/anagrafiche/ajax/select.php
index 71ec77135..07419a1dd 100644
--- a/modules/anagrafiche/ajax/select.php
+++ b/modules/anagrafiche/ajax/select.php
@@ -108,45 +108,36 @@ switch ($resource) {
// $custom['idtipointervento'] = 'idtipointervento_default';
break;
-
- case 'clienti_fornitori':
+
+ case 'clienti_fornitori':
$query = "SELECT `an_anagrafiche`.`idanagrafica` AS id, CONCAT_WS('', ragione_sociale, IF(citta !='' OR provincia != '', CONCAT(' (', citta, IF(provincia!='', CONCAT(' ', provincia), ''), ')'), '')) AS descrizione, `an_tipianagrafiche`.`descrizione` AS optgroup, idtipointervento_default, an_tipianagrafiche.idtipoanagrafica FROM `an_tipianagrafiche` INNER JOIN `an_tipianagrafiche_anagrafiche` ON `an_tipianagrafiche`.`idtipoanagrafica`=`an_tipianagrafiche_anagrafiche`.`idtipoanagrafica` INNER JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`an_tipianagrafiche_anagrafiche`.`idanagrafica` |where| ORDER BY `optgroup` ASC, ragione_sociale ASC";
- foreach ($elements as $element) {
- $filter[] = 'an_anagrafiche.idanagrafica='.prepare($element);
- }
-
-
- if (empty($filter)) {
- $where[] = 'deleted_at IS NULL';
- $where[] = "an_tipianagrafiche_anagrafiche.idtipoanagrafica IN (SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione = 'Cliente' OR descrizione = 'Fornitore')";
- }
+ foreach ($elements as $element) {
+ $filter[] = 'an_anagrafiche.idanagrafica='.prepare($element);
+ }
- if (!empty($search)) {
- $search_fields[] = 'ragione_sociale LIKE '.prepare('%'.$search.'%');
- $search_fields[] = 'citta LIKE '.prepare('%'.$search.'%');
- $search_fields[] = 'provincia LIKE '.prepare('%'.$search.'%');
- }
-
- // Aggiunta filtri di ricerca
$where = [];
+ if (empty($filter)) {
+ $where[] = 'deleted_at IS NULL';
+ $where[] = "an_tipianagrafiche_anagrafiche.idtipoanagrafica IN (SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione = 'Cliente' OR descrizione = 'Fornitore')";
+ }
+
+ if (!empty($search)) {
+ $search_fields[] = 'ragione_sociale LIKE '.prepare('%'.$search.'%');
+ $search_fields[] = 'citta LIKE '.prepare('%'.$search.'%');
+ $search_fields[] = 'provincia LIKE '.prepare('%'.$search.'%');
+ }
+
+ // Aggiunta filtri di ricerca
if (!empty($search_fields)) {
$where[] = '('.implode(' OR ', $search_fields).')';
}
-
+
if (!empty($filter)) {
$where[] = '('.implode(' OR ', $filter).')';
}
-
+
$query = str_replace('|where|', !empty($where) ? 'WHERE '.implode(' AND ', $where) : '', $query);
-
- $wh = '';
- if (count($where) != 0) {
- $wh = 'WHERE '.implode(' AND ', $where);
- }
-
- $query = str_replace('|where|', '|where| '.$wh, $query);
-
$rs = $dbo->fetchArray($query);
foreach ($rs as $r) {
@@ -163,7 +154,7 @@ switch ($resource) {
}
break;
-
+
// Nota Bene: nel campo id viene specificato idtipoanagrafica-idanagrafica -> modulo Utenti e permessi, creazione nuovo utente
case 'anagrafiche':
$query = "SELECT CONCAT(an_tipianagrafiche.idtipoanagrafica, '-', an_anagrafiche.idanagrafica) AS id, CONCAT_WS('', ragione_sociale, IF(citta !='' OR provincia != '', CONCAT(' (', citta, IF(provincia!='', CONCAT(' ', provincia), ''), ')'), '')) AS descrizione, idtipointervento_default FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica |where| ORDER BY ragione_sociale";
diff --git a/modules/contratti/plugins/contratti.consuntivo.php b/modules/contratti/plugins/contratti.consuntivo.php
index 2f3f93553..fac37e3a6 100644
--- a/modules/contratti/plugins/contratti.consuntivo.php
+++ b/modules/contratti/plugins/contratti.consuntivo.php
@@ -42,7 +42,7 @@ if (!empty($rsi)) {
foreach ($rsi as $int) {
$int = array_merge($int, get_costi_intervento($int['id']));
$totale_stato[$int['idstatointervento']] = sum($totale_stato[$int['idstatointervento']], $int['totale_scontato']);
-
+
// Riga intervento singolo
echo '
@@ -275,7 +275,7 @@ $budget = $rs[0]['budget'];
$rs = $dbo->fetchArray("SELECT SUM(qta) AS totale_ore FROM `co_righe_contratti` WHERE um='ore' AND idcontratto=".prepare($id_record));
$contratto_tot_ore = $rs[0]['totale_ore'];
-$diff = sum($budget, -$totale_addebito);
+$diff = sum($budget, -$totale);
if ($diff > 0) {
$bilancio = ''.Translator::numberToLocale($diff).' €';
diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php
index 04f08c43c..edd19c398 100644
--- a/modules/fatture/actions.php
+++ b/modules/fatture/actions.php
@@ -555,10 +555,14 @@ switch (post('op')) {
$articolo->id_iva = post('idiva');
$articolo->idconto = post('idconto');
- $articolo->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto');
- $articolo->id_ritenuta_acconto = post('id_ritenuta_acconto');
+ if (post('calcolo_ritenuta_acconto')) {
+ $articolo->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto');
+ $articolo->id_ritenuta_acconto = post('id_ritenuta_acconto');
+ }
- $articolo->id_rivalsa_inps = post('id_rivalsa_inps');
+ if (post('id_rivalsa_inps')) {
+ $articolo->id_rivalsa_inps = post('id_rivalsa_inps');
+ }
$articolo->prezzo_unitario_vendita = post('prezzo');
$articolo->sconto_unitario = post('sconto');
@@ -600,10 +604,14 @@ switch (post('op')) {
$riga->id_iva = post('idiva');
$riga->idconto = post('idconto');
- $riga->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto');
- $riga->id_ritenuta_acconto = post('id_ritenuta_acconto');
+ if (post('calcolo_ritenuta_acconto')) {
+ $riga->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto');
+ $riga->id_ritenuta_acconto = post('id_ritenuta_acconto');
+ }
- $riga->id_rivalsa_inps = post('id_rivalsa_inps');
+ if (post('id_rivalsa_inps')) {
+ $riga->id_rivalsa_inps = post('id_rivalsa_inps');
+ }
$riga->prezzo_unitario_vendita = post('prezzo');
$riga->qta = $qta;
diff --git a/modules/import/actions.php b/modules/import/actions.php
index c22c3b622..405dc3d45 100644
--- a/modules/import/actions.php
+++ b/modules/import/actions.php
@@ -53,7 +53,9 @@ switch (post('op')) {
// Richiamo delle operazioni specifiche
include $imports[$id_record]['import'];
- flash()->info(tr('Importazione completata. '.count($csv).' righe processate.'));
+ flash()->info(tr('Importazione completata: _COUNT_ righe processate', [
+ '_COUNT_' => count($csv),
+ ]));
break;
}
diff --git a/modules/import/edit.php b/modules/import/edit.php
index 4b4885e3a..8b4d85a44 100644
--- a/modules/import/edit.php
+++ b/modules/import/edit.php
@@ -45,6 +45,7 @@ if (empty($id_record)) {
$rows = Import::getFile($id_record, $record['id'], [
'limit' => 10,
]);
+
$count = count($rows[0]);
echo '
diff --git a/modules/preventivi/plugins/preventivi.consuntivo.php b/modules/preventivi/plugins/preventivi.consuntivo.php
index c79a31574..c7d0c7d5c 100644
--- a/modules/preventivi/plugins/preventivi.consuntivo.php
+++ b/modules/preventivi/plugins/preventivi.consuntivo.php
@@ -43,7 +43,7 @@ if (!empty($rsi)) {
// Tabella con i dati
foreach ($rsi as $int) {
$int = array_merge($int, get_costi_intervento($int['id']));
- $totale_stato[$int['idstatointervento']] = sum($totale_stato[$int['idstatointervento']], $int['totale']);
+ $totale_stato[$int['idstatointervento']] = sum($totale_stato[$int['idstatointervento']], $int['totale_scontato']);
// Riga intervento singolo
echo '
@@ -271,13 +271,13 @@ if (!empty($rsi)) {
/*
Bilancio del preventivo
*/
-$diff = sum($budget, -$totale_addebito);
+$diff = sum($budget, -$totale);
echo '
'.tr('Rapporto budget/spesa').':
';
-if ($budget > $totale) {
+if ($diff > 0) {
echo '
+'.Translator::numberToLocale($diff).' €';
} elseif ($diff < 0) {
diff --git a/plugins/exportPA/init.php b/plugins/exportPA/init.php
index bafc191a1..a42b35856 100644
--- a/plugins/exportPA/init.php
+++ b/plugins/exportPA/init.php
@@ -1,8 +1,10 @@
$azienda['nazione'],
'IdCodice' => $azienda['piva'],
],
- 'ProgressivoInvio' => $documento['codice_xml'],
+ 'ProgressivoInvio' => $documento['progressivo_invio'],
'FormatoTrasmissione' => ($cliente['tipo'] == 'Ente pubblico') ? 'FPA12' : 'FPR12',
'CodiceDestinatario' => !empty($cliente['codice_destinatario']) ? $cliente['codice_destinatario'] : $default_code,
];
@@ -623,27 +623,30 @@ class FatturaElettronica
$co_scadenziario = $database->fetchArray('SELECT * FROM `co_scadenziario` WHERE `iddocumento` = '.prepare($documento['id']));
foreach ($co_scadenziario as $scadenza) {
$pagamento = [
- 'ModalitaPagamento' => $co_pagamenti['codice_modalita_pagamento_fe'],
- 'DataScadenzaPagamento' => $scadenza['scadenza'],
- 'ImportoPagamento' => $scadenza['da_pagare'],
- ];
+ 'ModalitaPagamento' => $co_pagamenti['codice_modalita_pagamento_fe'],
+ 'DataScadenzaPagamento' => $scadenza['scadenza'],
+ 'ImportoPagamento' => $scadenza['da_pagare'],
+ ];
- if (!empty($documento['idbanca'])){
- $co_banche = $database->fetchOne('SELECT * FROM co_banche WHERE id = '.prepare($documento['idbanca']));
- if (!empty($co_banche['nome']))
- $pagamento['IstitutoFinanziario'] = $co_banche['nome'];
- if (!empty($co_banche['iban']))
- $pagamento['IBAN'] = $co_banche['iban'];
- if (!empty($co_banche['bic']))
- $pagamento['BIC'] = $co_banche['bic'];
- }
+ if (!empty($documento['idbanca'])) {
+ $co_banche = $database->fetchOne('SELECT * FROM co_banche WHERE id = '.prepare($documento['idbanca']));
+ if (!empty($co_banche['nome'])) {
+ $pagamento['IstitutoFinanziario'] = $co_banche['nome'];
+ }
+ if (!empty($co_banche['iban'])) {
+ $pagamento['IBAN'] = $co_banche['iban'];
+ }
+ if (!empty($co_banche['bic'])) {
+ $pagamento['BIC'] = $co_banche['bic'];
+ }
+ }
}
-
- $result[] = [
- 'DettaglioPagamento' => $pagamento
- ];
-
- return $result;
+
+ $result[] = [
+ 'DettaglioPagamento' => $pagamento
+ ];
+
+ return $result;
}
/**
@@ -694,7 +697,8 @@ class FatturaElettronica
return $attachments;
}
- $dir = Uploads::getDirectory($id_module, Plugins::get('Fatturazione Elettronica')['id']);
+ $data = $fattura->getUploadData();
+ $dir = static::getDirectory();
$rapportino_nome = sanitizeFilename($documento['numero'].'.pdf');
$filename = slashes(DOCROOT.'/'.$dir.'/'.$rapportino_nome);
@@ -702,6 +706,12 @@ class FatturaElettronica
$print = Prints::getModulePredefinedPrint($id_module);
Prints::render($print['id'], $documento['id'], $filename);
+ Uploads::delete($rapportino_nome, $data);
+ Uploads::register(array_merge([
+ 'name' => 'Stampa allegata',
+ 'original' => $rapportino_nome,
+ ], $data));
+
$attachments[] = [
'NomeAttachment' => 'Fattura',
'FormatoAttachment' => 'PDF',
@@ -851,6 +861,20 @@ class FatturaElettronica
return isset($json['data'][0]['OU'][0]['cod_uni_ou']) ? $json['data'][0]['OU'][0]['cod_uni_ou'] : null;
}
+ public static function getDirectory()
+ {
+ return Uploads::getDirectory(Modules::get('Fatture di vendita')['id']);
+ }
+
+ protected function getUploadData()
+ {
+ return [
+ 'category' => tr('Fattura elettronica'),
+ 'id_module' => Modules::get('Fatture di vendita')['id'],
+ 'id_record' => $this->getDocumento()['id'],
+ ];
+ }
+
/**
* Salva il file XML.
*
@@ -860,6 +884,12 @@ class FatturaElettronica
*/
public function save($directory)
{
+ $name = 'Fattura Elettronica (XML)';
+ $previous = $this->getFilename();
+ $data = $this->getUploadData();
+
+ Uploads::delete($previous, $data);
+
// Generazione nome XML
$filename = $this->getFilename(true);
@@ -868,34 +898,14 @@ class FatturaElettronica
$result = directory($directory) && file_put_contents($file, $this->toXML());
// Registrazione come allegato
- $this->register($filename);
+ Uploads::register(array_merge([
+ 'name' => $name,
+ 'original' => $filename,
+ ], $data));
return ($result === false) ? null : $filename;
}
- /**
- * Registra il file XML come allegato.
- *
- * @param string $filename
- */
- public function register($filename)
- {
- $data = [
- 'original' => $filename,
- 'category' => tr('Fattura elettronica'),
- 'id_module' => Modules::get('Fatture di vendita')['id'],
- //'id_plugin' => Plugins::get('Fatturazione Elettronica')['id'],
- 'id_record' => $this->getDocumento()['id'],
- ];
- $uploads = Uploads::get($data);
-
- $registered = in_array($filename, array_column($uploads, 'original'));
-
- if (!$registered) {
- Uploads::register($data);
- }
- }
-
/**
* Restituisce il nome del file XML per la fattura elettronica.
*
@@ -906,19 +916,19 @@ class FatturaElettronica
$azienda = static::getAzienda();
$prefix = 'IT'.(empty($azienda['piva']) ? $azienda['codice_fiscale'] : $azienda['piva']);
- if (empty($this->documento['codice_xml']) || !empty($new)) {
+ if (empty($this->documento['progressivo_invio']) || !empty($new)) {
$database = database();
do {
$code = date('y').secure_random_string(3);
- } while ($database->fetchNum('SELECT `id` FROM `co_documenti` WHERE `codice_xml` = '.prepare($code)) != 0);
+ } while ($database->fetchNum('SELECT `id` FROM `co_documenti` WHERE `progressivo_invio` = '.prepare($code)) != 0);
// Registrazione
- $database->update('co_documenti', ['codice_xml' => $code], ['id' => $this->getDocumento()['id']]);
- $this->documento['codice_xml'] = $code;
+ $database->update('co_documenti', ['progressivo_invio' => $code], ['id' => $this->getDocumento()['id']]);
+ $this->documento['progressivo_invio'] = $code;
}
- return $prefix.'_'.$this->documento['codice_xml'].'.xml';
+ return $prefix.'_'.$this->documento['progressivo_invio'].'.xml';
}
/**
diff --git a/select2('#idpagamento' b/select2('#idpagamento'
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/Auth.php b/src/Auth.php
index d20e96f06..7d4a08a7a 100644
--- a/src/Auth.php
+++ b/src/Auth.php
@@ -24,7 +24,7 @@ class Auth extends \Util\Singleton
'message' => 'Utente non abilitato!',
],
'unauthorized' => [
- 'code' => 3,
+ 'code' => 5,
'message' => "L'utente non ha nessun permesso impostato!",
],
];
diff --git a/src/Import.php b/src/Import.php
index 3d0e88e7b..760070cbd 100644
--- a/src/Import.php
+++ b/src/Import.php
@@ -37,7 +37,7 @@ class Import
$results[$module['id']] = array_merge($module->toArray(), [
'import' => file_exists($custom_file) ? $custom_file : $original_file,
- 'files' => $files,
+ 'files' => array_reverse($files),
]);
}
}
diff --git a/src/Validate.php b/src/Validate.php
index ad07b8a11..6a87ae344 100644
--- a/src/Validate.php
+++ b/src/Validate.php
@@ -24,8 +24,6 @@ class Validate
return true;
}
- $vat_number = starts_with($vat_number, 'IT') ? $vat_number : 'IT'.$vat_number;
-
// Controllo con API europea ufficiale
if (extension_loaded('soap')) {
try {
diff --git a/tests/_support/AcceptanceTester.php b/tests/_support/AcceptanceTester.php
index 3e04fd554..11ed112db 100644
--- a/tests/_support/AcceptanceTester.php
+++ b/tests/_support/AcceptanceTester.php
@@ -1,5 +1,6 @@
clickAndWait($link, '.swal2-buttonswrapper');
}
- public function expandSidebarLink($link)
- {
- $t = $this;
-
- $t->click($link, '.sidebar');
- $t->wait(1);
- }
-
public function navigateTo($link)
{
$this->clickAndWait($link, '.sidebar');
diff --git a/tests/_support/Helper/Acceptance.php b/tests/_support/Helper/Acceptance.php
index f91e191f6..5844c890e 100644
--- a/tests/_support/Helper/Acceptance.php
+++ b/tests/_support/Helper/Acceptance.php
@@ -2,6 +2,8 @@
namespace Helper;
+use Codeception\Util\Locator;
+
// here you can define custom actions
// all public methods declared in helper class will be available in $t
@@ -45,4 +47,25 @@ class Acceptance extends \Codeception\Module
return $this->getModule('WebDriver');
}
+
+ public function seePageHasElement($element)
+ {
+ try {
+ $this->getAcceptanceModule()->seeElement($element);
+ } catch (\PHPUnit_Framework_AssertionFailedError $f) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function expandSidebarLink($link)
+ {
+ $t = $this->getAcceptanceModule();
+
+ if (!$this->seePageHasElement("descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' sidebar ')]/descendant-or-self::*/li[contains(., '".$link."') and @class and contains(concat(' ', normalize-space(@class), ' '), ' menu-open ')]")) {
+ $t->click($link, '.sidebar');
+ $t->wait(1);
+ }
+ }
}
diff --git a/tests/_support/Helper/Common/RowHelper.php b/tests/_support/Helper/Common/RowHelper.php
index 1b5468068..08179aec1 100644
--- a/tests/_support/Helper/Common/RowHelper.php
+++ b/tests/_support/Helper/Common/RowHelper.php
@@ -10,25 +10,22 @@ class RowHelper extends \Codeception\Module
protected $finalPattern = "//div[@class='panel-heading' and contains(string(), 'Righe')]/parent::*//table//tr[contains(string(), '|name|')]//td[2]";
/**
- * Undocumented function.
+ * Completa le informazioni per la creazione di un nuovo elemento.
*
* @param AcceptanceTester $t
- * @param [type] $descrizione
- * @param [type] $qta
- * @param [type] $prezzo
- * @param int $sconto
- * @param string $tipo_sconto
- * @param [type] $id_iva
- * @param [type] $id_rivalsa_inps
- * @param [type] $id_ritenuta_acconto
+ * @param [type] $descrizione
+ * @param [type] $qta
+ * @param [type] $prezzo
+ * @param integer $sconto
+ * @param string $tipo_sconto
+ * @param [type] $id_iva
+ * @param [type] $id_rivalsa_inps
+ * @param [type] $id_ritenuta_acconto
+ * @return void
*/
- public function addRow(AcceptanceTester $t, $descrizione, $qta, $prezzo, $sconto = 0, $tipo_sconto = 'UNT', $id_iva = null, $id_rivalsa_inps = null, $id_ritenuta_acconto = null)
+ protected function fill(AcceptanceTester $t, $descrizione, $qta, $prezzo, $sconto = 0, $tipo_sconto = 'UNT', $id_iva = null, $id_rivalsa_inps = null, $id_ritenuta_acconto = null)
{
- // Apre il modal
- $t->clickAndWaitModal('Riga', '#tab_0');
-
- // Completa le informazioni
- $t->fillField('Descrizione', $descrizione);
+ $t->fillField('#descrizione_riga', $descrizione);
$t->fillField('Q.tà', $qta);
$t->fillField('Costo unitario', $prezzo);
@@ -50,6 +47,27 @@ class RowHelper extends \Codeception\Module
if ($id_ritenuta_acconto) {
$t->select2('#id_ritenuta_acconto', $id_ritenuta_acconto);
}
+ }
+
+ /**
+ * Aggiunge una nuova riga.
+ *
+ * @param AcceptanceTester $t
+ * @param string $descrizione
+ * @param int $qta
+ * @param float $prezzo
+ * @param int $sconto
+ * @param string $tipo_sconto
+ * @param int $id_iva
+ * @param int $id_rivalsa_inps
+ * @param int $id_ritenuta_acconto
+ */
+ public function addRow(AcceptanceTester $t, $descrizione, $qta, $prezzo, $sconto = 0, $tipo_sconto = 'UNT', $id_iva = null, $id_rivalsa_inps = null, $id_ritenuta_acconto = null)
+ {
+ // Apre il modal
+ $t->clickAndWaitModal('Riga', '#tab_0');
+
+ $this->fill($t, $descrizione, $qta, $prezzo, $sconto, $tipo_sconto, $id_iva, $id_rivalsa_inps, $id_ritenuta_acconto);
// Effettua il submit
$t->clickAndWait('Aggiungi', '.modal');
@@ -58,6 +76,34 @@ class RowHelper extends \Codeception\Module
$t->see('Riga aggiunta');
}
+ /**
+ * Aggiunge un nuovo articolo.
+ *
+ * @param AcceptanceTester $t
+ * @param string $descrizione
+ * @param int $qta
+ * @param float $prezzo
+ * @param int $sconto
+ * @param string $tipo_sconto
+ * @param int $id_iva
+ * @param int $id_rivalsa_inps
+ * @param int $id_ritenuta_acconto
+ */
+ public function addArticle(AcceptanceTester $t, $id_articolo, $descrizione, $qta, $prezzo, $sconto = 0, $tipo_sconto = 'UNT', $id_iva = null, $id_rivalsa_inps = null, $id_ritenuta_acconto = null)
+ {
+ // Apre il modal
+ $t->clickAndWaitModal('Articolo', '#tab_0');
+
+ $t->select2ajax('#idarticolo', $id_articolo);
+ $this->fill($t, $descrizione, $qta, $prezzo, $sconto, $tipo_sconto, $id_iva, $id_rivalsa_inps, $id_ritenuta_acconto);
+
+ // Effettua il submit
+ $t->clickAndWait('Aggiungi', '.modal');
+
+ // Controlla il salvataggio finale
+ $t->see('Articolo aggiunto');
+ }
+
/**
* Undocumented function.
*
@@ -85,6 +131,7 @@ class RowHelper extends \Codeception\Module
*/
public function testImporti(AcceptanceTester $t)
{
+ // Righe di test (issue #98)
$this->addRow($t, 'Riga 1', 1, 34);
$this->addRow($t, 'Riga 2', 1, 17.44);
$this->addRow($t, 'Riga 3', 48, 0.52);
@@ -96,6 +143,7 @@ class RowHelper extends \Codeception\Module
$t->see('46,71', $this->getFinalValue('IVA'));
$t->see('259,05', $this->getFinalValue('Totale'));
+ // Righe di controllo sugli sconti
$this->addRow($t, 'Riga 7 con sconto in euro', 15, 12, 2);
$this->addRow($t, 'Riga 8 con sconto percentuale', 15, 10, 20, 'PRC');
@@ -104,5 +152,27 @@ class RowHelper extends \Codeception\Module
$t->see('482,34', $this->getFinalValue('Imponibile scontato'));
$t->see('106,11', $this->getFinalValue('IVA'));
$t->see('588,45', $this->getFinalValue('Totale'));
+
+ // Sconto globale in euro
+ $t->fillField('Sconto incondizionato', 100);
+ $t->select2ajax('#tipo_sconto_generico', 'UNT');
+ $t->clickAndWait('Salva');
+
+ $t->see('442,34', $this->getFinalValue('Imponibile'));
+ $t->see('60,00', $this->getFinalValue('Sconto'));
+ $t->see('382,34', $this->getFinalValue('Imponibile scontato'));
+ $t->see('84,11', $this->getFinalValue('IVA'));
+ $t->see('466,45', $this->getFinalValue('Totale'));
+
+ // Sconto globale in percentuale
+ $t->fillField('Sconto incondizionato', 10);
+ $t->select2ajax('#tipo_sconto_generico', 'PRC');
+ $t->clickAndWait('Salva');
+
+ $t->see('494,11', $this->getFinalValue('Imponibile'));
+ $t->see('60,00', $this->getFinalValue('Sconto'));
+ $t->see('434,11', $this->getFinalValue('Imponibile scontato'));
+ $t->see('95,50', $this->getFinalValue('IVA'));
+ $t->see('529,61', $this->getFinalValue('Totale'));
}
}
diff --git a/tests/acceptance/BackupCest.php b/tests/acceptance/BackupCest.php
new file mode 100644
index 000000000..032e96940
--- /dev/null
+++ b/tests/acceptance/BackupCest.php
@@ -0,0 +1,52 @@
+login('admin', 'admin');
+ }
+
+ /**
+ * Crea un nuovo backup.
+ *
+ * @param AcceptanceTester $t
+ */
+ protected function createBackup(AcceptanceTester $t)
+ {
+ // Seleziona il modulo da aprire
+ $t->expandSidebarLink('Strumenti');
+ $t->navigateTo('Backup');
+
+ $t->clickAndWaitSwal('Crea backup');
+
+ // Conferma la creazione
+ $t->clickSwalButton('Crea');
+
+ // Controlla il salvataggio finale
+ $t->see('Nuovo backup creato correttamente!');
+ }
+
+ /**
+ * Ripristina un backup specifico.
+ *
+ * @param AcceptanceTester $t
+ */
+ protected function restoreBackup(AcceptanceTester $t, $name = nullW)
+ {
+ // Seleziona il modulo da aprire
+ $t->expandSidebarLink('Strumenti');
+ $t->navigateTo('Backup');
+ }
+
+ /**
+ * Crea una nuova anagrafica di tipo Cliente.
+ *
+ * @param AcceptanceTester $t
+ */
+ protected function testBackup(AcceptanceTester $t)
+ {
+ $name = $this->createBackup($t);
+ }
+}
diff --git a/tests/acceptance/ContrattiCest.php b/tests/acceptance/ContrattiCest.php
new file mode 100644
index 000000000..276a5774b
--- /dev/null
+++ b/tests/acceptance/ContrattiCest.php
@@ -0,0 +1,80 @@
+rowHelper = $rowHelper;
+ }
+
+ public function _before(\AcceptanceTester $t)
+ {
+ // Effettua l'accesso con le credenziali fornite
+ $t->login('admin', 'admin');
+ }
+
+ /**
+ * Crea un nuovo contratto.
+ *
+ * @param AcceptanceTester $t
+ */
+ protected function addContratto(AcceptanceTester $t, $name, $anagrafica)
+ {
+ // Seleziona il modulo da aprire
+ $t->expandSidebarLink('Vendite');
+ $t->navigateTo('Contratti');
+
+ // Apre la schermata di nuovo elemento
+ $t->clickAndWaitModal('.btn-primary', '#tabs');
+
+ // Completa i campi per il nuovo elemento
+ $t->fillField('Nome', $name);
+ $t->select2ajax('#idanagrafica', $anagrafica);
+
+ // Effettua il submit
+ $t->clickAndWait('Aggiungi', '#add-form');
+
+ // Controlla il salvataggio finale
+ $t->see('Aggiunto contratto');
+ }
+
+ /**
+ * Crea una nuova anagrafica di tipo cliente e la elimina.
+ *
+ * @param AcceptanceTester $t
+ */
+ protected function addAndDeleteContratto(AcceptanceTester $t, $name, $anagrafica = 2)
+ {
+ $this->addAnag($t, $name, $anagrafica);
+
+ // Seleziona l'azione di eliminazione
+ $t->clickAndWaitSwal('Elimina', '#tab_0');
+
+ // Conferma l'eliminazione
+ $t->clickSwalButton('Elimina');
+
+ // Controlla eliminazione
+ $t->see('Contratto eliminato!', '.alert-success');
+ }
+
+ /**
+ * Crea un nuovo contratto.
+ *
+ * @param AcceptanceTester $t
+ */
+ public function testContratto(AcceptanceTester $t)
+ {
+ $this->addContratto($t, 'Contratto di test', 2);
+
+ $this->rowHelper->testImporti($t);
+
+ //$t->click('Stampa');
+ }
+}
diff --git a/tests/acceptance/DDTCest.php b/tests/acceptance/DDTCest.php
new file mode 100644
index 000000000..1f739013a
--- /dev/null
+++ b/tests/acceptance/DDTCest.php
@@ -0,0 +1,92 @@
+rowHelper = $rowHelper;
+ }
+
+ public function _before(\AcceptanceTester $t)
+ {
+ // Effettua l'accesso con le credenziali fornite
+ $t->login('admin', 'admin');
+ }
+
+ /**
+ * Crea un nuovo ddt.
+ *
+ * @param AcceptanceTester $t
+ */
+ protected function addDdt(AcceptanceTester $t, $entrata, $anagrafica, $tipo)
+ {
+ // Seleziona il modulo da aprire
+ $t->expandSidebarLink('Magazzino');
+ $t->navigateTo($entrata == true ? 'Ddt di vendita' : 'Ddt di acquisto');
+
+ // Apre la schermata di nuovo elemento
+ $t->clickAndWaitModal('.btn-primary', '#tabs');
+
+ // Completa i campi per il nuovo elemento
+ $t->select2ajax('#idanagrafica_add', $anagrafica);
+ $t->select2('#idtipoddt', $tipo);
+
+ // Effettua il submit
+ $t->clickAndWait('Aggiungi', '#add-form');
+
+ // Controlla il salvataggio finale
+ $t->see('Aggiunto ddt');
+ }
+
+ /**
+ * Crea una nuova anagrafica di tipo cliente e la elimina.
+ *
+ * @param AcceptanceTester $t
+ */
+ protected function addAndDeleteDdt(AcceptanceTester $t, $entrata, $anagrafica, $tipo)
+ {
+ $this->addAnag($t, $entrata, $anagrafica, $tipo);
+
+ // Seleziona l'azione di eliminazione
+ $t->clickAndWaitSwal('Elimina', '#tab_0');
+
+ // Conferma l'eliminazione
+ $t->clickSwalButton('Elimina');
+
+ // Controlla eliminazione
+ $t->see('Ddt eliminato!', '.alert-success');
+ }
+
+ /**
+ * Crea un nuovo ddt.
+ *
+ * @param AcceptanceTester $t
+ */
+ public function testDdtDiVendita(AcceptanceTester $t)
+ {
+ $this->addDdt($t, true, 2, 2);
+
+ $this->rowHelper->testImporti($t);
+
+ //$t->click('Stampa');
+ }
+
+ /**
+ * Crea un nuovo ddt.
+ *
+ * @param AcceptanceTester $t
+ */
+ public function testDdtDiAcquisto(AcceptanceTester $t)
+ {
+ $this->addDdt($t, false, 3, 1);
+
+ $this->rowHelper->testImporti($t);
+ }
+}
diff --git a/tests/acceptance/FattureCest.php b/tests/acceptance/FattureCest.php
index a2f970bf8..f79639d57 100644
--- a/tests/acceptance/FattureCest.php
+++ b/tests/acceptance/FattureCest.php
@@ -21,7 +21,7 @@ class FattureCest
}
/**
- * Crea una nuova anagrafica.
+ * Crea una nuova fattura.
*
* @param AcceptanceTester $t
*/
@@ -42,11 +42,11 @@ class FattureCest
$t->clickAndWait('Aggiungi', '#add-form');
// Controlla il salvataggio finale
- $t->see('Aggiunta fattura numero');
+ $t->see('Aggiunta fattura');
}
/**
- * Crea una nuova anagrafica di tipo cliente e la elimina.
+ * Crea una nuova fattura e la elimina.
*
* @param AcceptanceTester $t
*/
@@ -61,7 +61,7 @@ class FattureCest
$t->clickSwalButton('Elimina');
// Controlla eliminazione
- $t->see('Anagrafica eliminata!', '.alert-success');
+ $t->see('Fattura eliminata!', '.alert-success');
}
/**
@@ -74,6 +74,8 @@ class FattureCest
$this->addFattura($t, true, 2, 2);
$this->rowHelper->testImporti($t);
+
+ //$t->click('Stampa');
}
/**
@@ -83,7 +85,11 @@ class FattureCest
*/
public function testFatturaDiAcquisto(AcceptanceTester $t)
{
- $this->addFattura($t, false, 1, 3);
+ $this->addFattura($t, false, 1, 4);
+
+ // Fix pagamento vuoto
+ $t->select2('#idpagamento', 109);
+ $t->clickAndWait('Salva');
$this->rowHelper->testImporti($t);
}
diff --git a/tests/acceptance/OrdiniCest.php b/tests/acceptance/OrdiniCest.php
new file mode 100644
index 000000000..3a46725ed
--- /dev/null
+++ b/tests/acceptance/OrdiniCest.php
@@ -0,0 +1,95 @@
+rowHelper = $rowHelper;
+ }
+
+ public function _before(\AcceptanceTester $t)
+ {
+ // Effettua l'accesso con le credenziali fornite
+ $t->login('admin', 'admin');
+ }
+
+ /**
+ * Crea un nuovo ordine.
+ *
+ * @param AcceptanceTester $t
+ */
+ protected function addOrdine(AcceptanceTester $t, $entrata, $anagrafica)
+ {
+ // Seleziona il modulo da aprire
+ $t->expandSidebarLink($entrata == true ? 'Vendite' : 'Acquisti');
+ $t->navigateTo($entrata == true ? 'Ordini cliente' : 'Ordini fornitore');
+
+ // Apre la schermata di nuovo elemento
+ $t->clickAndWaitModal('.btn-primary', '#tabs');
+
+ // Completa i campi per il nuovo elemento
+ $t->select2ajax('#idanagrafica', $anagrafica);
+
+ // Effettua il submit
+ $t->clickAndWait('Aggiungi', '#add-form');
+
+ // Controlla il salvataggio finale
+ $t->see('Aggiunto ordine');
+ }
+
+ /**
+ * Crea una nuova anagrafica di tipo cliente e la elimina.
+ *
+ * @param AcceptanceTester $t
+ */
+ protected function addAndDeleteOrdine(AcceptanceTester $t, $entrata, $anagrafica = 2)
+ {
+ $this->addAnag($t, $entrata, $anagrafica);
+
+ // Seleziona l'azione di eliminazione
+ $t->clickAndWaitSwal('Elimina', '#tab_0');
+
+ // Conferma l'eliminazione
+ $t->clickSwalButton('Elimina');
+
+ // Controlla eliminazione
+ $t->see('Ordine eliminato!', '.alert-success');
+ }
+
+ /**
+ * Crea un nuovo ordine.
+ *
+ * @param AcceptanceTester $t
+ */
+ public function testOrdineCliente(AcceptanceTester $t)
+ {
+ $this->addOrdine($t, true, 2);
+
+ $this->rowHelper->testImporti($t);
+
+ //$t->click('Stampa');
+ }
+
+ /**
+ * Crea un nuovo ordine.
+ *
+ * @param AcceptanceTester $t
+ */
+ public function testOrdineFornitore(AcceptanceTester $t)
+ {
+ $this->addOrdine($t, false, 4);
+
+ // Fix pagamento vuoto
+ $t->select2('#idpagamento', 109);
+ $t->clickAndWait('Salva');
+
+ $this->rowHelper->testImporti($t);
+ }
+}
diff --git a/tests/acceptance/PreventiviCest.php b/tests/acceptance/PreventiviCest.php
new file mode 100644
index 000000000..672028b2a
--- /dev/null
+++ b/tests/acceptance/PreventiviCest.php
@@ -0,0 +1,81 @@
+rowHelper = $rowHelper;
+ }
+
+ public function _before(\AcceptanceTester $t)
+ {
+ // Effettua l'accesso con le credenziali fornite
+ $t->login('admin', 'admin');
+ }
+
+ /**
+ * Crea un nuovo preventivo.
+ *
+ * @param AcceptanceTester $t
+ */
+ protected function addPreventivo(AcceptanceTester $t, $name, $anagrafica, $tipo = 'GEN')
+ {
+ // Seleziona il modulo da aprire
+ $t->expandSidebarLink('Vendite');
+ $t->navigateTo('Preventivi');
+
+ // Apre la schermata di nuovo elemento
+ $t->clickAndWaitModal('.btn-primary', '#tabs');
+
+ // Completa i campi per il nuovo elemento
+ $t->fillField('Nome preventivo', $name);
+ $t->select2ajax('#idanagrafica', $anagrafica);
+ $t->select2ajax('#idtipointervento', $tipo);
+
+ // Effettua il submit
+ $t->clickAndWait('Aggiungi', '#add-form');
+
+ // Controlla il salvataggio finale
+ $t->see('Aggiunto preventivo');
+ }
+
+ /**
+ * Crea una nuova anagrafica di tipo cliente e la elimina.
+ *
+ * @param AcceptanceTester $t
+ */
+ protected function addAndDeletePreventivo(AcceptanceTester $t, $name, $anagrafica = 2, $tipo = 'GEN')
+ {
+ $this->addAnag($t, $name, $anagrafica, $tipo);
+
+ // Seleziona l'azione di eliminazione
+ $t->clickAndWaitSwal('Elimina', '#tab_0');
+
+ // Conferma l'eliminazione
+ $t->clickSwalButton('Elimina');
+
+ // Controlla eliminazione
+ $t->see('Preventivo eliminato!', '.alert-success');
+ }
+
+ /**
+ * Crea un nuovo preventivo.
+ *
+ * @param AcceptanceTester $t
+ */
+ public function testPreventivo(AcceptanceTester $t)
+ {
+ $this->addPreventivo($t, 'Preventivo di test', 2);
+
+ $this->rowHelper->testImporti($t);
+
+ //$t->click('Stampa');
+ }
+}
diff --git a/update/2_4_3.sql b/update/2_4_3.sql
index 8553bcf33..1aaa44e4f 100644
--- a/update/2_4_3.sql
+++ b/update/2_4_3.sql
@@ -23,4 +23,7 @@ UPDATE `zz_widgets` SET `more_link` = 'if($(\'#th_Tipo input\').val()!= \'Agente
UPDATE `zz_widgets` SET `more_link` = 'if($(\'#th_Tipo input\').val()!= \'Vettore\'){ $(\'#th_Tipo input\').val(\'Vettore\').trigger(\'keyup\');} else reset(\'Tipo\');' WHERE `zz_widgets`.`name` = 'Numero di vettori';
-UPDATE `zz_widgets` SET `more_link` = 'reset(\'Tipo\');' WHERE `zz_widgets`.`name` = 'Tutte le anagrafiche';
\ No newline at end of file
+UPDATE `zz_widgets` SET `more_link` = 'reset(\'Tipo\');' WHERE `zz_widgets`.`name` = 'Tutte le anagrafiche';
+
+-- Fix del campo codice_xml
+ALTER TABLE `co_documenti` CHANGE `codice_xml` `progressivo_invio` VARCHAR(255);