Ensure status toggles to cancelled once completed cancelled using R1 cancellations
This commit is contained in:
parent
259f82e251
commit
87e413f558
|
|
@ -728,8 +728,6 @@ class InvoiceService
|
||||||
throw new \Exception('Modified invoice not found');
|
throw new \Exception('Modified invoice not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
nlog("invoice amount: " . $this->invoice->amount);
|
|
||||||
nlog("modified invoice amount: " . $modified_invoice->amount);
|
|
||||||
if(\App\Utils\BcMath::lessThan(abs($this->invoice->amount), $modified_invoice->amount)) {
|
if(\App\Utils\BcMath::lessThan(abs($this->invoice->amount), $modified_invoice->amount)) {
|
||||||
$document_type = 'R1'; // <- If The adjustment amount is less than the original invoice amount, we are doing a partial rectification
|
$document_type = 'R1'; // <- If The adjustment amount is less than the original invoice amount, we are doing a partial rectification
|
||||||
}
|
}
|
||||||
|
|
@ -755,7 +753,8 @@ class InvoiceService
|
||||||
->get()
|
->get()
|
||||||
->sum('backup.adjustable_amount');
|
->sum('backup.adjustable_amount');
|
||||||
|
|
||||||
if(\App\Utils\BcMath::equal(($modified_invoice->amount + $child_invoice_amounts), 0)) {
|
//@modified->amount may not have the correct totals due to IRPF.
|
||||||
|
if(\App\Utils\BcMath::greaterThan(abs($child_invoice_amounts), $modified_invoice->amount)) {
|
||||||
$modified_invoice->status_id = Invoice::STATUS_CANCELLED;
|
$modified_invoice->status_id = Invoice::STATUS_CANCELLED;
|
||||||
$modified_invoice->saveQuietly();
|
$modified_invoice->saveQuietly();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -94,6 +94,152 @@ class VerifactuApiTest extends TestCase
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function test_staged_full_cancellation_generates_correct_status()
|
||||||
|
{
|
||||||
|
$settings = $this->company->settings;
|
||||||
|
$settings->e_invoice_type = 'VERIFACTU';
|
||||||
|
$settings->is_locked = 'when_sent';
|
||||||
|
|
||||||
|
$this->company->settings = $settings;
|
||||||
|
$this->company->save();
|
||||||
|
|
||||||
|
$invoice = $this->buildData();
|
||||||
|
|
||||||
|
$item = new InvoiceItem();
|
||||||
|
$item->quantity = 1;
|
||||||
|
$item->product_key = 'product_1';
|
||||||
|
$item->notes = 'Product 1';
|
||||||
|
$item->cost = 100;
|
||||||
|
$item->discount = 0;
|
||||||
|
$item->tax_rate1 = 21;
|
||||||
|
$item->tax_name1 = 'IVA';
|
||||||
|
$item->tax_name2 = 'IRPF';
|
||||||
|
$item->tax_rate2 = -15;
|
||||||
|
|
||||||
|
$invoice->line_items = [$item];
|
||||||
|
$invoice->discount = 0;
|
||||||
|
$invoice->is_amount_discount = false;
|
||||||
|
|
||||||
|
$repo = new InvoiceRepository();
|
||||||
|
$invoice = $repo->save($invoice->toArray(), $invoice);
|
||||||
|
|
||||||
|
$invoice = $invoice->service()->markSent()->save();
|
||||||
|
|
||||||
|
//check the state for an original invoice
|
||||||
|
$this->assertEquals('F1', $invoice->backup->document_type);
|
||||||
|
$this->assertEquals(121, $invoice->backup->adjustable_amount);
|
||||||
|
$this->assertCount(0, $invoice->backup->child_invoice_ids);
|
||||||
|
$this->assertEquals(106, $invoice->amount);
|
||||||
|
|
||||||
|
$item = new InvoiceItem();
|
||||||
|
$item->quantity = -1;
|
||||||
|
$item->product_key = 'product_1';
|
||||||
|
$item->notes = 'Product 1';
|
||||||
|
$item->cost = 50;
|
||||||
|
$item->discount = 0;
|
||||||
|
$item->tax_rate1 = 21;
|
||||||
|
$item->tax_name1 = 'IVA';
|
||||||
|
$item->tax_name2 = 'IRPF';
|
||||||
|
$item->tax_rate2 = -15;
|
||||||
|
|
||||||
|
$data = $invoice->toArray();
|
||||||
|
$data['modified_invoice_id'] = $invoice->hashed_id;
|
||||||
|
$data['client_id'] = $this->client->hashed_id;
|
||||||
|
$data['line_items'] = [$item];
|
||||||
|
unset($data['number']);
|
||||||
|
$data['backup'] = null;
|
||||||
|
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token,
|
||||||
|
])->postJson('/api/v1/invoices', $data);
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
|
||||||
|
$invoice = $invoice->fresh();
|
||||||
|
|
||||||
|
$this->assertEquals(Invoice::STATUS_SENT, $invoice->status_id);
|
||||||
|
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token,
|
||||||
|
])->postJson('/api/v1/invoices', $data);
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
|
||||||
|
$invoice = $invoice->fresh();
|
||||||
|
|
||||||
|
$child_invoices = Invoice::withTrashed()
|
||||||
|
->whereIn('id', $this->transformKeys($invoice->backup->child_invoice_ids->toArray()))
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$child_invoice_amounts = $child_invoices->sum('backup.adjustable_amount');
|
||||||
|
|
||||||
|
$this->assertCount(2, $invoice->backup->child_invoice_ids);
|
||||||
|
$this->assertEquals(Invoice::STATUS_CANCELLED, $invoice->status_id);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function test_cancellation_generates_correct_status()
|
||||||
|
{
|
||||||
|
$settings = $this->company->settings;
|
||||||
|
$settings->e_invoice_type = 'VERIFACTU';
|
||||||
|
$settings->is_locked = 'when_sent';
|
||||||
|
|
||||||
|
$this->company->settings = $settings;
|
||||||
|
$this->company->save();
|
||||||
|
|
||||||
|
$invoice = $this->buildData();
|
||||||
|
|
||||||
|
$item = new InvoiceItem();
|
||||||
|
$item->quantity = 1;
|
||||||
|
$item->product_key = 'product_1';
|
||||||
|
$item->notes = 'Product 1';
|
||||||
|
$item->cost = 100;
|
||||||
|
$item->discount = 0;
|
||||||
|
$item->tax_rate1 = 21;
|
||||||
|
$item->tax_name1 = 'IVA';
|
||||||
|
$item->tax_name2 = 'IRPF';
|
||||||
|
$item->tax_rate2 = -15;
|
||||||
|
|
||||||
|
$invoice->line_items = [$item];
|
||||||
|
$invoice->discount = 0;
|
||||||
|
$invoice->is_amount_discount = false;
|
||||||
|
|
||||||
|
$repo = new InvoiceRepository();
|
||||||
|
$invoice = $repo->save($invoice->toArray(), $invoice);
|
||||||
|
|
||||||
|
$invoice = $invoice->service()->markSent()->save();
|
||||||
|
|
||||||
|
//check the state for an original invoice
|
||||||
|
$this->assertEquals('F1', $invoice->backup->document_type);
|
||||||
|
$this->assertEquals(121, $invoice->backup->adjustable_amount);
|
||||||
|
$this->assertCount(0, $invoice->backup->child_invoice_ids);
|
||||||
|
$this->assertEquals(106, $invoice->amount);
|
||||||
|
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'action' => 'cancel',
|
||||||
|
'ids' => [$invoice->hashed_id]
|
||||||
|
];
|
||||||
|
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token,
|
||||||
|
])->postJson('/api/v1/invoices/bulk', $data);
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
|
||||||
|
$arr = $response->json();
|
||||||
|
|
||||||
|
$invoice = $invoice->fresh();
|
||||||
|
|
||||||
|
$this->assertEquals(Invoice::STATUS_CANCELLED, $invoice->status_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public function test_backup_object_state()
|
public function test_backup_object_state()
|
||||||
{
|
{
|
||||||
$settings = $this->company->settings;
|
$settings = $this->company->settings;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue