《ERP系统》客户信用及风控代码
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系统》客户信用及风控代码的更多相关文章
- 解析大型.NET ERP系统 高质量.NET代码设计模式
1 缓存 Cache 系统中大量的用到缓存设计模式,对系统登入之后不变的数据进行缓存,不从数据库中直接读取.耗费一些内存,相比从SQL Server中再次读取数据要划算得多.缓存的基本设计模式参考下面 ...
- AX2012 ERP “系统慢”调优---跟踪SQL执行,优化代码
对于用户来说,系统是:慢的,难用的.你看xxx,多好用,多快,多人性化. 对于AX ERP系统也不例外,调优是必须的,调优一般分为几种: 系统性监测针对瓶劲环节提升,如:用户--应用服务器--DB-- ...
- 解析大型.NET ERP系统 权限模块设计与实现
权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...
- 全面具体介绍一个P2P网贷领域的ERP系统的主要功能
一般的P2P系统,至少包含PC站点的前端和后端.前端系统的功能.能够參考"P2P系统哪家强,功能事实上都一样" http://blog.csdn.net/fansunion ...
- 全面详细介绍一个P2P网贷领域的ERP系统的主要功能
一般的P2P系统,至少包括PC网站的前端和后端.前端系统的功能,可以参考"P2P系统哪家强,功能其实都一样" http://blog.csdn.net/fansunion/ ...
- 解析大型.NET ERP系统 数据审计功能
数据审计,英语表达是Audit,是追踪数据变化的过程,记录数据变化前后的值,供参考分析.通过设置,ERP可以追踪一个表的所有字段的变化,也可以只记录指定的字段的值变化.欧美企业每年都有独立的审计部门, ...
- 解析大型.NET ERP系统 十三种界面设计模式
成熟的ERP系统的界面应该都是从模板中拷贝出来的,各类功能的界面有规律可遵循.软件界面设计模式化或是艺术性的创作,我认可前者,模式化的界面客户容易举一反三,降低学习门槛.除了一些小部分的功能界面设计特 ...
- 解析大型.NET ERP系统 界面与逻辑分离
Windows Forms程序实现界面与逻辑分离的关键是数据绑定技术(Data Binding),这与微软推出的ASP.NET MVC的原理相同,分离业务代码与界面层,提高系统的可维护性. 数据绑定 ...
- 解析大型.NET ERP系统 通用附件管理功能
大型系统具备一个通用的附件管理功能,对于单据中无法清晰表达的字段,用一个附件图片或附件文档表示是最好的方法了.比如物料清单附加一张CAD图纸,销售订单评审功能中附加客户的各种表格,通用附件功能对系统起 ...
随机推荐
- Qt Creator中根据为Windows系统还是Linux系统对源码进行条件编译
方法1: 在.h和.cpp文件中,针对需要不同平台编译的代码:添加上如下的条件编译指令: #ifdef 标识符 程序段1 #else 程序段2 #endif 举例说明如下: //Windows系统包含 ...
- PAT A1134 Vertex Cover (25 分)——图遍历
A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at le ...
- Tensorflow[目录结构]
1 - Tensorflow源码目录结构 基于2018年5月28日github的tensorflow源码,即1.8版本 第一层: tensorflow: 核心代码目录. third_party:第三方 ...
- Python常见十六个错误集合,你知道那些?
使用python会出现各种各样的错误,以下是Python常见的错误以及解决方法. 1.ValueError: 'Conv2d_1a_3×3' is not a valid scope name 这个是 ...
- Vue-条件渲染v-if与v-show
一.共同点 根据数据值来判断是否显示DOM元素 二.区别 代码: <!DOCTYPE html> <html lang="en"> <head> ...
- Bootstrap Modal 使用remote从远程加载内容
Bootstrap的Modal这个模态窗组件还是很好用的,但在开发的过程中模态窗中的内容大部分都是从后端加载的.要实现模态窗的内容是从后端加载话,常用的实现方式有2种.它们是: (1) ...
- Asp.Net MVC页面显示后台处理进度问题
这个问题的背景是,用户通过浏览器上传文件或Excel数据到系统中,页面需要时时显示后台处理进度,以增强用户的体验. 在GitHub上找到一个一个项目,基本实现了这个功能,具体效果如下图 代码实现过程大 ...
- Luogu P1447 [NOI2010]能量采集
Preface 最近反演题做多了看什么都想反演.这道题由于数据弱,解法多种多样,这里简单分析一下. 首先转化下题目就是对于一个点\((x,y)\),所消耗的能量就是\(2(\gcd(x,y)-1)+1 ...
- openMP多线程编程
OpenMP(Open Muti-Processing) OpenMP缺点: 1:作为高层抽象,OpenMp并不适合需要复杂的线程间同步和互斥的场合: 2:另一个缺点是不能在非共享内存系统(如计算机集 ...
- aurora 64B/66B ip核设置与例程代码详解
见网页https://blog.csdn.net/u014586651/article/details/84349328 https://blog.csdn.net/u012135070/articl ...