<?php

namespace App\Console\Commands;

use App\Http\Controllers\InvLibController;
use App\Models\InvHead;
use App\Models\Param;
use Illuminate\Console\Command;

class TaxTxt extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'TaxTxt {--branch=} {--date1=} {--date2=}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '營業稅營業人進銷項資料檔 {--branch=分支統編} {--date1=開始日期} {--date2=結束日期}';

    public static $Param = [];

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */

/*
// 格式代號 X(002) 1 2
// 申報營業人稅籍編號 X(009) 3 11
// 流水號 X(007) 12 18
// 資料所屬年月
// 資料所屬年度 9(003) 19 21
// 資料所屬月份 9(002) 22 23
// 買受人統一編號 X(008) 24 31 欄位共用
// 發票訖號 9(008) 24 31
// 銷售人統一編號 X(008) 32 39欄位共用
// 統一發票 發票字軌 X(002) 40 41
// 發票(起)號碼 9(008) 42 49
// 彙總張數 9(004) 32 35
// 空白 X(004) 36 39
// 其他憑證號碼 X(010) 40 49
// 公用事業載具流水號 X(010) 40 49
// 空白 X(004) 32 35
// 海關代徵營業稅繳納 證號碼 X(014) 36 49
// 銷售金額 9(012) 50 61 欄位共用
// 營業稅稅基 9(012) 50 61
// 課稅別 X(001) 62 62
// 營業稅額 9(010) 63 72
// 扣抵代號 X(001) 73 73
// 空白 X(005) 74 78
// 特種稅額稅率 X(001) 79 79
// 彙加註記 X(001) 80 80 欄位共用
// 分攤註記 X(001) 80 80
// 通關方式註記 X(001) 81 81
 */

    public function handle()
    {

        if (null !== $this->option('branch')) {
            config(["app.store_id" => $this->option('branch')]);
        }
        self::$Param = Param::orderBy('id')->get()->keyby('id');

        if (self::$Param['95']->param_value == '') {
            $this->error('設先設定稅籍編號...');
            exit;
        }

        $br = PHP_EOL;

        if (null !== $this->option('date1')) {
            $date1 = $this->option('date1');
        } else {
            $date1 = date('Y-m-d');
        }
        if (null !== $this->option('date2')) {
            $date2 = $this->option('date2');
        } else {
            $date2 = date('Y-m-d');
        }
        $year = substr($date2, 0, 4) - 1911;
        $month = substr($date2, 5, 2);
        // echo $month.PHP_EOL;

        $txt = '';
        // echo $date1 . '~' . $date2 .PHP_EOL;
        $sell_id = self::$Param['2']->param_value;
        $lib = new InvLibController();
        $sells = InvHead::where('InvoiceDate', '>=', $date1)->where('InvoiceDate', '<=', $date2)->Orderby('InvoiceNumber')->Get();
        $counter = 0;

        if (count($sells) == 0) {
            echo '無任何資料';
            exit;
        }

        foreach ($sells as $key => $value) {
            $counter++;
            $txt .= '35'; // 格式代號 X(002) 1 2
            $txt .= self::$Param['95']->param_value; // 申報營業人稅籍編號 X(009) 3 11
            $txt .= sprintf('%07d', $counter); // 流水號 X(007) 12 18
            // 資料所屬年月
            $txt .= $year; // 資料所屬年度 9(003) 19 21
            $txt .= $month; // 資料所屬月份 9(002) 22 23
            //24-31
            //A.
            $txt .= ($value->Identifier == '0000000000') ? '00000000' : $value->Identifier; // 買受人統一編號 X(008) 24 31
            //B. 發票訖號 9(008) 24 31

            //32-49
            //A.
            $txt .= $sell_id; // 銷售人統一編號 X(008) 32 39
            $txt .= $value->InvoiceNumber; // 統一發票 發票字軌 X(002) 40 41 發票號碼 9(008) 42 49
            //B.
            // 彙總張數 9(004) 32 35
            // 空白 X(004) 36 39
            // 其他憑證號碼 X(010) 40 49
            //C.
            // 彙總張數 9(004) 32 35
            // 空白 X(004) 36 39
            // 公用事業載具流水號 X(010) 40 49
            //E.
            // 空白 X(004) 32 35
            // 海關代徵營業稅繳納 證號碼 X(014) 36 49

            //50-61
            /*
            非營業人 內含稅
            銷項稅額 = 當期開立統一發票總額 ÷（１＋徵收率）× 徵收率 （四捨五入）
            銷售額 = 當期開立統一發票總額 － 銷項稅額
            營業人 外稅
            銷售額 = 定價 ÷（１＋ 徵收率）
            銷項稅額 = 銷售額 × 徵收率
             */
            //A.
            if (($value->Identifier == '0000000000')) {
                if ($value->TaxRate != 0) {
                    $txt .= sprintf('%012d', $value->TotalAmount - round($value->TotalAmount / (1 + $value->TaxRate) * $value->TaxRate)); // 銷售金額 9(012) 50 61 欄位共用
                } else {
                    $txt .= sprintf('%012d', round($value->TotalAmount));
                }
            } else {
                $txt .= sprintf('%012d', $value->TotalAmount - $value->TaxAmount); // 銷售金額 9(012) 50 61 欄位共用
            }

            //B.
            // 營業稅稅基 9(012) 50 61
            if (in_array($value->MessageType, ['C0401', 'A0401', 'A0101'])) {
                $txt .= ($value->TaxType != '') ? trim($value->TaxType) : '1'; // 課稅別 X(001) 62 62
            } else {
                $txt .= 'F';
            }
/*
1 代表應稅。
2 代表零稅率。
3 代表免稅。
F 代表作廢發票。
D 代表空白未使用之統一發票。
（課稅別 F 或 D，除格式代號、申報營業人稅籍編號、流水號、資料所屬年月、銷售人統一編號及發票字軌（起、訖）號碼外，其他欄項應為空白或零
 */
            // 營業稅額 9(010) 63 72
            if (($value->Identifier == '0000000000')) {
                if ($value->TaxRate != 0) {
                    $txt .= sprintf('%010d', round($value->TotalAmount / (1 + $value->TaxRate) * $value->TaxRate)); // 營業稅額 9(010) 63 72
                } else {
                    $txt .= sprintf('%010d', 0);
                }
            } else {
                $txt .= sprintf('%010d', $value->TaxAmount); // 營業稅額 9(010) 63 72
            }
            $txt .= ' '; // 扣抵代號 X(001) 73 73
            /*
            1 代表進項可扣抵之進貨及費用。
            2 代表進項可扣抵之固定資產。
            3 代表進項不可扣抵之進貨及費用。
            4 代表進項不可扣抵之固定資產。
            空白代表銷項憑證
             */
            $txt .= '     '; // 空白 X(005) 74 78
            $txt .= ' '; // 特種稅額稅率 X(001) 79 79
            /*
            1 代表酒家及有陪侍服務之茶室、咖啡廳、酒吧等之營 業稅稅率。
            2 代表夜總會、有娛樂節目之餐飲店之營業稅稅率。
            3 代表銀行業、保險業、信託投資業、證券業、期貨業、
            票券業及典當業之專屬本業收入（不含銀行業、保險
            業經營銀行、保險本業收入）營業稅稅率。
            4 代表保險業之再保費收入之營業稅稅率。
            5 代表銀行業、保險業、信託投資業、證券業、期貨業、
            票券業及典當業之非專屬本業收入營業稅稅率。
            6 代表銀行業、保險業經營銀行、保險本業收入之營業 稅稅率（適用於一百零三年七月以後銷售額）。
            7 代表銀行業、保險業經營銀行、保險本業收入之營業 稅稅率（適用於一百零三年六月以前銷售額）。
            空白代表免稅或非銷項特種稅額之資料。
             */
            //80
            //A.
            $txt .= ' '; // 彙加註記 X(001) 80 80 欄位共用
            //B.
            // 分攤註記 X(001) 80 80
            if ($value->ZeroTaxSalesAmount > 0) {
                $txt .= ($value->CustomsClearanceMark != '') ? $value->CustomsClearanceMark : '1'; // 通關方式註記 X(001) 81 81
            } else {
                $txt .= ' ';
            }
            $txt .= "\n";
        }
        //echo $txt;
        file_put_contents(storage_path($sell_id . '.TXT'), $txt);
    }

}
