public function store(CreateInvoiceAPIRequest $request)
{
$data = Input::all();
$error = null;
if (isset($data['email'])) {
$email = $data['email'];
$client = Client::scope()->whereHas('contacts', function ($query) use($email) {
$query->where('email', '=', $email);
})->first();
if (!$client) {
$validator = Validator::make(['email' => $email], ['email' => 'email']);
if ($validator->fails()) {
$messages = $validator->messages();
return $messages->first();
}
$clientData = ['contact' => ['email' => $email]];
foreach (['name', 'address1', 'address2', 'city', 'state', 'postal_code', 'country_id', 'private_notes', 'currency_code'] as $field) {
if (isset($data[$field])) {
$clientData[$field] = $data[$field];
}
}
foreach (['first_name', 'last_name', 'phone'] as $field) {
if (isset($data[$field])) {
$clientData['contact'][$field] = $data[$field];
}
}
$client = $this->clientRepo->save($clientData);
}
} else {
if (isset($data['client_id'])) {
$client = Client::scope($data['client_id'])->firstOrFail();
}
}
$data = self::prepareData($data, $client);
$data['client_id'] = $client->id;
$invoice = $this->invoiceService->save($data);
$payment = false;
if ($invoice->isInvoice()) {
if (isset($data['auto_bill']) && boolval($data['auto_bill'])) {
$payment = $this->paymentService->autoBillInvoice($invoice);
} else {
if (isset($data['paid']) && $data['paid']) {
$payment = $this->paymentRepo->save(['invoice_id' => $invoice->id, 'client_id' => $client->id, 'amount' => $data['paid']]);
}
}
}
if (isset($data['email_invoice']) && $data['email_invoice']) {
if ($payment) {
$this->mailer->sendPaymentConfirmation($payment);
} elseif (!$invoice->is_recurring) {
$this->mailer->sendInvoice($invoice);
}
}
$invoice = Invoice::scope($invoice->public_id)->with('client', 'invoice_items', 'invitations')->first();
if (isset($data['download_invoice']) && boolval($data['download_invoice'])) {
return $this->fileReponse($invoice->getFileName(), $invoice->getPDFString());
}
return $this->itemResponse($invoice);
}