<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\URL;
use App\User;
use App\Book_detail;
use App\Assign_contributor;
use PDF;
use Barryvdh\Snappy;
use Excel;
use Illuminate\Pagination\LengthAwarePaginator;

class ReportController extends Controller{   

    /**
    * Create a new controller instance.
    *
    * @return void
    */

    public function __construct(){
        $this->middleware('auth');
    }

    /**
    Report dashboard view
    Updated on 10 july 2018: removed extra tabs : check backup for any issue
    **/
    
    public function report_view(Request $request){  
        #redirect to home if user not a contributor
        if(\Session::get('login_type') != 1){
            return redirect()->route('dashboard');
        }
        ##session values
        #value from session from commoncontroller
        #1st tab
        if(!isset($_GET['title_order'])){
            $detailbytitle_order = "asc";
        }else{
            $detailbytitle_order = $_GET['title_order'];
        }
        if(!isset($_GET['title_item'])){
            $detailbytitle_items = "25";
        }else{
            $detailbytitle_items = $_GET['title_item'];
        }
        #4th tab #book report
        if(!isset($_GET['book_order'])){
            $bookreport_order = "asc";
        }else{
            $bookreport_order = $_GET['book_order'];
        }
        if(!isset($_GET['book_item'])){
            $bookreport_items = "25";
        }else{
            $bookreport_items = $_GET['book_item'];
        }
        #platform session value for selectbox
        if(!isset($_GET['platformsession'])){
            $platformsession = "all_platform";
        }else{
            $platformsession = $_GET['platformsession'];
        }
        ##quarter dropdown values
        #getting current date quarter
        $current = floor((date('n') - 1) / 3);
        $current_year = date('Y');
        $year = date('y');
        $quarters = array();
        $q = "";
        $mysql_qty = "";
        for ($i = 0; $i < 5; $i++){
            $q = (($current+$i)%4) + 1;
        }
        #selecting value from session
        if(\Session::get('selected_quarter') == ""){
            $selected_quarter = $q;
        }else{
            $selected_quarter = \Session::get('selected_quarter');
        }
        $mysql_qty = $selected_quarter;
        ##year
        $current_year = date('Y');
        if(\Session::get('selected_year') == ""){
            $selected_year = $current_year; //current year
        }else{
           $selected_year = \Session::get('selected_year');
        }   
        ##dates
        $first_date = date('Y-m-d', strtotime(date('Y') . '-' . (($selected_quarter * 3) - 2) . '-1'));
        $last_date = date('Y-m-t', strtotime(date('Y') . '-' . (($selected_quarter * 3)) . '-1'));
        if(\Session::get('week_from') == ""){
            $week_from = $first_date; 
        }else{
           $week_from = \Session::get('week_from');
        }  
        if(\Session::get('week_to') == ""){
            $week_to = $last_date;
        }else{
           $week_to = \Session::get('week_to');
        }  
        #publisher id
        $id = Auth::user()->id;
        #var to be passed to view
        $contributor_details_title = "";
        $contributor_details = "";
        $contributor_details_royalty = "";
        /**** 
        Collecting years, 2017 t0 present
        *****/
        $years_array  ='';
        for($i=$current_year; $i>=2016 ; $i--){   
            if($i==$selected_year){
                $years_array .= '<option value='.$i.' selected="selected" >'.$i.'</option>';
            }else{
                $years_array .= '<option value='.$i.'>'.$i.'</option>';
            }
        }
        #get contributors names and count
        try{
            $contributors = DB::table("book_details")
            ->select("book_details.id","book_details.book_title","users.name")
            #joins
            ->leftJoin('assign_contributors', function ($join) {
                $join->on('book_details.id', '=', 'assign_contributors.book_id');
            })
            ->leftJoin('users', function ($join) {
                $join->on('assign_contributors.contributor_id', '=', 'users.id');
            })
            ->where(function ($query) {
                $query->where('book_details.merged_book','!=',1)
                ->orWhereNull('book_details.merged_book');
            })
            ->where(function ($query) {
                $query->where('users.merged_contributor','!=',1)
                ->orWhereNull('users.merged_contributor');
            })
            ->where("book_details.added_by",$id)
            ->orderby('book_details.book_title',"asc")
            ->get();
        }catch(\Exception $e){
            return $e->getMessage(); 
        }
        $c_names = array();
        foreach($contributors as $items){
            $items = get_object_vars($items);
            $c_names[$items['id']][]=$items['name'];
        }
        /**
        report by title 
        **/
        #if search is made
        if (isset($_GET['simplesearch_title'])) {
            #search parameter
            $simplesearch = $_GET['simplesearch_title'];
            #if only simple search is done w/o adv search
            if((!empty($simplesearch))) {  
                try{
                    $contributors_raw = DB::raw('(select users.id,users.name, users.email, users.country, users.state, users.city ,users.merged_contributor,users.added_by,users.login_type,contributionsdata.contributions from  (select distinct assign_contributors.contributor_id, count(distinct book_details.id) as contributions from assign_contributors LEFT JOIN book_details ON book_details.id = assign_contributors.book_id where book_details.merged_book  <> 1 group by contributor_id ) as contributionsdata left join users on contributionsdata.contributor_id = users.id where login_type = 2) as contridet');
                    $contributor_details_title = DB::table('contridet')
                    ->select('contridet.id','contridet.name','contridet.merged_contributor','contridet.email','contridet.login_type','contridet.added_by','contridet.contributions','country.country','state.state','city.city')
                    ->from($contributors_raw)
                    ->leftJoin('country', function ($join) {
                        $join->on('contridet.country', '=', 'country.id');
                    })
                    ->leftJoin('state', function ($join) {
                        $join->on('contridet.state', '=', 'state.id');
                    })
                    ->leftJoin('city', function ($join) {
                        $join->on('contridet.city', '=', 'city.id');
                    })
                    ->where('added_by',$id)
                    ->where(function ($query) {
                        $query->where('contridet.merged_contributor','!=',1)
                            ->orWhereNull('contridet.merged_contributor');
                    })
                    ->where('login_type', 2)
                    ->where(function($q) use ($request) {
                    $q->orWhere('contridet.name', 'like', '%'.$_GET['simplesearch_title'].'%');
                    $q->orWhere('contridet.email', 'like', '%'.$_GET['simplesearch_title'].'%');
                    $q->orWhere('contridet.country','like','%'.$_GET['simplesearch_title'].'%');    
                    })
                    ->orderBy('name',$detailbytitle_order)
                    ->paginate($detailbytitle_items, ['*'], 'title');
                }catch(\Exception $e){
                    return $e->getMessage();
                }
                #if no records found
                if (count($contributor_details_title) == 0) { 
                    if($_GET['simplesearch_title']){
                        $searched_item1 =  $_GET['simplesearch_title'];
                    }else{
                        $searched_item1 =  '';
                    }
                    $emptysearch_title = "We can't find any item matching your search";
                    return redirect('reports#report_by_title')->with(compact('emptysearch_title', 'searched_item1'));
                }
            }
        }#End search by title condition

        #if no search is made
        else{   
            //number 1.5
            try{
                #contributors shown who are assigned to books
                $contributors_raw = DB::raw('(select users.id,users.name, users.email, users.country, users.state, users.city ,users.merged_contributor,users.added_by,users.login_type,contributionsdata.contributions from  (select distinct assign_contributors.contributor_id, count(distinct book_details.id) as contributions from assign_contributors LEFT JOIN book_details ON book_details.id = assign_contributors.book_id where book_details.merged_book  <> 1 group by contributor_id ) as contributionsdata left join users on contributionsdata.contributor_id = users.id where login_type = 2) as contridet');
                $contributor_details_title = DB::table('contridet')
                ->select('contridet.id','contridet.name','contridet.merged_contributor','contridet.email','contridet.login_type','contridet.added_by','contridet.contributions','country.country','state.state','city.city')
                ->from($contributors_raw)
                ->leftJoin('country', function ($join) {
                    $join->on('contridet.country', '=', 'country.id');
                })
                ->leftJoin('state', function ($join) {
                    $join->on('contridet.state', '=', 'state.id');
                })
                ->leftJoin('city', function ($join) {
                    $join->on('contridet.city', '=', 'city.id');
                })
                ->where(function ($query) {
                    $query->where('contridet.merged_contributor','!=',1)
                    ->orWhereNull('contridet.merged_contributor');
                })
                ->where('added_by',$id)
                ->where('login_type', 2)
                ->orderBy('name',$detailbytitle_order)
                ->paginate($detailbytitle_items, ['*'], 'title');
            }catch(\Exception $e){
               return $e->getMessage(); 
            }
        }
        /**
        report by book 
        **/
        if (isset($_GET['searched_val'])) {
            #number 3 
            try{
                $reports_bookdata = DB::table('book_details')
                ->select('book_details.id','book_details.book_title','book_details.isbn_code','book_details.isbn_code2','book_details.isbn_code3','book_details.print_price','book_details.merged_book','book_details.out_of_print','book_details.print_date',DB::Raw('GROUP_CONCAT(assign_contributors.contributor_id) as contri_count'),DB::Raw('GROUP_CONCAT(users.merged_contributor) as merged_sum'),'book_details.disabled_book')
                ->where('book_details.added_by',$id)
                ->where(function($q) use ($request) {
                    if(isset($_GET['searched_val'])) {
                        $q->orWhere('book_title', 'like', '%'.$_GET['searched_val'].'%');
                        $q->orWhere('isbn_code', 'like', '%'.$_GET['searched_val'].'%');
                        $q->orWhere('isbn_code2', 'like', '%'.$_GET['searched_val'].'%');
                        $q->orWhere('isbn_code3', 'like', '%'.$_GET['searched_val'].'%');
                    }    
                })
                ->where(function ($query) {
                    $query->where('book_details.merged_book','!=',1)
                        ->orWhereNull('book_details.merged_book');
                })
                ->leftJoin('assign_contributors', function ($join) {
                    $join->on('book_details.id', '=', 'assign_contributors.book_id');
                })
                ->leftJoin('users', function ($join) {
                    $join->on('assign_contributors.contributor_id', '=', 'users.id');
                })
                ->groupBy(DB::raw('IFNULL(assign_contributors.book_id, UUID())'))#ignoring null values
                ->orderby('book_title',$bookreport_order)
                ->paginate($bookreport_items, ['*'], 'book');
                #appending search
                $reports_bookdata->appends(['searched_val' =>$_GET['searched_val'],]);

            }catch(\Exception $e){
                return $e->getMessage(); 
            }
            if (count($reports_bookdata) == 0) { //if no records found
                 if($_GET['searched_val']){
                    $searched_item3 =  $_GET['searched_val'];
                }else{
                    $searched_item3 =  '';
                }
                $nothingfound_book = "We can't find any item matching your search";
                return redirect('reports#book_report')->with(compact('nothingfound_book', 'searched_item3','platformsession'));
            }
            #for container icons : get book container
            try{
                $book_details_containers = DB::table('book_vol_containers')
                ->select('book_main_id','contained_book_id','contained_book.book_title as contained_title','container_book.book_title as container_title','contained_book.merged_book','container_book.merged_book')
                ->where('book_vol_containers.added_by',$id)
                ->leftJoin('book_details as contained_book', function ($join) {
                    $join->on('book_vol_containers.contained_book_id', '=', 'contained_book.id');
                })
                ->leftJoin('book_details as container_book', function ($join) {
                    $join->on('book_vol_containers.book_main_id', '=', 'container_book.id');
                })
                ->where(function ($query) {
                    $query->where('contained_book.merged_book','!=',1)
                        ->orWhereNull('contained_book.merged_book');
                })
                ->where(function ($query) {
                    $query->where('container_book.merged_book','!=',1)
                        ->orWhereNull('container_book.merged_book');
                })
                ->get();
            }catch(\Exception $e){
                return $e->getMessage().' Line no' .$e->getLine();
            }
            $book_container_ids = array();
            $book_containers_titles = array();
            $book_contained_ids = array();
            $book_main_container_title = array();
            foreach($book_details_containers as $item){
                $item = get_object_vars($item);
                #main id
                $book_container_ids[]=$item['book_main_id']; 
                #contained sub ids
                $book_contained_ids[]=$item['contained_book_id']; 
                #container main book
                $book_main_container_title[$item['contained_book_id']][]=$item['container_title'];
                #containeritems titles
                $book_containers_titles[$item['book_main_id']][]=$item['contained_title'];
            }
            $book_container_ids = array_unique($book_container_ids);
        }else{
            #number 3.5
            try{
                $reports_bookdata = DB::table('book_details')
                ->select('book_details.id','book_details.book_title','book_details.isbn_code','book_details.isbn_code2','book_details.isbn_code3','book_details.print_price','book_details.merged_book','book_details.out_of_print','book_details.print_date','book_details.disabled_book',DB::Raw('GROUP_CONCAT(assign_contributors.contributor_id) as contri_count'),DB::Raw('GROUP_CONCAT(users.merged_contributor) as merged_sum'))
                ->where('book_details.added_by',$id)
                ->orderby('book_title',$bookreport_order)
                ->where(function ($query) {
                    $query->where('book_details.merged_book','!=',1)
                        ->orWhereNull('book_details.merged_book');
                })
                ->leftJoin('assign_contributors', function ($join) {
                    $join->on('book_details.id', '=', 'assign_contributors.book_id');
                })
                ->leftJoin('users', function ($join) {
                    $join->on('assign_contributors.contributor_id', '=', 'users.id');
                })
                ->groupBy(DB::raw('IFNULL(assign_contributors.book_id, UUID())'))#ignoring null values
                ->paginate($bookreport_items, ['*'], 'book');
                
            }catch(\Exception $e){
                return $e->getMessage(); 
            }

            #for container icons : get book container
            try{
                $book_details_containers = DB::table('book_vol_containers')
                ->select('book_main_id','contained_book_id','contained_book.book_title as contained_title','container_book.book_title as container_title','contained_book.merged_book','container_book.merged_book')
                ->where('book_vol_containers.added_by',$id)
                ->leftJoin('book_details as contained_book', function ($join) {
                    $join->on('book_vol_containers.contained_book_id', '=', 'contained_book.id');
                })
                ->leftJoin('book_details as container_book', function ($join) {
                    $join->on('book_vol_containers.book_main_id', '=', 'container_book.id');
                })
                ->where(function ($query) {
                    $query->where('contained_book.merged_book','!=',1)
                        ->orWhereNull('contained_book.merged_book');
                })
                ->where(function ($query) {
                    $query->where('container_book.merged_book','!=',1)
                        ->orWhereNull('container_book.merged_book');
                })
                ->get();
            }catch(\Exception $e){
                return $e->getMessage().' Line no' .$e->getLine();
            }
            $book_container_ids = array();
            $book_containers_titles = array();
            $book_contained_ids = array();
            $book_main_container_title = array();
            foreach($book_details_containers as $item){
                $item = get_object_vars($item);
                #main id
                $book_container_ids[]=$item['book_main_id']; 
                #contained sub ids
                $book_contained_ids[]=$item['contained_book_id']; 
                #container main book
                $book_main_container_title[$item['contained_book_id']][]=$item['container_title'];
                #containeritems titles
                $book_containers_titles[$item['book_main_id']][]=$item['contained_title'];
            }
            $book_container_ids = array_unique($book_container_ids);
        }/*Report by book ends*/ 

        #get the out of print ids
        try{
            $out_of_print = DB::table('out_of_print')->select('id','book_id','year','quarters')->where('added_by',$id)->get();

        }catch(\Exception $e){
            return $e->getMessage();
        }
        $out_print_arr =  array();
        foreach($out_of_print as $things){
          $out_print_arr[$things->book_id][$things->year] = $things->quarters;
        }
        #dates conversion
        $week_from = date("m/d/y", strtotime($week_from));
        $week_to = date("m/d/y", strtotime($week_to));

        #for royalty report, when no contributor is assigned then do not show the report generation link
        return view('reports' ,compact('c_names','contributor_details_title','contributor_details','selected_quarter','selected_year','years_array','week_from','week_to','reports_bookdata','platformsession','container_contri','reports_book_container','container_books','book_container_ids','book_contained_ids','book_main_container_title','book_containers_titles','disabled_books','out_print_arr'));

    } /* ends main view action */


    /**
    Using one controller action for multiple form actions
    **/


