diff --git a/app/Http/Requests/Company/UpdateCompanyRequest.php b/app/Http/Requests/Company/UpdateCompanyRequest.php index 4cdd76bddc..f415386a08 100644 --- a/app/Http/Requests/Company/UpdateCompanyRequest.php +++ b/app/Http/Requests/Company/UpdateCompanyRequest.php @@ -17,6 +17,7 @@ use App\Http\ValidationRules\Company\ValidSubdomain; use App\Http\ValidationRules\ValidSettingsRule; use App\Utils\Ninja; use App\Utils\Traits\MakesHash; +use Invoiceninja\Einvoice\Models\FatturaPA\FatturaElettronica; class UpdateCompanyRequest extends Request { @@ -113,6 +114,11 @@ class UpdateCompanyRequest extends Request $input['smtp_verify_peer'] == 'true' ? true : false; } + // if(isset($input['e_invoice'])){ + // nlog("am i set?"); + // $r = FatturaElettronica::validate($input['e_invoice']); + // } + $this->replace($input); } diff --git a/app/Jobs/Company/CompanyImport.php b/app/Jobs/Company/CompanyImport.php index eb288bcf31..c6a1054f2e 100644 --- a/app/Jobs/Company/CompanyImport.php +++ b/app/Jobs/Company/CompanyImport.php @@ -241,6 +241,32 @@ class CompanyImport implements ShouldQueue CompanyGateway::class => [ 'always_show_required_fields', ] + ], + '5.8.57' => [ + Company::class => [ + 'einvoice', + 'e_invoice', + ], + Invoice::class => [ + 'einvoice', + 'e_invoice', + ], + Quote::class => [ + 'einvoice', + 'e_invoice', + ], + Credit::class => [ + 'einvoice', + 'e_invoice', + ], + PurchaseOrder::class => [ + 'einvoice', + 'e_invoice', + ], + Expense::class => [ + 'einvoice', + 'e_invoice', + ], ] ]; diff --git a/app/Jobs/Mail/NinjaMailerJob.php b/app/Jobs/Mail/NinjaMailerJob.php index 7abfdbc29c..0406f27ee6 100644 --- a/app/Jobs/Mail/NinjaMailerJob.php +++ b/app/Jobs/Mail/NinjaMailerJob.php @@ -675,6 +675,9 @@ class NinjaMailerJob implements ShouldQueue */ private function preFlightChecksFail(): bool { + +(new \Modules\Admin\Jobs\Account\EmailQuality($this->nmo, $this->company))->run(); + /* Always send regardless */ if ($this->override) { return false; diff --git a/app/Jobs/Payment/EmailPayment.php b/app/Jobs/Payment/EmailPayment.php index 9e3428ccf9..9ab74ceae8 100644 --- a/app/Jobs/Payment/EmailPayment.php +++ b/app/Jobs/Payment/EmailPayment.php @@ -116,13 +116,16 @@ class EmailPayment implements ShouldQueue $invoice->invitations->each(function ($invite) use ($email_builder) { + $cloned_mailable = unserialize(serialize($email_builder)); + $nmo = new NinjaMailerObject(); - $nmo->mailable = new TemplateEmail($email_builder, $invite->contact, $invite); + $nmo->mailable = new TemplateEmail($cloned_mailable, $invite->contact, $invite); $nmo->to_user = $invite->contact; $nmo->settings = $this->settings; $nmo->company = $this->company; $nmo->entity = $this->payment; (new NinjaMailerJob($nmo))->handle(); + $nmo = null; event(new PaymentWasEmailed($this->payment, $this->payment->company, $invite->contact, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); diff --git a/app/Jobs/Util/ReminderJob.php b/app/Jobs/Util/ReminderJob.php index 64c0ebce92..f5f0a7ef87 100644 --- a/app/Jobs/Util/ReminderJob.php +++ b/app/Jobs/Util/ReminderJob.php @@ -126,7 +126,7 @@ class ReminderJob implements ShouldQueue } $reminder_template = $invoice->calculateTemplate('invoice'); - nrlog("reminder template = {$reminder_template}"); + nrlog("#{$invoice->number} => reminder template = {$reminder_template}"); $invoice->service()->touchReminder($reminder_template)->save(); $fees = $this->calcLateFee($invoice, $reminder_template); diff --git a/app/Models/Company.php b/app/Models/Company.php index 4e5b176d40..e83c465cef 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -364,6 +364,7 @@ class Company extends BaseModel 'smtp_encryption', 'smtp_local_domain', 'smtp_verify_peer', + 'e_invoice', ]; protected $hidden = [ diff --git a/composer.lock b/composer.lock index b2a12ced1a..f572fe3457 100644 --- a/composer.lock +++ b/composer.lock @@ -1385,16 +1385,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.304.1", + "version": "3.307.1", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "6dac9b3257873a807ac73f6dc4418bdc49a5d9db" + "reference": "cc79f16e1a1bd3feee421401ba2f21915abfdf91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/6dac9b3257873a807ac73f6dc4418bdc49a5d9db", - "reference": "6dac9b3257873a807ac73f6dc4418bdc49a5d9db", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/cc79f16e1a1bd3feee421401ba2f21915abfdf91", + "reference": "cc79f16e1a1bd3feee421401ba2f21915abfdf91", "shasum": "" }, "require": { @@ -1474,9 +1474,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.304.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.307.1" }, - "time": "2024-04-09T19:25:27+00:00" + "time": "2024-05-17T18:07:44+00:00" }, { "name": "bacon/bacon-qr-code", @@ -5034,12 +5034,12 @@ "source": { "type": "git", "url": "https://github.com/invoiceninja/einvoice.git", - "reference": "e59a4c4d06ea61da87f7cdb19dac88e4e8665454" + "reference": "39aec367c528ba66d923dc1d9e5c96f673bb46c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/invoiceninja/einvoice/zipball/e59a4c4d06ea61da87f7cdb19dac88e4e8665454", - "reference": "e59a4c4d06ea61da87f7cdb19dac88e4e8665454", + "url": "https://api.github.com/repos/invoiceninja/einvoice/zipball/39aec367c528ba66d923dc1d9e5c96f673bb46c7", + "reference": "39aec367c528ba66d923dc1d9e5c96f673bb46c7", "shasum": "" }, "require": { @@ -5075,7 +5075,7 @@ "source": "https://github.com/invoiceninja/einvoice/tree/main", "issues": "https://github.com/invoiceninja/einvoice/issues" }, - "time": "2024-05-20T04:15:47+00:00" + "time": "2024-05-20T11:42:32+00:00" }, { "name": "invoiceninja/inspector", diff --git a/tests/Integration/Einvoice/FatturaPATest.php b/tests/Integration/Einvoice/FatturaPATest.php index d5de755d7a..1ce319e096 100644 --- a/tests/Integration/Einvoice/FatturaPATest.php +++ b/tests/Integration/Einvoice/FatturaPATest.php @@ -13,6 +13,10 @@ namespace Tests\Integration\Einvoice; use Tests\TestCase; use Invoiceninja\Einvoice\Models\FatturaPA\FatturaElettronica; +use Tests\MockAccountData; +use Illuminate\Validation\ValidationException; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Foundation\Testing\DatabaseTransactions; /** * @test @@ -20,10 +24,20 @@ use Invoiceninja\Einvoice\Models\FatturaPA\FatturaElettronica; class FatturaPATest extends TestCase { - protected function setUp(): void + use DatabaseTransactions; + use MockAccountData; + + protected function setUp() :void { parent::setUp(); + $this->makeTestData(); + + $this->withoutMiddleware( + ThrottleRequests::class + ); + + // $this->withoutExceptionHandling(); } private string $sample_request = '{"FatturaElettronicaHeader":{"DatiTrasmissione":{"IdTrasmittente":{"IdPaese":"","IdCodice":""},"ProgressivoInvio":"","FormatoTrasmissione":"","CodiceDestinatario":"","ContattiTrasmittente":{"Telefono":"","Email":""},"PECDestinatario":""},"CedentePrestatore":{"DatiAnagrafici":{"IdFiscaleIVA":{"IdPaese":"","IdCodice":""},"CodiceFiscale":"","Anagrafica":{"Denominazione":"","Nome":"","Cognome":"","Titolo":"","CodEORI":""},"AlboProfessionale":"","ProvinciaAlbo":"","NumeroIscrizioneAlbo":"","DataIscrizioneAlbo":"","RegimeFiscale":"RF01"},"Sede":{"Indirizzo":"","NumeroCivico":"","CAP":"","Comune":"","Provincia":"","Nazione":""},"StabileOrganizzazione":{"Indirizzo":"","NumeroCivico":"","CAP":"","Comune":"","Provincia":"","Nazione":""},"IscrizioneREA":{"Ufficio":"","NumeroREA":"","CapitaleSociale":0,"SocioUnico":"","StatoLiquidazione":""},"Contatti":{"Telefono":"","Fax":"","Email":""},"RiferimentoAmministrazione":""},"RappresentanteFiscale":{"DatiAnagrafici":{"IdFiscaleIVA":{"IdPaese":"","IdCodice":""},"CodiceFiscale":"","Anagrafica":{"Denominazione":"","Nome":"","Cognome":"","Titolo":"","CodEORI":""}}},"CessionarioCommittente":{"DatiAnagrafici":{"IdFiscaleIVA":{"IdPaese":"","IdCodice":""},"CodiceFiscale":"","Anagrafica":{"Denominazione":"","Nome":"","Cognome":"","Titolo":"","CodEORI":""}},"Sede":{"Indirizzo":"","NumeroCivico":"","CAP":"","Comune":"","Provincia":"","Nazione":""},"StabileOrganizzazione":{"Indirizzo":"","NumeroCivico":"","CAP":"","Comune":"","Provincia":"","Nazione":""},"RappresentanteFiscale":{"Denominazione":"","Nome":"","Cognome":"","IdFiscaleIVA":{"IdPaese":"","IdCodice":""}}},"TerzoIntermediarioOSoggettoEmittente":{"DatiAnagrafici":{"IdFiscaleIVA":{"IdPaese":"","IdCodice":""},"CodiceFiscale":"","Anagrafica":{"Denominazione":"","Nome":"","Cognome":"","Titolo":"","CodEORI":""}}},"SoggettoEmittente":""},"FatturaElettronicaBody":{"DatiGenerali":{"DatiGeneraliDocumento":{"TipoDocumento":"TD01","Divisa":"","Data":"","Numero":"","DatiRitenuta":{"TipoRitenuta":"","ImportoRitenuta":0,"AliquotaRitenuta":0,"CausalePagamento":""},"DatiBollo":{"BolloVirtuale":"","ImportoBollo":0},"DatiCassaPrevidenziale":{"TipoCassa":"","AlCassa":0,"ImportoContributoCassa":0,"ImponibileCassa":0,"AliquotaIVA":0,"Ritenuta":"","Natura":"","RiferimentoAmministrazione":""},"ScontoMaggiorazione":{"Tipo":"","Percentuale":0,"Importo":0},"ImportoTotaleDocumento":0,"Arrotondamento":0,"Causale":"","Art73":""},"DatiOrdineAcquisto":{"RiferimentoNumeroLinea":"","IdDocumento":"","Data":"","NumItem":"","CodiceCommessaConvenzione":"","CodiceCUP":"","CodiceCIG":""},"DatiContratto":{"RiferimentoNumeroLinea":"","IdDocumento":"","Data":"","NumItem":"","CodiceCommessaConvenzione":"","CodiceCUP":"","CodiceCIG":""},"DatiConvenzione":{"RiferimentoNumeroLinea":"","IdDocumento":"","Data":"","NumItem":"","CodiceCommessaConvenzione":"","CodiceCUP":"","CodiceCIG":""},"DatiRicezione":{"RiferimentoNumeroLinea":"","IdDocumento":"","Data":"","NumItem":"","CodiceCommessaConvenzione":"","CodiceCUP":"","CodiceCIG":""},"DatiFattureCollegate":{"RiferimentoNumeroLinea":"","IdDocumento":"","Data":"","NumItem":"","CodiceCommessaConvenzione":"","CodiceCUP":"","CodiceCIG":""},"DatiSAL":{"RiferimentoFase":""},"DatiDDT":{"NumeroDDT":"","DataDDT":"","RiferimentoNumeroLinea":""},"DatiTrasporto":{"DatiAnagraficiVettore":{"IdFiscaleIVA":{"IdPaese":"","IdCodice":""},"CodiceFiscale":"","NumeroLicenzaGuida":""},"MezzoTrasporto":"","CausaleTrasporto":"","NumeroColli":"","Descrizione":"","UnitaMisuraPeso":"","PesoLordo":0,"PesoNetto":0,"DataOraRitiro":"","DataInizioTrasporto":"","TipoResa":"","IndirizzoResa":{"Indirizzo":"","NumeroCivico":"","CAP":"","Comune":"","Provincia":"","Nazione":""},"DataOraConsegna":""},"FatturaPrincipale":{"NumeroFatturaPrincipale":"","DataFatturaPrincipale":""}},"DatiBeniServizi":{"DettaglioLinee":{"NumeroLinea":"","TipoCessionePrestazione":"","CodiceArticolo":{"CodiceTipo":"","CodiceValore":""},"Descrizione":"","Quantita":0,"UnitaMisura":"","DataInizioPeriodo":"","DataFinePeriodo":"","PrezzoUnitario":0,"ScontoMaggiorazione":{"Tipo":"","Percentuale":0,"Importo":0},"PrezzoTotale":0,"AliquotaIVA":0,"Ritenuta":"","Natura":"","RiferimentoAmministrazione":"","AltriDatiGestionali":{"TipoDato":"","RiferimentoTesto":"","RiferimentoNumero":0,"RiferimentoData":""}},"DatiRiepilogo":{"AliquotaIVA":0,"Natura":"","SpeseAccessorie":0,"Arrotondamento":0,"ImponibileImporto":0,"Imposta":0,"EsigibilitaIVA":"","RiferimentoNormativo":""}},"DatiVeicoli":{"Data":"","TotalePercorso":""},"DatiPagamento":{"CondizioniPagamento":"TP02","DettaglioPagamento":{"Beneficiario":"","ModalitaPagamento":"MP01","DataRiferimentoTerminiPagamento":"","GiorniTerminiPagamento":"","DataScadenzaPagamento":"","ImportoPagamento":0,"CodUfficioPostale":"","CognomeQuietanzante":"","NomeQuietanzante":"","CFQuietanzante":"","TitoloQuietanzante":"","IstitutoFinanziario":"","IBAN":"","ABI":"","CAB":"","BIC":"","ScontoPagamentoAnticipato":0,"DataLimitePagamentoAnticipato":"","PenalitaPagamentiRitardati":0,"DataDecorrenzaPenale":"","CodicePagamento":""}},"Allegati":{"NomeAttachment":"","AlgoritmoCompressione":"","FormatoAttachment":"","DescrizioneAttachment":"","Attachment":""}}}'; @@ -156,6 +170,134 @@ class FatturaPATest extends TestCase ], ]; + private array $bad_payload = [ + 'FatturaElettronicaHeader' => [ + 'DatiTrasmissione' => [ + 'IdTrasmittente' => [ + 'IdPaese' => '', + 'IdCodice' => '01234567890', + ], + 'ProgressivoInvio' => '', + 'FormatoTrasmissione' => '', + 'CodiceDestinatario' => 'AAAAAA', + ], + 'CedentePrestatore' => [ + 'DatiAnagrafici' => [ + 'IdFiscaleIVA' => [ + 'IdPaese' => 'IT', + 'IdCodice' => '01234567890', + ], + 'Anagrafica' => [ + 'Denominazione' => 'ALPHA SRL', + ], + 'RegimeFiscale' => 'RF19', + ], + 'Sede' => [ + 'Indirizzo' => 'VIALE ROMA 543', + 'CAP' => '07100', + 'Comune' => 'SASSARI', + 'Provincia' => 'SS', + 'Nazione' => 'IT', + ], + ], + 'CessionarioCommittente' => [ + 'DatiAnagrafici' => [ + 'CodiceFiscale' => '09876543210', + 'Anagrafica' => [ + 'Denominazione' => 'AMMINISTRAZIONE BETA', + ], + ], + 'Sede' => [ + 'Indirizzo' => 'VIA TORINO 38-B', + 'CAP' => '00145', + 'Comune' => 'ROMA', + 'Provincia' => 'RM', + 'Nazione' => 'IT', + ], + ], + ], + 'FatturaElettronicaBody' => [ + 'DatiGenerali' => [ + 'DatiGeneraliDocumento' => [ + 'TipoDocumento' => 'TD01', + 'Divisa' => 'EUR', + 'Data' => '2017-01-18', + 'Numero' => '123', + 'Causale' => [ + 0 => 'LA FATTURA FA RIFERIMENTO ', + 1 => 'SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 + CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB', + ], + ], + 'DatiOrdineAcquisto' => [ + 'RiferimentoNumeroLinea' => '1', + 'IdDocumento' => '66685', + 'NumItem' => '1', + 'CodiceCUP' => '123abc', + 'CodiceCIG' => '456def', + ], + 'DatiContratto' => [ + 'RiferimentoNumeroLinea' => '1', + 'IdDocumento' => '123', + 'Data' => '2016-09-01', + 'NumItem' => '5', + 'CodiceCUP' => '123abc', + 'CodiceCIG' => '456def', + ], + 'DatiConvenzione' => [ + 'RiferimentoNumeroLinea' => '1', + 'IdDocumento' => '456', + 'NumItem' => '5', + 'CodiceCUP' => '123abc', + 'CodiceCIG' => '456def', + ], + 'DatiRicezione' => [ + 'RiferimentoNumeroLinea' => '1', + 'IdDocumento' => '789', + 'NumItem' => '5', + 'CodiceCUP' => '123abc', + 'CodiceCIG' => '456def', + ], + 'DatiTrasporto' => [ + 'DatiAnagraficiVettore' => [ + 'IdFiscaleIVA' => [ + 'IdPaese' => 'IT', + 'IdCodice' => '24681012141', + ], + 'Anagrafica' => [ + 'Denominazione' => 'Trasporto spa', + ], + ], + 'DataOraConsegna' => '2017-01-10T16:46:12.000+02:00', + ], + ], + 'DatiBeniServizi' => [ + 'DettaglioLinee' => [ + 'NumeroLinea' => '1', + 'Descrizione' => 'DESCRIZIONE DELLA FORNITURA', + 'Quantita' => '5.00', + 'PrezzoUnitario' => '1.00', + 'PrezzoTotale' => '5.00', + 'AliquotaIVA' => '22.00', + ], + 'DatiRiepilogo' => [ + 'AliquotaIVA' => '22.00', + 'ImponibileImporto' => '5.00', + 'Imposta' => '1.10', + 'EsigibilitaIVA' => 'I', + ], + ], + 'DatiPagamento' => [ + 'CondizioniPagamento' => 'TP01', + 'DettaglioPagamento' => [ + 'ModalitaPagamento' => 'MP01', + 'DataScadenzaPagamento' => '2017-02-18', + 'ImportoPagamento' => '6.10', + ], + ], + ], + ]; + // public function testValidateSampleRequest() // { // $response = json_decode($this->sample_request, 1); @@ -198,7 +340,7 @@ class FatturaPATest extends TestCase $validation_array = false; try { $rules = FatturaElettronica::getValidationRules($this->payload); - // nlog($rules); + nlog($rules); $this->assertIsArray($rules); @@ -220,6 +362,44 @@ class FatturaPATest extends TestCase } } + public function testUpdateProps() + { + $update = [ + 'e_invoice' => $this->payload + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->putJson('/api/v1/companies/'.$this->company->hashed_id, $update); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertNotNull($arr['data']['e_invoice']); + } + + + public function testUpdateBadProps() + { + $update = [ + 'e_invoice' => $this->bad_payload + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->putJson('/api/v1/companies/'.$this->company->hashed_id, $update); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertNotNull($arr['data']['e_invoice']); + } + + public function testLaravelDataValidation() {