<?php
/**
 * 财务应付生成和检测脚本
 * Created by PhpStorm.
 * User: phperstar
 * Date: 2019/12/19
 * Time: 10:38 AM
 */
namespace Jobs\Model\MTopic\Finance;

use Mall\Framework\Core\StatusCode;

use Jobs\Cache\FinanceCache;

use Jobs\Dao\Purchase\DPurchase;
use Jobs\Dao\Purchase\DPurchaseOut;
use Jobs\Dao\Stock\DInventoryOut;
use Jobs\Dao\Stock\DInventoryInDetails;
use Jobs\Dao\Finance\DPay;
use Jobs\Dao\Finance\DPayReceiptIndex;


class MPayable
{
    private $objDPurchase;
    private $objDPurchaseOut;
    private $objDInventoryOut;
    private $objDPay;
    private $objDPayReceiptIndex;

    public function __construct()
    {
        $this->objDPurchase = new DPurchase('stock');
        $this->objDPurchaseOut = new DPurchaseOut('stock');
        $this->objDInventoryOut = new DInventoryOut('stock');
        $this->objDPay = new DPay('finance');
        $this->objDPayReceiptIndex = new DPayReceiptIndex('finance');
        //$this->objDPay->setSearchIndex('should_pay_receipt_search')->setType('should_pay_receipt');
    }

    /**
     * 检测销售出库单是否都生成应收单了
     */
    public function checkSaleOutCreateReceivable()
    {

    }

