mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Merge pull request #6262 from turbo124/v5-develop
Add company country as default if none is set
This commit is contained in:
commit
8cb1168831
2
.env.ci
2
.env.ci
@ -5,7 +5,7 @@ APP_DEBUG=true
|
|||||||
APP_URL=http://ninja.test
|
APP_URL=http://ninja.test
|
||||||
MULTI_DB_ENABLED=false
|
MULTI_DB_ENABLED=false
|
||||||
# database
|
# database
|
||||||
DB_CONNECTION=db-ninja-01
|
DB_CONNECTION=mysql
|
||||||
DB_DATABASE1=ninja
|
DB_DATABASE1=ninja
|
||||||
DB_USERNAME1=root
|
DB_USERNAME1=root
|
||||||
DB_PASSWORD1=ninja
|
DB_PASSWORD1=ninja
|
||||||
|
@ -77,7 +77,12 @@ class CreateAccount
|
|||||||
$sp794f3f->key = Str::random(32);
|
$sp794f3f->key = Str::random(32);
|
||||||
}
|
}
|
||||||
|
|
||||||
$sp794f3f->save();
|
if(Ninja::isHosted())
|
||||||
|
{
|
||||||
|
$sp794f3f->trial_started = now();
|
||||||
|
$sp794f3f->trial_plan = 'pro';
|
||||||
|
$sp794f3f->save();
|
||||||
|
}
|
||||||
|
|
||||||
$sp035a66 = CreateCompany::dispatchNow($this->request, $sp794f3f);
|
$sp035a66 = CreateCompany::dispatchNow($this->request, $sp794f3f);
|
||||||
$sp035a66->load('account');
|
$sp035a66->load('account');
|
||||||
|
@ -48,7 +48,7 @@ class PaymentUpdatedActivity implements ShouldQueue
|
|||||||
|
|
||||||
$fields = new stdClass;
|
$fields = new stdClass;
|
||||||
|
|
||||||
$user_id = array_key_exists('user_id', $event->event_vars) ? $event->event_vars['user_id'] : $event->payment->user_id;
|
$user_id = array_key_exists('user_id', $event->event_vars) ? $event->event_vars['user_id'] : $event->payment->user_id;
|
||||||
|
|
||||||
$fields->payment_id = $payment->id;
|
$fields->payment_id = $payment->id;
|
||||||
$fields->client_id = $payment->client_id;
|
$fields->client_id = $payment->client_id;
|
||||||
|
@ -62,9 +62,9 @@ class SupportMessageSent extends Mailable
|
|||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
|
|
||||||
if(Ninja::isHosted())
|
if(Ninja::isHosted())
|
||||||
$subject = "{$priority}Hosted-{$company->db} :: Customer Support - [{$plan}]";
|
$subject = "{$priority}Hosted-{$company->db} :: Customer Support - [{$plan}] ".date('M jS, g:ia');
|
||||||
else
|
else
|
||||||
$subject = "{$priority}Self Hosted :: Customer Support - [{$plan}]";
|
$subject = "{$priority}Self Hosted :: Customer Support - [{$plan}] ".date('M jS, g:ia');
|
||||||
|
|
||||||
return $this->from(config('mail.from.address'), $user->present()->name())
|
return $this->from(config('mail.from.address'), $user->present()->name())
|
||||||
->replyTo($user->email, $user->present()->name())
|
->replyTo($user->email, $user->present()->name())
|
||||||
|
@ -58,6 +58,10 @@ class ClientRepository extends BaseRepository
|
|||||||
return $client;
|
return $client;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!$client->id && auth()->user() && auth()->user()->company() && (!array_key_exists('country_id', $data) || empty($data['country_id']))){
|
||||||
|
$data['country_id'] = auth()->user()->company()->settings->country_id;
|
||||||
|
}
|
||||||
|
|
||||||
$client->fill($data);
|
$client->fill($data);
|
||||||
|
|
||||||
if (!isset($client->number) || empty($client->number)) {
|
if (!isset($client->number) || empty($client->number)) {
|
||||||
|
@ -80,6 +80,11 @@ class PaymentRepository extends BaseRepository {
|
|||||||
|
|
||||||
$client->service()->updatePaidToDate($data['amount'])->save();
|
$client->service()->updatePaidToDate($data['amount'])->save();
|
||||||
}
|
}
|
||||||
|
elseif($data['amount'] >0){
|
||||||
|
|
||||||
|
//this fixes an edge case with unapplied payments
|
||||||
|
$client->service()->updatePaidToDate($data['amount'])->save();
|
||||||
|
}
|
||||||
|
|
||||||
if (array_key_exists('credits', $data) && is_array($data['credits']) && count($data['credits']) > 0) {
|
if (array_key_exists('credits', $data) && is_array($data['credits']) && count($data['credits']) > 0) {
|
||||||
$_credit_totals = array_sum(array_column($data['credits'], 'amount'));
|
$_credit_totals = array_sum(array_column($data['credits'], 'amount'));
|
||||||
|
@ -104,6 +104,8 @@ class ApplyPayment extends AbstractService
|
|||||||
->ledger()
|
->ledger()
|
||||||
->updatePaymentBalance($amount_paid);
|
->updatePaymentBalance($amount_paid);
|
||||||
|
|
||||||
|
nlog("updating client balance by amount {$amount_paid}");
|
||||||
|
|
||||||
$this->invoice
|
$this->invoice
|
||||||
->client
|
->client
|
||||||
->service()
|
->service()
|
||||||
|
@ -33,13 +33,9 @@ class InvoiceService
|
|||||||
|
|
||||||
private $invoice;
|
private $invoice;
|
||||||
|
|
||||||
protected $client_service;
|
|
||||||
|
|
||||||
public function __construct($invoice)
|
public function __construct($invoice)
|
||||||
{
|
{
|
||||||
$this->invoice = $invoice;
|
$this->invoice = $invoice;
|
||||||
|
|
||||||
$this->client_service = new ClientService($invoice->client);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -49,7 +45,7 @@ class InvoiceService
|
|||||||
*/
|
*/
|
||||||
public function markPaid()
|
public function markPaid()
|
||||||
{
|
{
|
||||||
$this->invoice = (new MarkPaid($this->client_service, $this->invoice))->run();
|
$this->invoice = (new MarkPaid($this->invoice))->run();
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -29,14 +29,10 @@ class MarkPaid extends AbstractService
|
|||||||
{
|
{
|
||||||
use GeneratesCounter;
|
use GeneratesCounter;
|
||||||
|
|
||||||
private $client_service;
|
|
||||||
|
|
||||||
private $invoice;
|
private $invoice;
|
||||||
|
|
||||||
public function __construct(ClientService $client_service, Invoice $invoice)
|
public function __construct(Invoice $invoice)
|
||||||
{
|
{
|
||||||
$this->client_service = $client_service;
|
|
||||||
|
|
||||||
$this->invoice = $invoice;
|
$this->invoice = $invoice;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +88,9 @@ class MarkPaid extends AbstractService
|
|||||||
$payment->ledger()
|
$payment->ledger()
|
||||||
->updatePaymentBalance($payment->amount * -1);
|
->updatePaymentBalance($payment->amount * -1);
|
||||||
|
|
||||||
$this->client_service
|
$this->invoice
|
||||||
|
->client
|
||||||
|
->service()
|
||||||
->updateBalance($payment->amount * -1)
|
->updateBalance($payment->amount * -1)
|
||||||
->updatePaidToDate($payment->amount)
|
->updatePaidToDate($payment->amount)
|
||||||
->save();
|
->save();
|
||||||
|
@ -511,7 +511,7 @@ class SubscriptionService
|
|||||||
|
|
||||||
$total_payable = $pro_rata_refund_amount + $pro_rata_charge_amount + $this->subscription->price;
|
$total_payable = $pro_rata_refund_amount + $pro_rata_charge_amount + $this->subscription->price;
|
||||||
|
|
||||||
return $this->proRataInvoice($last_invoice, $target_subscription);
|
return $this->proRataInvoice($last_invoice, $target_subscription, $recurring_invoice->client_id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -614,7 +614,7 @@ nlog("handle plan change");
|
|||||||
* @param Subscription $target
|
* @param Subscription $target
|
||||||
* @return Invoice
|
* @return Invoice
|
||||||
*/
|
*/
|
||||||
private function proRataInvoice($last_invoice, $target)
|
private function proRataInvoice($last_invoice, $target, $client_id)
|
||||||
{
|
{
|
||||||
$subscription_repo = new SubscriptionRepository();
|
$subscription_repo = new SubscriptionRepository();
|
||||||
$invoice_repo = new InvoiceRepository();
|
$invoice_repo = new InvoiceRepository();
|
||||||
@ -626,7 +626,7 @@ nlog("handle plan change");
|
|||||||
$invoice->line_items = array_merge($subscription_repo->generateLineItems($target), $this->calculateProRataRefundItems($last_invoice));
|
$invoice->line_items = array_merge($subscription_repo->generateLineItems($target), $this->calculateProRataRefundItems($last_invoice));
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'client_id' => $last_invoice->client_id,
|
'client_id' => $client_id,
|
||||||
'quantity' => 1,
|
'quantity' => 1,
|
||||||
'date' => now()->format('Y-m-d'),
|
'date' => now()->format('Y-m-d'),
|
||||||
];
|
];
|
||||||
|
@ -46,7 +46,7 @@ return [
|
|||||||
'prefix' => '',
|
'prefix' => '',
|
||||||
'prefix_indexes' => true,
|
'prefix_indexes' => true,
|
||||||
'strict' => env('DB_STRICT', false),
|
'strict' => env('DB_STRICT', false),
|
||||||
'engine' => 'InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8',
|
// 'engine' => 'InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8',
|
||||||
],
|
],
|
||||||
|
|
||||||
'sqlite' => [
|
'sqlite' => [
|
||||||
|
@ -1044,7 +1044,7 @@ CREATE TABLE `migrations` (
|
|||||||
`migration` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
|
`migration` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
|
||||||
`batch` int(11) NOT NULL,
|
`batch` int(11) NOT NULL,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
DROP TABLE IF EXISTS `password_resets`;
|
DROP TABLE IF EXISTS `password_resets`;
|
||||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||||
|
137
tests/Feature/UpdatePaymentTest.php
Normal file
137
tests/Feature/UpdatePaymentTest.php
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Invoice Ninja (https://invoiceninja.com).
|
||||||
|
*
|
||||||
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @license https://opensource.org/licenses/AAL
|
||||||
|
*/
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use App\DataMapper\ClientSettings;
|
||||||
|
use App\Factory\ClientFactory;
|
||||||
|
use App\Factory\CreditFactory;
|
||||||
|
use App\Factory\InvoiceFactory;
|
||||||
|
use App\Factory\InvoiceItemFactory;
|
||||||
|
use App\Factory\PaymentFactory;
|
||||||
|
use App\Helpers\Invoice\InvoiceSum;
|
||||||
|
use App\Models\Client;
|
||||||
|
use App\Models\ClientContact;
|
||||||
|
use App\Models\Credit;
|
||||||
|
use App\Models\Invoice;
|
||||||
|
use App\Models\Payment;
|
||||||
|
use App\Utils\Traits\MakesHash;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||||
|
use Illuminate\Foundation\Testing\WithoutEvents;
|
||||||
|
use Illuminate\Routing\Middleware\ThrottleRequests;
|
||||||
|
use Illuminate\Support\Facades\Session;
|
||||||
|
use Illuminate\Validation\ValidationException;
|
||||||
|
use Tests\MockAccountData;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
* @covers App\Http\Controllers\PaymentController
|
||||||
|
*/
|
||||||
|
class UpdatePaymentTest extends TestCase
|
||||||
|
{
|
||||||
|
use MakesHash;
|
||||||
|
use DatabaseTransactions;
|
||||||
|
use MockAccountData;
|
||||||
|
use WithoutEvents;
|
||||||
|
|
||||||
|
public function setUp() :void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
Session::start();
|
||||||
|
|
||||||
|
$this->faker = \Faker\Factory::create();
|
||||||
|
|
||||||
|
$this->makeTestData();
|
||||||
|
$this->withoutExceptionHandling();
|
||||||
|
|
||||||
|
$this->withoutMiddleware(
|
||||||
|
ThrottleRequests::class
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testUpdatePaymentClientPaidToDate()
|
||||||
|
{
|
||||||
|
|
||||||
|
//Create new client
|
||||||
|
$client = Client::factory()->create([
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
'company_id' => $this->company->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
$this->assertEquals(0, $client->balance);
|
||||||
|
$this->assertEquals(0, $client->paid_to_date);
|
||||||
|
|
||||||
|
//Create Invoice
|
||||||
|
$invoice = InvoiceFactory::create($this->company->id, $this->user->id); //stub the company and user_id
|
||||||
|
$invoice->client_id = $client->id;
|
||||||
|
$invoice->line_items = $this->buildLineItems();
|
||||||
|
$invoice->uses_inclusive_taxes = false;
|
||||||
|
$invoice->save();
|
||||||
|
$invoice = (new InvoiceSum($invoice))->build()->getInvoice();
|
||||||
|
$invoice->save();
|
||||||
|
|
||||||
|
$this->assertEquals(0, $invoice->balance);
|
||||||
|
|
||||||
|
$invoice->service()->markSent()->save();
|
||||||
|
|
||||||
|
$this->assertEquals(10, $invoice->balance);
|
||||||
|
|
||||||
|
|
||||||
|
//create Unapplied payment via API
|
||||||
|
|
||||||
|
// $data = [
|
||||||
|
// 'amount' => $this->invoice->amount,
|
||||||
|
// 'client_id' => $client->hashed_id,
|
||||||
|
// 'invoices' => [
|
||||||
|
// [
|
||||||
|
// 'invoice_id' => $this->invoice->hashed_id,
|
||||||
|
// 'amount' => $this->invoice->amount,
|
||||||
|
// ],
|
||||||
|
// ],
|
||||||
|
// 'date' => '2020/12/12',
|
||||||
|
|
||||||
|
// ];
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'amount' => 10,
|
||||||
|
'client_id' => $client->hashed_id
|
||||||
|
];
|
||||||
|
|
||||||
|
$response = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token,
|
||||||
|
])->post('/api/v1/payments?include=invoices,paymentables', $data);
|
||||||
|
} catch (ValidationException $e) {
|
||||||
|
$message = json_decode($e->validator->getMessageBag(), 1);
|
||||||
|
$this->assertNotNull($message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// $arr = $response->json();
|
||||||
|
// $response->assertStatus(200);
|
||||||
|
// $payment_id = $arr['data']['id'];
|
||||||
|
// $payment = Payment::find($this->decodePrimaryKey($payment_id))->first();
|
||||||
|
// $payment->load('invoices');
|
||||||
|
|
||||||
|
// $this->assertNotNull($payment);
|
||||||
|
// $this->assertNotNull($payment->invoices());
|
||||||
|
// $this->assertEquals(1, $payment->invoices()->count());
|
||||||
|
|
||||||
|
$this->assertEquals(10, $client->fresh()->paid_to_date);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -488,7 +488,7 @@ trait MockAccountData
|
|||||||
$recurring_invoice->next_send_date = Carbon::now();
|
$recurring_invoice->next_send_date = Carbon::now();
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$recurring_invoice->number = $this->getNextInvoiceNumber($this->invoice->client, $this->invoice);
|
$recurring_invoice->number = $this->getNextRecurringInvoiceNumber($this->invoice->client, $this->invoice);
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$recurring_invoice = InvoiceToRecurringInvoiceFactory::create($this->invoice);
|
$recurring_invoice = InvoiceToRecurringInvoiceFactory::create($this->invoice);
|
||||||
@ -499,7 +499,7 @@ trait MockAccountData
|
|||||||
$recurring_invoice->next_send_date = Carbon::now();
|
$recurring_invoice->next_send_date = Carbon::now();
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$recurring_invoice->number = $this->getNextInvoiceNumber($this->invoice->client, $this->invoice);
|
$recurring_invoice->number = $this->getNextRecurringInvoiceNumber($this->invoice->client, $this->invoice);
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$recurring_invoice = InvoiceToRecurringInvoiceFactory::create($this->invoice);
|
$recurring_invoice = InvoiceToRecurringInvoiceFactory::create($this->invoice);
|
||||||
@ -510,7 +510,7 @@ trait MockAccountData
|
|||||||
$recurring_invoice->next_send_date = Carbon::now();
|
$recurring_invoice->next_send_date = Carbon::now();
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$recurring_invoice->number = $this->getNextInvoiceNumber($this->invoice->client, $this->invoice);
|
$recurring_invoice->number = $this->getNextRecurringInvoiceNumber($this->invoice->client, $this->invoice);
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$recurring_invoice = InvoiceToRecurringInvoiceFactory::create($this->invoice);
|
$recurring_invoice = InvoiceToRecurringInvoiceFactory::create($this->invoice);
|
||||||
@ -521,7 +521,7 @@ trait MockAccountData
|
|||||||
$recurring_invoice->next_send_date = Carbon::now();
|
$recurring_invoice->next_send_date = Carbon::now();
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$recurring_invoice->number = $this->getNextInvoiceNumber($this->invoice->client, $this->invoice);
|
$recurring_invoice->number = $this->getNextRecurringInvoiceNumber($this->invoice->client, $this->invoice);
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$recurring_invoice = InvoiceToRecurringInvoiceFactory::create($this->invoice);
|
$recurring_invoice = InvoiceToRecurringInvoiceFactory::create($this->invoice);
|
||||||
@ -532,7 +532,7 @@ trait MockAccountData
|
|||||||
$recurring_invoice->next_send_date = Carbon::now();
|
$recurring_invoice->next_send_date = Carbon::now();
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$recurring_invoice->number = $this->getNextInvoiceNumber($this->invoice->client, $this->invoice);
|
$recurring_invoice->number = $this->getNextRecurringInvoiceNumber($this->invoice->client, $this->invoice);
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$recurring_invoice = InvoiceToRecurringInvoiceFactory::create($this->invoice);
|
$recurring_invoice = InvoiceToRecurringInvoiceFactory::create($this->invoice);
|
||||||
@ -543,7 +543,7 @@ trait MockAccountData
|
|||||||
$recurring_invoice->next_send_date = Carbon::now()->addDays(10);
|
$recurring_invoice->next_send_date = Carbon::now()->addDays(10);
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$recurring_invoice->number = $this->getNextInvoiceNumber($this->invoice->client, $this->invoice);
|
$recurring_invoice->number = $this->getNextRecurringInvoiceNumber($this->invoice->client, $this->invoice);
|
||||||
$recurring_invoice->save();
|
$recurring_invoice->save();
|
||||||
|
|
||||||
$gs = new GroupSetting;
|
$gs = new GroupSetting;
|
||||||
|
@ -175,11 +175,11 @@ class GeneratesCounterTest extends TestCase
|
|||||||
|
|
||||||
$invoice_number = $this->getNextInvoiceNumber($this->client->fresh(), $this->invoice->fresh());
|
$invoice_number = $this->getNextInvoiceNumber($this->client->fresh(), $this->invoice->fresh());
|
||||||
|
|
||||||
$this->assertEquals($invoice_number, '0007');
|
$this->assertEquals($invoice_number, '0002');
|
||||||
|
|
||||||
$invoice_number = $this->getNextInvoiceNumber($this->client->fresh(), $this->invoice->fresh());
|
$invoice_number = $this->getNextInvoiceNumber($this->client->fresh(), $this->invoice->fresh());
|
||||||
|
|
||||||
$this->assertEquals($invoice_number, '0008');
|
$this->assertEquals($invoice_number, '0002');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testQuoteNumberValue()
|
public function testQuoteNumberValue()
|
||||||
@ -338,11 +338,11 @@ class GeneratesCounterTest extends TestCase
|
|||||||
|
|
||||||
$invoice_number = $this->getNextInvoiceNumber($cliz->fresh(), $this->invoice);
|
$invoice_number = $this->getNextInvoiceNumber($cliz->fresh(), $this->invoice);
|
||||||
|
|
||||||
$this->assertEquals($invoice_number, '0007');
|
$this->assertEquals($invoice_number, '0002');
|
||||||
|
|
||||||
$invoice_number = $this->getNextInvoiceNumber($cliz->fresh(), $this->invoice);
|
$invoice_number = $this->getNextInvoiceNumber($cliz->fresh(), $this->invoice);
|
||||||
|
|
||||||
$this->assertEquals($invoice_number, '0008');
|
$this->assertEquals($invoice_number, '0002');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testClientNumber()
|
public function testClientNumber()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user