工资计算 字典形式传参以及返回 结果
2017-09-06 17:00
176 查看
以字典的形式传参以及返回参数:(只计算了个人部分)
参数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]];
参数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]];
相关文章推荐
- Python Sqlite3以字典形式返回查询结果的实现方法
- Python Sqlite3以字典形式返回查询结果的实现方法
- 用python操作mysql数据库(之数据查询结果返回字典类型)
- 将SQL查询结果以字符串形式返回
- python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
- 深入理解用mysql_fetch_row()以数组的形式返回查询结果
- 深入理解用mysql_fetch_row()以数组的形式返回查询结果
- 使用FPU Control Word寄存器控制计算整形与浮点型混合相加的结果以及对浮点数异常相关位Mask的处理
- js 页面之间的跳转、传参以及返回上一页
- 深入分析使用mysql_fetch_object()以对象的形式返回查询结果
- 电商系统如何调用支付宝接口代码,以及支付宝如何返回处理结果。
- .net 将字典数据转换成xml 字符串, 以及传参至存储过程后如何取值
- mysql 返回多个函数计算结果
- 关于百度地图 DrivingRoute moreResultsUrl为“未能找到相应结果,请您:返回上一步操作..” 以及 WalkingRoute moreResultsUrl为空 的解决方案
- 系统会随机给你一个日期(yyyy-MM-dd)字符串,你需要计算这个时间上一个月的最后一天的具体日期,最后以yyyy年MM月dd日的字符形式返回
- Racket- 计算周工资。 输入列表,返回列表
- ABAP–如何在’REUSE_ALV_GRID_DISPLAY’使用自定义F4帮助,返回多个字段以及计算修改其他字段
- 2.、动态函数调用实现下列操作,输入2个数以及操作符计算结果。 @ 求最大公约数 $求最小公倍数 - 求差 + 求和 等等
- ASP 通用文章分页函数(非记录集分页), 返回多个结果, 字典实现 By shawl.qiu
- Python中让MySQL查询结果返回字典类型的方法