您的位置:首页 > 移动开发 > Objective-C

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

2017-09-06 17:00 169 查看
以字典的形式传参以及返回参数:(只计算了个人部分)

参数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]];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS objective-c
相关文章推荐