1.风控核心代码:

<?php

namespace core\models;

class SalesCustomersFacade extends \common\models\Base{

    /**
     * 根据申请记录修改信用额度
     * @param $salesCustomersCreditModel
     * @return array
     */
    public static function updateCreditByApply($salesCustomersCreditModel){

        if(\core\models\SalesCustomersCredit::STATUS_FINISH == $salesCustomersCreditModel->sales_customers_credit_review_status){
            return ['status'=>false, 'code'=>"05010240", 'message'=>'信用额度已经更新,不能重复更新'];
        }
        $transaction = \Yii::$app->db->beginTransaction();
        try {
            //添加信用额度变更记录
            $sales_customers_credit_result = \core\models\SalesCustomersCreditRecord::insertByApply($salesCustomersCreditModel);
            if (false == $sales_customers_credit_result){
                throw new \yii\db\Exception('新增信用额度变更记录失败!', '05010243');
            }

            //更新信用额度快照
            $sales_customers_result = \core\models\SalesCustomers::updateSalesCustomersByApply($salesCustomersCreditModel);
            if (false == $sales_customers_result){
                throw new \yii\db\Exception('更新客户信用额度失败!', '05010244');
            }

            //更新信用额度申请记录状态为完成
            $sales_customers_credit_result = \core\models\SalesCustomersCredit::updateFinishStatusByApply($salesCustomersCreditModel);
            if (false == $sales_customers_credit_result){
                throw new \yii\db\Exception('更新客户信用额度申请记录状态失败!', '05010245');
            }

            $transaction->commit();
            return ['status'=>true, 'code'=>'0', 'message'=>'更新信用额度成功'];
        }catch (\yii\db\Exception $e){
            $transaction->rollBack();
            return ['status'=>false, 'code'=>$e->getCode(), 'message'=>$e->getMessage()];
        }
    }

    public static function updateCreditByOrder($salesOrderModel){
        //判断不是先货后款
        if (\core\models\SalesOrder::TYPE_WMS_BEFORE != $salesOrderModel->sales_order_settle_mode){
            return ['status'=>false, 'code'=>"05010250", 'message'=>'订单付款状态不是先货后款'];
        }

        //判断审批状态不是已完成
        $status = \core\models\CommonApproveStatus::getApprovalStatus($salesOrderModel->sales_order_code, \core\models\CommonDingtalkApproval::SALES_ORDER);
        if(!in_array($status, array(\core\models\DingtalkApproval::COMPLETE_APPROVAL))){
            return ['status'=>false, 'code'=>"05010251", 'message'=>'订单状态审批不是已完成'];
        }

        $transaction = \Yii::$app->db->beginTransaction();
        try {
            //添加信用额度变更记录
            $sales_customers_credit_result = \core\models\SalesCustomersCreditRecord::insertByOrder($salesOrderModel);
            if (false == $sales_customers_credit_result){
                throw new \yii\db\Exception('新增信用额度变更记录失败!', '05010252');
        }

            //更新信用额度快照
            $sales_customers_result = \core\models\SalesCustomers::updateSalesCustomersByOrder($salesOrderModel);
            if (false == $sales_customers_result){
                throw new \yii\db\Exception('更新客户信用额度失败!', '05010244');
            }

            //更新信用额度申请记录状态为完成
            $sales_order_result = \core\models\SalesOrder::updateFinishStatusByOrder($salesOrderModel);
            if (false == $sales_order_result){
                throw new \yii\db\Exception('更新订单状态失败!', '05010245');
            }

            $transaction->commit();
            return ['status'=>true, 'code'=>'0', 'message'=>'更新信用额度成功'];
        }catch (\yii\db\Exception $e){
            $transaction->rollBack();
            return ['status'=>false, 'code'=>$e->getCode(), 'message'=>$e->getMessage()];
        }
    }

