<?xml version="1.0" encoding="UTF-8"?>

<!--
  ~
  ~      Copyright (c) 2018-2025, lengleng All rights reserved.
  ~
  ~  Redistribution and use in source and binary forms, with or without
  ~  modification, are permitted provided that the following conditions are met:
  ~
  ~ Redistributions of source code must retain the above copyright notice,
  ~  this list of conditions and the following disclaimer.
  ~  Redistributions in binary form must reproduce the above copyright
  ~  notice, this list of conditions and the following disclaimer in the
  ~  documentation and/or other materials provided with the distribution.
  ~  Neither the name of the yifu4cloud.com developer nor the names of its
  ~  contributors may be used to endorse or promote products derived from
  ~  this software without specific prior written permission.
  ~  Author: lengleng (wangiegie@gmail.com)
  ~
  -->

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.yifu.cloud.plus.v1.yifu.salary.mapper.TSalaryAccountMapper">

  <resultMap id="tSalaryAccountMap" type="com.yifu.cloud.plus.v1.yifu.salary.entity.TSalaryAccount">
    <id property="id" column="ID"/>
    <result property="invoiceTitle" column="INVOICE_TITLE"/>
    <result property="salaryFormId" column="SALARY_FORM_ID"/>
    <result property="salaryMonth" column="SALARY_MONTH"/>
    <result property="empId" column="EMP_ID"/>
    <result property="empName" column="EMP_NAME"/>
    <result property="empIdcard" column="EMP_IDCARD"/>
    <result property="bankNo" column="BANK_NO"/>
    <result property="bankName" column="BANK_NAME"/>
    <result property="deptId" column="DEPT_ID"/>
    <result property="deptNo" column="DEPT_NO"/>
    <result property="deptName" column="DEPT_NAME"/>
    <result property="salaryStyle" column="SALARY_STYLE"/>
    <result property="salaryGiveTime" column="SALARY_GIVE_TIME"/>
    <result property="distributionFlag" column="DISTRIBUTION_FLAG"/>
    <result property="deduSocialMonth" column="DEDU_SOCIAL_MONTH"/>
    <result property="deduProvidentMonth" column="DEDU_PROVIDENT_MONTH"/>
    <result property="formType" column="FORM_TYPE"/>
    <result property="settlementMonth" column="SETTLEMENT_MONTH"/>
    <result property="deleteFlag" column="DELETE_FLAG"/>
    <result property="socialPriority" column="SOCIAL_PRIORITY"/>
    <result property="fundPriority" column="FUND_PRIORITY"/>
    <result property="annualBonusType" column="ANNUAL_BONUS_TYPE"/>
    <result property="taxMonth" column="TAX_MONTH"/>
    <result property="isDeductSocial" column="IS_DEDUCT_SOCIAL"/>
    <result property="isDeductFund" column="IS_DEDUCT_FUND"/>
    <result property="province" column="PROVINCE"/>
    <result property="city" column="CITY"/>
    <result property="town" column="TOWN"/>
    <result property="empPhone" column="EMP_PHONE"/>
    <result property="ownFlag" column="OWN_FLAG"/>
    <result property="isRepeat" column="IS_REPEAT"/>
    <result property="bankSubName" column="BANK_SUB_NAME"/>
    <result property="bankProvince" column="BANK_PROVINCE"/>
    <result property="bankCity" column="BANK_CITY"/>
    <result property="isPersonTax" column="IS_PERSON_TAX"/>
    <result property="relaySalary" column="RELAY_SALARY"/>
    <result property="actualSalary" column="ACTUAL_SALARY"/>
    <result property="salaryTax" column="SALARY_TAX"/>
    <result property="relaySalaryUnit" column="RELAY_SALARY_UNIT"/>
    <result property="salaryTaxUnit" column="SALARY_TAX_UNIT"/>
	<result property="haveSalaryFlag" column="HAVE_SALARY_FLAG"/>
	<result property="haveSpecialFlag" column="HAVE_SPECIAL_FLAG"/>
  </resultMap>
    <sql id="Base_Column_List">
                a.ID,
                a.INVOICE_TITLE,
                a.SALARY_FORM_ID,
                a.SALARY_MONTH,
                a.EMP_ID,
                a.EMP_NAME,
                a.EMP_IDCARD,
                a.BANK_NO,
                a.BANK_NAME,
                a.DEPT_ID,
                a.DEPT_NO,
                a.DEPT_NAME,
                a.SALARY_STYLE,
                a.SALARY_GIVE_TIME,
                a.DISTRIBUTION_FLAG,
                a.DEDU_SOCIAL_MONTH,
                a.DEDU_PROVIDENT_MONTH,
                a.FORM_TYPE,
                a.SETTLEMENT_MONTH,
                a.DELETE_FLAG,
                a.SOCIAL_PRIORITY,
                a.FUND_PRIORITY,
                a.ANNUAL_BONUS_TYPE,
                a.TAX_MONTH,
                a.IS_DEDUCT_SOCIAL,
                a.IS_DEDUCT_FUND,
                a.PROVINCE,
                a.CITY,
                a.TOWN,
                a.EMP_PHONE,
                a.OWN_FLAG,
                a.IS_REPEAT,
                a.BANK_SUB_NAME,
                a.BANK_PROVINCE,
                a.BANK_CITY,
                a.IS_PERSON_TAX,
                a.RELAY_SALARY,
                a.ACTUAL_SALARY,
                a.SALARY_TAX,
                a.RELAY_SALARY_UNIT,
                a.SALARY_TAX_UNIT,
                a.HAVE_SALARY_FLAG,
                a.HAVE_SPECIAL_FLAG
    </sql>
    <sql id="tSalaryAccount_where">
        <if test="tSalaryAccount != null">
                    <if test="tSalaryAccount.id != null and tSalaryAccount.id.trim() != ''">
                        AND a.ID = #{tSalaryAccount.id}
                    </if>
                    <if test="tSalaryAccount.invoiceTitle != null and tSalaryAccount.invoiceTitle.trim() != ''">
                        AND a.INVOICE_TITLE = #{tSalaryAccount.invoiceTitle}
                    </if>
                    <if test="tSalaryAccount.salaryFormId != null and tSalaryAccount.salaryFormId.trim() != ''">
                        AND a.SALARY_FORM_ID = #{tSalaryAccount.salaryFormId}
                    </if>
                    <if test="tSalaryAccount.salaryMonth != null and tSalaryAccount.salaryMonth.trim() != ''">
                        AND a.SALARY_MONTH = #{tSalaryAccount.salaryMonth}
                    </if>
                    <if test="tSalaryAccount.empId != null and tSalaryAccount.empId.trim() != ''">
                        AND a.EMP_ID = #{tSalaryAccount.empId}
                    </if>
                    <if test="tSalaryAccount.empName != null and tSalaryAccount.empName.trim() != ''">
                        AND a.EMP_NAME = #{tSalaryAccount.empName}
                    </if>
                    <if test="tSalaryAccount.empIdcard != null and tSalaryAccount.empIdcard.trim() != ''">
                        AND a.EMP_IDCARD = #{tSalaryAccount.empIdcard}
                    </if>
                    <if test="tSalaryAccount.bankNo != null and tSalaryAccount.bankNo.trim() != ''">
                        AND a.BANK_NO = #{tSalaryAccount.bankNo}
                    </if>
                    <if test="tSalaryAccount.bankName != null and tSalaryAccount.bankName.trim() != ''">
                        AND a.BANK_NAME = #{tSalaryAccount.bankName}
                    </if>
                    <if test="tSalaryAccount.deptId != null and tSalaryAccount.deptId.trim() != ''">
                        AND a.DEPT_ID = #{tSalaryAccount.deptId}
                    </if>
                    <if test="tSalaryAccount.deptNo != null and tSalaryAccount.deptNo.trim() != ''">
                        AND a.DEPT_NO = #{tSalaryAccount.deptNo}
                    </if>
                    <if test="tSalaryAccount.deptName != null and tSalaryAccount.deptName.trim() != ''">
                        AND a.DEPT_NAME = #{tSalaryAccount.deptName}
                    </if>
                    <if test="tSalaryAccount.salaryStyle != null and tSalaryAccount.salaryStyle.trim() != ''">
                        AND a.SALARY_STYLE = #{tSalaryAccount.salaryStyle}
                    </if>
                    <if test="tSalaryAccount.salaryGiveTime != null and tSalaryAccount.salaryGiveTime.trim() != ''">
                        AND a.SALARY_GIVE_TIME = #{tSalaryAccount.salaryGiveTime}
                    </if>
                    <if test="tSalaryAccount.distributionFlag != null and tSalaryAccount.distributionFlag.trim() != ''">
                        AND a.DISTRIBUTION_FLAG = #{tSalaryAccount.distributionFlag}
                    </if>
                    <if test="tSalaryAccount.deduSocialMonth != null and tSalaryAccount.deduSocialMonth.trim() != ''">
                        AND a.DEDU_SOCIAL_MONTH = #{tSalaryAccount.deduSocialMonth}
                    </if>
                    <if test="tSalaryAccount.deduProvidentMonth != null and tSalaryAccount.deduProvidentMonth.trim() != ''">
                        AND a.DEDU_PROVIDENT_MONTH = #{tSalaryAccount.deduProvidentMonth}
                    </if>
                    <if test="tSalaryAccount.formType != null and tSalaryAccount.formType.trim() != ''">
                        AND a.FORM_TYPE = #{tSalaryAccount.formType}
                    </if>
                    <if test="tSalaryAccount.settlementMonth != null and tSalaryAccount.settlementMonth.trim() != ''">
                        AND a.SETTLEMENT_MONTH = #{tSalaryAccount.settlementMonth}
                    </if>
                    <if test="tSalaryAccount.deleteFlag != null">
                        AND a.DELETE_FLAG = #{tSalaryAccount.deleteFlag}
                    </if>
                    <if test="tSalaryAccount.socialPriority != null and tSalaryAccount.socialPriority.trim() != ''">
                        AND a.SOCIAL_PRIORITY = #{tSalaryAccount.socialPriority}
                    </if>
                    <if test="tSalaryAccount.fundPriority != null and tSalaryAccount.fundPriority.trim() != ''">
                        AND a.FUND_PRIORITY = #{tSalaryAccount.fundPriority}
                    </if>
                    <if test="tSalaryAccount.annualBonusType != null and tSalaryAccount.annualBonusType.trim() != ''">
                        AND a.ANNUAL_BONUS_TYPE = #{tSalaryAccount.annualBonusType}
                    </if>
                    <if test="tSalaryAccount.taxMonth != null and tSalaryAccount.taxMonth.trim() != ''">
                        AND a.TAX_MONTH = #{tSalaryAccount.taxMonth}
                    </if>
                    <if test="tSalaryAccount.isDeductSocial != null and tSalaryAccount.isDeductSocial.trim() != ''">
                        AND a.IS_DEDUCT_SOCIAL = #{tSalaryAccount.isDeductSocial}
                    </if>
                    <if test="tSalaryAccount.isDeductFund != null and tSalaryAccount.isDeductFund.trim() != ''">
                        AND a.IS_DEDUCT_FUND = #{tSalaryAccount.isDeductFund}
                    </if>
                    <if test="tSalaryAccount.province != null">
                        AND a.PROVINCE = #{tSalaryAccount.province}
                    </if>
                    <if test="tSalaryAccount.city != null">
                        AND a.CITY = #{tSalaryAccount.city}
                    </if>
                    <if test="tSalaryAccount.town != null">
                        AND a.TOWN = #{tSalaryAccount.town}
                    </if>
                    <if test="tSalaryAccount.empPhone != null and tSalaryAccount.empPhone.trim() != ''">
                        AND a.EMP_PHONE = #{tSalaryAccount.empPhone}
                    </if>
                    <if test="tSalaryAccount.ownFlag != null">
                        AND a.OWN_FLAG = #{tSalaryAccount.ownFlag}
                    </if>
                    <if test="tSalaryAccount.isRepeat != null">
                        AND a.IS_REPEAT = #{tSalaryAccount.isRepeat}
                    </if>
                    <if test="tSalaryAccount.bankSubName != null and tSalaryAccount.bankSubName.trim() != ''">
                        AND a.BANK_SUB_NAME = #{tSalaryAccount.bankSubName}
                    </if>
                    <if test="tSalaryAccount.bankProvince != null">
                        AND a.BANK_PROVINCE = #{tSalaryAccount.bankProvince}
                    </if>
                    <if test="tSalaryAccount.bankCity != null">
                        AND a.BANK_CITY = #{tSalaryAccount.bankCity}
                    </if>
                    <if test="tSalaryAccount.isPersonTax != null and tSalaryAccount.isPersonTax.trim() != ''">
                        AND a.IS_PERSON_TAX = #{tSalaryAccount.isPersonTax}
                    </if>
                    <if test="tSalaryAccount.relaySalary != null">
                        AND a.RELAY_SALARY = #{tSalaryAccount.relaySalary}
                    </if>
                    <if test="tSalaryAccount.actualSalary != null">
                        AND a.ACTUAL_SALARY = #{tSalaryAccount.actualSalary}
                    </if>
                    <if test="tSalaryAccount.salaryTax != null">
                        AND a.SALARY_TAX = #{tSalaryAccount.salaryTax}
                    </if>
                    <if test="tSalaryAccount.relaySalaryUnit != null">
                        AND a.RELAY_SALARY_UNIT = #{tSalaryAccount.relaySalaryUnit}
                    </if>
                    <if test="tSalaryAccount.salaryTaxUnit != null">
                        AND a.SALARY_TAX_UNIT = #{tSalaryAccount.salaryTaxUnit}
                    </if>
        </if>
    </sql>
    <!--tSalaryAccount简单分页查询-->
    <select id="getTSalaryAccountPage" resultMap="tSalaryAccountMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM t_salary_account a
        <where>
			a.DELETE_FLAG = 0
			<include refid="tSalaryAccount_where"/>
        </where>
    </select>

	<!-- 获取校验的报账明细 ### 格式:身份证号_工资月份_报表类型_应发金额 -->
	<select id="getAccountCheckList" resultType="com.yifu.cloud.plus.v1.yifu.salary.vo.AccountCheckVo">
		select
			CONCAT(a.EMP_IDCARD,"_",a.SALARY_MONTH,"_",a.FORM_TYPE) title,ifnull(ifnull(relaySalary.SALARY_MONEY,actSalary.SALARY_MONEY),0) relaySalary
		from t_salary_account a
				 left join t_salary_account_item relaySalary on relaySalary.SALARY_ACCOUNT_ID = a.id and relaySalary.JAVA_FIED_NAME='relaySalary'
				 left join t_salary_account_item actSalary on actSalary.SALARY_ACCOUNT_ID = a.id and actSalary.JAVA_FIED_NAME='actualSalarySum'
		where a.DELETE_FLAG = 0 and a.DEPT_ID = #{settleId} and a.SALARY_MONTH = #{settleMonth}
	</select>

	<!-- 获取校验的报账明细 ### 格式:身份证号_工资月份_报表类型_应发金额 -->
	<select id="getAccountCheckListLabor" resultType="com.yifu.cloud.plus.v1.yifu.salary.vo.AccountCheckVo">
		select
			CONCAT(a.EMP_IDCARD,"_",a.SALARY_MONTH,"_",a.FORM_TYPE) title,ifnull(actSalary.SALARY_MONEY,0) relaySalary
		from t_salary_account a
				 left join t_salary_account_item actSalary on actSalary.SALARY_ACCOUNT_ID = a.id and actSalary.JAVA_FIED_NAME='actualSalarySum'
		where a.DELETE_FLAG = 0 and a.DEPT_ID = #{settleId} and a.SALARY_MONTH = #{settleMonth}
	</select>

	<!-- 获取当前年最小计税月 -->
	<select id="getMinTaxMonthByNowYear" resultType="java.lang.String">
		select
			concat(min(a.TAX_MONTH - 0),'')
		from t_salary_account a
		where a.EMP_IDCARD = #{empIdCard} and a.DELETE_FLAG = 0 and a.SETTLEMENT_MONTH like concat(#{nowYear},"%")
		  and a.FORM_TYPE != '3' and a.FORM_TYPE != '4'
	</select>

	<select id="getLastMonthTHaveSalaryNosocial"  resultType="com.yifu.cloud.plus.v1.yifu.salary.entity.THaveSalaryNosocial">
		select a.EMP_ID           employee_id
			 , a.EMP_IDCARD       employee_id_card
			 , a.EMP_NAME         employee_name
			 , GROUP_CONCAT(a.relaySalary)    relay_salary
			 , a.CREATE_BY      CREATE_USER_ID
			 , GROUP_CONCAT(a.SALARY_MONTH)      month
			 , a.EMP_NAME         employee_name
			 , a.EMP_IDCARD       employee_id_card
			 , a.DEPT_ID          settle_domain_id
			 , a.DEPT_NAME        SETTLEMENT_ORGAN_NAME
			 , a.DEPT_NO          SETTLEMENT_ORGAN_NO
			 , a.SETTLEMENT_MONTH SETTLE_MONTH
		from (
				 select a.id
					  , s.DEPT_ID
					  , s.DEPT_NAME
					  , s.DEPT_NO
					  , s.CREATE_BY
					  , a.SALARY_FORM_ID
					  , a.EMP_ID
					  , a.EMP_IDCARD
					  , a.EMP_NAME
					  , a.SALARY_MONTH
					  , a.SETTLEMENT_MONTH
					  , if(item.JAVA_FIED_NAME = 'relaySalary', item.SALARY_MONEY, 0) relaySalary
					  , sum(if(item.JAVA_FIED_NAME in
							   ('unitSocial', 'personalSocial', 'withholidingUnitSocial', 'withholidingPersonSocial'),
							   item.SALARY_MONEY, 0))                                 social
				 from mvp_salary.t_salary_account a
						  left join mvp_salary.t_salary_account_item item on item.SALARY_ACCOUNT_ID = a.id
						  LEFT JOIN mvp_salary.t_salary_standard s on a.SALARY_FORM_ID = s.id

				 where
					 a.DELETE_FLAG = 0
				   and s.send_month in ( #{month} , #{month2} , #{month3})
				   AND s.STATUS IN (3, 4)
				 GROUP BY a.EMP_IDCARD, a.SALARY_MONTH limit 10
			 ) a
		where a.relaySalary > 0
		  and a.social = 0
		GROUP BY a.EMP_IDCARD  HAVING count(1) = 3
	</select>

	<!-- 薪资类型互斥校验 获取本年度身份证号列表 -->
	<select id="getAccountYearCheckList" resultType="java.lang.String">
		select a.EMP_IDCARD
		from t_salary_account a
		where a.DELETE_FLAG = 0 and a.DEPT_ID = #{settleId} and a.FORM_TYPE = '0' and a.SALARY_MONTH like concat(DATE_FORMAT(NOW(), '%Y'), '%')
	</select>
</mapper>