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);