1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-09-28 04:07:10 +02:00

Merge branch 'v5-develop' into v5-stable

This commit is contained in:
David Bomba 2021-07-03 14:46:16 +10:00
commit 1e8744e5dc
19 changed files with 119 additions and 35 deletions

View File

@ -426,8 +426,6 @@ class CheckData extends Command
Client::cursor()->where('is_deleted', 0)->where('clients.updated_at', '>', now()->subDays(2))->each(function ($client) {
$client->invoices->where('is_deleted', false)->whereIn('status_id', '!=', Invoice::STATUS_DRAFT)->each(function ($invoice) use ($client) {
// $total_amount = $invoice->payments()->whereIn('status_id', [Payment::STATUS_COMPLETED, Payment:: STATUS_PENDING, Payment::STATUS_PARTIALLY_REFUNDED])->get()->sum('pivot.amount');
// $total_refund = $invoice->payments()->get()->whereIn('status_id', [Payment::STATUS_COMPLETED, Payment:: STATUS_PENDING, Payment::STATUS_PARTIALLY_REFUNDED])->sum('pivot.refunded');
$total_paid = $invoice->payments()
->where('is_deleted', false)->whereIn('status_id', [Payment::STATUS_COMPLETED, Payment:: STATUS_PENDING, Payment::STATUS_PARTIALLY_REFUNDED, Payment::STATUS_REFUNDED])
@ -455,6 +453,38 @@ class CheckData extends Command
$this->logMessage("{$this->wrong_balances} clients with incorrect invoice balances");
}
// $clients = DB::table('clients')
// ->leftJoin('invoices', function($join){
// $join->on('invoices.client_id', '=', 'clients.id')
// ->where('invoices.is_deleted',0)
// ->where('invoices.status_id', '>', 1);
// })
// ->leftJoin('credits', function($join){
// $join->on('credits.client_id', '=', 'clients.id')
// ->where('credits.is_deleted',0)
// ->where('credits.status_id', '>', 1);
// })
// ->leftJoin('payments', function($join) {
// $join->on('payments.client_id', '=', 'clients.id')
// ->where('payments.is_deleted', 0)
// ->whereIn('payments.status_id', [Payment::STATUS_COMPLETED, Payment:: STATUS_PENDING, Payment::STATUS_PARTIALLY_REFUNDED, Payment::STATUS_REFUNDED]);
// })
// ->where('clients.is_deleted',0)
// //->where('clients.updated_at', '>', now()->subDays(2))
// ->groupBy('clients.id')
// ->havingRaw('sum(coalesce(invoices.amount - invoices.balance - credits.amount)) != sum(coalesce(payments.amount - payments.refunded, 0))')
// ->get(['clients.id', DB::raw('sum(coalesce(invoices.amount - invoices.balance - credits.amount)) as invoice_amount'), DB::raw('sum(coalesce(payments.amount - payments.refunded, 0)) as payment_amount')]);
private function checkClientBalances()
{
$this->wrong_balances = 0;

View File

@ -119,7 +119,7 @@ class QuoteController extends Controller
if ($process) {
foreach ($quotes as $quote) {
$quote->service()->approve(auth()->user())->save();
$quote->service()->approve(auth('contact')->user())->save();
event(new QuoteWasApproved(auth('contact')->user(), $quote, $quote->company, Ninja::eventVars()));
if (request()->has('signature') && !is_null(request()->signature) && !empty(request()->signature)) {

View File

@ -48,6 +48,10 @@ class RecurringInvoicesCron
->whereNull('deleted_at')
->where('status_id', RecurringInvoice::STATUS_ACTIVE)
->where('remaining_cycles', '!=', '0')
->whereHas('client', function ($query) {
$query->where('is_deleted',0)
->where('deleted_at', NULL);
})
->with('company')
->cursor();
@ -70,6 +74,10 @@ class RecurringInvoicesCron
->whereNull('deleted_at')
->where('status_id', RecurringInvoice::STATUS_ACTIVE)
->where('remaining_cycles', '!=', '0')
->whereHas('client', function ($query) {
$query->where('is_deleted',0)
->where('deleted_at', NULL);
})
->with('company')
->cursor();

View File

@ -62,6 +62,7 @@ class SubscriptionCron
->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL])
->where('balance', '>', 0)
->whereDate('due_date', '<=', now()->addDay()->startOfDay())
->whereNull('deleted_at')
->whereNotNull('subscription_id')
->cursor();

View File

@ -62,6 +62,10 @@ class ReminderJob implements ShouldQueue
->where('is_deleted', 0)
->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL])
->where('balance', '>', 0)
->whereHas('client', function ($query) {
$query->where('is_deleted',0)
->where('deleted_at', NULL);
})
->with('invitations')->cursor()->each(function ($invoice) {
if ($invoice->isPayable()) {

View File

@ -119,7 +119,7 @@ class AuthorizeCreditCard
'data' => $this->formatGatewayResponse($data, $vars),
];
SystemLogger::dispatch($logger_message, SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_SUCCESS, SystemLog::TYPE_AUTHORIZE, $this->authorize->client);
SystemLogger::dispatch($logger_message, SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_SUCCESS, SystemLog::TYPE_AUTHORIZE, $this->authorize->client, $this->authorize->client->company);
return true;
} else {

View File

@ -52,7 +52,7 @@ class CompanyRepository extends BaseRepository
if(array_key_exists('account1', $fields))
$fields['company1'] = $fields['account1'];
if(array_key_exists('company2', $fields))
if(array_key_exists('account2', $fields))
$fields['company2'] = $fields['account2'];
if(array_key_exists('invoice1', $fields))

View File

@ -35,6 +35,9 @@ trait SubscriptionHooker
'headers' => $headers,
]);
nlog("method name must be a string");
nlog($subscription->webhook_configuration['post_purchase_rest_method']);
try {
$response = $client->{$subscription->webhook_configuration['post_purchase_rest_method']}($subscription->webhook_configuration['post_purchase_url'],[
RequestOptions::JSON => ['body' => $body], RequestOptions::ALLOW_REDIRECTS => false

View File

@ -14,8 +14,8 @@ return [
'require_https' => env('REQUIRE_HTTPS', true),
'app_url' => rtrim(env('APP_URL', ''), '/'),
'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
'app_version' => '5.2.8',
'app_tag' => '5.2.8',
'app_version' => '5.2.9',
'app_tag' => '5.2.9',
'minimum_client_version' => '5.0.16',
'terms_version' => '1.0.1',
'api_secret' => env('API_SECRET', ''),

View File

@ -56,9 +56,9 @@ class CancelInvoiceTest extends TestCase
$this->invoice->service()->handleCancellation()->save();
$this->assertEquals(0, $this->invoice->balance);
$this->assertEquals($this->client->balance, ($client_balance - $invoice_balance));
$this->assertNotEquals($client_balance, $this->client->balance);
$this->assertEquals(0, $this->invoice->fresh()->balance);
$this->assertEquals($this->client->fresh()->balance, ($client_balance - $invoice_balance));
$this->assertNotEquals($client_balance, $this->client->fresh()->balance);
$this->assertEquals(Invoice::STATUS_CANCELLED, $this->invoice->status_id);
}
}

View File

@ -75,6 +75,8 @@ class ImportCompanyTest extends TestCase
{
parent::setUp();
$this->artisan('db:seed');
$this->withoutMiddleware(
ThrottleRequests::class
);
@ -85,6 +87,10 @@ class ImportCompanyTest extends TestCase
$account->delete();
});
CompanyGateway::all()->each(function ($cg){
$cg->forceDelete();
});
$this->account = Account::factory()->create();
$this->company = Company::factory()->create(['account_id' => $this->account->id]);
@ -137,6 +143,10 @@ class ImportCompanyTest extends TestCase
public function testImportUsers()
{
CompanyGateway::all()->each(function ($cg){
$cg->forceDelete();
});
$this->assertTrue(property_exists($this->backup_json_object, 'app_version'));
/***************************** Users *****************************/

View File

@ -48,6 +48,8 @@ class ImportCsvTest extends TestCase
$this->makeTestData();
$this->markTestSkipped('Skipping CSV Import to improve test speed');
$this->withoutExceptionHandling();
}

View File

@ -137,9 +137,9 @@ class ReverseInvoiceTest extends TestCase
$this->invoice = $this->invoice->service()->markPaid()->save();
$this->assertEquals($this->client->balance, ($this->invoice->balance * -1));
$this->assertEquals($this->client->paid_to_date, ($client_paid_to_date + $invoice_balance));
$this->assertEquals(0, $this->invoice->balance);
$this->assertEquals($this->client->fresh()->balance, ($this->invoice->balance * -1));
$this->assertEquals($this->client->fresh()->paid_to_date, ($client_paid_to_date + $invoice_balance));
$this->assertEquals(0, $this->invoice->fresh()->balance);
$this->assertEquals(Invoice::STATUS_PAID, $this->invoice->status_id);
$this->invoice = $this->invoice->service()->handleReversal()->save();
@ -163,7 +163,7 @@ class ReverseInvoiceTest extends TestCase
$this->assertEquals(Invoice::STATUS_REVERSED, $this->invoice->status_id);
$this->assertEquals(0, $this->invoice->balance);
$this->assertEquals($this->client->paid_to_date, ($client_paid_to_date));
$this->assertEquals($this->client->balance, ($client_balance - $invoice_balance));
$this->assertEquals($this->client->fresh()->paid_to_date, ($client_paid_to_date));
$this->assertEquals($this->client->fresh()->balance, ($client_balance - $invoice_balance));
}
}

View File

@ -40,7 +40,9 @@ class HtmlGenerationTest extends TestCase
public function testHtmlOutput()
{
$html = $this->generateHtml($this->invoice);
$this->client->fresh();
$html = $this->generateHtml($this->invoice->fresh());
$this->assertNotNull($html);
}

View File

@ -333,6 +333,8 @@ trait MockAccountData
$this->invoice->setRelation('company', $this->company);
$this->invoice->save();
$this->invoice->load("client");
InvoiceInvitation::factory()->create([
'user_id' => $this->invoice->user_id,
@ -348,7 +350,8 @@ trait MockAccountData
'invoice_id' => $this->invoice->id,
]);
$this->invoice->service()->markSent();
$this->invoice->fresh()->service()->markSent();
// $this->invoice->service()->markSent();
$this->quote = Quote::factory()->create([
'user_id' => $user_id,
@ -589,6 +592,10 @@ trait MockAccountData
$cg->config = encrypt(config('ninja.testvars.stripe'));
$cg->save();
}
$this->client = $this->client->fresh();
$this->invoice = $this->invoice->fresh();
}
/**

View File

@ -33,6 +33,7 @@ class AutoBillInvoiceTest extends TestCase
public function testAutoBillFunctionality()
{
$this->assertEquals($this->client->balance, 10);
$this->assertEquals($this->client->paid_to_date, 0);
$this->assertEquals($this->client->credit_balance, 10);
@ -42,9 +43,9 @@ class AutoBillInvoiceTest extends TestCase
$this->assertNotNull($this->invoice->payments());
$this->assertEquals(10, $this->invoice->payments()->sum('payments.amount'));
$this->assertEquals($this->client->balance, 0);
$this->assertEquals($this->client->paid_to_date, 10);
$this->assertEquals($this->client->credit_balance, 0);
$this->assertEquals($this->client->fresh()->balance, 0);
$this->assertEquals($this->client->fresh()->paid_to_date, 10);
$this->assertEquals($this->client->fresh()->credit_balance, 0);
}

View File

@ -14,6 +14,7 @@ use App\Models\Account;
use App\Models\Client;
use App\Models\Company;
use App\Models\Credit;
use App\Models\CreditInvitation;
use App\Models\User;
use Tests\MockUnitData;
use Tests\TestCase;
@ -28,7 +29,11 @@ class CreditBalanceTest extends TestCase
public function setUp() :void
{
parent::setUp();
Credit::all()->each(function ($credit){
$credit->forceDelete();
});
$this->makeTestData();
}

View File

@ -17,6 +17,7 @@ use App\Models\Client;
use App\Models\Company;
use App\Models\Credit;
use App\Models\Invoice;
use App\Models\Quote;
use App\Models\RecurringInvoice;
use App\Models\Timezone;
use App\Utils\Traits\GeneratesCounter;
@ -171,24 +172,32 @@ class GeneratesCounterTest extends TestCase
public function testInvoiceNumberValue()
{
$invoice_number = $this->getNextInvoiceNumber($this->client, $this->invoice);
$invoice_number = $this->getNextInvoiceNumber($this->client->fresh(), $this->invoice->fresh());
$this->assertEquals($invoice_number, '0007');
$invoice_number = $this->getNextInvoiceNumber($this->client->fresh(), $this->invoice->fresh());
$this->assertEquals($invoice_number, '0008');
$invoice_number = $this->getNextInvoiceNumber($this->client, $this->invoice);
$this->assertEquals($invoice_number, '0009');
}
public function testQuoteNumberValue()
{
$quote_number = $this->getNextQuoteNumber($this->client);
$quote_number = $this->getNextQuoteNumber($this->client->fresh());
$this->assertEquals($quote_number, 0002);
$quote_number = $this->getNextQuoteNumber($this->client);
// nlog(Quote::all()->pluck('number'));
$this->assertEquals($quote_number, '0003');
// $quote_number = $this->getNextQuoteNumber($this->client->fresh());
// nlog($this->company->settings->quote_number_counter);
// nlog(Quote::all()->pluck('number'));
// $this->assertEquals($quote_number, '0003');
}
public function testInvoiceNumberPattern()
@ -327,13 +336,13 @@ class GeneratesCounterTest extends TestCase
$cliz->settings = ClientSettings::defaults();
$cliz->save();
$invoice_number = $this->getNextInvoiceNumber($cliz, $this->invoice);
$invoice_number = $this->getNextInvoiceNumber($cliz->fresh(), $this->invoice);
$this->assertEquals($invoice_number, '0007');
$invoice_number = $this->getNextInvoiceNumber($cliz->fresh(), $this->invoice);
$this->assertEquals($invoice_number, '0008');
$invoice_number = $this->getNextInvoiceNumber($cliz, $this->invoice);
$this->assertEquals($invoice_number, '0009');
}
public function testClientNumber()

View File

@ -43,6 +43,8 @@ class InvitationTest extends TestCase
return $invitation->contact->is_primary == false;
})->toArray();
$this->assertEquals(1, count($invites));
$this->invoice->invitations = $invites;
$this->invoice->line_items = [];
@ -63,7 +65,7 @@ class InvitationTest extends TestCase
$arr = $response->json();
$this->assertEquals(1, count($arr['data']['invitations']));
$this->assertEquals(2, count($arr['data']['invitations']));
//test pushing a contact invitation back on