<?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.TStatisticsTaxSalaryMapper">

  <resultMap id="tStatisticsTaxSalaryMap" type="com.yifu.cloud.plus.v1.yifu.salary.entity.TStatisticsTaxSalary">
    <id property="id" column="id"/>
    <result property="invoiceTitle" column="INVOICE_TITLE"/>
    <result property="settleDepartId" column="SETTLE_DEPART_ID"/>
    <result property="settleDepartNo" column="SETTLE_DEPART_NO"/>
    <result property="settleDepartName" column="SETTLE_DEPART_NAME"/>
    <result property="declareMonth" column="DECLARE_MONTH"/>
    <result property="empId" column="EMP_ID"/>
    <result property="empName" column="EMP_NAME"/>
    <result property="empIdcard" column="EMP_IDCARD"/>
    <result property="costReduction" column="cost_reduction"/>
    <result property="childEduinfoMoney" column="child_eduInfo_money"/>
    <result property="housingRentalinfoMoney" column="housing_rentalInfo_money"/>
    <result property="housingLoanInterestExpenseMoney" column="housing_loan_Interest_expense_money"/>
    <result property="supportElderlyExpenseMoney" column="support_elderly_expense_money"/>
    <result property="continuingEducationExpenseMoney" column="continuing_education_expense_money"/>
    <result property="realSalary" column="REAL_SALARY"/>
    <result property="personalPensionMoney" column="PERSONAL_PENSION_MONEY"/>
    <result property="personalMedicalMoney" column="PERSONAL_MEDICAL_MONEY"/>
    <result property="personalUnemploymentMoney" column="PERSONAL_UNEMPLOYMENT_MONEY"/>
    <result property="personalSocial" column="PERSONAL_SOCIAL"/>
    <result property="personalFund" column="PERSONAL_FUND"/>
    <result property="enterpriseAnnuity" column="enterprise_annuity"/>
    <result property="taxable" column="taxable"/>
    <result property="taxFee" column="tax_fee"/>
    <result property="quickDeducation" column="QUICK_DEDUCATION"/>
    <result property="salaryTax" column="salary_tax"/>
    <result property="unitId" column="UNIT_ID"/>
    <result property="unitNo" column="UNIT_NO"/>
    <result property="unitName" column="UNIT_NAME"/>
    <result property="specialDeduMoney" column="SPECIAL_DEDU_MONEY"/>
    <result property="sumBabyMoney" column="sum_baby_money"/>
    <result property="isNewEmployee" column="IS_NEW_EMPLOYEE"/>
    <result property="createMonth" column="CREATE_MONTH"/>
    <result property="empPhone" column="EMP_PHONE"/>
  </resultMap>
    <sql id="Base_Column_List">
                a.id,
                a.INVOICE_TITLE,
                a.SETTLE_DEPART_ID,
                a.SETTLE_DEPART_NO,
                a.SETTLE_DEPART_NAME,
                a.DECLARE_MONTH,
                a.EMP_ID,
                a.EMP_NAME,
                a.EMP_IDCARD,
                a.cost_reduction,
                a.child_eduInfo_money,
                a.housing_rentalInfo_money,
                a.housing_loan_Interest_expense_money,
                a.support_elderly_expense_money,
                a.continuing_education_expense_money,
                a.REAL_SALARY,
                a.PERSONAL_PENSION_MONEY,
                a.PERSONAL_MEDICAL_MONEY,
                a.PERSONAL_UNEMPLOYMENT_MONEY,
                a.PERSONAL_SOCIAL,
                a.PERSONAL_FUND,
                a.enterprise_annuity,
                a.taxable,
                a.tax_fee,
                a.QUICK_DEDUCATION,
                a.salary_tax,
                a.UNIT_ID,
                a.UNIT_NO,
                a.UNIT_NAME,
                a.SPECIAL_DEDU_MONEY,
                a.sum_baby_money,
                a.IS_NEW_EMPLOYEE,
                a.CREATE_MONTH,
                a.EMP_PHONE
    </sql>
    <sql id="tStatisticsTaxSalary_where">
        <if test="tStatisticsTaxSalary != null">
                    <if test="tStatisticsTaxSalary.id != null and tStatisticsTaxSalary.id.trim() != ''">
                        AND a.id = #{tStatisticsTaxSalary.id}
                    </if>
                    <if test="tStatisticsTaxSalary.invoiceTitle != null and tStatisticsTaxSalary.invoiceTitle.trim() != ''">
                        AND a.INVOICE_TITLE = #{tStatisticsTaxSalary.invoiceTitle}
                    </if>
                    <if test="tStatisticsTaxSalary.settleDepartId != null and tStatisticsTaxSalary.settleDepartId.trim() != ''">
                        AND a.SETTLE_DEPART_ID = #{tStatisticsTaxSalary.settleDepartId}
                    </if>
                    <if test="tStatisticsTaxSalary.settleDepartNo != null and tStatisticsTaxSalary.settleDepartNo.trim() != ''">
                        AND a.SETTLE_DEPART_NO = #{tStatisticsTaxSalary.settleDepartNo}
                    </if>
                    <if test="tStatisticsTaxSalary.settleDepartName != null and tStatisticsTaxSalary.settleDepartName.trim() != ''">
                        AND a.SETTLE_DEPART_NAME = #{tStatisticsTaxSalary.settleDepartName}
                    </if>
                    <if test="tStatisticsTaxSalary.declareMonth != null and tStatisticsTaxSalary.declareMonth.trim() != ''">
                        AND a.DECLARE_MONTH = #{tStatisticsTaxSalary.declareMonth}
                    </if>
                    <if test="tStatisticsTaxSalary.empId != null and tStatisticsTaxSalary.empId.trim() != ''">
                        AND a.EMP_ID = #{tStatisticsTaxSalary.empId}
                    </if>
                    <if test="tStatisticsTaxSalary.empName != null and tStatisticsTaxSalary.empName.trim() != ''">
                        AND a.EMP_NAME = #{tStatisticsTaxSalary.empName}
                    </if>
                    <if test="tStatisticsTaxSalary.empIdcard != null and tStatisticsTaxSalary.empIdcard.trim() != ''">
                        AND a.EMP_IDCARD = #{tStatisticsTaxSalary.empIdcard}
                    </if>
                    <if test="tStatisticsTaxSalary.costReduction != null">
                        AND a.cost_reduction = #{tStatisticsTaxSalary.costReduction}
                    </if>
                    <if test="tStatisticsTaxSalary.childEduinfoMoney != null">
                        AND a.child_eduInfo_money = #{tStatisticsTaxSalary.childEduinfoMoney}
                    </if>
                    <if test="tStatisticsTaxSalary.housingRentalinfoMoney != null">
                        AND a.housing_rentalInfo_money = #{tStatisticsTaxSalary.housingRentalinfoMoney}
                    </if>
                    <if test="tStatisticsTaxSalary.housingLoanInterestExpenseMoney != null">
                        AND a.housing_loan_Interest_expense_money = #{tStatisticsTaxSalary.housingLoanInterestExpenseMoney}
                    </if>
                    <if test="tStatisticsTaxSalary.supportElderlyExpenseMoney != null">
                        AND a.support_elderly_expense_money = #{tStatisticsTaxSalary.supportElderlyExpenseMoney}
                    </if>
                    <if test="tStatisticsTaxSalary.continuingEducationExpenseMoney != null">
                        AND a.continuing_education_expense_money = #{tStatisticsTaxSalary.continuingEducationExpenseMoney}
                    </if>
                    <if test="tStatisticsTaxSalary.realSalary != null">
                        AND a.REAL_SALARY = #{tStatisticsTaxSalary.realSalary}
                    </if>
                    <if test="tStatisticsTaxSalary.personalPensionMoney != null">
                        AND a.PERSONAL_PENSION_MONEY = #{tStatisticsTaxSalary.personalPensionMoney}
                    </if>
                    <if test="tStatisticsTaxSalary.personalMedicalMoney != null">
                        AND a.PERSONAL_MEDICAL_MONEY = #{tStatisticsTaxSalary.personalMedicalMoney}
                    </if>
                    <if test="tStatisticsTaxSalary.personalUnemploymentMoney != null">
                        AND a.PERSONAL_UNEMPLOYMENT_MONEY = #{tStatisticsTaxSalary.personalUnemploymentMoney}
                    </if>
                    <if test="tStatisticsTaxSalary.personalSocial != null">
                        AND a.PERSONAL_SOCIAL = #{tStatisticsTaxSalary.personalSocial}
                    </if>
                    <if test="tStatisticsTaxSalary.personalFund != null">
                        AND a.PERSONAL_FUND = #{tStatisticsTaxSalary.personalFund}
                    </if>
                    <if test="tStatisticsTaxSalary.enterpriseAnnuity != null">
                        AND a.enterprise_annuity = #{tStatisticsTaxSalary.enterpriseAnnuity}
                    </if>
                    <if test="tStatisticsTaxSalary.taxable != null">
                        AND a.taxable = #{tStatisticsTaxSalary.taxable}
                    </if>
                    <if test="tStatisticsTaxSalary.taxFee != null">
                        AND a.tax_fee = #{tStatisticsTaxSalary.taxFee}
                    </if>
                    <if test="tStatisticsTaxSalary.quickDeducation != null">
                        AND a.QUICK_DEDUCATION = #{tStatisticsTaxSalary.quickDeducation}
                    </if>
                    <if test="tStatisticsTaxSalary.salaryTax != null">
                        AND a.salary_tax = #{tStatisticsTaxSalary.salaryTax}
                    </if>
                    <if test="tStatisticsTaxSalary.unitId != null and tStatisticsTaxSalary.unitId.trim() != ''">
                        AND a.UNIT_ID = #{tStatisticsTaxSalary.unitId}
                    </if>
                    <if test="tStatisticsTaxSalary.unitNo != null and tStatisticsTaxSalary.unitNo.trim() != ''">
                        AND a.UNIT_NO = #{tStatisticsTaxSalary.unitNo}
                    </if>
                    <if test="tStatisticsTaxSalary.unitName != null and tStatisticsTaxSalary.unitName.trim() != ''">
                        AND a.UNIT_NAME = #{tStatisticsTaxSalary.unitName}
                    </if>
                    <if test="tStatisticsTaxSalary.specialDeduMoney != null">
                        AND a.SPECIAL_DEDU_MONEY = #{tStatisticsTaxSalary.specialDeduMoney}
                    </if>
                    <if test="tStatisticsTaxSalary.sumBabyMoney != null">
                        AND a.sum_baby_money = #{tStatisticsTaxSalary.sumBabyMoney}
                    </if>
        </if>
    </sql>
    <!--tStatisticsTaxSalary简单分页查询-->
    <select id="getTStatisticsTaxSalaryPage" resultMap="tStatisticsTaxSalaryMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM t_statistics_tax_salary a
        <where>
            1=1
            <include refid="tStatisticsTaxSalary_where"/>
        </where>
    </select>

	<insert id="insertStatisticsTaxSalaryByTableName">
		insert into t_statistics_tax_salary (
			select
				a.id,a.INVOICE_TITLE,a.SETTLE_DEPART_ID,a.SETTLE_DEPART_NO,a.SETTLE_DEPART_NAME
				 ,a.DECLARE_MONTH,a.EMP_ID,a.EMP_NAME,a.EMP_IDCARD,a.cost_reduction
				 ,a.child_eduInfo_money,a.housing_rentalInfo_money,a.housing_loan_Interest_expense_money
				 ,a.support_elderly_expense_money,a.continuing_education_expense_money
				 ,a.REAL_SALARY,a.PERSONAL_PENSION_MONEY,a.PERSONAL_MEDICAL_MONEY,a.PERSONAL_UNEMPLOYMENT_MONEY
				 ,a.PERSONAL_SOCIAL,a.PERSONAL_FUND,a.enterprise_annuity,a.taxable,ifnull(c.WITHHOLDING_RATE,0) tax_fee
				 ,ifnull(c.QUICK_DEDUCATION,0) QUICK_DEDUCATION,a.salary_tax,a.unit_id,a.unit_no,a.unit_name,a.SPECIAL_DEDU_MONEY
				 ,a.sum_baby_money,
				a.IS_NEW_EMPLOYEE,
				a.CREATE_MONTH,
				a.EMP_PHONE
			from (
					 SELECT
						 concat(a.id,#{nowMonth}) id,
						 #{nowMonth} DECLARE_MONTH,
						 a.INVOICE_TITLE,
						 a.EMP_ID,
						 a.EMP_NAME,
						 a.EMP_IDCARD,
						 a.SETTLE_DEPART_ID,
						 a.SETTLE_DEPART_NO,
						 a.SETTLE_DEPART_NAME,
						 sum(a.REAL_SALARY) - sum(a.exemption_persion_tax) - sum(if(a.annual_bonus_tax > 0,a.annual_bonus,0)) REAL_SALARY,
						 max(a.cost_reduction) cost_reduction,
						 max(a.SPECIAL_DEDU_MONEY) SPECIAL_DEDU_MONEY,
						 max(a.child_eduInfo_money) child_eduInfo_money,
						 max(a.housing_loan_Interest_expense_money) housing_loan_Interest_expense_money,
						 max(a.housing_rentalInfo_money) housing_rentalInfo_money,
						 max(a.continuing_education_expense_money) continuing_education_expense_money,
						 max(a.support_elderly_expense_money) support_elderly_expense_money,
						 max(a.sum_baby_money) sum_baby_money,
						 sum(a.PERSONAL_SOCIAL) + sum(a.withholiding_person_social) PERSONAL_SOCIAL,
						 round(((sum(a.PERSONAL_SOCIAL) + sum(a.withholiding_person_social)) * 0.75),2) PERSONAL_PENSION_MONEY,
						 round(((sum(a.PERSONAL_SOCIAL) + sum(a.withholiding_person_social)) * 0.2),2) PERSONAL_MEDICAL_MONEY,
						 round(((sum(a.PERSONAL_SOCIAL) + sum(a.withholiding_person_social)) * 0.05),2) PERSONAL_UNEMPLOYMENT_MONEY,
						 sum(a.PERSONAL_FUND) + sum(a.withholiding_person_fund) PERSONAL_FUND,
						 sum(a.REAL_SALARY) - sum(a.exemption_persion_tax)
							 - max(a.SPECIAL_DEDU_MONEY)
							 - sum(a.PERSONAL_SOCIAL) - sum(a.withholiding_person_social)
							 - sum(a.PERSONAL_FUND) - sum(a.withholiding_person_fund)
							 - max(a.cost_reduction)
							 - sum(a.enterprise_annuity)
							 - sum(if(a.annual_bonus_tax > 0,a.annual_bonus,0)) taxable,
						 sum(a.salary_tax) salary_tax,
						 sum(a.enterprise_annuity) enterprise_annuity,
						 a.unit_id,
						 a.unit_no,
						 a.unit_name,
						 a.IS_NEW_EMPLOYEE,
						 a.CREATE_MONTH,
						 a.EMP_PHONE
					 FROM ${tableName} a
					 where a.SETTLEMENT_MONTH <![CDATA[ <= ]]>  #{nowMonth} and a.SETTLEMENT_MONTH like concat(#{lastYear},'%')
					 GROUP BY a.EMP_IDCARD,a.INVOICE_TITLE ORDER BY a.settle_depart_id asc
				 ) a
					 left join t_salary_tax_config c on c.MIN_INCOME <![CDATA[ < ]]> a.taxable and c.MAX_INCOME >= a.taxable and c.TYPE=0
		)
	</insert>

	<!-- 删除-按申报月份 -->
	<delete id="deleteByYearMonth">
		DELETE FROM t_statistics_tax_salary WHERE DECLARE_MONTH = #{yearMonth}
	</delete>

</mapper>