    public function report_multiple_action(Request $request){ 

        #publisher's id
        $id = Auth::user()->id;

        /**
        setting up the quarter and dates of the sessions
        **/


        if ($request->ajax()){

            $from_date = $request->date_from_val;
            $from_d_format = date("Y-m-d", strtotime($from_date));

            $to_date = $request->date_to_val;
            $to_d_format = date("Y-m-d", strtotime($to_date));

            \Session::put('week_from', $from_d_format);
            \Session::put('week_to', $to_d_format);
            \Session::put('selected_quarter', $request->selected_quarter_val);
            \Session::put('selected_year', $request->selected_year_val);

            if( (\Session::get('week_from') != "") && (\Session::get('week_to') != "") && (\Session::get('selected_quarter') != "") && (\Session::get('selected_year') != "") ){
                return response()->json(array(
                    'msg'=> 'Details successfully added',
                    'success'=>1,
                ));
            }else{
                return response()->json(array(
                    'msg'=> 'Details successfully added',
                    'success'=>0,
                ));
            }
            
        }/** ends date and quarter session set function **/

    } /* End report_multiple_action Action*/


    /**
    Book Report function : platform pdf 
    **/


    public function download_bookdata(Request $request,$id){

        #redirect to home if user not a contributor
        if(\Session::get('login_type') != 1){
            return redirect()->route('dashboard');
        }

        
        #for money
        setlocale(LC_MONETARY, 'en_US.UTF-8');

        #updated this get code on 28 feb, 26 April : removed reload
        if(\Session::get('platformsession') == ""){
            $bookreport_platform = 'all_platform';
        }else{
            $bookreport_platform = \Session::get('platformsession');
        }

        #Book id
        $bookid = $id;

        #current date
        $current = floor((date('n') - 1) / 3);

        $year = date('y');
        $quarters = array();
        $q = "";
        $mysql_qty = "";

        for ($i = 0; $i < 5; $i++){
            $q = (($current+$i)%4) + 1;
        }

        $mysql_qty = $q;

        #session
        if(\Session::get('selected_quarter') == ""){
            $selected_quarter = $q;
        }else{
            $selected_quarter = \Session::get('selected_quarter');
        }

        $mysql_qty = $selected_quarter;
            
        #current year
        $current_year= date('Y');

        if(\Session::get('selected_year') == ""){
            $selected_year = $current_year; 
        }else{
            $selected_year = \Session::get('selected_year');
        }    
        
        #dates
        $first_date = date('Y-m-d', strtotime(date('Y') . '-' . (($selected_quarter * 3) - 2) . '-1'));
        $last_date = date('Y-m-t', strtotime(date('Y') . '-' . (($selected_quarter * 3)) . '-1'));

        #session dates
        if(\Session::get('week_from') == ""){
            $week_from = $first_date; 
        }else{
            $week_from = \Session::get('week_from');
        }  

        if(\Session::get('week_to') == ""){
            $week_to = $last_date;
        }else{
            $week_to = \Session::get('week_to');
        } 

        #selected qauarter from dates
        $month1 = date('m', strtotime($week_from));
        $q1 = ceil($month1/3);

        $month2 = date('m', strtotime($week_to));
        $q2 = ceil($month2/3);

        #quarter names
        if($q1 == 1){$quarter_name1 = 'first_quarter' ;}
        if($q1 == 2){$quarter_name1 = 'second_quarter' ;}
        if($q1 == 3){$quarter_name1 = 'third_quarter' ;}
        if($q1 == 4){$quarter_name1 = 'fourth_quarter' ;}
        
        if($q2 == 1){$quarter_name2 = 'first_quarter' ;}
        if($q2 == 2){$quarter_name2 = 'second_quarter' ;}
        if($q2 == 3){$quarter_name2 = 'third_quarter' ;}
        if($q2 == 4){$quarter_name2 = 'fourth_quarter' ;}

        #logged in user
        $id = Auth::user()->id;
       
        #Book info array
        try{

            $book_details = DB::table('book_details')
            ->select('book_details.book_title','book_details.id','book_details.isbn_code','book_details.isbn_code2','book_details.isbn_code3','book_details.asin_code','book_details.comixology_code','book_details.google_gg_key','book_details.itune_code','book_details.diamond_item_code','book_details.amazon_item_code','book_details.upc','book_details.qb_classes','book_details.print_price','book_details.digital_price','book_details.book_choice','users.name','contributor_roles.contributor_role','assign_contributors.percentage','assign_contributors.id as assign_id','book_vol_containers.contained_book_id','forcontainer.book_title as contained_title','book_vol_variants.sub_book_id','variant_book.book_title as variant_title')

            #get contributors
            ->leftJoin('assign_contributors', function ($join) {
            $join->on('book_details.id', '=', 'assign_contributors.book_id');
            })
            ->leftJoin('users', function ($join) {
            $join->on('users.id', '=', 'assign_contributors.contributor_id');
            })

            #get role
            ->leftJoin('contributor_roles', function ($join) {
            $join->on('contributor_roles.id', '=', 'assign_contributors.role_id');
            })

            #get containers
            ->leftJoin('book_vol_containers', function($join){
                $join->on('book_details.id','=','book_vol_containers.book_main_id');
            })

            #get container names
            ->leftJoin('book_details as forcontainer', function($join){
                $join->on('book_vol_containers.contained_book_id','=','forcontainer.id');
            })

            #get variants
            ->leftJoin('book_vol_variants', function($join){
                $join->on('book_details.id','=','book_vol_variants.book_main_id');
            })

            #get variant names
            ->leftJoin('book_details as variant_book', function($join){
                $join->on('book_vol_variants.sub_book_id','=','variant_book.id');
            })

            #where conditions
            ->where('book_details.added_by', $id)
            ->where(function ($query) {
                $query->where('users.merged_contributor','!=',1)
                    ->orWhereNull('users.merged_contributor');
            })
            ->where(function ($query) {
                $query->where('book_details.merged_book','!=',1)
                    ->orWhereNull('book_details.merged_book');
            })
            ->where('book_details.id',$bookid)
            ->get();


        }catch(\Exception $e){
            return $e->getMessage()." Line report error ". $e->getLine(); 
        }

        #main array
        $books_array = array();
        foreach($book_details as $item){
            $item = get_object_vars($item);

            #BASIC INFO
            $books_array['book_basics'] = [
            'name'=>$item['book_title'],
            'print_price'=>money_format('%+n', floatval($item['print_price'])),
            'digital_price'=>money_format('%+n', floatval($item['digital_price'])),
            'royalty_choice'=>$item['book_choice'],
            ];

            #BOOK CODES
            $books_array['book_codes'] = [
            'ISBN CODE'=>$item['isbn_code'],
            'ISBN CODE 2'=>$item['isbn_code2'],
            'ISBN CODE 3'=>$item['isbn_code3'],
            'ASIN'=>$item['asin_code'],
            'COMIXOLOGY CODE'=>$item['comixology_code'],
            'GOOGLE GG KEY'=>$item['google_gg_key'],
            'ITUNE'=>$item['itune_code'],
            'DIAMOND CODE'=>$item['diamond_item_code'],
            'AMAZON'=>$item['amazon_item_code'],
            'UPC'=>$item['upc'],
            'QB CLASSES'=>$item['qb_classes'],
            ];

            #CONTRIBUTORS
            if($item['assign_id']){
                $books_array['contributor'][$item['assign_id']]=['name'=>$item['name'],'percentage'=>$item['percentage'] ,'role'=>$item['contributor_role']];
            }else{
                $books_array['contributor'] = '';
            }

            #CONTAINERS
            if(!empty($item['contained_book_id'])){
                $books_array['containers'][$item['contained_book_id']]=$item['contained_title'];
            }else{
                $books_array['containers']='';
            }

            #VARIANTS
            if(!empty($item['sub_book_id'])){
                $books_array['variants'][$item['sub_book_id']]=$item['variant_title'];
            }else{
                $books_array['variants']='';
            }
        }

        #amount details
        try{
            $amount_details = DB::table('book_advances')
            ->select('book_details.id','book_details.book_title','book_advances.amount','book_advances.quarter','book_advances.year','book_advances.id as adv_id')
            ->leftJoin('book_details', function($join){
                $join->on('book_advances.book_id','=','book_details.id');
            })

            ->where(function ($query) {
                $query->where('book_details.merged_book','!=',1)
                    ->orWhereNull('book_details.merged_book');
            })

            ->where(function ($query) {
                $query->where('book_details.merged_book','!=',1)
                    ->orWhereNull('book_details.merged_book');
            })
            ->where('book_details.added_by', $id)
            ->where('book_details.id',$bookid)
            ->get();

        }catch(\Exception $e){
            return $e->getMessage();
        }


        if($amount_details->isEmpty()){
            $books_array['amount']=0;
        }else{
            foreach( $amount_details as $item ){

            if(($item->year == $selected_year || (empty($item->year))) && (($item->quarter >= $q1 && $item->quarter <= $q2))){
                $books_array['amount'][$item->id][$item->adv_id] = $item->amount;
                }
                else{
                    $books_array['amount'][$item->id][$item->adv_id] = 0;
                }
            }
        }
        
        #Expense
        try{
            $get_exp = DB::table('book_details')
            ->select('book_expenses.id as exp_id','book_expenses.first_quarter','book_expenses.second_quarter','book_expenses.third_quarter','book_expenses.fourth_quarter','book_expenses.year','book_details.added_by','book_details.id')
            ->leftJoin('book_expenses', function ($join) {
                $join->on('book_details.id', '=', 'book_expenses.book_id');
            })
            ->where('book_details.added_by', $id)
            ->where('book_expenses.book_id',$bookid)
            ->get();

        }catch(\Exception $e){
            return $e->getMessage();
        }

        if($get_exp->isEmpty()){
            $books_array['Expenses'] = "";
        }

        foreach ($get_exp as $item) {


            if( ($item->year == $selected_year || (empty($item->year))) ){

                if($selected_quarter != 5){
                    
                    $books_array['Expenses'][$item->exp_id][$quarter_name1] = [
                    'YEAR'=>$item->year,
                    'exp' => money_format('%+n', floatval($item->$quarter_name1)),
                    ];
                
                }else{

                    if($q1 == $q2){

                        $books_array['Expenses'][$item->exp_id][$quarter_name1] = [
                        'YEAR'=>$item->year,
                        'exp' => money_format('%+n', floatval($item->$quarter_name1)),
                         ];

                    }else{

                        $books_array['Expenses'][$item->exp_id]['first_quarter'] = [
                        'YEAR'=>$item->year,
                        'exp'=>money_format('%+n', floatval($item->first_quarter)),
                        ];

                        $books_array['Expenses'][$item->exp_id]['second_quarter'] = [
                        'YEAR'=>$item->year,
                        'exp'=>money_format('%+n', floatval($item->second_quarter)),
                        ];

                        $books_array['Expenses'][$item->exp_id]['third_quarter'] = [
                        'YEAR'=>$item->year,
                        'exp'=>money_format('%+n', floatval($item->third_quarter)),
                        ];

                        $books_array['Expenses'][$item->exp_id]['fourth_quarter'] = [
                        'YEAR'=>$item->year,
                        'exp'=>money_format('%+n', floatval($item->fourth_quarter)),
                        ];
                    }
                }
            }
            else{

                if($selected_quarter != 5){
                    $books_array['Expenses'][$item->exp_id][$quarter_name1] = [
                    'YEAR'=>$selected_year,
                    'exp'=>'No Expenses found.',
                    ];

                }else{

                    if($q1 == $q2){
                        $books_array['Expenses'][$item->exp_id][$quarter_name1] = [
                        'YEAR'=>$selected_year,
                        'exp'=>'No Expenses found.',
                        ];
                    }else{
                        $books_array['Expenses'][$item->exp_id]['first_quarter'] = [
                        'YEAR'=>$selected_year,
                        'exp'=>'No Expenses found.',
                        ];
                        $books_array['Expenses'][$item->exp_id]['second_quarter'] = [
                        'YEAR'=>$selected_year,
                        'exp'=>'No Expenses found.',
                        ];
                        $books_array['Expenses'][$item->exp_id]['third_quarter'] = [
                        'YEAR'=>$selected_year,
                        'exp'=>'No Expenses found.',
                        ];
                        $books_array['Expenses'][$item->exp_id]['fourth_quarter'] = [
                        'YEAR'=>$selected_year,
                        'exp'=>'No Expenses found.',
                        ];
                    }
                }
            }
        }

        ###digital sales collection : if the select box is selected as per the platform or all the platforms requested

        ##Amazon Platform Sales 

        if($bookreport_platform == 'amazon' || $bookreport_platform == 'all_platform'){
            
            #collecting from table
            try{
                $books_amazon = DB::table('amazon_sales_reports')
                ->select('amazon_sales_reports.created_at','amazon_sales_reports.custom_sale_date','amazon_sales_reports.book_avail_id','amazon_sales_reports.exchange_payment_amount','book_details.added_by')
                ->leftJoin('book_details', function ($join) {
                    $join->on('book_details.id', '=', 'amazon_sales_reports.book_avail_id');
                })
                ->where('book_details.added_by', $id)
                ->where('amazon_sales_reports.book_avail_id',$bookid)

                ->where(function ($query) use ($week_from) {
                    $query->orWhere('amazon_sales_reports.custom_sale_date','>=',$week_from);
                })
                ->where(function ($query) use ($week_to){
                    $query->orWhere('amazon_sales_reports.custom_sale_date','<=',$week_to);
                })
                ->get();
            }catch(\Exception $e){
                 return $e->getMessage()." Line contri ". $e->getLine(); 
            }

            #amazon data : collecting total

            if($books_amazon->isEmpty()){
                $books_array['platforms']['Amazon']['Sale Platform']='Amazon';
                $books_array['platforms']['Amazon']['Net Revenue'][]=0;

            }else{

                foreach($books_amazon as $item){
                    $item = get_object_vars($item);
                    $books_array['platforms']['Amazon']['Sale Platform']='Amazon';
                    $books_array['platforms']['Amazon']['Net Revenue'][]=$item['exchange_payment_amount'];
                }
            }
        }

        ##Apple platform Sales
        if($bookreport_platform == 'apple' || $bookreport_platform == 'all_platform'){
            
            #collecting from table
            try{
                $books_apple = DB::table('apple_sale_reports')
                ->select('apple_sale_reports.created_at','apple_sale_reports.book_avail_id','apple_sale_reports.custom_sale_date_apple','apple_sale_reports.end_date','apple_sale_reports.exchange_payment_amount','book_details.added_by')
                ->leftJoin('book_details', function ($join) {
                    $join->on('book_details.id', '=', 'apple_sale_reports.book_avail_id');
                })
                ->where('book_details.added_by', $id)
                ->where('apple_sale_reports.book_avail_id',$bookid)
                ->where(function ($query) use ($week_from) {
                    $query->orWhere('apple_sale_reports.custom_sale_date_apple','>=',$week_from);
                })
                ->where(function ($query) use ($week_to){
                    $query->orWhere('apple_sale_reports.custom_sale_date_apple','<=',$week_to);
                })->get();

            }catch(\Exception $e){
                 return $e->getMessage()." Line contri ". $e->getLine(); 
            }

            if($books_apple->isEmpty()){

                $books_array['platforms']['Apple']['Sale Platform']='Apple';
                $books_array['platforms']['Apple']['Net Revenue'][]=0;

            }else{

                foreach($books_apple as $item){
                    $item = get_object_vars($item);
                    $books_array['platforms']['Apple']['Sale Platform']='Apple';
                    $books_array['platforms']['Apple']['Net Revenue'][]=$item['exchange_payment_amount'];
                }
            }
        }

        ##Barnes and nobles platform Sales
        if($bookreport_platform == 'barnes' || $bookreport_platform == 'all_platform'){
            
            #collecting from table
            try{
                $books_barnes = DB::table('barnes_nobles_sale_reports')
                ->select('barnes_nobles_sale_reports.created_at','barnes_nobles_sale_reports.custom_invoice_date','barnes_nobles_sale_reports.book_avail_id','barnes_nobles_sale_reports.total_cost_payment_currency','book_details.added_by')
                ->leftJoin('book_details', function ($join) {
                $join->on('book_details.id', '=', 'barnes_nobles_sale_reports.book_avail_id');
                })
                ->where('book_details.added_by', $id)
                ->where('barnes_nobles_sale_reports.book_avail_id',$bookid)

                ->where(function ($query) use ($week_from) {
                $query->orWhere('barnes_nobles_sale_reports.custom_invoice_date','>=',$week_from);
                })
                ->where(function ($query) use ($week_to){
                 $query->orWhere('barnes_nobles_sale_reports.custom_invoice_date','<=',$week_to);
                })
                ->get();
            }catch(\Exception $e){
                 return $e->getMessage()." Line contri ". $e->getLine(); 
            }

            if($books_barnes->isEmpty()){

                $books_array['platforms']['Barnes & Nobles']['Sale Platform']='Barnes & Nobles';
                $books_array['platforms']['Barnes & Nobles']['Net Revenue'][]=0;

            }else{

                foreach($books_barnes as $item){
                    $item = get_object_vars($item);
                    $books_array['platforms']['Barnes & Nobles']['Sale Platform']='Barnes & Nobles';
                    $books_array['platforms']['Barnes & Nobles']['Net Revenue'][]=$item['total_cost_payment_currency'];
                }
            }
           
        }

        ##Comixology platform Sales
        if($bookreport_platform == 'comixology' || $bookreport_platform == 'all_platform'){
            
            #collecting from table
            try{
                $books_comixology = DB::table('comixology_sale_reports')
                ->select('comixology_sale_reports.created_at','comixology_sale_reports.custom_sale_date_comix','comixology_sale_reports.book_avail_id','comixology_sale_reports.sum_publisher_share_usd','book_details.added_by')
                ->leftJoin('book_details', function ($join) {
                $join->on('book_details.id', '=', 'comixology_sale_reports.book_avail_id');
                })
                ->where('book_details.added_by', $id)
                ->where('comixology_sale_reports.book_avail_id',$bookid)
                ->where(function ($query) use ($week_from) {
                 $query->orWhere('comixology_sale_reports.custom_sale_date_comix','>=',$week_from);
                })
                ->where(function ($query) use ($week_to){
                $query->orWhere('comixology_sale_reports.custom_sale_date_comix','<=',$week_to);
                })
                ->get();
            }catch(\Exception $e){
                 return $e->getMessage()." Line contri ". $e->getLine(); 
            }


            if($books_comixology->isEmpty()){

                $books_array['platforms']['Comixology']['Sale Platform']='Comixology';
                $books_array['platforms']['Comixology']['Net Revenue'][]=0;

            }else{

                foreach($books_comixology as $item){
                    $item = get_object_vars($item);
                    $books_array['platforms']['Comixology']['Sale Platform']='Comixology';
                    $books_array['platforms']['Comixology']['Net Revenue'][]=$item['sum_publisher_share_usd'];
                }
            }
        }


        ##Comixology Subscription platform Sales
        if($bookreport_platform == 'comixology_sub' || $bookreport_platform == 'all_platform'){

            #collecting from table
            try{
                $books_comixology_sub = DB::table('comixology_subscription_sale_reports')
                ->select('comixology_subscription_sale_reports.created_at','comixology_subscription_sale_reports.custom_date_comix_subs','comixology_subscription_sale_reports.book_avail_id','comixology_subscription_sale_reports.total_revenue','book_details.added_by')
                ->leftJoin('book_details', function ($join) {
                $join->on('book_details.id', '=', 'comixology_subscription_sale_reports.book_avail_id');
                })
                ->where('book_details.added_by', $id)
                ->where('comixology_subscription_sale_reports.book_avail_id',$bookid)
                ->where(function ($query) use ($week_from) {
                 $query->orWhere('comixology_subscription_sale_reports.custom_date_comix_subs','>=',$week_from);
                })
                ->where(function ($query) use ($week_to){
                $query->orWhere('comixology_subscription_sale_reports.custom_date_comix_subs','<=',$week_to);
                })
                ->get();
            }catch(\Exception $e){
                 return $e->getMessage()." Line contri ". $e->getLine(); 
            }

            if($books_comixology_sub->isEmpty()){

                $books_array['platforms']['Comixology Subscription']['Sale Platform']='Comixology Subscription';
                $books_array['platforms']['Comixology Subscription']['Net Revenue'][]=0;

            }else{

                foreach($books_comixology_sub as $item){
                    $item = get_object_vars($item);
                    $books_array['platforms']['Comixology Subscription']['Sale Platform']='Comixology Subscription';
                    $books_array['platforms']['Comixology Subscription']['Net Revenue'][]=$item['total_revenue'];
                }
            }
        }


        ##Diamond platform Sales
        if($bookreport_platform == 'diamond' || $bookreport_platform == 'all_platform'){
            
            #collecting from table
            try{
                $books_diamond = DB::table('book_details')
                ->select('book_financials.created_at','book_financials.book_avail_id','book_financials.total_cost','book_financials.market','book_details.added_by','book_financials.week_from','book_financials.week_to')
                ->leftJoin('book_financials', function ($join) {
                    $join->on('book_financials.book_avail_id', '=', 'book_details.id');
                })
                ->where('book_details.added_by', $id)
                ->where('book_details.id',$bookid)
                ->get();                        


            }catch(\Exception $e){
                 return $e->getMessage()." Line contri ". $e->getLine(); 
            }
            
            #diamond data : collecting total
            $diamond_data = array(); 
            foreach($books_diamond as $book_diamond){
                $book_diamond = get_object_vars($book_diamond);
                if(($book_diamond['week_from'] >= $week_from && $book_diamond['week_to'] <= $week_to )||(empty($book_diamond['week_from']))){

                    #when the market is different like "NO_COST_REPLACEMENTS" the total is not provided
                    if(empty($book_diamond['total_cost'])){
                        $diamond_data[$book_diamond['market']][]=[
                        'sale_platform'=>'Diamond',
                        'market'=>$book_diamond['market'],
                        'total_cost'=>0,
                        ];
                    }else{
                         $diamond_data[$book_diamond['market']][]=[
                        'sale_platform'=>'Diamond',
                        'market'=>$book_diamond['market'],
                        'total_cost'=>$book_diamond['total_cost'],
                        ];
                    }
                }else{
                    $diamond_data[$book_diamond['market']][]=[
                        'sale_platform'=>'Diamond',
                        'market'=>'',
                        'total_cost'=>0
                    ];
                }    
            }
            
            #data dispaly in pdf  : summing up the total
            
            if(!empty($diamond_data)){
                foreach($diamond_data as $key=>$diamond_detail){
                    $sum = 0; 
                    foreach($diamond_detail as $diamnd_data){
                        $sum += $diamnd_data['total_cost'];
                        $diamond_array[$key][] =[
                            'sale_platform'=>'Diamond',
                            'market'=>$diamnd_data['market'],
                            'total_cost'=>money_format('%+n', floatval($sum))
                        ];
                    }
                }
            }else{
                #if no total found, make total sales empty
                $diamond_array['N/A'][] = [ 'sale_platform'=>'','market'=>'','total_cost'=>''];
            }
        }else{ 
            #if not this platform selected make array empty
            $diamond_array = array();
        }

        ##Google platform Sales */
        if($bookreport_platform == 'google' || $bookreport_platform == 'all_platform'){
            
            #collecting from table
            try{
                $books_google = DB::table('google_sale_reports')
                ->select('google_sale_reports.created_at','google_sale_reports.custom_sale_date_google','google_sale_reports.book_avail_id','google_sale_reports.earnings_amount','book_details.added_by')
                ->leftJoin('book_details', function ($join) {
                $join->on('book_details.id', '=', 'google_sale_reports.book_avail_id');
                })
                ->where('book_details.added_by', $id)
                ->where('google_sale_reports.book_avail_id',$bookid)

                ->where(function ($query) use ($week_from) {
                $query->orWhere('google_sale_reports.custom_sale_date_google','>=',$week_from);
                })
                ->where(function ($query) use ($week_to){
                $query->orWhere('google_sale_reports.custom_sale_date_google','<=',$week_to);
                })
                ->get();
            }catch(\Exception $e){
                 return $e->getMessage()." Line contri ". $e->getLine(); 
            }


            if($books_google->isEmpty()){

                $books_array['platforms']['Google']['Sale Platform']='Google';
                $books_array['platforms']['Google']['Net Revenue'][]=0;

            }else{

                foreach($books_google as $item){
                    $item = get_object_vars($item);
                    $books_array['platforms']['Google']['Sale Platform']='Google';
                    $books_array['platforms']['Google']['Net Revenue'][]=$item['earnings_amount'];
                }
            }
        }

        ##Oni press platform Sales
        if($bookreport_platform == 'oni_press' || $bookreport_platform == 'all_platform'){
            
            #collecting from table
            try{
                $books_onipress = DB::table('oni_press_shopify_sales')
                ->select('oni_press_shopify_sales.created_at','oni_press_shopify_sales.custom_sale_date_oni_con','oni_press_shopify_sales.book_avail_id','oni_press_shopify_sales.net_sales','book_details.added_by')
                ->leftJoin('book_details', function ($join) {
                    $join->on('book_details.id', '=', 'oni_press_shopify_sales.book_avail_id');
                })
                ->where('book_details.added_by', $id)
                ->where('oni_press_shopify_sales.book_avail_id',$bookid)
                ->where(function ($query) use ($week_from) {
                    $query->orWhere('oni_press_shopify_sales.custom_sale_date_oni_con','>=',$week_from);
                })
                ->where(function ($query) use ($week_to){
                $query->orWhere('oni_press_shopify_sales.custom_sale_date_oni_con','<=',$week_to);
                })
                ->get();
            }catch(\Exception $e){
                 return $e->getMessage()." Line contri ". $e->getLine(); 
            }

            if($books_onipress->isEmpty()){

                $books_array['platforms']['Oni Press']['Sale Platform']='Oni Press';
                $books_array['platforms']['Oni Press']['Net Revenue'][]=0;

            }else{

                foreach($books_onipress as $item){
                    $item = get_object_vars($item);
                    $books_array['platforms']['Oni Press']['Sale Platform']='Oni Press';
                    $books_array['platforms']['Oni Press']['Net Revenue'][]=$item['net_sales']*.90;
                }
            }


            ##shopify
            try{
                $books_oni_shop = DB::table('oni_real_shopify_sales')
                ->select('oni_real_shopify_sales.created_at','oni_real_shopify_sales.custom_date','oni_real_shopify_sales.book_avail_id','oni_real_shopify_sales.total_sales','book_details.added_by')
                ->leftJoin('book_details', function ($join) {
                    $join->on('book_details.id', '=', 'oni_real_shopify_sales.book_avail_id');
                })
                ->where('book_details.added_by', $id)
                ->where('oni_real_shopify_sales.book_avail_id',$bookid)
                ->where(function ($query) use ($week_from) {
                    $query->orWhere('oni_real_shopify_sales.custom_date','>=',$week_from);
                })
                ->where(function ($query) use ($week_to){
                $query->orWhere('oni_real_shopify_sales.custom_date','<=',$week_to);
                })
                            ->get();
            }catch(\Exception $e){
                 return $e->getMessage()." Line contri ". $e->getLine(); 
            }


            if($books_oni_shop->isEmpty()){

                $books_array['platforms']['Oni Press']['Sale Platform']='Oni Press';
                $books_array['platforms']['Oni Press']['Net Revenue'][]=0;

            }else{

                foreach($books_oni_shop as $item){
                    $item = get_object_vars($item);
                    $books_array['platforms']['Oni Press']['Sale Platform']='Oni Press';
                    $books_array['platforms']['Oni Press']['Net Revenue'][]=$item['net_sales']*.90;
                }
            }
        }

        #S & S Sales
        if($bookreport_platform == 's_s' || $bookreport_platform == 'all_platform'){
           
            #collecting from table
            try{
                $books_ss = DB::table('s_s_sale_reports')
                ->select('s_s_sale_reports.created_at','s_s_sale_reports.custom_invoice_date','s_s_sale_reports.book_avail_id','s_s_sale_reports.dollar_net','book_details.added_by')
                ->leftJoin('book_details', function ($join) {
                $join->on('book_details.id', '=', 's_s_sale_reports.book_avail_id');
                })
                ->where('book_details.added_by', $id)
                ->where('s_s_sale_reports.book_avail_id',$bookid)

                ->where(function ($query) use ($week_from) {
                $query->orWhere('s_s_sale_reports.custom_invoice_date','>=',$week_from);
                })
                ->where(function ($query) use ($week_to){
                $query->orWhere('s_s_sale_reports.custom_invoice_date','<=',$week_to);
                })
                ->get();
            }catch(\Exception $e){
                 return $e->getMessage()." Line contri ". $e->getLine(); 
            }

            if($books_ss->isEmpty()){

                $books_array['platforms']['S & S']['Sale Platform']='S & S';
                $books_array['platforms']['S & S']['Net Revenue'][]=0;

            }else{

                foreach($books_ss as $item){
                    $item = get_object_vars($item);
                    $books_array['platforms']['S & S']['Sale Platform']='S & S';
                    $books_array['platforms']['S & S']['Net Revenue'][]=$item['dollar_net'];
                }
            }
        }

        $pdf = PDF::loadView('pdf/platform_book_report',compact('books_array','diamond_array','selected_quarter','week_from','week_to'));
        return $pdf->stream();

    }/* End download_bookdata function */


