diff --git a/commerce_invoice.api.php b/commerce_invoice.api.php new file mode 100644 index 0000000..11daf8e --- /dev/null +++ b/commerce_invoice.api.php @@ -0,0 +1,27 @@ +id() . '-invoice'; +} + +/** + * @} End of "addtogroup hooks". + */ diff --git a/commerce_invoice.install b/commerce_invoice.install index 34949dc..9221c45 100644 --- a/commerce_invoice.install +++ b/commerce_invoice.install @@ -5,6 +5,7 @@ * Contains install and update functions for Commerce Invoice. */ +use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\StreamWrapper\PrivateStream; /** @@ -34,3 +35,18 @@ function commerce_invoice_update_8200() { $field_definition->setTranslatable(FALSE); $definition_update_manager->updateFieldStorageDefinition($field_definition); } + +/** + * Add a new reference field to invoice entity for the generated invoice file. + */ +function commerce_invoice_update_8201() { + $definition_manager = \Drupal::entityDefinitionUpdateManager(); + // Create a new field definition. + $new_file_field = BaseFieldDefinition::create('entity_reference') + ->setLabel(t('Invoice PDF')) + ->setSetting('target_type', 'file') + ->setDescription(t('The generated pdf file of the invoice.')) + ->setDisplayConfigurable('view', TRUE); + // Install the new definition. + $definition_manager->installFieldStorageDefinition('invoice_file', 'commerce_invoice', 'commerce_invoice', $new_file_field); +} diff --git a/src/Entity/Invoice.php b/src/Entity/Invoice.php index 374b9e4..71da021 100644 --- a/src/Entity/Invoice.php +++ b/src/Entity/Invoice.php @@ -781,6 +781,12 @@ class Invoice extends CommerceContentEntityBase implements InvoiceInterface { ]) ->setDisplayConfigurable('view', TRUE); + $fields['invoice_file'] = BaseFieldDefinition::create('entity_reference') + ->setLabel(t('Invoice PDF')) + ->setDescription(t('The generated pdf file of the invoice.')) + ->setSetting('target_type', 'file') + ->setDisplayConfigurable('view', TRUE); + return $fields; } diff --git a/src/InvoicePrintBuilder.php b/src/InvoicePrintBuilder.php index 74c9710..aa55939 100644 --- a/src/InvoicePrintBuilder.php +++ b/src/InvoicePrintBuilder.php @@ -76,23 +76,19 @@ class InvoicePrintBuilder implements InvoicePrintBuilderInterface { * {@inheritdoc} */ public function savePrintable(InvoiceInterface $invoice, PrintEngineInterface $print_engine, $scheme = 'private') { - $filename = $this->generateFilename($invoice); $langcode = $invoice->language()->getId(); - $files = $this->fileStorage->loadByProperties([ - 'uri' => "$scheme://$filename", - 'langcode' => $langcode, - ]); - - if ($files) { - return $this->fileStorage->load(key($files)); + // If an invoice file already exists, return existing object. + if (!$invoice->invoice_file->isEmpty()) { + //return $invoice->invoice_file->entity; } + // Create a file based in the current invoice. $config = $this->configFactory->get('entity_print.settings'); + $filename = $this->generateFilename($invoice); $uri = $this->printBuilder->savePrintable([$invoice], $print_engine, $scheme, $filename, $config->get('default_css')); - if (!$uri) { return FALSE; } - + // Create a permanent file object. $file = $this->fileStorage->create([ 'uri' => $uri, 'uid' => $this->currentUser->id(), @@ -100,6 +96,9 @@ class InvoicePrintBuilder implements InvoicePrintBuilderInterface { 'status' => FILE_STATUS_PERMANENT, ]); $file->save(); + // Update the reference in the invoice. + $invoice->invoice_file = $file; + $invoice->save(); return $file; } @@ -113,9 +112,10 @@ class InvoicePrintBuilder implements InvoicePrintBuilderInterface { * The generated filename. */ protected function generateFilename(InvoiceInterface $invoice) { - $file_name = $this->filenameGenerator->generateFilename([$invoice]); - $file_name .= '-' . $invoice->language()->getId() . '-' . str_replace('_', '', $invoice->getState()->getId()) . '.pdf'; - return $file_name; + $base_file_name = $this->filenameGenerator->generateFilename([$invoice]); + $file_name = $base_file_name . '-' . $invoice->language()->getId() . '-' . str_replace('_', '', $invoice->getState()->getId()) . '.pdf'; + \Drupal::moduleHandler()->invokeAll('commerce_invoice_filename_alter', [&$file_name, $invoice]); + return $file_name . '.pdf'; } }