    public static function updateCreditByRepay($financeInvoiceModel){
        $salesOrderModel = $financeInvoiceModel->salesOrder;
        //判断不是先货后款
        if (\core\models\SalesOrder::TYPE_WMS_BEFORE != $salesOrderModel->sales_order_settle_mode){
            return ['status'=>false, 'code'=>"05010250", 'message'=>'订单付款状态不是先货后款'];
        }

        //获取发票信息
        $financeInvoiceModel = \core\models\FinanceSalesInvoice::find()->where(['is_del'=>0, 'sales_order_code'=>$salesOrderModel->sales_order_code])->one();
        if (empty($financeInvoiceModel)){
            return ['status'=>false, 'code'=>"05010252", 'message'=>'发票信息不存在'];
        }

        if ($financeInvoiceModel->finance_sales_invoice_settle_status != 1){
            return ['status'=>false, 'code'=>"05010253", 'message'=>'订单未回款'];
        }

        $transaction = \Yii::$app->db->beginTransaction();
        try {
            //添加信用额度变更记录
            $sales_customers_credit_result = \core\models\SalesCustomersCreditRecord::insertByRepay($financeInvoiceModel);
            if (false == $sales_customers_credit_result){
                throw new \yii\db\Exception('新增信用额度变更记录失败!', '05010252');
            }

            //更新信用额度快照
            $sales_customers_result = \core\models\SalesCustomers::updateSalesCustomersByRepay($financeInvoiceModel);
            if (false == $sales_customers_result){
                throw new \yii\db\Exception('更新客户信用额度失败!', '05010244');
            }

            //更新信用额度申请记录状态为完成
            /*
            $sales_order_result = \core\models\FinanceSalesInvoice::updateFinishStatusByRepay($financeInvoiceModel);
            if (false == $sales_order_result){
                throw new \yii\db\Exception('更新订单状态失败!', '05010245');
            }
            */
            $transaction->commit();
            return ['status'=>true, 'code'=>'0', 'message'=>'更新信用额度成功'];
        }catch (\yii\db\Exception $e){
            $transaction->rollBack();
            return ['status'=>false, 'code'=>$e->getCode(), 'message'=>$e->getMessage()];
        }
    }

    /**
     * 根据信用额度判断能否签订合同
     * @param $sales_contract
     * @return bool
     */
    public static function canContractByCredit($salesContractModel){
        $salesCustomersModel = $salesContractModel->salesCustomers;
        //判断是否先款后货
        if (\core\models\SalesContract::TYPE_FINANCE_BEFORE == $salesContractModel->sales_contract_settle_mode){
            return ['status'=>true, 'errcode'=>'0', 'errmsg'=>'ok'];
        }
        //判断上一单是否已经回款
        $lastestSaleOrderModels = \core\models\SalesOrder::find()->where([
            'is_del'=>0,
            'sales_customers_id'=>$salesCustomersModel->id,
            'sales_order_settle_mode'=>\core\models\SalesOrder::TYPE_WMS_BEFORE])->all();
        if (!empty($lastestSaleOrderModels)){
            foreach ($lastestSaleOrderModels as $lastestSaleOrderModel){
                $status = \core\models\CommonApproveStatus::getApprovalStatus($lastestSaleOrderModel->sales_order_code, \core\models\CommonDingtalkApproval::SALES_ORDER);
                if (empty($lastestSaleOrderModel->send_out_at)){
                    $send_out_at = 0;
                }else{
                    $send_out_at = $lastestSaleOrderModel->send_out_at;
                }
                if($status == \core\models\DingtalkApproval::COMPLETE_APPROVAL
                    && (time() - $send_out_at > $salesContractModel->sales_contract_aging)
                    && empty($lastestSaleOrderModel->repay_status == 0)){
                    return ['status'=>false, 'errcode'=>'050204', 'errmsg'=>'上一单超账期未回款'];
                }
            }
        }

        //判断信用额度是否已经过期
        $salesCustomersModel = \core\models\SalesCustomers::findOne(['id'=>$salesContractModel->sales_customers_id]);
        if ($salesCustomersModel->sales_customers_credit_end_at < time()){
            return ['status'=>false, 'errcode'=>'050201', 'errmsg'=>'客户资质已经过期'];
        }
        //判断信用额度是否已经不足
        if ($salesCustomersModel->sales_customers_credit_surplus < \common\models\Base::moneyBcmul($salesContractModel->sales_contract_receivables)){
            return ['status'=>false, 'errcode'=>'050202', 'errmsg'=>'客户信用余额不足'];
        }
        return ['status'=>true, 'errcode'=>'0', 'errmsg'=>'ok'];
    }

