save() public method

public save ( array $data, Invoice $invoice = null ) : Invoice | mixed
$data array
$invoice app\models\Invoice
return app\models\Invoice | mixed
 /**
  * @param array $data
  * @param Invoice|null $invoice
  * @return \App\Models\Invoice|Invoice|mixed
  */
 public function save(array $data, Invoice $invoice = null)
 {
     if (isset($data['client'])) {
         $canSaveClient = false;
         $canViewClient = false;
         $clientPublicId = array_get($data, 'client.public_id') ?: array_get($data, 'client.id');
         if (empty($clientPublicId) || $clientPublicId == '-1') {
             $canSaveClient = Auth::user()->can('create', ENTITY_CLIENT);
         } else {
             $client = Client::scope($clientPublicId)->first();
             $canSaveClient = Auth::user()->can('edit', $client);
             $canViewClient = Auth::user()->can('view', $client);
         }
         if ($canSaveClient) {
             $client = $this->clientRepo->save($data['client']);
         }
         if ($canSaveClient || $canViewClient) {
             $data['client_id'] = $client->id;
         }
     }
     $invoice = $this->invoiceRepo->save($data, $invoice);
     $client = $invoice->client;
     $client->load('contacts');
     $sendInvoiceIds = [];
     foreach ($client->contacts as $contact) {
         if ($contact->send_invoice) {
             $sendInvoiceIds[] = $contact->id;
         }
     }
     // if no contacts are selected auto-select the first to enusre there's an invitation
     if (!count($sendInvoiceIds)) {
         $sendInvoiceIds[] = $client->contacts[0]->id;
     }
     foreach ($client->contacts as $contact) {
         $invitation = Invitation::scope()->whereContactId($contact->id)->whereInvoiceId($invoice->id)->first();
         if (in_array($contact->id, $sendInvoiceIds) && !$invitation) {
             $invitation = Invitation::createNew();
             $invitation->invoice_id = $invoice->id;
             $invitation->contact_id = $contact->id;
             $invitation->invitation_key = str_random(RANDOM_KEY_LENGTH);
             $invitation->save();
         } elseif (!in_array($contact->id, $sendInvoiceIds) && $invitation) {
             $invitation->delete();
         }
     }
     return $invoice;
 }
 /**
  * @param $file
  * @return array
  * @throws Exception
  */
 public function importJSON($file)
 {
     $this->init();
     $file = file_get_contents($file);
     $json = json_decode($file, true);
     $json = $this->removeIdFields($json);
     $this->checkClientCount(count($json['clients']));
     foreach ($json['clients'] as $jsonClient) {
         if (EntityModel::validate($jsonClient, ENTITY_CLIENT) === true) {
             $client = $this->clientRepo->save($jsonClient);
             $this->addSuccess($client);
         } else {
             $this->addFailure(ENTITY_CLIENT, $jsonClient);
             continue;
         }
         foreach ($jsonClient['invoices'] as $jsonInvoice) {
             $jsonInvoice['client_id'] = $client->id;
             if (EntityModel::validate($jsonInvoice, ENTITY_INVOICE) === true) {
                 $invoice = $this->invoiceRepo->save($jsonInvoice);
                 $this->addSuccess($invoice);
             } else {
                 $this->addFailure(ENTITY_INVOICE, $jsonInvoice);
                 continue;
             }
             foreach ($jsonInvoice['payments'] as $jsonPayment) {
                 $jsonPayment['client_id'] = $jsonPayment['client'] = $client->id;
                 // TODO: change to client_id once views are updated
                 $jsonPayment['invoice_id'] = $jsonPayment['invoice'] = $invoice->id;
                 // TODO: change to invoice_id once views are updated
                 if (EntityModel::validate($jsonPayment, ENTITY_PAYMENT) === true) {
                     $payment = $this->paymentRepo->save($jsonPayment);
                     $this->addSuccess($payment);
                 } else {
                     $this->addFailure(ENTITY_PAYMENT, $jsonPayment);
                     continue;
                 }
             }
         }
     }
     return $this->results;
 }