mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-23 02:45:33 +08:00
482 lines
20 KiB
PHP
482 lines
20 KiB
PHP
<?php
|
||
/**
|
||
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*/
|
||
|
||
class finance_ctl_bill extends desktop_controller{
|
||
var $flag = 'sale';
|
||
/**
|
||
* sale
|
||
* @return mixed 返回值
|
||
*/
|
||
public function sale(){
|
||
$is_export = kernel::single('desktop_user')->has_permission('finance_export');#增加销售收退款单导出权限
|
||
$this->title = '销售收退款单';
|
||
$base_filter = array('fee_type_id'=>'0');
|
||
$this->base_filter = $base_filter;
|
||
$this->flag = 'sale';
|
||
$params = array(
|
||
'title'=>$this->title,
|
||
'actions'=>array(
|
||
array(
|
||
'label' => '批量审核记账',
|
||
'submit' => 'index.php?app=finance&ctl=bill&act=do_charge&finder_id='.$_GET['finder_id'],
|
||
),
|
||
array(
|
||
'label' => '添加账单',
|
||
'href' => 'index.php?app=finance&ctl=bill&act=add_bill&flt=sale&finder_id='.$_GET['finder_id'],
|
||
'target' => "dialog::{width:300,height:350,title:'添加账单'}",
|
||
),
|
||
array(
|
||
'label' => '拉取账单',
|
||
'href' => 'index.php?app=finance&ctl=bill&act=trade_search&flt=sale&finder_id='.$_GET['finder_id'],
|
||
'target' => "dialog::{width:550,height:150,title:'拉取账单'}",
|
||
),
|
||
),
|
||
'use_buildin_new_dialog' => false,
|
||
'use_buildin_set_tag'=>false,
|
||
'use_buildin_recycle'=>false,
|
||
'use_buildin_export'=>$is_export,
|
||
'use_buildin_import'=>false,
|
||
'use_buildin_filter'=>true,
|
||
'use_view_tab'=>true,
|
||
'finder_aliasname'=>'ar_sale',
|
||
'finder_cols'=>'column_edit,bill_bn,channel_name,member,trade_time,order_bn,fee_item,money,status,unconfirm_money,confirm_money,charge_status,charge_time,monthly_status',
|
||
'base_filter' => $base_filter,
|
||
);
|
||
$this->finder('finance_mdl_bill',$params);
|
||
}
|
||
|
||
/**
|
||
* index
|
||
* @return mixed 返回值
|
||
*/
|
||
public function index(){
|
||
$this->title = '销售费用单';
|
||
$this->flag = 'unsale';
|
||
$base_filter = array('fee_type_id|noequal'=>'1');
|
||
$this->base_filter = $base_filter;
|
||
$params = array(
|
||
'title'=>$this->title,
|
||
'actions'=>array(
|
||
array(
|
||
'label' => '批量审核记账',
|
||
'submit' => 'index.php?app=finance&ctl=bill&act=do_charge&finder_id='.$_GET['finder_id'],
|
||
),
|
||
array(
|
||
'label' => '添加费用单',
|
||
'href' => 'index.php?app=finance&ctl=bill&act=add_bill&finder_id='.$_GET['finder_id'],
|
||
'target' => "dialog::{width:300,height:350,title:'添加费用单'}",
|
||
),
|
||
),
|
||
'use_buildin_new_dialog' => false,
|
||
'use_buildin_set_tag'=>false,
|
||
'use_buildin_recycle'=>false,
|
||
'use_buildin_export'=>false,
|
||
'use_buildin_import'=>false,
|
||
'use_buildin_filter'=>true,
|
||
'use_view_tab'=>true,
|
||
'finder_aliasname'=>'ar_unsale',
|
||
'finder_cols'=>'bill_bn,channel_name,fee_obj,member,trade_time,order_bn,fee_type,fee_item,money,charge_status,charge_time,monthly_status,column_edit',
|
||
'base_filter' => $base_filter,
|
||
);
|
||
$this->finder('finance_mdl_bill',$params);
|
||
}
|
||
|
||
function _views(){
|
||
if($this->flag == 'sale'){
|
||
$sub_menu = $this->_viewsale();
|
||
}else{
|
||
$sub_menu = $this->_viewunsale();
|
||
}
|
||
return $sub_menu;
|
||
}
|
||
|
||
function _viewsale(){
|
||
$arObj = $this->app->model('bill');
|
||
$sub_menu = array(
|
||
0 => array('label'=>app::get('base')->_('全部'),'filter'=>array('fee_type_id'=>1),'addon'=>$arObj->count(array('fee_type_id'=>1)),'optional'=>false),
|
||
1 => array('label'=>app::get('base')->_('未记账'),'filter'=>array('fee_type_id'=>1,'charge_status'=>0),'addon'=>$arObj->count(array('fee_type_id'=>1,'charge_status'=>0)),'optional'=>false),
|
||
2 => array('label'=>app::get('base')->_('待核销'),'filter'=>array('fee_type_id'=>1,'status|noequal'=>2,'charge_status'=>1),'addon'=>$arObj->count(array('fee_type_id'=>1,'status|noequal'=>2,'charge_status'=>1)),'optional'=>false),
|
||
3 => array('label'=>app::get('base')->_('已核销'),'filter'=>array('fee_type_id'=>1,'status'=>2),'addon'=>$arObj->count(array('fee_type_id'=>1,'status'=>2)),'optional'=>false),
|
||
);
|
||
return $sub_menu;
|
||
}
|
||
|
||
function _viewunsale(){
|
||
$arObj = $this->app->model('bill');
|
||
$sub_menu = array(
|
||
0 => array('label'=>app::get('base')->_('全部'),'filter'=>array('fee_type_id|noequal'=>1),'addon'=>$arObj->count(array('fee_type_id|noequal'=>1)),'optional'=>false),
|
||
1 => array('label'=>app::get('base')->_('未记账'),'filter'=>array('fee_type_id|noequal'=>1,'charge_status'=>0),'addon'=>$arObj->count(array('fee_type_id|noequal'=>1,'charge_status'=>0)),'optional'=>false),
|
||
2 => array('label'=>app::get('base')->_('已记账'),'filter'=>array('fee_type_id|noequal'=>1,'charge_status'=>1),'addon'=>$arObj->count(array('fee_type_id|noequal'=>1,'charge_status'=>1)),'optional'=>false),
|
||
);
|
||
return $sub_menu;
|
||
}
|
||
|
||
//批量记账
|
||
/**
|
||
* do_charge
|
||
* @return mixed 返回值
|
||
*/
|
||
public function do_charge(){
|
||
$this->begin('javascript:finderGroup["'.$_GET['finder_id'].'"].refresh();');
|
||
$billObj = app::get('finance')->model('bill');
|
||
if($_POST['isSelectedAll'] == '_ALL_'){
|
||
$where = $billObj->_filter($_POST);
|
||
$sql = 'select bill_id from sdb_finance_bill where '.$where;
|
||
$rs = kernel::database()->select($sql);
|
||
$ids = array();
|
||
foreach($rs as $v){
|
||
$ids['bill_id'][] =$v['bill_id'];
|
||
}
|
||
}else{
|
||
$ids = $_POST;
|
||
}
|
||
$res = kernel::single('finance_bill')->do_charge($ids);
|
||
if($res['status'] == 'fail'){
|
||
$this->end(false,$res['msg'],'javascript:finderGroup["'.$_GET['finder_id'].'"].refresh();');
|
||
}
|
||
$this->end(true,'操作成功!','javascript:finderGroup["'.$_GET['finder_id'].'"].refresh();');
|
||
}
|
||
|
||
//添加收退款单
|
||
/**
|
||
* 添加_bill
|
||
* @return mixed 返回值
|
||
*/
|
||
public function add_bill(){
|
||
if($_GET['flt'] == 'sale'){
|
||
$this->pagedata['fee_type_data'] = kernel::single('finance_bill')->get_fee_type_item_relation('sale');
|
||
}else{
|
||
$this->pagedata['fee_type_data'] = kernel::single('finance_bill')->get_fee_type_item_relation('unsale');
|
||
}
|
||
$this->pagedata['json'] = json_encode($this->pagedata['fee_type_data']);
|
||
$this->pagedata['finder_id'] = $_GET['finder_id'];
|
||
$this->display('bill/add.html');
|
||
}
|
||
|
||
//处理
|
||
// ‘order_bn’=>’业务单据号bn’,
|
||
// ‘member’=>’客户/会员或交易对方ID’,
|
||
// ‘channel_id=>’渠道ID(店铺,仓库)’,
|
||
// ‘channel_name’=>’渠道名称(店铺,仓库)’,
|
||
// ‘trade_time’=>’单据的完成日期’,
|
||
// ‘fee_obj’=>’费用对象’,
|
||
// ‘money’=>’区分正负’,
|
||
// ‘fee_item’=>’费用项名称’
|
||
// 'credential_number'=>'凭据号',
|
||
/**
|
||
* do_add_bill
|
||
* @return mixed 返回值
|
||
*/
|
||
public function do_add_bill(){
|
||
$this->begin('javascript:finderGroup["'.$_GET['finder_id'].'"].refresh();');
|
||
|
||
$orderdata = kernel::single('finance_func')->order_is_exists($_POST['order_bn']);
|
||
if($orderdata == false){
|
||
$this->end(false,'业务单据号不存在');
|
||
}
|
||
$shopinfo = kernel::single('finance_func')->getShopByShopID($orderdata['shop_id']);
|
||
$sdf=array(
|
||
'order_bn'=>$_POST['order_bn'],
|
||
'member'=>$_POST['member'],
|
||
'channel_id'=>$shopinfo['shop_id'],
|
||
'channel_name'=>$shopinfo['shop_name'],
|
||
'trade_time'=>$_POST['trade_time'],
|
||
'fee_obj'=>$_POST['fee_obj'],
|
||
'money'=>$_POST['money'],
|
||
'fee_item'=>$_POST['fee_item'],
|
||
'credential_number'=>$_POST['credential_number'],
|
||
'unique_id'=>kernel::single('finance_func')->unique_id(array($_POST['credential_number'],$_POST['fee_obj'],$_POST['fee_item'])),
|
||
);
|
||
$init_flag = kernel::single('finance_monthly_report')->get_init_time();
|
||
if($init_flag['flag'] === 'false') $this->end(false,'未设置初始化完成,不能添加');
|
||
$res = kernel::single('finance_bill')->do_save($sdf);
|
||
if($res['status'] == 'fail'){
|
||
$this->end(false,$res['msg']);
|
||
}
|
||
$this->end(true,'添加成功');
|
||
}
|
||
|
||
//核销
|
||
/**
|
||
* verificate
|
||
* @return mixed 返回值
|
||
*/
|
||
public function verificate(){
|
||
$billObj = &app::get('finance')->model('bill');
|
||
$bill_id = $_GET['bill_id'];
|
||
$bill_data = kernel::single('finance_bill')->get_bill_by_bill_id($bill_id,'order_bn');
|
||
$ar_data = kernel::single('finance_bill')->get_ar_by_bill_id($bill_id,'order_bn');
|
||
$next_bill_id = kernel::single('finance_verification')->get_next_data($bill_id);
|
||
$this->pagedata['bill_data'] = $bill_data;
|
||
$this->pagedata['ar_data'] = $ar_data;
|
||
$this->pagedata['bill_id'] = $bill_id;
|
||
$this->pagedata['next_bill_id'] = $next_bill_id['bill_id'];
|
||
$this->pagedata['finder_id'] = $_GET['finder_id'];
|
||
if(isset($_GET['flag']) && $_GET['flag'] == 'replace'){
|
||
$this->pagedata['replace'] = true;
|
||
}else{
|
||
$this->pagedata['replace'] = false;
|
||
}
|
||
$html = $this->fetch('bill/verificate.html');
|
||
echo $html;
|
||
}
|
||
|
||
//分类展示
|
||
/**
|
||
* sync_verificate
|
||
* @return mixed 返回值
|
||
*/
|
||
public function sync_verificate(){
|
||
$bill_id = $_POST['bill_id'];
|
||
$flag = $_POST['flag'];
|
||
$bill_data = kernel::single('finance_bill')->get_bill_by_bill_id($bill_id,$flag);
|
||
$ar_data = kernel::single('finance_bill')->get_ar_by_bill_id($bill_id,$flag);
|
||
$data['bill_data'] = $bill_data;
|
||
$data['ar_data'] = $ar_data;
|
||
echo json_encode($data);
|
||
}
|
||
|
||
//收支单导入 - 账单导入
|
||
/**
|
||
* bill_import
|
||
* @return mixed 返回值
|
||
*/
|
||
public function bill_import(){
|
||
// 显示tab
|
||
$settingTabs = array(
|
||
array('name' => '支付宝账单导入', 'file_name' => 'bill/import/zhifubao.html', 'app' => 'finance','order'=>'100'),
|
||
// array('name' => '京东账单导入', 'file_name' => 'bill/import/jingdong.html', 'app' => 'finance','order'=>'200'),
|
||
// array('name' => '一号店账单导入', 'file_name' => 'bill/import/yihaodian.html', 'app' => 'finance','order'=>'300'),
|
||
// array('name' => '销售实收账单', 'file_name' => 'bill/import/normal.html', 'app' => 'finance','order'=>'400'),
|
||
// array('name' => '销售应收账单', 'file_name' => 'bill/import/ar.html', 'app' => 'finance','order'=>'500'),
|
||
);
|
||
// 定位到具体的TAB
|
||
if (isset($_GET['tab']) && isset($settingTabs[intval($_GET['tab'])])) $settingTabs[intval($_GET['tab'])]['current'] = true;
|
||
$this->pagedata['settingTabs'] = $settingTabs;
|
||
$get = kernel::single('base_component_request')->get_get();
|
||
|
||
$this->pagedata['ctler'] = 'finance_mdl_bill';
|
||
$this->pagedata['add'] = 'finance';
|
||
|
||
unset($get['app'],$get['ctl'],$get['act'],$get['add'],$get['ctler']);
|
||
$this->pagedata['data'] = $get;
|
||
|
||
$ioType = array();
|
||
foreach( kernel::servicelist('omecsv_io') as $aIo ){
|
||
$ioType[$aIo->io_type_name] = '.'.$aIo->io_type_name;
|
||
}
|
||
|
||
|
||
$this->pagedata['ioType'] = $ioType;
|
||
|
||
$this->page('bill/import.html');
|
||
}
|
||
|
||
//确认核销
|
||
/**
|
||
* do_verificate
|
||
* @return mixed 返回值
|
||
*/
|
||
public function do_verificate(){
|
||
$this->begin('javascript:finderGroup["'.$_POST['finder_id'].'"].refresh();');
|
||
if(empty($_POST['bill_id']) || empty($_POST['ar_id'])){
|
||
$this->end(false,'应收单据或者实收单据不能为空');
|
||
}
|
||
$rs = kernel::single('finance_bill')->do_verificate($_POST['bill_id'],$_POST['ar_id'],$_POST['trade_time']);
|
||
if($rs['status'] == 'fail'){
|
||
$this->end(false,$rs['msg']);
|
||
}
|
||
$this->end(true,'操作成功');
|
||
}
|
||
|
||
//异步判断核销金额的大小
|
||
/**
|
||
* sync_do_verificate
|
||
* @return mixed 返回值
|
||
*/
|
||
public function sync_do_verificate(){
|
||
if(empty($_POST['bill_id']) || empty($_POST['ar_id'])){
|
||
$res = array('status'=>'fail','msg'=>'应收单据或者实收单据不能为空');
|
||
echo json_encode($res);exit;
|
||
}
|
||
$res = kernel::single('finance_bill')->do_verificate($_POST['bill_id'],$_POST['ar_id'],$_POST['trade_time'],1);
|
||
if($res['status'] == 'success'){
|
||
switch ($res['msg_code']) {
|
||
case '1':
|
||
$res['msg'] = '全额核销,是否确认?';
|
||
break;
|
||
|
||
case '2':
|
||
$res['msg'] = '未核销应收合计大于实收,将按未核销金额由低到高的顺序核销,是否确认?';
|
||
break;
|
||
case '3':
|
||
$res['msg'] = '未核销实收大于应收合计,实收账单将部分核销,是否确认?';
|
||
break;
|
||
}
|
||
}
|
||
echo json_encode($res);
|
||
}
|
||
|
||
function findbill(){
|
||
$filter = array('fee_type_id'=>'1','status|noequal'=>'2','charge_status'=>'1');
|
||
$params = array(
|
||
'title'=>'实收单据',
|
||
'use_buildin_new_dialog' => false,
|
||
'use_buildin_set_tag'=>false,
|
||
'use_buildin_recycle'=>false,
|
||
'use_buildin_export'=>false,
|
||
'use_buildin_import'=>false,
|
||
'use_view_tab' => false,
|
||
'use_buildin_filter'=>true,
|
||
'base_filter' => $filter,
|
||
);
|
||
$this->finder('finance_mdl_bill', $params);
|
||
}
|
||
|
||
/**
|
||
* 获取bill
|
||
* @return mixed 返回结果
|
||
*/
|
||
public function getbill(){
|
||
$billObj = &app::get('finance')->model('bill');
|
||
$bill_id = $_POST['bill_id'];
|
||
$data = $billObj->getList('*',array('bill_id'=>$bill_id));
|
||
foreach($data as $k=>$v){
|
||
$data[$k] = $v;
|
||
$data[$k]['trade_time'] = date('Y-m-d',$v['trade_time']);
|
||
}
|
||
echo json_encode($data);
|
||
}
|
||
|
||
function findar(){
|
||
$filter = array('status|noequal'=>'2','charge_status'=>'1');
|
||
$params = array(
|
||
'title'=>'应收单据',
|
||
'use_buildin_new_dialog' => false,
|
||
'use_buildin_set_tag'=>false,
|
||
'use_buildin_recycle'=>false,
|
||
'use_buildin_export'=>false,
|
||
'use_buildin_import'=>false,
|
||
'use_view_tab' => false,
|
||
'use_buildin_filter'=>true,
|
||
'base_filter' => $filter,
|
||
);
|
||
$this->finder('finance_mdl_ar', $params);
|
||
}
|
||
|
||
/**
|
||
* 获取ar
|
||
* @return mixed 返回结果
|
||
*/
|
||
public function getar(){
|
||
$arObj = &app::get('finance')->model('ar');
|
||
$ar_id = $_POST['ar_id'];
|
||
$data = $arObj->getList('*',array('ar_id'=>$ar_id));
|
||
foreach($data as $k=>$v){
|
||
$data[$k] = $v;
|
||
$data[$k]['trade_time'] = date('Y-m-d',$v['trade_time']);
|
||
$data[$k]['type'] = kernel::single('finance_ar')->get_name_by_type($v['type']);
|
||
}
|
||
echo json_encode($data);
|
||
}
|
||
|
||
/**
|
||
* sync_do_charge
|
||
* @return mixed 返回值
|
||
*/
|
||
public function sync_do_charge(){
|
||
$res = array('status'=>'succ','msg'=>'');
|
||
$bill_id = $_POST['bill_id'];
|
||
$id = array('bill_id'=>array('0'=>$bill_id));
|
||
$res = kernel::single('finance_bill')->do_charge($id);
|
||
if($res['status'] == 'fail') {
|
||
$res = array('status'=>'fail','msg'=>'记账失败');
|
||
echo json_encode($res);
|
||
exit;
|
||
}
|
||
$billObj = &app::get('finance')->model('bill');
|
||
$cols = 'bill_id,bill_bn,member,order_bn,trade_time,credential_number,fee_obj,fee_item,money,unconfirm_money,confirm_money,charge_status';
|
||
$data = $billObj->getList($cols,array('bill_id'=>$bill_id));
|
||
foreach($data as $k=>$v){
|
||
$data[$k]['trade_time'] = date("Y-m-d",$v['trade_time']);
|
||
}
|
||
$res['msg'] = $data[0];
|
||
echo json_encode($res);
|
||
}
|
||
|
||
function sync_do_cancel(){
|
||
$id = $_POST['id'];
|
||
$finder_id = $_GET['finder_id'];
|
||
$data = array('res'=>'succ','msg'=>'','finder_id'=>$finder_id);
|
||
$billObj = &app::get('finance')->model('bill');
|
||
$rs = $billObj->delete(array('bill_id'=>$id));
|
||
if(!$rs){
|
||
$data = array('res'=>'fail','msg'=>'作废不成功');
|
||
echo json_decode($data);exit;
|
||
}
|
||
echo json_encode($data);
|
||
}
|
||
|
||
/**
|
||
* trade_search
|
||
* @return mixed 返回值
|
||
*/
|
||
public function trade_search(){
|
||
|
||
$this->pagedata['finder_id'] = $_GET['finder_id'];
|
||
$this->display('bill/trade_search.html');
|
||
}
|
||
|
||
/**
|
||
* do_trade_search
|
||
* @return mixed 返回值
|
||
*/
|
||
public function do_trade_search(){
|
||
$start_time = date("Y-m-d H:i:s",strtotime($_POST['start_time']));
|
||
$end_time = date("Y-m-d H:i:s",strtotime($_POST['end_time']));
|
||
$page_no = $_POST['page_no'];
|
||
$alipay_order_no = $_POST['alipay_order_no'];
|
||
$merchant_order_no = $_POST['merchant_order_no'];
|
||
#店铺信息:淘宝已授权
|
||
$funcObj = kernel::single('finance_func');
|
||
$shop_list = $funcObj->taobao_shop_list();
|
||
$shop_num = count($shop_list);
|
||
$tmp_num = 0;
|
||
if ($shop_list) {
|
||
foreach ($shop_list as $key=>$shop) {
|
||
$data = kernel::single('erpapi_router_request')->set('shop', $shop['shop_id'])->finance_trade_search($start_time, $end_time, $page_no,100,$alipay_order_no,$merchant_order_no);
|
||
}
|
||
|
||
if ($data['rsp'] == 'succ' ) {
|
||
$record_list = isset($data['data']) && $data['data'] ? $data['data']['total_records'] : '';
|
||
if ($record_list && is_array($record_list)) {
|
||
#添加账单
|
||
kernel::single('finance_rpc_response_func_bill')->batch_trade_add($record_list, $shop['node_id']);
|
||
}
|
||
}
|
||
$tmp_num += $data['data']['total_pages'];
|
||
if($tmp_num==$page_no && $data['rsp']=='succ' && $shop_num==$key+1){
|
||
echo 'finish@100';
|
||
}elseif ($data['data']['total_pages']>$page_no && $data['rsp']=='succ'){
|
||
$schedule = (100*$page_no)/$data['data']['total_results']*100/$shop_num;
|
||
echo 'success@'.$schedule;
|
||
}else{
|
||
echo '获取失败';
|
||
}
|
||
}
|
||
}
|
||
} |