From 5dff0a37efa29ce4b0c01971318cf54821d8c411 Mon Sep 17 00:00:00 2001 From: Paul Mehrer Date: Tue, 11 Feb 2025 16:42:45 +0100 Subject: [PATCH] tweak(Sales) Document prepare for copy fixes, added more test assertions --- .../tine20/Sales/Document/ControllerTest.php | 60 +++++++++++++++++-- tine20/Sales/Model/Document/Abstract.php | 19 ++++++ 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/tests/tine20/Sales/Document/ControllerTest.php b/tests/tine20/Sales/Document/ControllerTest.php index d6a7d5373bb..feb6bd358fa 100644 --- a/tests/tine20/Sales/Document/ControllerTest.php +++ b/tests/tine20/Sales/Document/ControllerTest.php @@ -217,11 +217,23 @@ public function testCopyInvoice(): void $customer = $this->_createCustomer(); $product1 = $this->_createProduct(); + /** @var Sales_Model_Address $recipientId */ + $recipientId = $customer->{Sales_Model_Customer::FLD_DEBITORS}->getFirstRecord()->{Sales_Model_Debitor::FLD_BILLING}->getFirstRecord(); + $invoiceRecipientId = clone $recipientId; + $invoiceRecipientId->{Sales_Model_Address::FLD_PREFIX3} = 'unittest prefix3'; + + $path = Tinebase_FileSystem::getInstance()->getPathOfNode( + Filemanager_Controller_Node::getInstance()->createNodes('/shared/test', Tinebase_Model_Tree_FileObject::TYPE_FOLDER)->getFirstRecord(), true); + file_put_contents('tine20://' . $path . '/test.txt', 'unittest'); + $order = Sales_Controller_Document_Order::getInstance()->create(new Sales_Model_Document_Order([ Sales_Model_Document_Order::FLD_CUSTOMER_ID => $customer, Sales_Model_Document_Order::FLD_ORDER_STATUS => Sales_Model_Document_Order::STATUS_ACCEPTED, - Sales_Model_Document_Order::FLD_RECIPIENT_ID => $customer->{Sales_Model_Customer::FLD_DEBITORS}->getFirstRecord()->{Sales_Model_Debitor::FLD_BILLING}->getFirstRecord(), - Sales_Model_Document_Order::FLD_INVOICE_RECIPIENT_ID => $customer->{Sales_Model_Customer::FLD_DEBITORS}->getFirstRecord()->{Sales_Model_Debitor::FLD_BILLING}->getFirstRecord(), + Sales_Model_Document_Order::FLD_RECIPIENT_ID => $recipientId, + Sales_Model_Document_Order::FLD_INVOICE_RECIPIENT_ID => $invoiceRecipientId, + Sales_Model_Document_Order::FLD_ATTACHMENTS => new Tinebase_Record_RecordSet(Tinebase_Model_Tree_Node::class, [ + Tinebase_FileSystem::getInstance()->stat($path . '/test.txt'), + ]), Sales_Model_Document_Order::FLD_POSITIONS => [ new Sales_Model_DocumentPosition_Order([ Sales_Model_DocumentPosition_Order::FLD_TITLE => 'pos 1', @@ -237,10 +249,17 @@ public function testCopyInvoice(): void ], true) ], ])); + $this->assertSame($recipientId->getId(), $order->{Sales_Model_Document_Order::FLD_RECIPIENT_ID}->{Sales_Model_Document_Order::FLD_ORIGINAL_ID}); + $this->assertSame($recipientId->getId(), $order->{Sales_Model_Document_Order::FLD_INVOICE_RECIPIENT_ID}->{Sales_Model_Document_Order::FLD_ORIGINAL_ID}); + $this->assertNotSame($order->{Sales_Model_Document_Order::FLD_RECIPIENT_ID}->getId(), $order->{Sales_Model_Document_Order::FLD_INVOICE_RECIPIENT_ID}->getId()); + $this->assertNotSame($recipientId->getId(), $order->{Sales_Model_Document_Order::FLD_INVOICE_RECIPIENT_ID}->getId()); + $this->assertNotSame('unittest prefix3', $order->{Sales_Model_Document_Order::FLD_RECIPIENT_ID}->{Sales_Model_Address::FLD_PREFIX3}); + $this->assertSame('unittest prefix3', $order->{Sales_Model_Document_Order::FLD_INVOICE_RECIPIENT_ID}->{Sales_Model_Address::FLD_PREFIX3}); $this->assertSame(Sales_Config::DOCUMENT_FOLLOWUP_STATUS_NONE, $order->{Sales_Model_Document_Order::FLD_FOLLOWUP_INVOICE_BOOKED_STATUS}); $this->assertSame(Sales_Config::DOCUMENT_FOLLOWUP_STATUS_NONE, $order->{Sales_Model_Document_Order::FLD_FOLLOWUP_INVOICE_CREATED_STATUS}); + $this->assertSame(1, $order->attachments->count()); $this->assertNull($order->{Sales_Model_Document_Order::FLD_POSITIONS}->getFirstRecord()->{Sales_Model_DocumentPosition_Order::FLD_NOTES}); - Tinebase_Record_Expander::expandRecord($order, true); + Tinebase_Record_Expander::expandRecord($order, fullExpansion: true); $this->assertSame(1, $order->{Sales_Model_Document_Order::FLD_POSITIONS}->getFirstRecord()->{Sales_Model_DocumentPosition_Order::FLD_NOTES}->count()); $invoice = Sales_Controller_Document_Abstract::executeTransition(new Sales_Model_Document_Transition([ @@ -254,29 +273,58 @@ public function testCopyInvoice(): void ]), ] ])); + $this->assertSame($recipientId->getId(), $invoice->{Sales_Model_Document_Order::FLD_RECIPIENT_ID}->{Sales_Model_Document_Order::FLD_ORIGINAL_ID}); + $this->assertNotSame($invoice->{Sales_Model_Document_Invoice::FLD_RECIPIENT_ID}->getId(), $order->{Sales_Model_Document_Order::FLD_INVOICE_RECIPIENT_ID}->getId()); + $this->assertSame('unittest prefix3', $invoice->{Sales_Model_Document_Invoice::FLD_RECIPIENT_ID}->{Sales_Model_Address::FLD_PREFIX3}); + $this->assertSame(0, $invoice->attachments->count()); $this->assertNull($invoice->{Sales_Model_Document_Invoice::FLD_POSITIONS}->getFirstRecord()->{Sales_Model_DocumentPosition_Invoice::FLD_NOTES}); Tinebase_Record_Expander::expandRecord($invoice, true); $this->assertSame(0, $invoice->{Sales_Model_Document_Invoice::FLD_POSITIONS}->getFirstRecord()->{Sales_Model_DocumentPosition_Invoice::FLD_NOTES}->count()); + $invoice->attachments->addRecord(Tinebase_FileSystem::getInstance()->stat($path . '/test.txt')); $invoice->{Sales_Model_Document_Invoice::FLD_POSITIONS}->getFirstRecord()->{Sales_Model_DocumentPosition_Invoice::FLD_NOTES}->addRecord(new Tinebase_Model_Note([ Tinebase_Model_Note::FLD_NOTE_TYPE_ID => Tinebase_Model_Note::SYSTEM_NOTE_NAME_NOTE, Tinebase_Model_Note::FLD_NOTE => 'invoice' ], true)); $invoice = Sales_Controller_Document_Invoice::getInstance()->update($invoice); + $ublAttachmentId = $invoice->attachments->getFirstRecord()->getId(); + $invoice->{Sales_Model_Document_Invoice::FLD_ATTACHED_DOCUMENTS}->addRecord(new Sales_Model_Document_AttachedDocument([ + Sales_Model_Document_AttachedDocument::FLD_TYPE => Sales_Model_Document_AttachedDocument::TYPE_UBL, + Sales_Model_Document_AttachedDocument::FLD_NODE_ID => $ublAttachmentId, + Sales_Model_Document_AttachedDocument::FLD_CREATED_FOR_SEQ => $invoice->seq, + ], true)); + $invoice->attachments->addRecord(Tinebase_FileSystem::getInstance()->stat($path . '/test.txt')); + $invoice->attachments->getLastRecord()->name = 'test1.text'; + $invoice = Sales_Controller_Document_Invoice::getInstance()->update($invoice); + $otherAttachmentId = array_values(array_diff($invoice->attachments->getArrayOfIds(), [$ublAttachmentId]))[0]; + $invoice->{Sales_Model_Document_Invoice::FLD_ATTACHED_DOCUMENTS}->addRecord(new Sales_Model_Document_AttachedDocument([ + Sales_Model_Document_AttachedDocument::FLD_TYPE => Sales_Model_Document_AttachedDocument::TYPE_SUPPORTING_DOCUMENT, + Sales_Model_Document_AttachedDocument::FLD_NODE_ID => $otherAttachmentId, + Sales_Model_Document_AttachedDocument::FLD_CREATED_FOR_SEQ => $invoice->seq, + ], true)); + $invoice = Sales_Controller_Document_Invoice::getInstance()->update($invoice); $this->assertNull($invoice->{Sales_Model_Document_Invoice::FLD_POSITIONS}->getFirstRecord()->{Sales_Model_DocumentPosition_Invoice::FLD_NOTES}); - Tinebase_Record_Expander::expandRecord($invoice, true); + Tinebase_Record_Expander::expandRecord($invoice, fullExpansion: true); $this->assertSame(1, $invoice->{Sales_Model_Document_Invoice::FLD_POSITIONS}->getFirstRecord()->{Sales_Model_DocumentPosition_Invoice::FLD_NOTES}->count()); - $copy = Sales_Controller_Document_Invoice::getInstance()->copy($invoice->getId(), true); + $copy = Sales_Controller_Document_Invoice::getInstance()->copy($invoice->getId(), persist: true); $this->assertNotSame($invoice->getId(), $copy->getId()); $this->assertSame($invoice->{Sales_Model_Document_Invoice::FLD_POSITIONS}->count(), $copy->{Sales_Model_Document_Invoice::FLD_POSITIONS}->count()); $this->assertNotSame($invoice->{Sales_Model_Document_Invoice::FLD_POSITIONS}->getFirstRecord()->getId(), $copy->{Sales_Model_Document_Invoice::FLD_POSITIONS}->getFirstRecord()->getId()); $this->assertNull($copy->{Sales_Model_Document_Invoice::FLD_PRECURSOR_DOCUMENTS}); + $this->assertSame($recipientId->getId(), $copy->{Sales_Model_Document_Order::FLD_RECIPIENT_ID}->{Sales_Model_Document_Order::FLD_ORIGINAL_ID}); + $this->assertNotSame($invoice->{Sales_Model_Document_Invoice::FLD_RECIPIENT_ID}->getId(), $copy->{Sales_Model_Document_Order::FLD_RECIPIENT_ID}->getId()); + $this->assertSame('unittest prefix3', $copy->{Sales_Model_Document_Invoice::FLD_RECIPIENT_ID}->{Sales_Model_Address::FLD_PREFIX3}); + + $this->assertSame(1, $copy->attachments->count()); + $this->assertFalse($invoice->attachments->getById($copy->attachments->getFirstRecord()->getId())); + $this->assertSame(1, $copy->{Sales_Model_Document_Invoice::FLD_ATTACHED_DOCUMENTS}->count()); + $this->assertNull($copy->{Sales_Model_Document_Invoice::FLD_POSITIONS}->getFirstRecord()->{Sales_Model_DocumentPosition_Invoice::FLD_NOTES}); - Tinebase_Record_Expander::expandRecord($copy, true); + Tinebase_Record_Expander::expandRecord($copy, fullExpansion: true); $this->assertSame(1, $copy->{Sales_Model_Document_Invoice::FLD_POSITIONS}->getFirstRecord()->{Sales_Model_DocumentPosition_Invoice::FLD_NOTES}->count()); $this->assertNotSame($invoice->{Sales_Model_Document_Invoice::FLD_POSITIONS}->getFirstRecord()->{Sales_Model_DocumentPosition_Invoice::FLD_NOTES}->getFirstRecord()->getId(), $copy->{Sales_Model_Document_Invoice::FLD_POSITIONS}->getFirstRecord()->{Sales_Model_DocumentPosition_Invoice::FLD_NOTES}->getFirstRecord()->getId()); } diff --git a/tine20/Sales/Model/Document/Abstract.php b/tine20/Sales/Model/Document/Abstract.php index 97badca8763..f8db64f6852 100644 --- a/tine20/Sales/Model/Document/Abstract.php +++ b/tine20/Sales/Model/Document/Abstract.php @@ -130,6 +130,7 @@ abstract class Sales_Model_Document_Abstract extends Tinebase_Record_NewAbstract self::HAS_CUSTOM_FIELDS => true, self::HAS_NOTES => false, self::HAS_RELATIONS => true, + self::COPY_RELATIONS => false, self::HAS_TAGS => true, self::HAS_SYSTEM_CUSTOM_FIELDS => true, @@ -1113,4 +1114,22 @@ public function createPositionFromProduct(Sales_Model_Product $product, string $ $this->{self::FLD_POSITIONS}->addRecord($position); return $position; } + + public function prepareForCopy(): void + { + /** @var Sales_Model_Document_AttachedDocument $attachedDoc */ + foreach ($this->{self::FLD_ATTACHED_DOCUMENTS} as $attachedDoc) { + switch ($attachedDoc->{Sales_Model_Document_AttachedDocument::FLD_TYPE}) { + case Sales_Model_Document_AttachedDocument::TYPE_PAPERSLIP: + case Sales_Model_Document_AttachedDocument::TYPE_UBL: + $this->{self::FLD_ATTACHED_DOCUMENTS}->removeById($attachedDoc->getId()); + if ($this->{self::FLD_ATTACHMENTS} instanceof Tinebase_Record_RecordSet) { + $this->{self::FLD_ATTACHMENTS}->removeById($attachedDoc->{Sales_Model_Document_AttachedDocument::FLD_NODE_ID}); + } + break; + } + } + + parent::prepareForCopy(); + } }