    /**
     * 根据信用额度判断能否下订单
     * @param $sales_contract
     * @return bool
     */
    public static function canOrderByCredit($salesOrderModel){
        $salesCustomersModel = $salesOrderModel->salesCustomers;
        $salesContractModel = $salesOrderModel->salesContract;
        //判断是否先款后货
        if (\core\models\SalesOrder::TYPE_FINANCE_BEFORE == $salesOrderModel->sales_order_settle_mode){
            return ['status'=>true, 'errcode'=>'0', 'errmsg'=>'ok'];
        }
        //判断上一单是否已经回款
        $lastestSaleOrderModels = \core\models\SalesOrder::find()->where([
            'is_del'=>0,
            'sales_customers_id'=>$salesCustomersModel->id,
            'sales_order_settle_mode'=>\core\models\SalesOrder::TYPE_WMS_BEFORE])->andWhere(['!=', 'id', $salesOrderModel->id])->all();
        if (!empty($lastestSaleOrderModels)){
            foreach ($lastestSaleOrderModels as $lastestSaleOrderModel){
                $status = \core\models\CommonApproveStatus::getApprovalStatus($lastestSaleOrderModel->sales_order_code, \core\models\CommonDingtalkApproval::SALES_ORDER);
                if (empty($lastestSaleOrderModel->send_out_at)){
                    $send_out_at = 0;
                }else{
                    $send_out_at = $lastestSaleOrderModel->send_out_at;
                }
                if($status == \core\models\DingtalkApproval::COMPLETE_APPROVAL
                && (time() - $send_out_at > $salesContractModel->sales_contract_aging)
                && empty($lastestSaleOrderModel->repay_status == 0)){
                    return ['status'=>false, 'errcode'=>'050204', 'errmsg'=>'上一单超账期未回款'];
                }
            }
        }

        //判断信用额度是否已经过期
        $salesCustomersModel = \core\models\SalesCustomers::findOne(['id'=>$salesOrderModel->sales_customers_id]);
        if ($salesCustomersModel->sales_customers_credit_end_at < time()){
            return ['status'=>false, 'errcode'=>'050206', 'errmsg'=>'客户资质已经过期'];
        }
        //判断信用额度是否已经不足
        if ($salesCustomersModel->sales_customers_credit_surplus < $salesOrderModel->sales_order_total_amount){
            return ['status'=>false, 'errcode'=>'050207', 'errmsg'=>'客户信用余额不足'];
        }
        //判断订单额度是否超出合同额度
        if ($salesContractModel->sales_contract_amount < \common\models\Base::moneyBcdiv($salesOrderModel->sales_order_total_amount)){
            return ['status'=>false, 'errcode'=>'050208', 'errmsg'=>'订单总金额超出合同总金额'];
        }
        return ['status'=>true, 'errcode'=>'0', 'errmsg'=>'ok'];
    }

    public static function canCreditApplyByCredit($salesCustomersModel){
        $salesCustomersCreditModels = $salesCustomersModel->salesCustomersCredit;

        if (empty($salesCustomersCreditModels)){
            $return_arr = ['flag'=>true, 'message'=>'信用申请'];
            return $return_arr;
        }else{
            foreach ($salesCustomersCreditModels as $salesCustomersCreditModel){
                $approval = \core\models\CommonDingtalkApproval::SALES_CUSTOMER_CREDIT;
                $status = \core\models\CommonApproveStatus::getApprovalStatus($salesCustomersCreditModel->sales_customers_credit_code, $approval);
                $update_credit_status = $salesCustomersCreditModel->sales_customers_credit_review_status;

                if ($update_credit_status != \core\models\DingtalkApproval::COMPLETE_APPROVAL){
                    $return_arr = ['flag'=>false, 'message'=>''];
                    return $return_arr;
                }

                if ($update_credit_status != \core\models\SalesCustomersCredit::STATUS_FINISH){
                    $return_arr = ['flag'=>false, 'message'=>''];
                    return $return_arr;
                }
            }
            $return_arr = ['flag'=>true, 'message'=>'信用变更申请'];
            return $return_arr;
        }
    }
}

  

