工资计算 字典形式传参以及返回 结果

以字典的形式传参以及返回参数:(只计算了个人部分)

参数model

@interface CCCalculatorParamModel : NSObject<YYModel>


@property (nonatomic, assign) CGFloat providentFund;//公积金

@property (nonatomic, assign) CGFloat yanglao;//养老

@property (nonatomic, assign) CGFloat medicalTreatment;//医疗

@property (nonatomic, assign) CGFloat unemployment;//失业

@property (nonatomic, assign) CGFloat occupationalInjury;//工伤

@property (nonatomic, assign) CGFloat giveBirth;//生育


@property (nonatomic, assign) CGFloat minSocialSecurityCardinalNumber;//最小社保汇缴基数是3902

@property (nonatomic, assign) CGFloat maxSocialSecurityCardinalNumber;//最大社保汇缴基数是19512


@property (nonatomic, assign) CGFloat minAccumulationFundCardinalNumber;//公积金汇缴基数是2190

@property (nonatomic, assign) CGFloat maxAccumulationFundCardinalNumber;//最大公积金汇缴基数是19512


1//工资计算(税前算税后)

+(NSMutableDictionary *)calculatorSalary:(CGFloat)salary taxBase:(CGFloat)taxBase scaleParam:(NSDictionary *)scaleParam {

    

    NSMutableDictionary *resultDic = [NSMutableDictionary dictionary];

    NSArray *scaleArr = @[@"0.03",@"0.1",@"0.2",@"0.25",@"0.30",@"0.35",@"0.45"];

    NSArray *quickDeductionArr = @[@"0",@"105",@"555",@"1005",@"2755",@"5505",@"13505"];

//    社保最小缴纳基数

    CGFloat minSocialSecurityCardinalNumber = [scaleParam[@"minSocialSecurityCardinalNumber"] floatValue];

//    社保最大缴纳基数

    CGFloat maxSocialSecurityCardinalNumber = [scaleParam[@"maxSocialSecurityCardinalNumber"]floatValue];

//    公积金最小缴纳基数

    CGFloat minAccumulationFundCardinalNumber = [scaleParam[@"minAccumulationFundCardinalNumber"] floatValue];

//    公积金最大缴纳基数

    CGFloat maxAccumulationFundCardinalNumber = [scaleParam[@"maxAccumulationFundCardinalNumber"]floatValue];

    

//    计算所给工资的社保缴纳基数

    CGFloat theCalculatorMoney =0;

    if (salary>minSocialSecurityCardinalNumber && salary<=maxSocialSecurityCardinalNumber) {

        theCalculatorMoney = salary;

    }

    else if (salary>maxSocialSecurityCardinalNumber){

        theCalculatorMoney = maxSocialSecurityCardinalNumber;

    }

    else{

        theCalculatorMoney = minSocialSecurityCardinalNumber;

    }

//    计算社保

    CGFloat yanglao = ROUND(theCalculatorMoney *[scaleParam[@"yanglao"] floatValue]);

    [resultDic setObject:@(yanglao) forKey:@"yanglao"];

    

    CGFloat medicalTreatment = ROUND(theCalculatorMoney *[scaleParam[@"medicalTreatment"] floatValue]);

    [resultDic setObject:@(medicalTreatment) forKey:@"medicalTreatment"];

    

    CGFloat unemployment = ROUND(theCalculatorMoney *[scaleParam[@"unemployment"] floatValue]);

    [resultDic setObject:@(unemployment) forKey:@"unemployment"];

    

    CGFloat occupationalInjury = ROUND(theCalculatorMoney *[scaleParam[@"occupationalInjury"] floatValue]);

    [resultDic setObject:@(occupationalInjury) forKey:@"occupationalInjury"];

    

    CGFloat giveBirth = ROUND(theCalculatorMoney *[scaleParam[@"giveBirth"] floatValue]);

    [resultDic setObject:@(giveBirth) forKey:@"giveBirth"];

    

    // 计算所给工资的公积金缴纳基数

    CGFloat theCalculatorprovidentFundMoney =0;

    if (salary > minAccumulationFundCardinalNumber && salary <= maxAccumulationFundCardinalNumber) {

        theCalculatorprovidentFundMoney = salary;

        

    }else if (salary > maxAccumulationFundCardinalNumber){

        theCalculatorprovidentFundMoney = maxAccumulationFundCardinalNumber;

        

    }else{

        theCalculatorprovidentFundMoney = minAccumulationFundCardinalNumber;

    }

//    计算公积金

    CGFloat providentFund = ROUND(theCalculatorprovidentFundMoney *[scaleParam[@"providentFund"] floatValue]);

    [resultDic setObject:@(providentFund) forKey:@"providentFund"];

//    计算个税

    CGFloat needPayTaxesMoney = salary-(providentFund+yanglao+medicalTreatment+unemployment+occupationalInjury+giveBirth);

    CGFloat tax = 0;

    if (needPayTaxesMoney>taxBase) {

        CGFloat needPayTaxes = salary-(providentFund+yanglao+medicalTreatment+unemployment+occupationalInjury+giveBirth)-taxBase;

        NSMutableArray *taxArr = [NSMutableArray array];

        for (int i=0; i<scaleArr.count; i++) {

            CGFloat scale = [scaleArr[i] floatValue];

            CGFloat tax = needPayTaxes *scale -[quickDeductionArr[i] integerValue];

            [taxArr addObject:[NSNumber numberWithFloat:tax]];

        }

        CGFloat maxValue = [[taxArr valueForKeyPath:@"@max.floatValue"] floatValue];

        tax = ROUND(maxValue);

        [resultDic setObject:@(tax) forKey:@"tax"];

    }

    else{

        tax = 0;

        [resultDic setObject:@(tax) forKey:@"tax"];

    }

    

    //到手工资

    CGFloat saveSalary = needPayTaxesMoney -tax;

    [resultDic setObject:@(saveSalary) forKey:@"saveSalary"];

    

    return resultDic;

}