    /**
    Download books excel : full sales , digital + physical 
    **/


    public function download_allbook_fullsale(Request $request){

        #redirect to home if user not a contributor
        if(\Session::get('login_type') != 1){
            return redirect()->route('dashboard');
        }

        
        ##download full report 

        ##dates
        #current date
        $current = floor((date('n') - 1) / 3);

        $year = date('y');
        $quarters = array();
        $q = "";
        $mysql_qty = "";
        for ($i = 0; $i < 5; $i++){
            $q = (($current+$i)%4) + 1;
        }
        $mysql_qty = $q;

        #session
        if(\Session::get('selected_quarter') == ""){
            $selected_quarter = $q;
        }else{
            $selected_quarter = \Session::get('selected_quarter');
        }

        $mysql_qty = $selected_quarter;
            
        #current year
        $current_year= date('Y');

        if(\Session::get('selected_year') == ""){
            $selected_year = $current_year; 
        }else{
            $selected_year = \Session::get('selected_year');
        }    
        
        #dates
        $first_date = date('Y-m-d', strtotime(date('Y') . '-' . (($selected_quarter * 3) - 2) . '-1'));
        $last_date = date('Y-m-t', strtotime(date('Y') . '-' . (($selected_quarter * 3)) . '-1'));

        #session dates
        if(\Session::get('week_from') == ""){
            $week_from = $first_date; 
        }else{
            $week_from = \Session::get('week_from');
        }  

        if(\Session::get('week_to') == ""){
            $week_to = $last_date;
        }else{
            $week_to = \Session::get('week_to');
        }

        #logged in user
        $id = Auth::user()->id;

        ###get basic details of books : diamond data
        try{
            $books_db_data = DB::table('book_details')
                        ->select('book_details.id','book_details.book_title','book_details.merged_book','book_details.isbn_code','book_details.isbn_code2','book_details.isbn_code3','book_details.asin_code','book_details.itune_code','book_details.comixology_code','book_details.diamond_item_code','book_details.amazon_item_code','book_details.itune_code','book_details.google_gg_key','book_details.qb_classes','book_details.print_price','book_details.digital_price','users.name','users.merged_contributor','assign_contributors.percentage','book_financials.total_cost','book_financials.market','book_financials.week_from','book_financials.week_to')
                        ->leftjoin('assign_contributors', function ($join) {
                            $join->on('assign_contributors.book_id', '=', 'book_details.id');
                        })
                        ->leftjoin('users', function ($join) {
                            $join->on('users.id', '=', 'assign_contributors.contributor_id');
                        })
                        ->leftJoin('book_financials', function ($join) {
                            $join->on('book_financials.book_avail_id', '=', 'book_details.id');
                        })
                        ->where(function ($query) use($request) {
                            $query->where('book_financials.total_cost', '<>', '', 'and')
                            ->orWhereNull('book_financials.total_cost');
                        })
                        ->where(function ($query) {
                            $query->where('users.merged_contributor','!=',1)
                                ->orWhereNull('users.merged_contributor');
                        })
                        ->where(function ($query) {
                            $query->where('book_details.merged_book','!=',1)
                                ->orWhereNull('book_details.merged_book');
                        })
                        ->where('book_details.added_by', $id)
                        ->orderby('book_details.book_title','asc')
                        ->get()->toArray(); 
        }catch(\Exception $e){
            return $e->getMessage()." Line contri test". $e->getLine(); 
        }


        ##for diamond sales
        try{
            $books_db_diamond = DB::table('book_details')
            ->select('book_details.id','book_details.book_title','book_details.merged_book','book_details.isbn_code','book_details.isbn_code2','book_details.isbn_code3','book_details.asin_code','book_details.itune_code','book_details.comixology_code','book_details.diamond_item_code','book_details.amazon_item_code','book_details.itune_code','book_details.google_gg_key','book_details.qb_classes','book_details.print_price','book_details.digital_price','book_financials.total_cost','book_financials.market','book_financials.week_from','book_financials.week_to')
           
            ->leftJoin('book_financials', function ($join) {
                $join->on('book_financials.book_avail_id', '=', 'book_details.id');
            })
            ->where(function ($query) use($request) {
                $query->where('book_financials.total_cost', '<>', '', 'and')
                ->orWhereNull('book_financials.total_cost');
            })
            
            ->where(function ($query) {
                $query->where('book_details.merged_book','!=',1)
                    ->orWhereNull('book_details.merged_book');
            })
            ->where('book_details.added_by', $id)
            ->orderby('book_details.book_title','asc')
            ->get()->toArray(); 
        }catch(\Exception $e){
            return $e->getMessage()." Line contri test". $e->getLine(); 
        }

        



        #array to save basic details
        $book_details_data = array();
        $diamond_data = array();
        foreach($books_db_data as $item){
            $item = get_object_vars($item);

            #print price
            if(empty($item['print_price'])){
                $var_price = '';
            }else{
                $var_price = floatval($item['print_price']);
            }

            #digital price
            if(empty($item['digital_price'])){
                $digital_price = '';
            }else{
                $digital_price = floatval($item['digital_price']);
            }

            #percentage
            if(empty($item['percentage'])){
                $percentage = '0%';
            }else{
                $percentage = $item['percentage'].'%';
            }
            
            #basic details
            $book_details_data[$item['id']]['bookdet'] = [
                'bookname'=>$item['book_title'],
                'id'=>$item['id'],
                'isbn_code'=>$item['isbn_code'],
                'isbn_code2'=>$item['isbn_code2'],
                'isbn_code3'=>$item['isbn_code3'],
                'asin_code'=>$item['asin_code'],
                'itune_code'=>$item['itune_code'],
               'comixology_code'=>$item['comixology_code'],
                'diamond_item_code'=>$item['diamond_item_code'],
                'amazon_item_code'=>$item['amazon_item_code'],
                'google_gg_key'=>$item['google_gg_key'],
                'qb_classes'=>$item['qb_classes'],
                'print_price'=>$var_price,
                'digital_price'=>$digital_price
            ];
        }


        foreach($books_db_diamond as $item){
            $item = get_object_vars($item);
            #total sum : diamond sales
            if(($item['week_from'] >= $week_from && $item['week_to'] <= $week_to )||(empty($item['week_from']))){
                  $diamond_data[$item['id']]['sum'][$item['market']][] = $item['total_cost'];
                $diamond_data[$item['id']]['total_sum'][] = $item['total_cost'];
            }else{
                $diamond_data[$item['id']]['sum'][$item['market']][] = ''; 
                $diamond_data[$item['id']]['total_sum'][] = '';
            }
        }

        #appending into array
        foreach($diamond_data as $book_id => $diamond){
            foreach($book_details_data as $key => $item){
                if($book_id == $key){
                    foreach ($diamond['sum'] as $market => $sum){
                        if(!empty($market)){
                            $book_details_data[$key][$market]['diamond_sum']=array_sum($sum);
                        }
                    }
                    $book_details_data[$key]['total_sum']=array_sum($diamond['total_sum']);
                }
            }
        }
       
        #contributor data
        $contri_data = array();
        foreach($book_details_data as $key=>$item){
            $contri_data[$item['bookdet']['id']]['bookdet'] = [
                'bookname'=>$item['bookdet']['bookname'],
                'id'=>$item['bookdet']['id'],
                'isbn_code'=>$item['bookdet']['isbn_code'],
                'isbn_code2'=>$item['bookdet']['isbn_code2'],
                'isbn_code3'=>$item['bookdet']['isbn_code3'],
                'asin_code'=>$item['bookdet']['asin_code'],
                'itune_code'=>$item['bookdet']['itune_code'],
                'comixology_code'=>$item['bookdet']['comixology_code'],
                'diamond_item_code'=>$item['bookdet']['diamond_item_code'],
                'amazon_item_code'=>$item['bookdet']['amazon_item_code'],
                'google_gg_key'=>$item['bookdet']['google_gg_key'],
                'qb_classes'=>$item['bookdet']['qb_classes'],
                'print_price'=>$item['bookdet']['print_price'],
                'digital_price'=>$item['bookdet']['digital_price']
            ];

            #direct market
            if(isset($item['DIRECT_MARKET_STORES'])){
               $contri_data[$item['bookdet']['id']]['bookdet']['DIRECT_MARKET_STORES']=$item['DIRECT_MARKET_STORES']['diamond_sum'];
            }elseif(!isset($item['DIRECT_MARKET_STORES'])){
                 $contri_data[$item['bookdet']['id']]['bookdet']['DIRECT_MARKET_STORES']='';
            }

            #direct shortage
            if(isset($item['DIRECT_SHORTAGE_/_DAMAGE'])){
               $contri_data[$item['bookdet']['id']]['bookdet']['DIRECT_SHORTAGE_/_DAMAGE']=$item['DIRECT_SHORTAGE_/_DAMAGE']['diamond_sum'];

            }elseif(!isset($item['DIRECT_SHORTAGE_/_DAMAGE'])){
                $contri_data[$item['bookdet']['id']]['bookdet']['DIRECT_SHORTAGE_/_DAMAGE']='';
            }

            #non direct store
            if(isset($item['NON-DIRECT_MARKET_STORES'])){
               $contri_data[$item['bookdet']['id']]['bookdet']['NON-DIRECT_MARKET_STORES']=$item['NON-DIRECT_MARKET_STORES']['diamond_sum'];
            }elseif(!isset($item['NON-DIRECT_MARKET_STORES'])){
                 $contri_data[$item['bookdet']['id']]['bookdet']['NON-DIRECT_MARKET_STORES']='';
            }

            #non direct shortage
            if(isset($item['NON-DIRECT_SHORTAGE'])){
               $contri_data[$item['bookdet']['id']]['bookdet']['NON-DIRECT_SHORTAGE']=$item['NON-DIRECT_SHORTAGE']['diamond_sum'];
            }elseif(!isset($item['NON-DIRECT_SHORTAGE'])){
                 $contri_data[$item['bookdet']['id']]['bookdet']['NON-DIRECT_SHORTAGE']='';
            }

            #international 1
            if(isset($item['INTERNATIONAL_NON-DIRECT_MARKET_STORES'])){
               $contri_data[$item['bookdet']['id']]['bookdet']['INTERNATIONAL_NON-DIRECT_MARKET_STORES']=$item['INTERNATIONAL_NON-DIRECT_MARKET_STORES']['diamond_sum'];
            }elseif(!isset($item['INTERNATIONAL_NON-DIRECT_MARKET_STORES'])){
                 $contri_data[$item['bookdet']['id']]['bookdet']['INTERNATIONAL_NON-DIRECT_MARKET_STORES']='';
            }

            #international 2
            if(isset($item['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES'])){
               $contri_data[$item['bookdet']['id']]['bookdet']['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES']=$item['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES']['diamond_sum'];
            }elseif(!isset($item['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES'])){
                 $contri_data[$item['bookdet']['id']]['bookdet']['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES']='';
            }

            #returns
            if(isset($item['DIRECT_RETURNS'])){
               $contri_data[$item['bookdet']['id']]['bookdet']['DIRECT_RETURNS']=$item['DIRECT_RETURNS']['diamond_sum'];
            }elseif(!isset($item['DIRECT_RETURNS'])){
                 $contri_data[$item['bookdet']['id']]['bookdet']['DIRECT_RETURNS']='';
            }

            #non returns
            if(isset($item['NON-DIRECT_RETURNS'])){
               $contri_data[$item['bookdet']['id']]['bookdet']['NON-DIRECT_RETURNS']=$item['NON-DIRECT_RETURNS']['diamond_sum'];
            }elseif(!isset($item['NON-DIRECT_RETURNS'])){
                 $contri_data[$item['bookdet']['id']]['bookdet']['NON-DIRECT_RETURNS']='';
            }

            #no cost replacements
            if(isset($item['NO_COST_REPLACEMENTS'])){
               $contri_data[$item['bookdet']['id']]['bookdet']['NO_COST_REPLACEMENTS']=$item['NO_COST_REPLACEMENTS']['diamond_sum'];
            }elseif(!isset($item['NO_COST_REPLACEMENTS'])){
                 $contri_data[$item['bookdet']['id']]['bookdet']['NO_COST_REPLACEMENTS']='';
            }
            
            #frieght
            if(isset($item['FREIGHT_REBATE_SUMMARY'])){
               $contri_data[$item['bookdet']['id']]['bookdet']['FREIGHT_REBATE_SUMMARY']=$item['FREIGHT_REBATE_SUMMARY']['diamond_sum'];
            }elseif(!isset($item['FREIGHT_REBATE_SUMMARY'])){
                 $contri_data[$item['bookdet']['id']]['bookdet']['FREIGHT_REBATE_SUMMARY']='';
            }  

        } #end foreach

        $book_details = array();
        foreach($contri_data as $key=>$value){
            foreach($value as $key1=>$value1){
                $book_details[$key][] = $value1;
            }
        }
        
        ###get amazon sales
        try{
            $books_db_amazon = DB::table('book_details')
            ->select('amazon_sales_reports.custom_sale_date','amazon_sales_reports.exchange_payment_amount','book_details.id','book_details.book_title')
            ->leftJoin('amazon_sales_reports', function ($join) {
                $join->on('amazon_sales_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {

            $query->where('amazon_sales_reports.exchange_payment_amount', '<>', '', 'and')
            ->orWhereNull('amazon_sales_reports.exchange_payment_amount');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        #creating array for sum
        $amazon_data = array();
        foreach($books_db_amazon as $item){
            $item = get_object_vars($item);

            if(($item['custom_sale_date'] >= $week_from && $item['custom_sale_date'] <= $week_to )||(empty($item['custom_sale_date']))){
                 $amazon_data[$item['id']]['book_details'][] = [
                'book_title'=>$item['book_title']
                ];
                $amazon_data[$item['id']]['book_details']['sum'][] = $item['exchange_payment_amount']; 
            }else{
                $amazon_data[$item['id']]['book_details'][] = [
                'book_title'=>$item['book_title']
                ];
                $amazon_data[$item['id']]['book_details']['sum'][] = 0; 
            }   
        }
        
        #appending it into array
        foreach($amazon_data as $book_id => $amazon){
          
            foreach($book_details as $key => $item[0]){
                
                if($book_id == $key){

                    $amazon_sum_val = array_sum($amazon['book_details']['sum']);

                    if($amazon_sum_val == '0'){
                        $book_details[$key][0]['amazon_sum'] = '';
                    }else{
                        $book_details[$key][0]['amazon_sum'] = $amazon_sum_val;
                    }
                }
            }
        }
        
        ###get apple sales
        try{
            $books_db_apple = DB::table('book_details')
            ->select('apple_sale_reports.exchange_payment_amount','book_details.id','book_details.book_title','apple_sale_reports.custom_sale_date_apple','apple_sale_reports.end_date')
            ->leftJoin('apple_sale_reports', function ($join) {
                $join->on('apple_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('apple_sale_reports.exchange_payment_amount', '<>', '', 'and')
            ->orWhereNull('apple_sale_reports.exchange_payment_amount');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }
        
        #creating array for sum
        $apple_data = array();
        foreach($books_db_apple as $item){
            $item = get_object_vars($item);

            if(($item['custom_sale_date_apple'] >= $week_from && $item['custom_sale_date_apple'] <= $week_to )||(empty($item['custom_sale_date_apple'])) ){

                $apple_data[$item['id']]['book_details'][] = ['book_title'=>$item['book_title']];
                $apple_data[$item['id']]['book_details']['sum'][] = $item['exchange_payment_amount'];  

            }else{
                $apple_data[$item['id']]['book_details'][] = [
                    'book_title'=>$item['book_title']];
                $apple_data[$item['id']]['book_details']['sum'][] = 0;   
            }
        }
        
        #appending it into array
        foreach($apple_data as $book_id => $apple){
          
            foreach($book_details as $key => $item[0]){
              
                if($book_id == $key){
                    $apple_sum_val = array_sum($apple['book_details']['sum']);
                    if($apple_sum_val == '0'){
                        $book_details[$key][0]['apple_sum'] = '';
                    }else{
                        $book_details[$key][0]['apple_sum']=$apple_sum_val;
                    }
                    
                }
            }
        }   

        ### get barnes sales report
         try{
            $books_db_barnes = DB::table('book_details')
            ->select('barnes_nobles_sale_reports.total_cost_payment_currency','book_details.id','barnes_nobles_sale_reports.custom_invoice_date')
            ->leftJoin('barnes_nobles_sale_reports', function ($join) {
            $join->on('barnes_nobles_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {

            $query->where('barnes_nobles_sale_reports.total_cost_payment_currency', '<>', '', 'and')
            ->orWhereNull('barnes_nobles_sale_reports.total_cost_payment_currency');
            })
            ->get()->toArray();
        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        #creating array for sum
        $barnes_data = array();
        foreach($books_db_barnes as $item){
            $item = get_object_vars($item);
            if(($item['custom_invoice_date'] >= $week_from && $item['custom_invoice_date'] <= $week_to )||(empty($item['custom_invoice_date'])) ){

                $barnes_data[$item['id']]['book_details']['sum'][] = $item['total_cost_payment_currency'];  

            }else{
                $barnes_data[$item['id']]['book_details']['sum'][] = 0;  
            }
        }
       
        #appending it into array
        foreach($barnes_data as $book_id => $barnes){
            foreach($book_details as $key => $item[0]){
                if($book_id == $key){
                    $barnes_sum_val = array_sum($barnes['book_details']['sum']);

                    if($barnes_sum_val == '0'){
                        $book_details[$key][0]['barnes_sum'] = '';
                    }else{
                        $book_details[$key][0]['barnes_sum']=$barnes_sum_val;
                    }
                }
            }
        }
        
        ### get comixology sales report
        try{
            $books_db_comixology = DB::table('book_details')
            ->select('comixology_sale_reports.sum_publisher_share_usd','book_details.id','comixology_sale_reports.custom_sale_date_comix')
            ->leftJoin('comixology_sale_reports', function ($join) {
                $join->on('comixology_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('comixology_sale_reports.sum_publisher_share_usd', '<>', '', 'and')
            ->orWhereNull('comixology_sale_reports.sum_publisher_share_usd');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        #creating array for sum
        $comixology_data = array();
        foreach($books_db_comixology as $item){
            $item = get_object_vars($item);
            if(($item['custom_sale_date_comix'] >= $week_from && $item['custom_sale_date_comix'] <= $week_to )||(empty($item['custom_sale_date_comix'])) ){
                $comixology_data[$item['id']]['book_details']['sum'][] = $item['sum_publisher_share_usd'];   
            }else{
                 $comixology_data[$item['id']]['book_details']['sum'][] = 0;  
            }
        }
       
        #appending it into array
        foreach($comixology_data as $book_id => $barnes){
            foreach($book_details as $key => $item[0]){
                if($book_id == $key){
                    $comix_sum_value = array_sum($barnes['book_details']['sum']);
                    if($comix_sum_value == '0'){
                        $book_details[$key][0]['comixology_sum'] = '';
                    }else{
                        $book_details[$key][0]['comixology_sum']=$comix_sum_value;
                    }   
                }
            }
        }

        ### get Comixology Subscription sales report
        try{
            $books_db_comix_subs = DB::table('book_details')
            ->select('comixology_subscription_sale_reports.total_revenue','book_details.id','comixology_subscription_sale_reports.custom_date_comix_subs')
            ->leftJoin('comixology_subscription_sale_reports', function ($join) {
            $join->on('comixology_subscription_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->get()->toArray();

        }catch(\Exception $e){
            return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        #creating array for sum
        $comix_sub_data = array();
        foreach($books_db_comix_subs as $item){
            $item = get_object_vars($item);
            if(($item['custom_date_comix_subs'] >= $week_from && $item['custom_date_comix_subs'] <= $week_to )||(empty($item['custom_date_comix_subs'])) ){
                $comix_sub_data[$item['id']]['book_details']['sum'][] = $item['total_revenue'];
            }else{
                $comix_sub_data[$item['id']]['book_details']['sum'][] = 0;
            }
        }
       
        #appending it into array
        foreach($comix_sub_data as $book_id => $oni){
            foreach($book_details as $key => $item[0]){
                if($book_id == $key){
                    $comix_sub_sum = array_sum($oni['book_details']['sum']);
                    if($comix_sub_sum == '0'){
                        $book_details[$key][0]['comix_sub_sum'] = '';
                    }else{
                        $book_details[$key][0]['comix_sub_sum']=$comix_sub_sum;
                    }
                }
            }
        }

        ### get google sales report
        try{
            $books_db_google = DB::table('book_details')
            ->select('google_sale_reports.earnings_amount','book_details.id','book_details.book_title','google_sale_reports.custom_sale_date_google')
            ->leftJoin('google_sale_reports', function ($join) {
                $join->on('google_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('google_sale_reports.custom_sale_date_google', '<>', '', 'and')
            ->orWhereNull('google_sale_reports.custom_sale_date_google');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri google". $e->getLine(); 
        }

        #creating array for sum
        $google_data = array();
        foreach($books_db_google as $item){
            $item = get_object_vars($item);
            if(($item['custom_sale_date_google'] >= $week_from && $item['custom_sale_date_google'] <= $week_to )||(empty($item['custom_sale_date_google'])) ){
                $google_data[$item['id']]['book_details'][] = [
                    'book_title'=>$item['book_title']
                ];
                $google_data[$item['id']]['book_details']['sum'][] = $item['earnings_amount']; 
            }else{
                $google_data[$item['id']]['book_details'][] = [
                    'book_title'=>$item['book_title']
                ];
                $google_data[$item['id']]['book_details']['sum'][] = 0; 
            }    
        }
       
        #appending it into array
        foreach($google_data as $book_id => $google){
            foreach($book_details as $key => $item[0]){
                if($book_id == $key){
                    $google_sum_val = array_sum($google['book_details']['sum']);
                    if($google_sum_val == '0'){
                        $book_details[$key][0]['google_sum'] = '';
                    }else{
                        $book_details[$key][0]['google_sum']=$google_sum_val;
                    }
                }
            }
        }

        ### get oni_press_website sales report

        #square
        try{
            $books_db_oni_web = DB::table('book_details')
            ->select('oni_press_shopify_sales.net_sales','book_details.id','oni_press_shopify_sales.custom_sale_date_oni_con')
            ->leftJoin('oni_press_shopify_sales', function ($join) {
                $join->on('oni_press_shopify_sales.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('oni_press_shopify_sales.net_sales', '<>', '', 'and')
            ->orWhereNull('oni_press_shopify_sales.net_sales');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        #shopify
        try{
            $oni_shop_web = DB::table('book_details')
            ->select('oni_real_shopify_sales.total_sales','book_details.id','oni_real_shopify_sales.custom_date')
            ->leftJoin('oni_real_shopify_sales', function ($join) {
                $join->on('oni_real_shopify_sales.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('oni_real_shopify_sales.total_sales', '<>', '', 'and')
            ->orWhereNull('oni_real_shopify_sales.total_sales');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }


        #creating array for sum
        $oni_web_data = array();

        #square
        foreach($books_db_oni_web as $item){
            $item = get_object_vars($item);
            if(($item['custom_sale_date_oni_con'] >= $week_from && $item['custom_sale_date_oni_con'] <= $week_to )||(empty($item['custom_sale_date_oni_con'])) ){
                $oni_web_data[$item['id']]['book_details']['sum'][] = $item['net_sales'];
            }else{
                $oni_web_data[$item['id']]['book_details']['sum'][] = 0;
            }
        }

        #shopify
        foreach($oni_shop_web as $item){
            $item = get_object_vars($item);
            if(($item['custom_date'] >= $week_from && $item['custom_date'] <= $week_to )||(empty($item['custom_date'])) ){
                $oni_web_data[$item['id']]['book_details']['sum'][] = $item['total_sales'];
            }else{
                $oni_web_data[$item['id']]['book_details']['sum'][] = 0;
            }
        }
       
        #appending it into array
        foreach($oni_web_data as $book_id => $oni){
            foreach($book_details as $key => $item[0]){
                if($book_id == $key){
                    $oni_sum_val = array_sum($oni['book_details']['sum'])*.90;
                    if($oni_sum_val == '0'){
                        $book_details[$key][0]['oni_web_sum'] = '';
                    }else{
                        $book_details[$key][0]['oni_web_sum']=$oni_sum_val;
                    }  
                }
            }
        }

        ### get s & s sales report
        try{
            $books_db_ss = DB::table('book_details')
            ->select('s_s_sale_reports.dollar_net','book_details.id','book_details.book_title','s_s_sale_reports.custom_invoice_date')
            ->leftJoin('s_s_sale_reports', function ($join) {
                $join->on('s_s_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('s_s_sale_reports.custom_invoice_date', '<>', '', 'and')
            ->orWhereNull('s_s_sale_reports.custom_invoice_date');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri ss". $e->getLine(); 
        }

        #creating array for sum
        $ss_data = array();
        foreach($books_db_ss as $item){
            $item = get_object_vars($item);
            if(($item['custom_invoice_date'] >= $week_from && $item['custom_invoice_date'] <= $week_to )||(empty($item['custom_invoice_date'])) ){
                $ss_data[$item['id']]['book_details'][] = [
                    'book_title'=>$item['book_title']
                ];
                $ss_data[$item['id']]['book_details']['sum'][] = $item['dollar_net']; 
            }else{
                $ss_data[$item['id']]['book_details'][] = [
                    'book_title'=>$item['book_title']
                ];
                $ss_data[$item['id']]['book_details']['sum'][] = 0; 
            }    
        }
       
        #appending it into array
        foreach($ss_data as $book_id => $ss){
            foreach($book_details as $key => $item[0]){
                if($book_id == $key){
                    $ss_sum_val = array_sum($ss['book_details']['sum']);
                    if($ss_sum_val == '0'){
                        $book_details[$key][0]['ss_sum'] = '';
                    }else{
                        $book_details[$key][0]['ss_sum']=$ss_sum_val;
                    }
                }
            }
        }

        ### appending contributors ##########
        try{
            $books_db_contributor = DB::table('book_details')
            ->select('book_details.id','users.name','users.merged_contributor','assign_contributors.percentage','assign_contributors.role_id','contributor_roles.contributor_role')
            ->leftjoin('assign_contributors', function ($join) {
                $join->on('assign_contributors.book_id', '=', 'book_details.id');
            })
            ->leftjoin('users', function ($join) {
                $join->on('users.id', '=', 'assign_contributors.contributor_id');
            })
            ->leftjoin('contributor_roles', function ($join) {
                $join->on('contributor_roles.id', '=', 'assign_contributors.role_id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) {
                $query->where('users.merged_contributor','!=',1)
                    ->orWhereNull('users.merged_contributor');
            })
            ->orderby('book_details.book_title','asc')
            ->get()->toArray();
                          
        }catch(\Exception $e){
            return $e->getMessage()." Line contri test". $e->getLine(); 
        }

        $book_details_contributor = array();
        foreach($books_db_contributor as $item){
            $item = get_object_vars($item);
           
            if(isset($item['percentage'])){
                if(empty($item['percentage'])){
                    $percentage = '0%';
                }else{
                    $percentage = $item['percentage'].'%';
                }
            }else{
                $percentage = '';
            }
            
            #adding the contributors
            $book_details_contributor[$item['id']]['contri'][] = ['contributor_name'=>$item['name'],'contributor_role'=>$item['contributor_role'],'percentage'=>$percentage];

        }
        
        #collecting contributors : if more than one contri , second rows should be empty
        foreach($book_details as $key1=>$value1[0]){

            $book_details[$key1][0]['contributor_name'] = $book_details_contributor[$key1]['contri'][0]['contributor_name'];
            $book_details[$key1][0]['contributor_role'] = $book_details_contributor[$key1]['contri'][0]['contributor_role'];
            $book_details[$key1][0]['percentage'] = $book_details_contributor[$key1]['contri'][0]['percentage'];

            foreach($book_details_contributor[$key1]['contri'] as $key2=>$contri_dat){
                if($key2 != 0){
                    $book_details[$key1][$key2]= [
                    'bookname'=>'',
                    'id'=>'',
                    'isbn_code'=>'',
                    'isbn_code3'=>'',
                    'isbn_code2'=>'',
                    'asin_code'=>'',
                    'itune_code'=>'',
                    'comixology_code'=>'',
                    'diamond_item_code'=>'',
                    'amazon_item_code'=>'',
                    'google_gg_key'=>'',
                    'qb_classes'=>'',
                    'print_price'=>'',
                    'digital_price'=>'',
                    'contributor_name'=>$contri_dat['contributor_name'],
                    'contributor_role'=>$contri_dat['contributor_role'],
                    'percentage'=>$contri_dat['percentage'],
                    'DIRECT_MARKET_STORES'=>'',
                    'DIRECT_SHORTAGE_/_DAMAGE'=>'',
                    'NON-DIRECT_MARKET_STORES'=>'',
                    'NON-DIRECT_SHORTAGE'=>'',
                    'INTERNATIONAL_NON-DIRECT_MARKET_STORES'=>'',
                    'INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES'=>'',
                    'DIRECT_RETURNS'=>'',
                    'NON-DIRECT_RETURNS'=>'',
                    'NO_COST_REPLACEMENTS'=>'',
                    'FREIGHT_REBATE_SUMMARY'=>'',
                    'amazon_sum'=>'',
                    'apple_sum'=>'',
                    'barnes_sum'=>'',
                    'comixology_sum'=>'',
                    'comix_sub_sum'=>'',
                    'google_sum'=>'',
                    'oni_web_sum'=>'',
                    'ss_sum'=>'',
                    ];
                }
            }
        }
        
        ######### ends here #############

        #excel sheet fields            
        $b_details = array();
        $b_details[] = ['BOOK NAME','ISBN Physical 13','ISBN Digital 13','ISBN 10','ASIN CODE','ITUNE CODE','COMIXOLOGY CODE','DIAMOND CODE','AMAZON CODE','GOOGLE GG KEY','QB CLASSES','PRINT PRICE (In Dollars)','DIGITAL PRICE (In Dollars)','CONTRIBUTOR NAME','CONTRIBUTOR ROLE','PERCENTAGE','DIRECT_MARKET_STORES (In Dollars)','DIRECT_SHORTAGE_/_DAMAGE (In Dollars)','DIRECT_RETURNS (In Dollars)','NON-DIRECT_MARKET_STORES (In Dollars)','NON-DIRECT_SHORTAGE (In Dollars)','NON-DIRECT_RETURNS (In Dollars)','INTERNATIONAL_NON-DIRECT_MARKET_STORES (In Dollars)','INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES (In Dollars)','NO_COST_REPLACEMENTS (In Dollars)','FREIGHT_REBATE_SUMMARY (In Dollars)','AMAZON (In Dollars)','APPLE (In Dollars)','BARNES & NOBLES (In Dollars)','COMIXOLOGY (In Dollars)','COMIXOLOGY SUBSCRIPTION (In Dollars)','GOOGLE (In Dollars)','ONIPRESS (In Dollars)','S & S (In Dollars)'];

        #adding values to array containing book details
        foreach($book_details as $bd){
            unset($bd['id']);
            foreach($bd as $bd1){
            $b_details[]  = ['name'=>$bd1['bookname'],
            'isbn_code'=>$bd1['isbn_code'],
            'isbn_code3'=>$bd1['isbn_code3'],
            'isbn_code2'=>$bd1['isbn_code2'],
            'asin_code'=>$bd1['asin_code'],
            'itune_code'=>$bd1['itune_code'],
            'comixology_code'=>$bd1['comixology_code'],
            'diamond_item_code'=>$bd1['diamond_item_code'],
            'amazon_item_code'=>$bd1['amazon_item_code'],
            'google_gg_key'=>$bd1['google_gg_key'],
            'qb_classes'=>$bd1['qb_classes'],
            'print_price'=>$bd1['print_price'],
            'digital_price'=>$bd1['digital_price'],
            'contributor_name'=>$bd1['contributor_name'],
            'contributor_role'=>$bd1['contributor_role'],
            'percentage'=>$bd1['percentage'],
            'diamond_item_code'=>$bd1['diamond_item_code'],
            'DIRECT_MARKET_STORES'=>$bd1['DIRECT_MARKET_STORES'],
            'DIRECT_SHORTAGE_/_DAMAGE'=>$bd1['DIRECT_SHORTAGE_/_DAMAGE'],
            'DIRECT_RETURNS'=>$bd1['DIRECT_RETURNS'],
            'NON-DIRECT_MARKET_STORES'=>$bd1['NON-DIRECT_MARKET_STORES'],
            'NON-DIRECT_SHORTAGE'=>$bd1['NON-DIRECT_SHORTAGE'],
            'NON-DIRECT_RETURNS'=>$bd1['NON-DIRECT_RETURNS'],
            'INTERNATIONAL_NON-DIRECT_MARKET_STORES'=>$bd1['INTERNATIONAL_NON-DIRECT_MARKET_STORES'],
            'INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES'=>$bd1['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES'],
            'NO_COST_REPLACEMENTS'=>$bd1['NO_COST_REPLACEMENTS'],
            'FREIGHT_REBATE_SUMMARY'=>$bd1['FREIGHT_REBATE_SUMMARY'],
            'amazon_sum'=>$bd1['amazon_sum'],
            'apple_sum'=>$bd1['apple_sum'],
            'barnes_sum'=>$bd1['barnes_sum'],
            'comixology_sum'=>$bd1['comixology_sum'],
            'comix_sub_sum'=>$bd1['comix_sub_sum'],
            'google_sum'=>$bd1['google_sum'],
            'oni_web_sum'=>$bd1['oni_web_sum'],
            'ss_sum'=>$bd1['ss_sum'],
            ];
            }
        }  
       
        #setting quarter values
        if($selected_quarter == '1'){
            $quarter = '1st Qtr';
        }else if($selected_quarter == '2'){
            $quarter = '2nd Qtr';
        }else if($selected_quarter == '3'){
            $quarter = '3rd Qtr';
        }else if($selected_quarter == '4'){
            $quarter = '4th Qtr';
        }else if($selected_quarter == '5'){
            $quarter = 'Custom Qtr';
        }

        #setting up excel
        try{
            return Excel::create('full_report_('.$quarter.')'.date("m/d/Y"), function($excel) use ($b_details){

            $excel->setTitle('Books/Percentage');
            $excel->setDescription('Book Report');

            $excel->sheet('sheet', function($sheet) use ($b_details){
                $sheet->fromArray($b_details, null, 'A1', false, false);

                #Align starts
                $sheet->getDefaultStyle()
                ->getAlignment()
                ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                #Align ends

            });

            })->download('xls');
        }catch(\Exception $e){
            return $e->getMessage();
        }

    }##End of download_allbook_fullsale function



    /**
    Download books excel : digital
    **/


    public function download_allbookreport(Request $request){
       
        #redirect to home if user not a contributor
        if(\Session::get('login_type') != 1){
            return redirect()->route('dashboard');
        }

        
        ##download digital report 

        ##dates
         #current date
        $current = floor((date('n') - 1) / 3);

        $year = date('y');
        $quarters = array();
        $q = "";
        $mysql_qty = "";

        for ($i = 0; $i < 5; $i++){
            $q = (($current+$i)%4) + 1;
        }

        $mysql_qty = $q;

        #session
        if(\Session::get('selected_quarter') == ""){
            $selected_quarter = $q;
        }else{
            $selected_quarter = \Session::get('selected_quarter');
        }

        $mysql_qty = $selected_quarter;
            
        #current year
        $current_year= date('Y');

        if(\Session::get('selected_year') == ""){
            $selected_year = $current_year; 
        }else{
            $selected_year = \Session::get('selected_year');
        }    
        
        #dates
        $first_date = date('Y-m-d', strtotime(date('Y') . '-' . (($selected_quarter * 3) - 2) . '-1'));
        $last_date = date('Y-m-t', strtotime(date('Y') . '-' . (($selected_quarter * 3)) . '-1'));

        #session dates
        if(\Session::get('week_from') == ""){
            $week_from = $first_date; 
        }else{
            $week_from = \Session::get('week_from');
        }  

        if(\Session::get('week_to') == ""){
            $week_to = $last_date;
        }else{
            $week_to = \Session::get('week_to');
        }

        #logged in user
        $id = Auth::user()->id;

        ###get basic details of books
        try{
            $books_db_data = DB::table('book_details')
            ->select('book_details.id','book_details.book_title','book_details.merged_book','book_details.isbn_code','book_details.isbn_code2','book_details.isbn_code3','book_details.asin_code','book_details.itune_code','book_details.comixology_code','book_details.diamond_item_code','book_details.amazon_item_code','book_details.itune_code','book_details.google_gg_key','book_details.qb_classes','book_details.print_price','book_details.digital_price','users.name','users.merged_contributor','assign_contributors.percentage','assign_contributors.role_id','contributor_roles.contributor_role')
            ->leftjoin('assign_contributors', function ($join) {
                $join->on('assign_contributors.book_id', '=', 'book_details.id');
            })
            ->leftjoin('users', function ($join) {
                $join->on('users.id', '=', 'assign_contributors.contributor_id');
            })
            ->leftjoin('contributor_roles', function ($join) {
                $join->on('contributor_roles.id', '=', 'assign_contributors.role_id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) {
                $query->where('users.merged_contributor','!=',1)
                    ->orWhereNull('users.merged_contributor');
            })
            ->where(function ($query) {
                $query->where('book_details.merged_book','!=',1)
                    ->orWhereNull('book_details.merged_book');
            })
            ->orderby('book_details.book_title','asc')
            ->get()->toArray();
        }catch(\Exception $e){
            return $e->getMessage()." Line contri test". $e->getLine(); 
        }

        #array to save basic details
        $book_details_data = array();
        foreach($books_db_data as $item){
            $item = get_object_vars($item);

            #print price
            if(empty($item['print_price'])){
                $var_price = '';
            }else{
                $var_price = floatval($item['print_price']);
            }

            #digital price
            if(empty($item['digital_price'])){
                $digital_price = '';
            }else{
                $digital_price = floatval($item['digital_price']);
            }

            #percentage
            if(isset($item['percentage'])){
                if(empty($item['percentage'])){
                    $percentage = '0%';
                }else{
                    $percentage = $item['percentage'].'%';
                }
            }else{
                $percentage = '';
            }
            
            #other details
            $book_details_data[$item['id']]['bookdet'] = [
                'bookname'=>$item['book_title'],
                'id'=>$item['id'],
                'isbn_code'=>$item['isbn_code'],
                'isbn_code2'=>$item['isbn_code2'],
                'isbn_code3'=>$item['isbn_code3'],
                'asin_code'=>$item['asin_code'],
                'itune_code'=>$item['itune_code'],
                'comixology_code'=>$item['comixology_code'],
                'diamond_item_code'=>$item['diamond_item_code'],
                'amazon_item_code'=>$item['amazon_item_code'],
                'google_gg_key'=>$item['google_gg_key'],
                'qb_classes'=>$item['qb_classes'],
                'print_price'=>$var_price,
                'digital_price'=>$digital_price
            ];

            #contributor details
            $book_details_data[$item['id']]['contri'][] = ['contributor_name'=>$item['name'],'contributor_role'=>$item['contributor_role'],'percentage'=>$percentage];     
        }
        
        #collecting contributor data : if more than one contri, the other row should contain only contri's name
        $contri_data = array();
        foreach($book_details_data as $item){
            $contri_data[$item['bookdet']['id']]['bookdet'] = [
            'bookname'=>$item['bookdet']['bookname'],
            'id'=>$item['bookdet']['id'],
            'isbn_code'=>$item['bookdet']['isbn_code'],
            'isbn_code3'=>$item['bookdet']['isbn_code3'],
            'isbn_code2'=>$item['bookdet']['isbn_code2'],
            'asin_code'=>$item['bookdet']['asin_code'],
            'itune_code'=>$item['bookdet']['itune_code'],
            'comixology_code'=>$item['bookdet']['comixology_code'],
            'diamond_item_code'=>$item['bookdet']['diamond_item_code'],
            'amazon_item_code'=>$item['bookdet']['amazon_item_code'],
            'google_gg_key'=>$item['bookdet']['google_gg_key'],
            'qb_classes'=>$item['bookdet']['qb_classes'],
            'print_price'=>$item['bookdet']['print_price'],
            'digital_price'=>$item['bookdet']['digital_price']
            ];

            $contri_data[$item['bookdet']['id']]['bookdet']['contributor_name'] = $item['contri'][0]['contributor_name'];
            $contri_data[$item['bookdet']['id']]['bookdet']['contributor_role'] = $item['contri'][0]['contributor_role'];
            $contri_data[$item['bookdet']['id']]['bookdet']['percentage'] = $item['contri'][0]['percentage']; 
            
            foreach($item['contri'] as $key=>$contri_dat){
                if($key != 0){
                    $contri_data[$item['bookdet']['id']][]= [
                    'bookname'=>'',
                    'id'=>'',
                    'isbn_code'=>'',
                    'isbn_code3'=>'',
                    'isbn_code2'=>'',
                    'asin_code'=>'',
                    'itune_code'=>'',
                    'comixology_code'=>'',
                    'diamond_item_code'=>'',
                    'amazon_item_code'=>'',
                    'google_gg_key'=>'',
                    'qb_classes'=>'',
                    'print_price'=>'',
                    'digital_price'=>'',
                    'contributor_name'=>$contri_dat['contributor_name'],
                    'contributor_role'=>$contri_dat['contributor_role'],
                    'percentage'=>$contri_dat['percentage']
                    ];
                }
            }
        }

        $book_details = array();
        foreach($contri_data as $key=>$value){
            foreach($value as $key1=>$value1){
                $book_details[] = $value1;
            }
        }

        ###get amazon sales
        try{
            $books_db_amazon = DB::table('book_details')
            ->select('amazon_sales_reports.custom_sale_date','amazon_sales_reports.exchange_payment_amount','book_details.id','book_details.book_title')
            ->leftJoin('amazon_sales_reports', function ($join) {
            $join->on('amazon_sales_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {

            $query->where('amazon_sales_reports.exchange_payment_amount', '<>', '', 'and')
            ->orWhereNull('amazon_sales_reports.exchange_payment_amount');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        #creating array for sum
        $amazon_data = array();
        foreach($books_db_amazon as $item){
            $item = get_object_vars($item);

            #collect sales as per the selected dates
            if(($item['custom_sale_date'] >= $week_from && $item['custom_sale_date'] <= $week_to )||(empty($item['custom_sale_date']))){
                 $amazon_data[$item['id']]['book_details'][] = [
                'book_title'=>$item['book_title']
                ];
                $amazon_data[$item['id']]['book_details']['sum'][] = $item['exchange_payment_amount']; 
            }else{
                $amazon_data[$item['id']]['book_details'][] = [
                'book_title'=>$item['book_title']
                ];
                $amazon_data[$item['id']]['book_details']['sum'][] = 0; 
            }      
        }
        
        #appending it into array
        foreach($amazon_data as $book_id => $amazon){
            foreach($book_details as $key => $item){
                if($book_id == $item['id']){
                    $amazon_sum_val = array_sum($amazon['book_details']['sum']);
                    if($amazon_sum_val == '0'){
                        $book_details[$key]['amazon_sum'] = '';
                    }else{
                        $book_details[$key]['amazon_sum'] = $amazon_sum_val;
                    }
                }
            }
        }

        ###get apple sales
        try{
            $books_db_apple = DB::table('book_details')
            ->select('apple_sale_reports.exchange_payment_amount','book_details.id','book_details.book_title','apple_sale_reports.custom_sale_date_apple','apple_sale_reports.end_date')
            ->leftJoin('apple_sale_reports', function ($join) {
            $join->on('apple_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {

            $query->where('apple_sale_reports.exchange_payment_amount', '<>', '', 'and')
            ->orWhereNull('apple_sale_reports.exchange_payment_amount');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        #creating array for sum
        $apple_data = array();
        foreach($books_db_apple as $item){
            $item = get_object_vars($item);

             #collect sales as per the selected dates
            if(($item['custom_sale_date_apple'] >= $week_from && $item['custom_sale_date_apple'] <= $week_to )||(empty($item['custom_sale_date_apple'])) ){

                $apple_data[$item['id']]['book_details'][] = ['book_title'=>$item['book_title']];
                $apple_data[$item['id']]['book_details']['sum'][] = $item['exchange_payment_amount'];  

            }else{
                $apple_data[$item['id']]['book_details'][] = [
                    'book_title'=>$item['book_title']];
                $apple_data[$item['id']]['book_details']['sum'][] = 0;   
            }
        }
       
        #appending it into array
        foreach($apple_data as $book_id => $apple){
            foreach($book_details as $key => $item){
                if($book_id == $item['id']){
                    $apple_sum_val = array_sum($apple['book_details']['sum']);
                    if($apple_sum_val == '0'){
                        $book_details[$key]['apple_sum'] = '';
                    }else{
                        $book_details[$key]['apple_sum']=$apple_sum_val;
                    }  
                }
            }
        }

        ### get barnes sales report
         try{
            $books_db_barnes = DB::table('book_details')
            ->select('barnes_nobles_sale_reports.total_cost_payment_currency','book_details.id','barnes_nobles_sale_reports.custom_invoice_date')
            ->leftJoin('barnes_nobles_sale_reports', function ($join) {
                $join->on('barnes_nobles_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('barnes_nobles_sale_reports.total_cost_payment_currency', '<>', '', 'and')
            ->orWhereNull('barnes_nobles_sale_reports.total_cost_payment_currency');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        #creating array for sum
        $barnes_data = array();
        foreach($books_db_barnes as $item){
            $item = get_object_vars($item);

             #collect sales as per the selected dates
            if(($item['custom_invoice_date'] >= $week_from && $item['custom_invoice_date'] <= $week_to )||(empty($item['custom_invoice_date'])) ){

                $barnes_data[$item['id']]['book_details']['sum'][] = $item['total_cost_payment_currency'];  

            }else{
                $barnes_data[$item['id']]['book_details']['sum'][] = 0;  
            }
        }
       
        #appending it into array
        foreach($barnes_data as $book_id => $barnes){
            foreach($book_details as $key => $item){
                if($book_id == $item['id']){
                    $barnes_sum_val = array_sum($barnes['book_details']['sum']);
                    if($barnes_sum_val == '0'){
                        $book_details[$key]['barnes_sum'] = '';
                    }else{
                        $book_details[$key]['barnes_sum']=$barnes_sum_val;
                    }
                }
            }
        }
        
        ### get comixology sales report
        try{
            $books_db_comixology = DB::table('book_details')
            ->select('comixology_sale_reports.sum_publisher_share_usd','book_details.id','comixology_sale_reports.custom_sale_date_comix')
            ->leftJoin('comixology_sale_reports', function ($join) {
                $join->on('comixology_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('comixology_sale_reports.sum_publisher_share_usd', '<>', '', 'and')
            ->orWhereNull('comixology_sale_reports.sum_publisher_share_usd');
            })
            ->get()->toArray();
        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        #creating array for sum
        $comixology_data = array();
        foreach($books_db_comixology as $item){
            $item = get_object_vars($item);

             #collect sales as per the selected dates
            if(($item['custom_sale_date_comix'] >= $week_from && $item['custom_sale_date_comix'] <= $week_to )||(empty($item['custom_sale_date_comix'])) ){
                $comixology_data[$item['id']]['book_details']['sum'][] = $item['sum_publisher_share_usd'];   
            }else{
                 $comixology_data[$item['id']]['book_details']['sum'][] = 0;  
            }
        }
       
        #appending it into array
        foreach($comixology_data as $book_id => $barnes){
            foreach($book_details as $key => $item){
                if($book_id == $item['id']){
                    $comix_sum_value = array_sum($barnes['book_details']['sum']);
                    if($comix_sum_value == '0'){
                        $book_details[$key]['comixology_sum'] = '';
                    }else{
                        $book_details[$key]['comixology_sum']=$comix_sum_value;
                    }  
                }
            }
        }

        ### get Comixology subscription sales report
        try{
            $books_db_comix_subs = DB::table('book_details')
            ->select('comixology_subscription_sale_reports.total_revenue','book_details.id','comixology_subscription_sale_reports.custom_date_comix_subs')
            ->leftJoin('comixology_subscription_sale_reports', function ($join) {
                $join->on('comixology_subscription_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->get()->toArray();

        }catch(\Exception $e){
            return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        #creating array for sum
        $comix_sub_data = array();
        foreach($books_db_comix_subs as $item){
            $item = get_object_vars($item);

            #collect sales as per the selected dates
            if(($item['custom_date_comix_subs'] >= $week_from && $item['custom_date_comix_subs'] <= $week_to )||(empty($item['custom_date_comix_subs'])) ){
                $comix_sub_data[$item['id']]['book_details']['sum'][] = $item['total_revenue'];
            }else{
                $comix_sub_data[$item['id']]['book_details']['sum'][] = 0;
            }
        }
       
        #appending it into array
        foreach($comix_sub_data as $book_id => $comx_sub){
            foreach($book_details as $key => $item){
                if($book_id == $item['id']){
                    $comix_sub_sum = array_sum($comx_sub['book_details']['sum']);
                    if($comix_sub_sum == '0'){
                        $book_details[$key]['comix_sub_sum'] = '';
                    }else{
                        $book_details[$key]['comix_sub_sum']=$comix_sub_sum;
                    }  
                }
            }
        }

        ### get google sales report
        try{
            $books_db_google = DB::table('book_details')
            ->select('google_sale_reports.earnings_amount','book_details.id','book_details.book_title','google_sale_reports.custom_sale_date_google')
            ->leftJoin('google_sale_reports', function ($join) {
                $join->on('google_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('google_sale_reports.earnings_amount', '<>', '', 'and')
            ->orWhereNull('google_sale_reports.earnings_amount');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri google". $e->getLine(); 
        }

        #creating array for sum
        $google_data = array();
        foreach($books_db_google as $item){
            $item = get_object_vars($item);

            #collect sales as per the selected dates
            if(($item['custom_sale_date_google'] >= $week_from && $item['custom_sale_date_google'] <= $week_to )||(empty($item['custom_sale_date_google'])) ){
                $google_data[$item['id']]['book_details'][] = [
                    'book_title'=>$item['book_title']
                ];
                $google_data[$item['id']]['book_details']['sum'][] = $item['earnings_amount']; 
            }else{
                $google_data[$item['id']]['book_details'][] = [
                    'book_title'=>$item['book_title']
                ];
                $google_data[$item['id']]['book_details']['sum'][] = 0; 
            }    
        }
       
        #appending it into array
        foreach($google_data as $book_id => $google){
            foreach($book_details as $key => $item){
                if($book_id == $item['id']){
                    $google_sum_val = array_sum($google['book_details']['sum']);
                    if($google_sum_val == '0'){
                        $book_details[$key]['google_sum'] = '';
                    }else{
                        $book_details[$key]['google_sum']=$google_sum_val;
                    }  
                }
            }
        }

        ### get oni_press_website sales report

        #square
        try{
            $books_db_oni_web = DB::table('book_details')
            ->select('oni_press_shopify_sales.net_sales','book_details.id','oni_press_shopify_sales.custom_sale_date_oni_con')
            ->leftJoin('oni_press_shopify_sales', function ($join) {
                $join->on('oni_press_shopify_sales.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('oni_press_shopify_sales.net_sales', '<>', '', 'and')
            ->orWhereNull('oni_press_shopify_sales.net_sales');
            })
            ->get()->toArray();
        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        #shopify

        try{
            $oni_shop_web = DB::table('book_details')
            ->select('oni_real_shopify_sales.total_sales','book_details.id','oni_real_shopify_sales.custom_date')
            ->leftJoin('oni_real_shopify_sales', function ($join) {
                $join->on('oni_real_shopify_sales.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('oni_real_shopify_sales.total_sales', '<>', '', 'and')
            ->orWhereNull('oni_real_shopify_sales.total_sales');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri ". $e->getLine(); 
        }

        ##creating array for sum

        #square
        $oni_web_data = array();
        foreach($books_db_oni_web as $item){
            $item = get_object_vars($item);

            #collect sales as per the selected dates
            if(($item['custom_sale_date_oni_con'] >= $week_from && $item['custom_sale_date_oni_con'] <= $week_to )||(empty($item['custom_sale_date_oni_con'])) ){
                $oni_web_data[$item['id']]['book_details']['sum'][] = $item['net_sales'];
            }else{
                $oni_web_data[$item['id']]['book_details']['sum'][] = 0;
            }
        }

        #shopify
        foreach($oni_shop_web as $item){
            $item = get_object_vars($item);

            #collect sales as per the selected dates
            if(($item['custom_date'] >= $week_from && $item['custom_date'] <= $week_to )||(empty($item['custom_date'])) ){
                $oni_web_data[$item['id']]['book_details']['sum'][] = $item['total_sales'];
            }else{
                $oni_web_data[$item['id']]['book_details']['sum'][] = 0;
            }
        }
       
        #appending it into array
        foreach($oni_web_data as $book_id => $oni){
            foreach($book_details as $key => $item){
                if($book_id == $item['id']){
                    $oni_sum_val = array_sum($oni['book_details']['sum'])*.90;
                    if($oni_sum_val == '0'){
                        $book_details[$key]['oni_web_sum'] = '';
                    }else{
                        $book_details[$key]['oni_web_sum']=$oni_sum_val;
                    }   
                }
            }
        }

        ### get s & s sales report
        try{
            $books_db_ss = DB::table('book_details')
            ->select('s_s_sale_reports.dollar_net','book_details.id','book_details.book_title','s_s_sale_reports.custom_invoice_date')
            ->leftJoin('s_s_sale_reports', function ($join) {
                $join->on('s_s_sale_reports.book_avail_id', '=', 'book_details.id');
            })
            ->where('book_details.added_by', $id)
            ->where(function ($query) use($request) {
                $query->where('s_s_sale_reports.dollar_net', '<>', '', 'and')
            ->orWhereNull('s_s_sale_reports.dollar_net');
            })
            ->get()->toArray();

        }catch(\Exception $e){
             return $e->getMessage()." Line contri ss". $e->getLine(); 
        }

        #creating array for sum
        $ss_data = array();
        foreach($books_db_ss as $item){
            $item = get_object_vars($item);

            #collect sales as per the selected dates
            if(($item['custom_invoice_date'] >= $week_from && $item['custom_invoice_date'] <= $week_to )||(empty($item['custom_invoice_date'])) ){
                $ss_data[$item['id']]['book_details'][] = [
                    'book_title'=>$item['book_title']
                ];
                $ss_data[$item['id']]['book_details']['sum'][] = $item['dollar_net']; 
            }else{
                $ss_data[$item['id']]['book_details'][] = [
                    'book_title'=>$item['book_title']
                ];
                $ss_data[$item['id']]['book_details']['sum'][] = 0; 
            }    
        }
       
        #appending it into array
        foreach($ss_data as $book_id => $ss){
            foreach($book_details as $key => $item){
                if($book_id == $item['id']){
                    $ss_sum_val = array_sum($ss['book_details']['sum']);
                    if($ss_sum_val == '0'){
                        $book_details[$key]['ss_sum'] = '';
                    }else{
                        $book_details[$key]['ss_sum']=$ss_sum_val;
                    }  
                }
            }
        }

        #excel sheet fields            
        $b_details = array();
        $b_details[] = ['BOOK NAME','ISBN Physical 13','ISBN Digital 13','ISBN 10','ASIN CODE','ITUNE CODE','COMIXOLOGY CODE','DIAMOND CODE','AMAZON CODE','GOOGLE GG KEY','QB CLASSES','PRINT PRICE (In Dollars)','DIGITAL PRICE (In Dollars)','CONTRIBUTOR NAME','CONTRIBUTOR ROLE','PERCENTAGE','AMAZON (In Dollars)','APPLE (In Dollars)','BARNES & NOBLES (In Dollars)','COMIXOLOGY (In Dollars)','COMIXOLOGY SUBSCRIPTION (In Dollars)','GOOGLE (In Dollars)','ONIPRESS (In Dollars)','S & S (In Dollars)'];

        foreach($book_details as $bd){
            unset($bd['id']);
            $b_details[]  = $bd;
        }  

        #setting up quarter values
        if($selected_quarter == '1'){
            $quarter = '1st Qtr';
        }else if($selected_quarter == '2'){
            $quarter = '2nd Qtr';
        }else if($selected_quarter == '3'){
            $quarter = '3rd Qtr';
        }else if($selected_quarter == '4'){
            $quarter = '4th Qtr';
        }else if($selected_quarter == '5'){
            $quarter = 'Custom Qtr';
        }

        #running the excel
        try{
            return Excel::create('digital_report_('.$quarter.')'.date("m/d/Y"), function($excel) use ($b_details){
                $excel->setTitle('Books/Percentage');
                $excel->setDescription('Book Report');
                $excel->sheet('sheet', function($sheet) use ($b_details){
                    $sheet->fromArray($b_details, null, 'A1', false, false);

                    #Align starts
                    $sheet->getDefaultStyle()
                    ->getAlignment()
                    ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                    #Align ends

                });
            })->download('xls');
        }catch(\Exception $e){
            return $e->getMessage();
        }
        
    } /* End of download_allbookreport function */


    /**
    Download books excel : physical
    **/


    public function download_physicalreport(Request $request){
        
        #redirect to home if user not a contributor
        if(\Session::get('login_type') != 1){
            return redirect()->route('dashboard');
        }

        
        #download physical excel

        ##for currency
        setlocale(LC_MONETARY, 'en_US.UTF-8'); //for money

        ##dates
        #current date
        $current = floor((date('n') - 1) / 3);

        $year = date('y');
        $quarters = array();
        $q = "";
        $mysql_qty = "";

        for ($i = 0; $i < 5; $i++){
            $q = (($current+$i)%4) + 1;
        }

        $mysql_qty = $q;

        #session
        if(\Session::get('selected_quarter') == ""){
            $selected_quarter = $q;
        }else{
            $selected_quarter = \Session::get('selected_quarter');
        }

        $mysql_qty = $selected_quarter;
            
        #current year
        $current_year= date('Y');

        if(\Session::get('selected_year') == ""){
            $selected_year = $current_year; 
        }else{
            $selected_year = \Session::get('selected_year');
        }    
        
        #dates
        $first_date = date('Y-m-d', strtotime(date('Y') . '-' . (($selected_quarter * 3) - 2) . '-1'));
        $last_date = date('Y-m-t', strtotime(date('Y') . '-' . (($selected_quarter * 3)) . '-1'));

        #session dates
        if(\Session::get('week_from') == ""){
            $week_from = $first_date; 
        }else{
            $week_from = \Session::get('week_from');
        }  

        if(\Session::get('week_to') == ""){
            $week_to = $last_date;
        }else{
            $week_to = \Session::get('week_to');
        }

        ##logged in user
        $id = Auth::user()->id;

        ##diamond report
        try{
            $book_details_db = DB::Table('book_details')
            ->select('book_details.id','book_details.isbn_code','book_details.isbn_code2','book_details.isbn_code3','book_details.merged_book','book_details.diamond_item_code','book_details.amazon_item_code','book_financials.total_cost','book_financials.market','book_financials.week_from','book_financials.week_to','book_details.book_title','book_details.qb_classes','book_details.print_price','book_details.digital_price')
            ->leftJoin('book_financials', function ($join) {
                $join->on('book_financials.book_avail_id', '=', 'book_details.id');
            })
            ->where(function ($query) use($request) {
                $query->where('book_financials.total_cost', '<>', '', 'and')
                ->orWhereNull('book_financials.total_cost');
            })
            ->where(function ($query) {
                $query->where('book_details.merged_book','!=',1)
                    ->orWhereNull('book_details.merged_book');
            })
            ->where('book_details.added_by', $id)
            ->orderby('book_details.book_title', 'asc')
            ->get();
        }catch(\Exception $e){
            return $e->getMessage();
        }

        #collecting only books details / Sales 
        $book_data = array();
        $diamond_data = array();
        foreach( $book_details_db as $item){
            $item = get_object_vars($item);

            #print price
            if(empty($item['print_price'])){
                $var_price = '';
            }else{
                $var_price = floatval($item['print_price']);
            }

            #digital price
            if(empty($item['digital_price'])){
                $digital_price = '';
            }else{
                $digital_price = floatval($item['digital_price']);
            }

            #details
            $book_data[$item['id']]= [
                'name'=>$item['book_title'],
                'id'=>$item['id'],
                'isbn_code'=>$item['isbn_code'],
                'isbn_code3'=>$item['isbn_code3'],
                'isbn_code2'=>$item['isbn_code2'],
                'qb_classes'=>$item['qb_classes'],
                'print_price'=>$var_price,
                'digital_price'=>$digital_price,
                'diamond_item_code'=>$item['diamond_item_code'],
                'amazon_item_code'=>$item['amazon_item_code'],
            ];

            #totals
            if(($item['week_from'] >= $week_from && $item['week_to'] <= $week_to )||(empty($item['week_from']))){
                $diamond_data[$item['id']]['sum'][$item['market']][] = $item['total_cost'];
                $diamond_data[$item['id']]['total_sum'][] = $item['total_cost'];
           }else{
                $diamond_data[$item['id']]['sum'][$item['market']][] = ''; 
                $diamond_data[$item['id']]['total_sum'][] = '';
           }
        };
        
        #appending into array
        foreach($diamond_data as $book_id => $diamond){
            foreach($book_data as $key => $item){
                if($book_id == $key){
                    foreach ($diamond['sum'] as $market => $sum){
                        if(!empty($market)){
                            $book_data[$key][$market]['diamond_sum']=array_sum($sum);
                        }
                    }
                    $book_data[$key]['total_sum']=array_sum($diamond['total_sum']);
                }
            }
        }

        #checking if data is set, then app values
        foreach($book_data as $key => $item){
            #direct market
            if(isset($item['DIRECT_MARKET_STORES'])){
               $book_data[$key][0]['DIRECT_MARKET_STORES']=$item['DIRECT_MARKET_STORES']['diamond_sum'];
            }elseif(!isset($item['DIRECT_MARKET_STORES'])){
                 $book_data[$key][0]['DIRECT_MARKET_STORES']='';
            }

            #direct shortage
            if(isset($item['DIRECT_SHORTAGE_/_DAMAGE'])){
               $book_data[$key][1]['DIRECT_SHORTAGE_/_DAMAGE']=$item['DIRECT_SHORTAGE_/_DAMAGE']['diamond_sum'];

            }elseif(!isset($item['DIRECT_SHORTAGE_/_DAMAGE'])){
                $book_data[$key][1]['DIRECT_SHORTAGE_/_DAMAGE']='';
            }

            #non direct store
            if(isset($item['NON-DIRECT_MARKET_STORES'])){
               $book_data[$key][2]['NON-DIRECT_MARKET_STORES']=$item['NON-DIRECT_MARKET_STORES']['diamond_sum'];
            }elseif(!isset($item['NON-DIRECT_MARKET_STORES'])){
                 $book_data[$key][2]['NON-DIRECT_MARKET_STORES']='';
            }

            #non direct shortage
            if(isset($item['NON-DIRECT_SHORTAGE'])){
               $book_data[$key][3]['NON-DIRECT_SHORTAGE']=$item['NON-DIRECT_SHORTAGE']['diamond_sum'];
            }elseif(!isset($item['NON-DIRECT_SHORTAGE'])){
                 $book_data[$key][3]['NON-DIRECT_SHORTAGE']='';
            }

            #international 1
            if(isset($item['INTERNATIONAL_NON-DIRECT_MARKET_STORES'])){
               $book_data[$key][4]['INTERNATIONAL_NON-DIRECT_MARKET_STORES']=$item['INTERNATIONAL_NON-DIRECT_MARKET_STORES']['diamond_sum'];
            }elseif(!isset($item['INTERNATIONAL_NON-DIRECT_MARKET_STORES'])){
                 $book_data[$key][4]['INTERNATIONAL_NON-DIRECT_MARKET_STORES']='';
            }

            #international 2
            if(isset($item['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES'])){
               $book_data[$key][5]['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES']=$item['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES']['diamond_sum'];
            }elseif(!isset($item['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES'])){
                 $book_data[$key][5]['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES']='';
            }

            #returns
            if(isset($item['DIRECT_RETURNS'])){
               $book_data[$key][6]['DIRECT_RETURNS']=$item['DIRECT_RETURNS']['diamond_sum'];
            }elseif(!isset($item['DIRECT_RETURNS'])){
                 $book_data[$key][6]['DIRECT_RETURNS']='';
            }

            #non returns
            if(isset($item['NON-DIRECT_RETURNS'])){
               $book_data[$key][7]['NON-DIRECT_RETURNS']=$item['NON-DIRECT_RETURNS']['diamond_sum'];
            }elseif(!isset($item['NON-DIRECT_RETURNS'])){
                 $book_data[$key][7]['NON-DIRECT_RETURNS']='';
            }

            #no cost replacements
            if(isset($item['NO_COST_REPLACEMENTS'])){
               $book_data[$key][8]['NO_COST_REPLACEMENTS']=$item['NO_COST_REPLACEMENTS']['diamond_sum'];
            }elseif(!isset($item['NO_COST_REPLACEMENTS'])){
                 $book_data[$key][8]['NO_COST_REPLACEMENTS']='';
            }
            
            #frieght
            if(isset($item['FREIGHT_REBATE_SUMMARY'])){
               $book_data[$key][9]['FREIGHT_REBATE_SUMMARY']=$item['FREIGHT_REBATE_SUMMARY']['diamond_sum'];
            }elseif(!isset($item['FREIGHT_REBATE_SUMMARY'])){
                 $book_data[$key][9]['FREIGHT_REBATE_SUMMARY']='';
            }
        }
        
        #excel sheet
        $b_details = array();
        $b_details[] = ['BOOK NAME','ISBN Physical 13','ISBN Digital 13','ISBN 10','QB CLASSES','PRINT PRICE (In Dollars)','DIGITAL PRICE (In Dollars)','DIAMOND CODE','AMAZON CODE','DIRECT_MARKET_STORES (In Dollars)','DIRECT_SHORTAGE_/_DAMAGE (In Dollars)','DIRECT_RETURNS (In Dollars)','NON-DIRECT_MARKET_STORES (In Dollars)','NON-DIRECT_SHORTAGE (In Dollars)','NON-DIRECT_RETURNS (In Dollars)','INTERNATIONAL_NON-DIRECT_MARKET_STORES (In Dollars)','INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES (In Dollars)','NO_COST_REPLACEMENTS (In Dollars)','FREIGHT_REBATE_SUMMARY (In Dollars)','TOTAL (In Dollars)'];

        foreach($book_data as $bd){
            unset($bd['id']);
            if($bd['total_sum'] == '0'){
                $total = '';
            }else{
                $total = money_format('%+n', floatval($bd['total_sum']));
            }
            
            $b_details[]  = ['name'=>$bd['name'],
                    'isbn_code'=>$bd['isbn_code'],
                    'isbn_code3'=>$bd['isbn_code3'],
                    'isbn_code2'=>$bd['isbn_code2'],
                    'qb_classes'=>$bd['qb_classes'],
                    'print_price'=>$bd['print_price'],
                    'digital_price'=>$bd['digital_price'],
                    'diamond_item_code'=>$bd['diamond_item_code'],
                    'amazon_item_code'=>$bd['amazon_item_code'],
                    'DIRECT_MARKET_STORES'=>$bd[0]['DIRECT_MARKET_STORES'],
                    'DIRECT_SHORTAGE_/_DAMAGE'=>$bd[1]['DIRECT_SHORTAGE_/_DAMAGE'],
                    'DIRECT_RETURNS'=>$bd[6]['DIRECT_RETURNS'],
                    'NON-DIRECT_MARKET_STORES'=>$bd[2]['NON-DIRECT_MARKET_STORES'],
                    'NON-DIRECT_SHORTAGE'=>$bd[3]['NON-DIRECT_SHORTAGE'],
                    'NON-DIRECT_RETURNS'=>$bd[7]['NON-DIRECT_RETURNS'],
                    'INTERNATIONAL_NON-DIRECT_MARKET_STORES'=>$bd[4]['INTERNATIONAL_NON-DIRECT_MARKET_STORES'],
                    'INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES'=>$bd[5]['INTERNATIONAL_NON-DIRECT_MARKET_SHORTAGES'],
                    'NO_COST_REPLACEMENTS'=>$bd[8]['NO_COST_REPLACEMENTS'],
                    'FREIGHT_REBATE_SUMMARY'=>$bd[9]['FREIGHT_REBATE_SUMMARY'],
                    'TOTAL'=>$bd['total_sum']
                ];
        }
        
        #setting up quarter for name
        if($selected_quarter == '1'){
            $quarter = '1st Qtr';
        }else if($selected_quarter == '2'){
            $quarter = '2nd Qtr';
        }else if($selected_quarter == '3'){
            $quarter = '3rd Qtr';
        }else if($selected_quarter == '4'){
            $quarter = '4th Qtr';
        }else if($selected_quarter == '5'){
            $quarter = 'Custom Qtr';
        }

        #running the excel
        try{
            return Excel::create('physical_report_('.$quarter.')'.date("m/d/Y"), function($excel) use ($b_details){
                $excel->setTitle('Physical Report');
                $excel->setDescription('Book Report');
                $excel->sheet('sheet', function($sheet) use ($b_details){
                    $sheet->fromArray($b_details, null, 'A1', false, false);

                    #Align starts
                    $sheet->getDefaultStyle()
                    ->getAlignment()
                    ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                    #Align ends

                });
            })->download('xls');
        }catch(\Exception $e){
            return $e->getMessage().'Line no'. $e->getLine();
        }

    }/** ends download all physical report **/

    /********
    Expense Advance Sheet
    ********/
    public function download_expense_advance(Request $request){
        
        #redirect to home if user not a contributor
        if(\Session::get('login_type') != 1){
            return redirect()->route('dashboard');
        }

        
        ##for currency
        setlocale(LC_MONETARY, 'en_US.UTF-8'); //for money

        ##dates
        #current date
        $current = floor((date('n') - 1) / 3);

        $year = date('y');
        $quarters = array();
        $q = "";
        $mysql_qty = "";

        for ($i = 0; $i < 5; $i++){
            $q = (($current+$i)%4) + 1;
        }

        $mysql_qty = $q;

        #session
        if(\Session::get('selected_quarter') == ""){
            $selected_quarter = $q;
        }else{
            $selected_quarter = \Session::get('selected_quarter');
        }

        $mysql_qty = $selected_quarter;
            
        #current year
        $current_year= date('Y');

        if(\Session::get('selected_year') == ""){
            $selected_year = $current_year; 
        }else{
            $selected_year = \Session::get('selected_year');
        }    

        ##quarter in words 
        if($selected_quarter == 1){
            $selected_quarter_words ='first_quarter';
        }
        if($selected_quarter == 2){
            $selected_quarter_words = 'second_quarter';
        }
        if($selected_quarter == 3){
            $selected_quarter_words = 'third_quarter';
        }
        if($selected_quarter == 4){
            $selected_quarter_words ='fourth_quarter';
        }
        if($selected_quarter == 5){
            $selected_quarter_words = 'custom_quarter';
        }
        
        #dates
        $first_date = date('Y-m-d', strtotime(date('Y') . '-' . (($selected_quarter * 3) - 2) . '-1'));
        $last_date = date('Y-m-t', strtotime(date('Y') . '-' . (($selected_quarter * 3)) . '-1'));

        #session dates
        if(\Session::get('week_from') == ""){
            $week_from = $first_date; 
        }else{
            $week_from = \Session::get('week_from');
        }  

        if(\Session::get('week_to') == ""){
            $week_to = $last_date;
        }else{
            $week_to = \Session::get('week_to');
        }

        ##logged in user
        $id = Auth::user()->id;

        ##diamond report
        try{
            $book_details_db = DB::Table('book_details')
            ->select('book_details.id','book_details.book_title','book_details.isbn_code','book_details.isbn_code3','book_details.isbn_code2','book_details.diamond_item_code','book_details.qb_classes','book_details.print_price','book_details.digital_price')
            ->where(function ($query) {
                $query->where('book_details.merged_book','!=',1)
                    ->orWhereNull('book_details.merged_book');
            })
            ->where('book_details.added_by', $id)
            ->orderby('book_details.book_title', 'asc')
            ->get();
        }catch(\Exception $e){
            return $e->getMessage();
        }

       
        $book_details = array();
        foreach($book_details_db as $item){
            $item = get_object_vars($item);

            #print price
            if(empty($item['print_price'])){
                $var_price = '';
            }else{
                $var_price = floatval($item['print_price']);
            }

            #digital price
            if(empty($item['digital_price'])){
                $digital_price = '';
            }else{
                $digital_price = floatval($item['digital_price']);
            }

            #details
            $book_details[$item['id']]= [
                'id'=>$item['id'],
                'name'=>$item['book_title'],
                'isbn_code'=>$item['isbn_code'],
                'isbn_code3'=>$item['isbn_code3'],
                'isbn_code2'=>$item['isbn_code2'],
                'qb_classes'=>$item['qb_classes'],
                'diamond_item_code'=>$item['diamond_item_code'],
                'print_price'=>$var_price,
                'digital_price'=>$digital_price,
            ];

        }

        #Get Expenses
        
        try{
            $expenses = DB::table('book_details')
            ->select('book_details.id','book_details.book_title','book_expenses.first_quarter','book_expenses.second_quarter','book_expenses.third_quarter','book_expenses.fourth_quarter','book_expenses.year')
            ->leftJoin('book_expenses', function ($join) {
                $join->on('book_details.id', '=', 'book_expenses.book_id');
            })
            ->orderby('book_details.book_title', 'asc')
            ->where('book_details.added_by', $id)
            ->where(function ($query) {
                $query->where('book_details.merged_book','!=',1)
                    ->orWhereNull('book_details.merged_book');
            })
            ->get();

        }catch(\Exception $e){
           return $e->getMessage()." Line no assigned_books_arr exp ".$e->getLine();
        }

        #for custom quarter
        $qtrs_val=array();
        if($selected_quarter == 5){
            $selected_q = 'Custom Quarter (Jan - Dec)'; 
            $month1 = date('m', strtotime($week_from));//get the quarter of week from date
            $q1 = ceil($month1/3);
            
            $month2 = date('m', strtotime($week_to));//get the quarter of week to date
            $q2 = ceil($month2/3);  
            
            for($qtrs=$q1; $qtrs <= $q2; $qtrs++){//collect the quarter in array
                $qtrs_val[]=$qtrs;
            }
        }

        $expense = array();
        foreach($expenses as $item){
            $item = get_object_vars($item);
            #if not custom quarter
            if($selected_quarter != 5){
                if(($selected_year == $item['year'] || empty($item['year']))){
                    $expense[$item['id']][] = $item[$selected_quarter_words];
                }elseif($selected_year != $item['year']){
                    if(!isset($expense[$item['id']])){
                      $expense[$item['id']][] = 0;
                    }
                }
                
            #if custom quarter sum up all the values
            }else{

                if(($selected_year == $item['year'] || empty($item['year']))){
                    $all_qtr_sum =0;
                    foreach($qtrs_val as $qtr){  
                        if($qtr == 1){
                            $all_qtr_sum +=$item['first_quarter'];
                        }
                        if($qtr == 2){
                            $all_qtr_sum +=$item['second_quarter'];
                        }
                        if($qtr == 3){
                            $all_qtr_sum +=$item['third_quarter'];
                        }
                        if($qtr == 4){
                            $all_qtr_sum +=$item['fourth_quarter'];
                        }
                    }
                    $expense[$item['id']][] =$all_qtr_sum;

                }elseif($selected_year != $item['year']){
                    if(!isset($expense[$item['id']])){
                      $expense[$item['id']][]=0;  
                    }
                }
            }#ends condition for quarter
        }#ends expense foreach

        #append expense data in book details
        foreach($expense as $bookid=>$expens){
            foreach($book_details as $key=>$book){
                if($bookid == $book['id']){
                    $book_details[$key]['expense'] = array_sum($expens);
                }
            }
        }
        
        #Get Advances
        try{
            $advance = DB::table('book_details')
            ->select('book_details.id as book_id','book_advances.id','book_advances.book_id as db_id','book_details.book_title','book_advances.added_by','book_advances.amount as advance_amount','book_advances.year as advance_year','book_advances.quarter as advance_quarter','book_advances.updated_at')
            ->leftJoin('book_advances', function ($join) {
                $join->on('book_advances.book_id','=','book_details.id');
            })
            ->orderby('book_details.book_title', 'asc')
            ->where('book_details.added_by',$id)
            ->where(function ($query) {
                $query->where('book_details.merged_book','!=',1)
                    ->orWhereNull('book_details.merged_book');
            })
            ->get();

        }catch(\Exception $e){
            return $e->getMessage();
        }
        //print'<pre>';print_r($advance);die;
        #advance current qtr : collecting advances based on the qtr selected
        $amount_current_quarter = array();
        foreach($advance as $item){
            $item = get_object_vars($item);

            #if not a custom array, filter it based on the year and quarter
            if($selected_quarter != 5 ){
                if($item['advance_quarter']==$selected_quarter && $item['advance_year'] == $selected_year){
                    $amount_current_quarter[$item['book_id']][] =$item['advance_amount'];
                }else{
                   
                    $amount_current_quarter[$item['book_id']][]=0;
                }
            }else{

                #custom quarter dates
                $default_first_date = date('Y-m-d', strtotime($selected_year . '-' . ((1 * 3) - 2) . '-1'));
                $default_last_date = date('Y-m-t', strtotime($selected_year . '-' . ((4 * 3)) . '-1'));

                if(\Session::get('week_from') == ""){
                    $custom_week_from = $default_first_date; 
                }else{
                    $custom_week_from = \Session::get('week_from');
                }  

                if(\Session::get('week_to') == ""){
                    $custom_week_to = $default_last_date;
                }else{
                   $custom_week_to = \Session::get('week_to');
                } 

                $custom_quarter_from = ceil(date('m', strtotime($custom_week_from))/3);
                $custom_quarter_to = ceil(date('m', strtotime($custom_week_to))/3);

                #custom quarter amount
                if($item['advance_year'] == $selected_year && ( $item['advance_quarter'] >= $custom_quarter_from && $item['advance_quarter'] <= $custom_quarter_to )){

                    $amount_current_quarter[$item['book_id']][] =$item['advance_amount'];

                }else{
                    if(!isset($amount_current_quarter)){

                        $amount_current_quarter[$item['book_id']][]=0;
                    }
                }
            }
        }
        
        #append advance data in book details
        foreach($amount_current_quarter as $bookid=>$advance){
            foreach($book_details as $key=>$book){
                if($bookid == $book['id']){
                    $book_details[$key]['advance'] = array_sum($advance);
                }
            }
        }

        #excel sheet fields            
        $b_details = array();
        $b_details[] = ['BOOK NAME','ISBN Physical 13','ISBN Digital 13','ISBN 10','DIAMOND CODE','QB CLASSES','PRINT PRICE (In Dollars)','DIGITAL PRICE (In Dollars)','EXPENSE (In Dollars)','ADVANCE (In Dollars)'];
        foreach($book_details as $bd){
            unset($bd['id']);
            $b_details[]  = $bd;
        } 

        #setting up quarter values
        if($selected_quarter == '1'){
            $quarter = '1st Qtr';
        }else if($selected_quarter == '2'){
            $quarter = '2nd Qtr';
        }else if($selected_quarter == '3'){
            $quarter = '3rd Qtr';
        }else if($selected_quarter == '4'){
            $quarter = '4th Qtr';
        }else if($selected_quarter == '5'){
            $quarter = 'Custom Qtr';
        }

        #running the excel
        try{
            return Excel::create('expense_advance_sheet_('.$quarter.' - '.$selected_year.')'.date("m/d/Y"), function($excel) use ($b_details){
                $excel->setTitle('Books/Percentage');
                $excel->setDescription('Book Report');
                $excel->sheet('sheet', function($sheet) use ($b_details){
                    $sheet->fromArray($b_details, null, 'A1', false, false);
                    #Align starts
                    $sheet->getDefaultStyle()
                    ->getAlignment()
                    ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                    #Align ends
                });
            })->download('xls');
        }catch(\Exception $e){
            return $e->getMessage();
        }
    }/***ends download_expense_advance sheet***/


    /**
    Add / Save Comment Function starts
    **/

    public function add_comment_popup(Request $request){
        #redirect to home if user not a contributor
        if(\Session::get('login_type') != 1){
            return redirect()->route('dashboard');
        }        
        #request to view the comment
        if($request->has('view_comment')){

            #contributor id
            $contri_id = $request['id'];
            
            ##logged in user
            $id = Auth::user()->id;

            #collecting the comment
            try{
                $contr_details = DB::table('users')
                ->select('users.id','users.name','users.merged_contributor','users.email','users.login_type','users.added_by','users.contributor_comment')
                ->where(function ($query) {
                    $query->where('users.merged_contributor','!=',1)
                        ->orWhereNull('users.merged_contributor');
                })  
                ->where('added_by',$id)
                ->where('id',$contri_id)
                ->where('login_type', 2)
                ->get()->toArray();
               
            }catch(\Exception $e){
                return $e->getMessage();
            }

            #putting the comment in var
            foreach($contr_details as $details){
                $name = $details->name;
                $contri_comment = $details->contributor_comment;
            }

            #returning the reponse
            return response()->json(array(
                'success'=>1,
                'contri_id'=>$contri_id,
                'name' => $name,
                'contri_comment' => $contri_comment, 
            ));
        }#request to view comments ends here
        
        
        /***********
        Save Comment Added for contributor
        ************/

        if($request->has('add_comment_report')){

            $data = $request->all();

            #contributor id
            $contributor_id = $request->contributor_id;

            #comment
            $contributor_add_comment = $request->add_comment;

            if(empty($contributor_add_comment)){

                try{
                    $contr_comment_update_empty = DB::table('users')->where('id', $contributor_id)->update(['contributor_comment' => $data['add_comment']]);
                }catch(\Exception $e){
                    return $e->getMessage();
                }

                if($contr_comment_update_empty == 0){
                    return response()->json(array(
                        'msg'=> 'No Comment was entered.',
                        'error'=>1,
                    ));
                }else{
                    return response()->json(array(
                        'msg'=> 'Unable to process.',
                        'error'=>1,
                    ));
                }
            }

            #checking if the added comment is already added.
            try{
                $contr_comment_text = DB::table('users')
                                    ->where('id', $contributor_id)
                                    ->where('contributor_comment', $contributor_add_comment)
                                    ->first();
            }catch(\Exception $e){
                return $e->getMessage();
            }

            #if not added, update
            try{
                if(empty($contr_comment_text)){
                    try{
                        $contributor_comment = DB::table('users')->where('id', $contributor_id)->update(['contributor_comment' => $data['add_comment']]);
                    }catch(\Exception $e){
                        return $e->getMessage();
                    }

                    if($contributor_comment == 1){
                        return response()->json(array(
                            'msg'=> 'Comment added successfully.',
                            'success'=>1,
                        ));
                    }else{
                        return response()->json(array(
                            'msg'=> 'Unable to add comment.',
                            'error'=>1,
                        ));
                    }
                }
            }catch(\Exception $e){
                return $e->getMessage();
            }
            
            #if value exists then dont update
            if($contr_comment_text){
                return response()->json(array(
                    'msg'=> 'Comment already saved.',
                    'error'=>1,
                ));
            }
        }#end of save comment if
    } #ends add /save comment function
} /* End Controller*/
