public function delete()
 {
     // Get id of quote_request
     $input = Input::all();
     $id = $input['delete'];
     $quote_request = QuoteRequest::find($id);
     // Delete Quote PDF if it exists
     $path = 'quotes/' . $id . '.pdf';
     if (file_exists($path)) {
         unlink($path);
     }
     // Delete Artwork image and its thumbnail if they exist
     if ($quote_request->artwork_image != null) {
         $path_image = 'uploads/artworks/' . $quote_request->artwork_image;
         $path_thumbnail = 'uploads/thumbnails/' . $quote_request->artwork_image;
         if (file_exists($path_image)) {
             unlink($path_image);
         }
         if (file_exists($path_thumbnail)) {
             unlink($path_thumbnail);
         }
     }
     $quote_request_items = $quote_request->qris;
     foreach ($quote_request_items as $quote_request_item) {
         $quote_line_delete = QuoteRequestItem::find($quote_request_item->id);
         $quote_line_delete->delete();
     }
     $quotes = $quote_request->quotes;
     foreach ($quotes as $quote) {
         $quote_lines = $quote->qris;
         foreach ($quote_lines as $quote_line) {
             $quote_line_delete = QuoteItem::find($quote_line->id);
             $quote_line_delete->delete();
         }
         $quote_delete = Quote::find($quote->id);
         $quote_delete->delete();
     }
     $quote_request->delete();
     if (isset($input['customer_id'])) {
         return redirect('customers/' . $input['customer_id'] . '/history')->with('message', 'Quote / Job has been deleted successfully');
     } else {
         return redirect('/')->with('message', 'Quote / Job has been deleted successfully');
     }
 }
 public function show_sticker($id)
 {
     $delivery_history = DeliveryHistory::find($id);
     $input = unserialize($delivery_history->input);
     $quote = QuoteRequest::find($delivery_history->qr_id);
     $delivery_address = CustomerAddress::find($input['delivery_address']);
     // Create PDF
     $qtys = isset($input['number']) ? $input['number'] : '';
     $html = view('jobs.sticker', compact('input', 'quote', 'delivery_address', 'qtys'));
     $dompdf = PDF::loadHTML($html)->setPaper(array(0, 0, 422.37, 283.49));
     return $dompdf->stream();
 }
 public function post_freight($id)
 {
     $input = Input::all();
     $quoute_request = QuoteRequest::find($id);
     $freight_lines = $quoute_request->freight_charges;
     $freight_lines_to_delete = array();
     foreach ($freight_lines as $freight_line) {
         array_push($freight_lines_to_delete, $freight_line->id);
     }
     $freight_charge = [];
     foreach ($quoute_request->qris as $line) {
         array_push($freight_charge, 0);
     }
     // If Freight data was entered
     if (isset($input['freight'])) {
         foreach ($input['freight'] as $index => $line) {
             if (isset($line['freight_id'])) {
                 $freight = Freight::find($line['freight_id']);
                 // Delete this item from array for deleting
                 foreach ($freight_lines_to_delete as $key => $item) {
                     if ($item == $freight->id) {
                         unset($freight_lines_to_delete[$key]);
                     }
                 }
             } else {
                 $freight = new Freight();
             }
             $freight->quote_request_id = $quoute_request->id;
             $freight->type = $line['type'];
             if (isset($line['freight_id_chosen'])) {
                 $freight->include_in_quote = true;
             } else {
                 $freight->include_in_quote = false;
             }
             $freight->save();
             // Save freight items fields
             foreach ($line['qri_id'] as $key => $column) {
                 if (isset($line['id'])) {
                     $freight_item = FreightItem::find($line['id'][$key]);
                 } else {
                     $freight_item = new FreightItem();
                 }
                 $freight_item->freight_id = $freight->id;
                 $freight_item->qri_id = $line['qri_id'][$key];
                 $freight_item->supplier_id = $line['supplier_id'][$key];
                 $freight_item->cbm = isset($line['cbm']) ? $line['cbm'][$key] : null;
                 $freight_item->cbm_rate = isset($line['cbm_rate']) ? $line['cbm_rate'][$key] : null;
                 $freight_item->number_items = isset($line['number_items']) ? $line['number_items'][$key] : null;
                 $freight_item->fixed_cost = isset($line['fixed_cost']) ? $line['fixed_cost'][$key] : null;
                 $freight_item->total_cost = $line['total_cost'][$key];
                 $freight_item->markup = $line['markup'][$key];
                 $freight_item->total = $line['total'][$key];
                 $freight_item->save();
                 if (isset($line['freight_id_chosen'])) {
                     $freight_charge[$key] += $freight_item->total;
                 }
             }
             // Erase ticked files
             if (isset($line['erase_files'])) {
                 $file_names_array = is_null($freight->files) ? [] : unserialize($freight->files);
                 foreach ($line['erase_files'] as $erase_file_index) {
                     $path = 'uploads/attachments/' . $file_names_array[$erase_file_index];
                     if (file_exists($path)) {
                         unlink($path);
                     }
                     unset($file_names_array[$erase_file_index]);
                 }
                 $freight->files = serialize($file_names_array);
                 $freight->save();
             }
             // Storing freight files
             if (Input::hasFile('files-' . $index)) {
                 $files = Input::file('files-' . $index);
                 $file_names_array = is_null($freight->files) ? [] : unserialize($freight->files);
                 foreach ($files as $file) {
                     if ($file->isValid()) {
                         $filename = $file->getClientOriginalName();
                         $destination_path = 'uploads/attachments';
                         $file->move($destination_path, $filename);
                         if (!in_array($filename, $file_names_array)) {
                             array_push($file_names_array, $filename);
                         }
                     }
                 }
                 $freight->files = serialize($file_names_array);
                 $freight->save();
             }
         }
     }
     // Save freight charges
     foreach ($quoute_request->qris as $key => $line) {
         $line->freight_charge = $freight_charge[$key];
         $line->save();
     }
     // Delete needed items
     foreach ($freight_lines_to_delete as $line) {
         $freight = Freight::find($line);
         $file_names_array = is_null($freight->files) ? [] : unserialize($freight->files);
         foreach ($file_names_array as $file) {
             $path = 'uploads/attachments/' . $file;
             if (file_exists($path)) {
                 unlink($path);
             }
         }
         // Delete related freight_items
         $freight_items = $freight->freight_items;
         foreach ($freight_items as $freight_item) {
             $freight_item->delete();
         }
     }
     Freight::destroy($freight_lines_to_delete);
     return redirect('freight/' . $id)->with('message', 'Freight charges have been saved successfully');
 }
    public function send_invoice($id)
    {
        // Get data for sending invoice
        $quote_request = QuoteRequest::find($id);
        define('BASE_PATH', $_SERVER['DOCUMENT_ROOT']);
        define("XRO_APP_TYPE", "Private");
        define("OAUTH_CALLBACK", 'http://printflow.local:8000/');
        /* For Demo-Company
                define ( "OAUTH_CALLBACK", 'http://printflow.local:8000/' );
                $useragent = "Demo-Printflow";
        
                $signatures = array (
                    'consumer_key'     => 'PMNK76GMVNQLNK945E385MVIDCCMVQ',
                    'shared_secret'    => 'VUQPJDKRZ1ZUPRSBBHUZ3J8DOQTQEL',
                    // API versions
                    'core_version' => '2.0',
                    'payroll_version' => '1.0'
                );
                */
        $useragent = env('USER_AGENT');
        $signatures = array('consumer_key' => env('XERO_KEY'), 'shared_secret' => env('XERO_SECRET'), 'core_version' => '2.0', 'payroll_version' => '1.0');
        if (XRO_APP_TYPE == "Private" || XRO_APP_TYPE == "Partner") {
            $signatures['rsa_private_key'] = BASE_PATH . '/certs/privatekey.pem';
            $signatures['rsa_public_key'] = BASE_PATH . '/certs/publickey.cer';
        }
        $XeroOAuth = new \XeroOAuth(array_merge(array('application_type' => XRO_APP_TYPE, 'oauth_callback' => OAUTH_CALLBACK, 'user_agent' => $useragent), $signatures));
        $initialCheck = $XeroOAuth->diagnostics();
        $checkErrors = count($initialCheck);
        if ($checkErrors > 0) {
            // you could handle any config errors here, or keep on truckin if you like to live dangerously
            foreach ($initialCheck as $check) {
                echo 'Error: ' . $check . PHP_EOL;
            }
        } else {
            $session = $this->persistSession(array('oauth_token' => $XeroOAuth->config['consumer_key'], 'oauth_token_secret' => $XeroOAuth->config['shared_secret'], 'oauth_session_handle' => ''));
            $oauthSession = $this->retrieveSession();
            if (isset($oauthSession['oauth_token'])) {
                $XeroOAuth->config['access_token'] = $oauthSession['oauth_token'];
                $XeroOAuth->config['access_token_secret'] = $oauthSession['oauth_token_secret'];
                if (isset($_REQUEST)) {
                    if (!isset($_REQUEST['where'])) {
                        $_REQUEST['where'] = "";
                    }
                }
                if (isset($_REQUEST['wipe'])) {
                    session_destroy();
                    header("Location: {$here}");
                    // already got some credentials stored?
                } elseif (isset($_REQUEST['refresh'])) {
                    $response = $XeroOAuth->refreshToken($oauthSession['oauth_token'], $oauthSession['oauth_session_handle']);
                    if ($XeroOAuth->response['code'] == 200) {
                        $session = $this->persistSession($response);
                        $oauthSession = $this->retrieveSession();
                    } else {
                        $this->outputError($XeroOAuth);
                        if ($XeroOAuth->response['helper'] == "TokenExpired") {
                            $XeroOAuth->refreshToken($oauthSession['oauth_token'], $oauthSession['session_handle']);
                        }
                    }
                } elseif (isset($oauthSession['oauth_token']) && isset($_REQUEST)) {
                    $XeroOAuth->config['access_token'] = $oauthSession['oauth_token'];
                    $XeroOAuth->config['access_token_secret'] = $oauthSession['oauth_token_secret'];
                    $XeroOAuth->config['session_handle'] = $oauthSession['oauth_session_handle'];
                    $xml = '<Invoices>
							  <Invoice>
								<Type>ACCREC</Type>
								<Contact>
								  <Name>' . htmlspecialchars($quote_request->customer->customer_name) . '</Name>
								</Contact>
								<Status>DRAFT</Status>
								<Date>' . Carbon::now()->format('Y-m-d') . '</Date>
								<DueDate>' . Carbon::now()->addWeeks(2)->format('Y-m-d') . '</DueDate>
								<Reference>' . htmlspecialchars($quote_request->ref) . '-' . $id . '</Reference>
								<LineAmountTypes>Exclusive</LineAmountTypes>
								<LineItems>
								  <LineItem>
									<JobNo>' . $id . '</JobNo>
									<Title>' . htmlspecialchars($quote_request->title) . '</Title>
									<Description>' . htmlspecialchars($quote_request->title) . '</Description>
									<UnitAmount>' . $quote_request->job->job_item->price / $quote_request->job->job_item->quantity . '</UnitAmount>
									<GST>' . $quote_request->job->job_item->gst . '</GST>
									<AccountCode>230/</AccountCode>
									<TotalIncGST>' . $quote_request->job->job_item->total . '</TotalIncGST>
									<Quantity>' . $quote_request->job->job_item->quantity . '</Quantity>
									<PONumber>' . $id . '</PONumber>
								  </LineItem>';
                    if (!empty($quote_request->summary)) {
                        $xml .= '<LineItem>
									<Description>' . htmlspecialchars($quote_request->summary) . '</Description>
								  </LineItem>';
                    }
                    $xml .= '</LineItems>
							  </Invoice>
							</Invoices>';
                    $response = $XeroOAuth->request('POST', $XeroOAuth->url('Invoices', 'core'), array(), $xml);
                    if ($XeroOAuth->response['code'] == 200) {
                        // Set status = 'completed' job
                        $quote_request->status = 9;
                        $quote_request->save();
                        return 'OK';
                    } else {
                        $this->outputError($XeroOAuth);
                        return 'ERROR';
                    }
                }
            }
        }
        return 'ERROR';
    }