以字典的形式传参以及返回参数:(只计算了个人部分)
参数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]];