    /**
     * 采购入库单生成应付单
     */
    public function createPayable($params)
    {
        if (empty($params)) {
            echo '请求创建应付单参数为空'.PHP_EOL;
            return false;
        }

        if (empty($params['type'])) {
            echo '生成应付单:type字段错误,请提供单据类型'.PHP_EOL;
            return false;
        }

        $payableExtraData = [];
        $purchaseData = [];
        $payableData = [];
        //采购入库生成应付
        if($params['type'] == StatusCode::$orderType['purchaseIn']) {
            // 查询采购单信息
            $this->objDPurchase->setTable($this->objDPurchase->get_Table() . '_' . $params['enterpriseId']);
            $purchaseData = $this->objDPurchase->get(['id'=>$params['id']]);
            if($purchaseData === false){
                echo 'sql错误'.$this->objDPurchase->error().PHP_EOL;
                return false;
            }

            if (empty($purchaseData)) {
                echo '采购订单id:' . $params['id'] . '的数据为空'.PHP_EOL;
                return false;
            }

            // 获取入库金额生成应付
            $objDInventoryInDetails = new DInventoryInDetails('stock');
            $objDInventoryInDetails->setTable('qianniao_inventory_in_details_'.$params['enterpriseId']);
            $inDetailsData = $objDInventoryInDetails->select(['linkId' => $params['inventoryInId']]);
            if($inDetailsData === false){
                echo '查询采购订单对应的入库单详情数据错误'.$objDInventoryInDetails->error().PHP_EOL;
                return false;
            }
            if( empty($inDetailsData) ){
                echo '采购订单'.$params['id'].'对应的入库单详情数据为空'.PHP_EOL;
                return false;
            }

            $payMoney = 0;
            foreach ($inDetailsData as $key => $value){
                $payMoney = bcadd($payMoney, bcmul($value['inNum'], $value['unitPrice']), 2);
            }

            $payableExtraData = [
                'supplierId' => $purchaseData['supplierId'],
                'supplierName' => $purchaseData['supplierName'],
                'sourceNo' => $purchaseData['no'],
                //'payMoney' => $payMoney, // 应付 = 实际采购总成本-均摊费用
                'payMoney' => bcadd(bcsub($purchaseData['purchaseAmount'],$purchaseData['couponAmount'],2),$purchaseData['otherAmount'],2),
                'discountMoney' => $purchaseData['couponAmount'],
                'receiptTypeId' => StatusCode::$orderType['purchaseOrder'],
                'purchaseId' => $purchaseData['id'],
                'notOffsetMoney' => $payMoney,
            ];
            // 创建应付单数据
            $payableData = [
                'warehouseId' => $purchaseData['warehouseId'],
                'warehouseName' => $purchaseData['warehouseName'],
                'financeTypeId' => StatusCode::$orderType['purchaseReturn'],
                'financeType'   => '采购单',
                'auditStatus' => StatusCode::$auditStatus['auditing'],
                'createTime'  => time(),
                'updateTime'  => time(),
            ];
        }

        //采购退货出库生成应付
        if($params['type'] == StatusCode::$orderType['purchaseReturnOut']) {
            // 查询采购退货出库单信息
            $this->objDInventoryOut->setTable($this->objDInventoryOut->get_Table() . '_' . $params['enterpriseId']);
            $inventoryOutData = $this->objDInventoryOut->get(['id'=>$params['id']]);
            if($inventoryOutData === false){
                echo 'sql错误'.$this->objDInventoryOut->error().PHP_EOL;
                return false;
            }

            if (empty($inventoryOutData)) {
                echo '采购退货出库单id:' . $params['id'] . '的数据为空'.PHP_EOL;
                return false;
            }

            //查出源采购退货单对应的供应商Id和名称
            $this->objDPurchaseOut->setTable($this->objDPurchaseOut->get_Table() . '_' . $params['enterpriseId']);
            $purchaseData = $this->objDPurchaseOut->get(['no'=>$inventoryOutData['sourceNo']]);
            if($purchaseData === false){
                echo 'sql错误'.$this->objDPurchase->error().PHP_EOL;
                return false;
            }

            if (empty($purchaseData)) {
                echo '采购退货单no:' . $inventoryOutData['originNo'] . '的数据为空'.PHP_EOL;
                return false;
            }

            $payableExtraData = [
                'supplierId' => $purchaseData['supplierId'],
                'supplierName' => $purchaseData['supplierName'],
                'sourceNo' => $purchaseData['originNo'],//采购订单编号
                'payMoney' => '-'.bcadd($purchaseData['purchaseAmount'], $purchaseData['otherAmount'],4),//实际应付金额
                'discountMoney' => 0,
                'receiptTypeId' => StatusCode::$orderType['purchaseReturn'],
                'purchaseId' => $purchaseData['originId'],
                'notOffsetMoney'=>'-'.bcadd($purchaseData['purchaseAmount'], $purchaseData['otherAmount'],4),//实际应付金额
            ];
            // 创建应付单数据
            $payableData = [
                'warehouseId' => $purchaseData['warehouseId'],
                'warehouseName' => $purchaseData['warehouseName'],
                'financeTypeId' => StatusCode::$orderType['purchaseReturn'],
                'financeType'   => '采购退款单',
                'auditStatus' => StatusCode::$auditStatus['auditing'],
                'createTime'  => time(),
                'updateTime'  => time(),
            ];
        }

        /*foreach ($payableData as $key => $value) {
            if (empty($value) && $value !== 0) {
                echo $key . '参数错误';
                return false;
            }
        }*/
        $payableData = array_merge($payableData, $payableExtraData);

        // 添加应付单
        $this->objDPay->beginTransaction();
        $this->objDPay->setTable('qianniao_pay_receipt_' . $params['enterpriseId'] . '_' . date('Y') . '_' . ceil(date('m') / 3));

        //添加应付单no编号
        $dbResult =  $this->objDPay->get('createTime >='.strtotime(date('Ymd'.'0:0:0')), 'no', 'createTime desc');
        if ($dbResult === false) {
            echo '数据库查询失败'.$this->objDPay->error().PHP_EOL;
            return false;
        }
        if(empty($dbResult)){
            $payableData['no'] = createSerialNumberByDate('');
        }else{
            $payableData['no'] = createSerialNumberByDate($dbResult['no']);
        }

        //索引表数据
        $indexData = [
            'payReceiptId' => 0,
            'supplierId'       => $payableData['supplierId'],
            'sourceNo'         => $payableData['sourceNo'],
            'auditStatus'      => $payableData['auditStatus'],
            'financeTypeId'    => $payableData['financeTypeId'],
            'financeType'      => $payableData['financeType'],
            'warehouseId'      => $payableData['warehouseId'],
            'createTime'       => $payableData['createTime'],
            'updateTime'       => $payableData['updateTime'],

        ];
        $this->objDPayReceiptIndex->setTable('qianniao_pay_receipt_index_' . $params['enterpriseId']);
        $payReceiptId = $this->objDPayReceiptIndex->insert($indexData);
        if ($payReceiptId === false) {
            $this->objDPay->rollBack();
            echo 'sql错误'.$this->objDPayReceiptIndex->error().PHP_EOL;
            return false;
        }

        $payableData['id'] = $payReceiptId;
        $payableId = $this->objDPay->insert($payableData);
        if ($payableId === false) {
            $this->objDPay->rollBack();
            echo 'sql错误'.$this->objDPay->error().PHP_EOL;
            return false;
        }


        $this->objDPay->commit();

        /*
        $_id = self::createEsDocumentId($payableId, $params['enterpriseId']);
        $esData = $payableData;
        $esData['id'] = $payableId;
        $esData['enterpriseId'] = $params['enterpriseId'];
        $result = $this->objDPay->addUpSearchIndexDocument($esData, $_id);
        if (isset($result['_shards']) && isset($result['_shards']['successful']) && $result['_shards']['successful'] == 1) {
            //echo "es操作成功";die;
        }*/

        $objFinanceCache = new FinanceCache();
        $objFinanceCache->cacheExistPayEnterprise($params['enterpriseId']);

        echo '添加应付单成功'.PHP_EOL;
        return true;
    }

    private function createEsDocumentId($payId, $enterpriseId)
    {
        $t = date('Y') . '_' . ceil(date('m') / 3);
        return 'EnterpriseId_' . $enterpriseId . '_'. $t .'_payId_' . $payId;
    }

}