《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图纸,销售订单评审功能中附加客户的各种表格,通用附件功能对系统起 ...
随机推荐
- <<linux device driver,third edition>> Chapter 3:Char Drivers
The Internal Representation of Device Numbers Within the kernel,the dev_t type(defined in linux/type ...
- linux调度器源码分析 - 初始化(二)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 上期文章linux调度器源码分析 - 概述(一)已经把调度器相关的数据结构介绍了一遍,本篇着重通过代码说明 ...
- [08] AOP基本概念和使用
1.什么是AOP AOP = Aspect Oriental Programing,即面向切面编程.什么概念,我们看如下的图片: 三个方法中,重复使用了代码A和代码B,典型的场景比如"开启事 ...
- 人生苦短之学习Python50本书籍(包涵基础、算法、机器学习、模块、爬虫框架、树莓派等)总有你想要的书籍
很多小伙伴说想学习想学习但是没有学习书籍,我给大家分享一大波学习书籍,具体的可以自己往下翻 <"笨办法学"Python3> Zed Shaw 著 (2018年5月) ...
- Cordova套网站
用Cordova套网站,只修改Content的话,打包后的App,在点击后会打开浏览器,并没有在App中显示内容. 需要设置allow-navigation为 * <?xml version=' ...
- 通过C# WinForm控件创建的WPF WIndow窗口控件无法输入的问题
原文:通过WinForm控件创建的WPF 控件无法输入的问题 今天把写的一个WPF程序发布到别的机器上执行,发现一个比较奇怪的问题:在那个机器上用英文输入法无法输入数字,非要切换到中文输入法才行:但在 ...
- 阿里云ubuntu 16.04搭建odoo11服务器
ubuntu 16.04 具体如何搭建odoo11网站的具体步骤可以参考这一篇文章 按上面的文章配置环境后,自己网站的启动具体步骤如下: 1.登录阿里云 [远程连接],进入命令行界面1 2.cd到目录 ...
- Ionic Android项目Splash设置
ionic项目中,在splashscreen消失后会出现零点几秒的白屏,再出现app页面. 1. 安装Cordova splash screen插件 ionic plugin add org.apac ...
- java内存模型与volatile变量与Atomic的compareAndSet
java分主内存和工作内存, 主内存是线程共享的, 工作内存是每个线程独有的. java对主内存的操作是通过工作内存间接完成的: 先拷贝主内存变量值到工作内存, 在工作内存操作这个变量的副本, 完成后 ...
- synchronized和Lock的异同
JAVA语言使用两种机制来实现堆某种共享资源的同步,synchronized和Lock.其中,synchronized使用Object对象本身的notify.wait.notifyAll调度机制,而l ...