2//工资计算(税后算税前)

+(NSMutableDictionary *)taxAfterCalculatorSalary:(CGFloat)salary taxBase:(CGFloat)taxBase scaleParam:(NSDictionary *)scaleParam{

    NSMutableDictionary *resultDic = [NSMutableDictionary dictionary];

    NSArray *scaleArr = @[@"0.03",@"0.1",@"0.2",@"0.25",@"0.30",@"0.35",@"0.45"];

    NSArray *quickDeductionArr = @[@"0",@"105",@"555",@"1005",@"2755",@"5505",@"13505"];

    //    社保最小缴纳基数

    CGFloat minSocialSecurityCardinalNumber = [scaleParam[@"minSocialSecurityCardinalNumber"] floatValue];

    //    社保最大缴纳基数

    CGFloat maxSocialSecurityCardinalNumber = [scaleParam[@"maxSocialSecurityCardinalNumber"]floatValue];

    //    公积金最小缴纳基数

    CGFloat minAccumulationFundCardinalNumber = [scaleParam[@"minAccumulationFundCardinalNumber"] floatValue];

    //    公积金最大缴纳基数

    CGFloat maxAccumulationFundCardinalNumber = [scaleParam[@"maxAccumulationFundCardinalNumber"]floatValue];

    

    //  税后最小最大基数(五险)

    NSDictionary *minSocialSalarDic = [self calculatorSalary:minSocialSecurityCardinalNumber taxBase:taxBase scaleParam:scaleParam];

    CGFloat minSocialSecurity = [minSocialSalarDic[@"giveBirth"]floatValue]+[minSocialSalarDic[@"medicalTreatment"]floatValue]+[minSocialSalarDic[@"occupationalInjury"]floatValue]+[minSocialSalarDic[@"unemployment"]floatValue]+[minSocialSalarDic[@"yanglao"]floatValue]; //五险最低缴纳额

    NSDictionary *maxSocialSalarDic = [self calculatorSalary:maxSocialSecurityCardinalNumber taxBase:taxBase scaleParam:scaleParam];


    //  税后最小最大基数(公积金)

    NSDictionary *minFourFundSalarDic = [self calculatorSalary:minAccumulationFundCardinalNumber taxBase:taxBase scaleParam:scaleParam];

    NSDictionary *maxFourFundSalarDic = [self calculatorSalary:maxAccumulationFundCardinalNumber taxBase:taxBase scaleParam:scaleParam];

    

    CGFloat minFourFund = [minFourFundSalarDic[@"providentFund"] floatValue];       //公积金最低缴纳额

    

    //   税后最小最大基数(五险一金)

    CGFloat minTaxAfterSocialSecurityCardinalNumber = [minSocialSalarDic[@"saveSalary"] floatValue];

    CGFloat maxTaxAfterSocialSecurityCardinalNumber = [maxSocialSalarDic[@"saveSalary"]floatValue];

    CGFloat minTaxAfterAccumulationFundCardinalNumber = [minFourFundSalarDic[@"saveSalary"] floatValue];

    CGFloat maxTaxAfterAccumulationFundCardinalNumber = [maxFourFundSalarDic[@"saveSalary"]floatValue];

    

    CGFloat theSocialSecurityCalculatorMoney = 0;//社保计算基数

    CGFloat theCalculatorprovidentFundMoney = 0;//公积金计算基数

    //五险一金比例

    CGFloat allScale = [scaleParam[@"providentFund"] floatValue]+ [scaleParam[@"yanglao"] floatValue] + [scaleParam[@"medicalTreatment"]floatValue]+ [scaleParam[@"unemployment"] floatValue]+[scaleParam[@"occupationalInjury"] floatValue]+[scaleParam[@"giveBirth"] floatValue];

    //社保比例

    CGFloat allSocialScale = [scaleParam[@"providentFund"] floatValue]+ [scaleParam[@"yanglao"] floatValue] + [scaleParam[@"medicalTreatment"]floatValue]+ [scaleParam[@"unemployment"] floatValue]+[scaleParam[@"occupationalInjury"] floatValue]+[scaleParam[@"giveBirth"] floatValue];

//    个税

    CGFloat baseMoney = salary-taxBase;

    NSMutableArray *allMoneyArr = [NSMutableArray array];

    for (int i=0; i<scaleArr.count; i++) {

        CGFloat scale = [scaleArr[i] floatValue];

        CGFloat money = baseMoney -[quickDeductionArr[i] integerValue];

        CGFloat needPayTaxes = money/(1-scale);

        [allMoneyArr addObject:[NSNumber numberWithFloat:needPayTaxes+taxBase]];

    }

    [allMoneyArr addObject:[NSNumber numberWithFloat:salary]];

    CGFloat maxAllMoneyValue = [[allMoneyArr valueForKeyPath:@"@max.floatValue"] floatValue];

    CGFloat needPayTaxesMoney = ROUND(maxAllMoneyValue);


//    计算五险一金 (税后最小最大基数排序)

        NSArray *numberArr = @[@(minTaxAfterAccumulationFundCardinalNumber),@(minTaxAfterSocialSecurityCardinalNumber),@(maxTaxAfterAccumulationFundCardinalNumber),@(maxTaxAfterSocialSecurityCardinalNumber)];

        

        NSComparator finderSort = ^(id string1,id string2){

            

            if ([string1 integerValue] > [string2 integerValue]) {

                return (NSComparisonResult)NSOrderedDescending;

            }else if ([string1 integerValue] < [string2 integerValue]){

                return (NSComparisonResult)NSOrderedAscending;

            }

            else

                return (NSComparisonResult)NSOrderedSame;

        };

        NSArray *resultArray = [numberArr sortedArrayUsingComparator:finderSort];

//        计算社保公积金的缴纳基数

        if (salary <= [resultArray[0] floatValue]) {

//            最小都按最小基数计算

            theSocialSecurityCalculatorMoney = minSocialSecurityCardinalNumber;

            theCalculatorprovidentFundMoney = minAccumulationFundCardinalNumber;

        }

        else if (salary>[resultArray[0] floatValue] &&salary<=[resultArray[1] floatValue]){

//            如果社保的最小基数比公积金最小基数 大,则社保按最小基数算,公积金按比例计算

            if ([resultArray[1] floatValue]==minTaxAfterSocialSecurityCardinalNumber) {

                theSocialSecurityCalculatorMoney = minSocialSecurityCardinalNumber;

                theCalculatorprovidentFundMoney = ROUND((needPayTaxesMoney + minSocialSecurity) /(1-[scaleParam[@"providentFund"] floatValue]));


            }

            else{

//            如果社保的最小基数比公积金最小基数 小,则公积金按最小基数算,社保按比例计算

                theSocialSecurityCalculatorMoney = ROUND((needPayTaxesMoney+minFourFund)/(1-allSocialScale));

                theCalculatorprovidentFundMoney = minTaxAfterAccumulationFundCardinalNumber;

            }

        }

        else if (salary>[resultArray[1] floatValue] &&salary<=[resultArray[2] floatValue]){

//            在中间部分社保公积金都是按比例计算

            theCalculatorprovidentFundMoney = ROUND(needPayTaxesMoney/(1-allScale));

            theSocialSecurityCalculatorMoney = ROUND(needPayTaxesMoney/(1-allScale));


        }

        else if (salary>[resultArray[2]floatValue] && salary<=[resultArray[3]floatValue]){

//            如果公积金的最大基数比社保最大基数 ,则公积金按最大基数计算,社保按比例计算

            if  ([resultArray[2] floatValue]==maxTaxAfterAccumulationFundCardinalNumber) {

                theSocialSecurityCalculatorMoney = ROUND(needPayTaxesMoney/(1-allScale));

                theCalculatorprovidentFundMoney = maxAccumulationFundCardinalNumber;

            }

            else{

//            如果公积金的最大基数比社保最大基数 ,则社保按最大基数计算,公积金按比例计算

                theCalculatorprovidentFundMoney = ROUND(needPayTaxesMoney/(1-allScale));

                theSocialSecurityCalculatorMoney = maxSocialSecurityCardinalNumber;

            }

        }

        else{

//            都超过最大,则都按最大基数计算

            theSocialSecurityCalculatorMoney = maxSocialSecurityCardinalNumber;

            theCalculatorprovidentFundMoney = maxAccumulationFundCardinalNumber;

            

        }

//    计算个税

    CGFloat tax = 0;

    if (needPayTaxesMoney>taxBase) {

        CGFloat needPayTaxes = needPayTaxesMoney - taxBase;

        NSMutableArray *taxArr = [NSMutableArray array];

        for (int i=0; i<scaleArr.count; i++) {

            CGFloat scale = [scaleArr[i] floatValue];

            CGFloat tax = needPayTaxes *scale -[quickDeductionArr[i] integerValue];

            [taxArr addObject:[NSNumber numberWithFloat:tax]];

        }

        CGFloat maxValue = [[taxArr valueForKeyPath:@"@max.floatValue"] floatValue];

        tax = ROUND(maxValue);

        [resultDic setObject:@(tax) forKey:@"tax"];

    }

    else{

        tax = 0;

        [resultDic setObject:@(tax) forKey:@"tax"];

    }

    //    计算五险

    CGFloat yanglao = ROUND(theSocialSecurityCalculatorMoney *[scaleParam[@"yanglao"] floatValue]);

    [resultDic setObject:@(yanglao) forKey:@"yanglao"];

    

    CGFloat medicalTreatment = ROUND(theSocialSecurityCalculatorMoney *[scaleParam[@"medicalTreatment"] floatValue]);

    [resultDic setObject:@(medicalTreatment) forKey:@"medicalTreatment"];

    

    CGFloat unemployment = ROUND(theSocialSecurityCalculatorMoney *[scaleParam[@"unemployment"] floatValue]);

    [resultDic setObject:@(unemployment) forKey:@"unemployment"];

    

    CGFloat occupationalInjury = ROUND(theSocialSecurityCalculatorMoney *[scaleParam[@"occupationalInjury"] floatValue]);

    [resultDic setObject:@(occupationalInjury) forKey:@"occupationalInjury"];

    

    CGFloat giveBirth = ROUND(theSocialSecurityCalculatorMoney *[scaleParam[@"giveBirth"] floatValue]);

    [resultDic setObject:@(giveBirth) forKey:@"giveBirth"];

    

//    计算公积金

    CGFloat providentFund = ROUND(theCalculatorprovidentFundMoney *[scaleParam[@"providentFund"] floatValue]);

    [resultDic setObject:@(providentFund) forKey:@"providentFund"];

    

    //    taxBefore 税前

    CGFloat taxBefore = needPayTaxesMoney+ (providentFund+yanglao+medicalTreatment+unemployment+occupationalInjury+giveBirth);

    [resultDic setObject:@(taxBefore) forKey:@"taxBefore"];

    

    return resultDic;

}

使用方法:(把参数model转换为字典)

CCCalculatorParamModel *paramModel = [[CCCalculatorParamModel alloc] init];

    paramModel.providentFund = 0.07;

    paramModel.yanglao = 0.08;

    paramModel.unemployment = 0.005;

    paramModel.medicalTreatment = 0.02;

    paramModel.giveBirth = 0;

    paramModel.occupationalInjury = 0;

    paramModel.minSocialSecurityCardinalNumber = 3902;

    paramModel.minAccumulationFundCardinalNumber = 2190;

    paramModel.maxAccumulationFundCardinalNumber = 19512;

    paramModel.maxSocialSecurityCardinalNumber = 19512;

   NSDictionary *resultDic =  [CCCommon taxAfterCalculatorSalary:[self.rate floatValue] taxBase:3500 scaleParam:[paramModel yy_modelToJSONObject]];




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值