《ERP系统》客户信用及风控代码的更多相关文章

  1. 解析大型.NET ERP系统 高质量.NET代码设计模式

    1 缓存 Cache 系统中大量的用到缓存设计模式,对系统登入之后不变的数据进行缓存,不从数据库中直接读取.耗费一些内存,相比从SQL Server中再次读取数据要划算得多.缓存的基本设计模式参考下面 ...

  2. AX2012 ERP “系统慢”调优---跟踪SQL执行,优化代码

    对于用户来说,系统是:慢的,难用的.你看xxx,多好用,多快,多人性化. 对于AX ERP系统也不例外,调优是必须的,调优一般分为几种: 系统性监测针对瓶劲环节提升,如:用户--应用服务器--DB-- ...

  3. 解析大型.NET ERP系统 权限模块设计与实现

    权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...

  4. 全面具体介绍一个P2P网贷领域的ERP系统的主要功能

        一般的P2P系统,至少包含PC站点的前端和后端.前端系统的功能.能够參考"P2P系统哪家强,功能事实上都一样" http://blog.csdn.net/fansunion ...

  5. 全面详细介绍一个P2P网贷领域的ERP系统的主要功能

        一般的P2P系统,至少包括PC网站的前端和后端.前端系统的功能,可以参考"P2P系统哪家强,功能其实都一样" http://blog.csdn.net/fansunion/ ...

  6. 解析大型.NET ERP系统 数据审计功能

    数据审计,英语表达是Audit,是追踪数据变化的过程,记录数据变化前后的值,供参考分析.通过设置,ERP可以追踪一个表的所有字段的变化,也可以只记录指定的字段的值变化.欧美企业每年都有独立的审计部门, ...

  7. 解析大型.NET ERP系统 十三种界面设计模式

    成熟的ERP系统的界面应该都是从模板中拷贝出来的,各类功能的界面有规律可遵循.软件界面设计模式化或是艺术性的创作,我认可前者,模式化的界面客户容易举一反三,降低学习门槛.除了一些小部分的功能界面设计特 ...

  8. 解析大型.NET ERP系统 界面与逻辑分离

    Windows Forms程序实现界面与逻辑分离的关键是数据绑定技术(Data Binding),这与微软推出的ASP.NET MVC的原理相同,分离业务代码与界面层,提高系统的可维护性. 数据绑定 ...

  9. 解析大型.NET ERP系统 通用附件管理功能

    大型系统具备一个通用的附件管理功能,对于单据中无法清晰表达的字段,用一个附件图片或附件文档表示是最好的方法了.比如物料清单附加一张CAD图纸,销售订单评审功能中附加客户的各种表格,通用附件功能对系统起 ...

随机推荐

  1. 安装docker后访问外网失败

    服务器网段是(172.17)与docker默认桥接的网桥号段相同 docker version 17.03.2-ce 1.centOS6 原文链接 http://www.bubuko.com/info ...

  2. JavaScript高级程序设计学习(一)之介绍

    作为一名web开发人员,日常用的最多的就是js,也就是大名鼎鼎的ECMAScript,又称javascript.再次声明js与java除了语法上相似,没有半毛钱关系.据说之所以叫javascript, ...

  3. STM32固件库详解

    STM32固件库详解   emouse原创文章,转载请注明出处http://www.cnblogs.com/emouse/ 应部分网友要求,最新加入固件库以及开发环境使用入门视频教程,同时提供例程模板 ...

  4. python多版本共存问题(以2.7和3.5系列版本为例)

    1.0 下载Python2.7x和Python3.5x版本 2.0 安装Python 3.0 配置环境变量,分别添加至path路径 4.0 只修改Python27文件中的.exe文件(这样系统默认为P ...

  5. VS2015编写的MFC上位机,波特率可调,可动态显示曲线,可显示三维

    VS2015编写的MFC上位机,波特率可调,可动态显示曲线,可显示三维 2016年01月14日 11:40:28 博博有个大大大的Dream 阅读数:9375   版权声明:本文为博主原创文章,未经博 ...

  6. java算法----排序----(1)插入排序

    package log; public class Test4 { /** * java算法---插入排序 * * @param args */ public static void main(Str ...

  7. Spring Extensible XML

    Spring框架从2.0版本开始,提供了基于Schema风格的Spring XML格式用来定义bean的扩展机制.引入Schema-based XML是为了对Traditional的XML配置形式进行 ...

  8. CF1097D Makoto and a Blackboard 积性函数、概率期望、DP

    传送门 比赛秒写完ABC结果不会D--最后C还fst了qwq 首先可以想到一个约数个数\(^2\)乘上\(K\)的暴力DP,但是显然会被卡 在\(10^{15}\)范围内因数最多的数是\(978217 ...

  9. 一个可爱 & 小清新的加载等待Android控件

    https://github.com/Carson-Ho/Kawaii_LoadingView

  10. 浅谈博弈论中的两个基本模型——Bash Game&&Nim Game

    最近在数学这一块搞了蛮多题目,已经解决了数论基础,线性代数(只有矩阵,行列式待坑),组合数学中的一些简单问题.所以接下来不可避免的对博弈论这一哲学大坑开工. 当然,由于我很菜,所以也只能从最基础最容易 ...