Merge pull request #3337 from e1um/fix-transaction-contact-sync

fix: sync transaction contact_id when document contact changes
This commit is contained in:
Cüneyt Şentürk 2026-02-28 10:16:21 +00:00 committed by GitHub
commit 8359383ba9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 52 additions and 1 deletions

View File

@ -27,7 +27,10 @@ class UpdateDocument extends Job implements ShouldUpdate
event(new DocumentUpdating($this->model, $this->request)); event(new DocumentUpdating($this->model, $this->request));
\DB::transaction(function () { // Track original contact_id to sync transactions if it changes
$originalContactId = $this->model->contact_id;
\DB::transaction(function () use ($originalContactId) {
// Upload attachment // Upload attachment
if ($this->request->file('attachment')) { if ($this->request->file('attachment')) {
$this->deleteMediaModel($this->model, 'attachment', $this->request); $this->deleteMediaModel($this->model, 'attachment', $this->request);
@ -66,6 +69,13 @@ class UpdateDocument extends Job implements ShouldUpdate
$this->model->update($this->request->all()); $this->model->update($this->request->all());
// Sync transaction contact_id if document contact changed
if (isset($this->request['contact_id']) && $originalContactId != $this->request['contact_id']) {
$this->model->transactions()->update([
'contact_id' => $this->request['contact_id'],
]);
}
$this->model->updateRecurring($this->request->all()); $this->model->updateRecurring($this->request->all());
}); });

View File

@ -4,6 +4,9 @@ namespace Tests\Feature\Purchases;
use App\Exports\Purchases\Bills\Bills as Export; use App\Exports\Purchases\Bills\Bills as Export;
use App\Jobs\Document\CreateDocument; use App\Jobs\Document\CreateDocument;
use App\Jobs\Document\UpdateDocument;
use App\Models\Banking\Transaction;
use App\Models\Common\Contact;
use App\Models\Document\Document; use App\Models\Document\Document;
use Illuminate\Http\UploadedFile; use Illuminate\Http\UploadedFile;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
@ -235,6 +238,44 @@ class BillsTest extends FeatureTestCase
$this->assertFlashLevel('success'); $this->assertFlashLevel('success');
} }
public function testItShouldUpdateTransactionContactWhenBillVendorChanges()
{
// Create two different vendors
$vendorA = Contact::factory()->vendor()->enabled()->create();
$vendorB = Contact::factory()->vendor()->enabled()->create();
// Create a bill with vendor A
$request = $this->getRequest();
$request['contact_id'] = $vendorA->id;
$request['contact_name'] = $vendorA->name;
$request['contact_email'] = $vendorA->email;
$bill = $this->dispatch(new CreateDocument($request));
// Create a transaction (payment) for this bill with vendor A
$transaction = Transaction::factory()->expense()->create([
'document_id' => $bill->id,
'contact_id' => $vendorA->id,
'type' => 'expense',
]);
// Verify transaction has vendor A's contact_id
$this->assertEquals($vendorA->id, $transaction->contact_id);
// Update the bill to use vendor B
$request['contact_id'] = $vendorB->id;
$request['contact_name'] = $vendorB->name;
$request['contact_email'] = $vendorB->email;
$this->dispatch(new UpdateDocument($bill, $request));
// Refresh the transaction from database
$transaction->refresh();
// Verify transaction's contact_id was updated to vendor B
$this->assertEquals($vendorB->id, $transaction->contact_id);
}
public function getRequest($recurring = false) public function getRequest($recurring = false)
{ {
$factory = Document::factory(); $factory = Document::factory();