public function save($data, $checkSubPermissions = false) { if (isset($data['client'])) { $can_save_client = !$checkSubPermissions; if (!$can_save_client) { if (empty($data['client']['public_id']) || $data['client']['public_id'] == '-1') { $can_save_client = Client::canCreate(); } else { $can_save_client = Client::wherePublicId($data['client']['public_id'])->first()->canEdit(); } } if ($can_save_client) { $client = $this->clientRepo->save($data['client']); $data['client_id'] = $client->id; } } $invoice = $this->invoiceRepo->save($data, $checkSubPermissions); $client = $invoice->client; $client->load('contacts'); $sendInvoiceIds = []; foreach ($client->contacts as $contact) { if ($contact->send_invoice || count($client->contacts) == 1) { $sendInvoiceIds[] = $contact->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; }