Cleanup for QB Imports

This commit is contained in:
David Bomba 2025-02-11 15:26:00 +11:00
parent 014485820c
commit 49ca95117f
6 changed files with 1053 additions and 798 deletions

View File

@ -2,9 +2,11 @@
namespace App\Import\Providers;
use App\Models\Invoice;
use Illuminate\Support\Facades\Cache;
use App\Services\Quickbooks\QuickbooksService;
use App\Services\Quickbooks\Transformers\ClientTransformer;
use App\Services\Quickbooks\Transformers\PaymentTransformer;
class QBBackup extends BaseImport implements ImportInterface
{
@ -54,6 +56,40 @@ class QBBackup extends BaseImport implements ImportInterface
public function payment()
{
$payments = isset($this->qb_data['payments']) && is_array($this->qb_data['payments']) ? $this->qb_data['payments'] : [];
foreach ($payments as $payment) {
$payment_transformer = new PaymentTransformer($this->company);
$transformed = $payment_transformer->qbToNinja($payment);
$ninja_payment = $payment_transformer->buildPayment($payment);
$ninja_payment->service()->applyNumber()->save();
$invoice = Invoice::query()
->withTrashed()
->where('company_id', $this->company->id)
->where('sync->qb_id', $payment['invoice_id'])
->first();
if ($invoice) {
$paymentable = new \App\Models\Paymentable();
$paymentable->payment_id = $ninja_payment->id;
$paymentable->paymentable_id = $invoice->id;
$paymentable->paymentable_type = 'invoices';
$paymentable->amount = $transformed['applied'] + $ninja_payment->credits->sum('amount');
$paymentable->created_at = $ninja_payment->date; //@phpstan-ignore-line
$paymentable->save();
$invoice->service()->applyPayment($ninja_payment, $paymentable->amount);
}
}
}
public function vendor()

View File

@ -56,8 +56,6 @@ class QbInvoice implements SyncInterface
$ninja_invoice_data = $this->invoice_transformer->qbToNinja($record);
nlog($ninja_invoice_data);
$payment_ids = $ninja_invoice_data['payment_ids'] ?? [];
$client_id = $ninja_invoice_data['client_id'] ?? null;
@ -201,13 +199,35 @@ class QbInvoice implements SyncInterface
if ($invoice->id) {
$this->qbInvoiceUpdate($ninja_invoice_data, $invoice);
}
nlog($ninja_invoice_data);
//new invoice scaffold
$invoice->fill($ninja_invoice_data);
$invoice->saveQuietly();
$invoice = $invoice->calc()->getInvoice()->service()->markSent()->applyNumber()->createInvitations()->save();
foreach ($payment_ids as $payment_id) {
$payment = $this->service->sdk->FindById('Payment', $payment_id);
$payment_transformer = new PaymentTransformer($this->service->company);
$transformed = $payment_transformer->qbToNinja($payment);
$ninja_payment = $payment_transformer->buildPayment($payment);
$ninja_payment->service()->applyNumber()->save();
$paymentable = new \App\Models\Paymentable();
$paymentable->payment_id = $ninja_payment->id;
$paymentable->paymentable_id = $invoice->id;
$paymentable->paymentable_type = 'invoices';
$paymentable->amount = $transformed['applied'] + $ninja_payment->credits->sum('amount');
$paymentable->created_at = $ninja_payment->date; //@phpstan-ignore-line
$paymentable->save();
$invoice->service()->applyPayment($ninja_payment, $paymentable->amount);
}
if ($record instanceof \QuickBooksOnline\API\Data\IPPSalesReceipt) {
$invoice->service()->markPaid()->save();
}

View File

@ -0,0 +1,84 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2024. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Services\Quickbooks\Models;
use App\Models\Client;
use App\Models\Invoice;
use App\DataMapper\ClientSync;
use App\Factory\ClientFactory;
use App\Interfaces\SyncInterface;
use App\Factory\ClientContactFactory;
use App\Services\Quickbooks\QuickbooksService;
use App\Services\Quickbooks\Transformers\ClientTransformer;
use App\Services\Quickbooks\Transformers\PaymentTransformer;
class QbPayment implements SyncInterface
{
public function __construct(public QuickbooksService $service)
{
}
public function find(string $id): mixed
{
return $this->service->sdk->FindById('Payment', $id);
}
public function importToNinja(array $records): void
{
foreach ($records as $payment) {
$payment_transformer = new PaymentTransformer($this->service->company);
$transformed = $payment_transformer->qbToNinja($payment);
$ninja_payment = $payment_transformer->buildPayment($payment);
$ninja_payment->service()->applyNumber()->save();
$invoice = Invoice::query()
->withTrashed()
->where('company_id', $this->service->company->id)
->where('sync->qb_id', $payment['invoice_id'])
->first();
if ($invoice) {
$paymentable = new \App\Models\Paymentable();
$paymentable->payment_id = $ninja_payment->id;
$paymentable->paymentable_id = $invoice->id;
$paymentable->paymentable_type = 'invoices';
$paymentable->amount = $transformed['applied'] + $ninja_payment->credits->sum('amount');
$paymentable->created_at = $ninja_payment->date; //@phpstan-ignore-line
$paymentable->save();
$invoice->service()->applyPayment($ninja_payment, $paymentable->amount);
}
}
}
public function syncToNinja(array $records): void
{
$transformer = new PaymentTransformer($this->service->company);
foreach ($records as $record) {
$ninja_data = $transformer->qbToNinja($record);
}
}
public function syncToForeign(array $records): void
{
}
}

View File

@ -20,12 +20,13 @@ use App\Factory\InvoiceFactory;
use App\Factory\ProductFactory;
use App\DataMapper\QuickbooksSync;
use App\Factory\ClientContactFactory;
use App\Services\Quickbooks\Models\QbClient;
use QuickBooksOnline\API\Core\CoreConstants;
use App\Services\Quickbooks\Models\QbInvoice;
use App\Services\Quickbooks\Models\QbPayment;
use App\Services\Quickbooks\Models\QbProduct;
use QuickBooksOnline\API\DataService\DataService;
use App\Services\Quickbooks\Jobs\QuickbooksImport;
use App\Services\Quickbooks\Models\QbClient;
use App\Services\Quickbooks\Transformers\ClientTransformer;
use App\Services\Quickbooks\Transformers\InvoiceTransformer;
use App\Services\Quickbooks\Transformers\PaymentTransformer;
@ -41,6 +42,8 @@ class QuickbooksService
public QbClient $client;
public QbPayment $payment;
public QuickbooksSync $settings;
private bool $testMode = true;
@ -82,6 +85,8 @@ class QuickbooksService
$this->client = new QbClient($this);
$this->payment = new QbPayment($this);
$this->settings = $this->company->quickbooks->settings;
// $this->checkDefaultAccounts(); // disabled, because if OAuth not present, we don't have access to the accounts.

View File

@ -8,6 +8,7 @@ use ReflectionClass;
use App\Models\Client;
use App\Models\Company;
use App\Models\Invoice;
use App\Models\Payment;
use App\Models\Product;
use Tests\MockAccountData;
use Illuminate\Support\Str;
@ -27,6 +28,7 @@ use Illuminate\Routing\Middleware\ThrottleRequests;
use QuickBooksOnline\API\Facades\Invoice as QbInvoice;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use App\Services\Quickbooks\Transformers\ClientTransformer;
class QuickbooksMappingTest extends TestCase
{
use MockAccountData;
@ -77,6 +79,14 @@ class QuickbooksMappingTest extends TestCase
$this->assertGreaterThan($pre_count, $post_count);
$pre_count = Payment::where('company_id', $this->company->id)->count();
$this->assertGreaterThan(0, count($this->qb_data['payments']));
$qb->payment->importToNinja($this->qb_data['payments']);
$post_count = Payment::where('company_id', $this->company->id)->count();
$this->assertGreaterThan($pre_count, $post_count);
Client::where('company_id', $this->company->id)->cursor()->each(function ($client) {
$client->forceDelete();

File diff suppressed because it is too large Load Diff