diff --git a/.project b/.project
index bd6d7b8..d07e753 100644
--- a/.project
+++ b/.project
@@ -22,12 +22,12 @@
- 1652984931087
+ 1664829736278
30
org.eclipse.core.resources.regexFilterMatcher
- node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
+ node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 552c396..3e4748e 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,14 +1,576 @@
eclipse.preferences.version=1
+enableParallelJavaIndexSearch=true
+org.eclipse.jdt.core.builder.annotationPath.allLocations=disabled
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=
+org.eclipse.jdt.core.circularClasspath=warning
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.camelCaseMatch=enabled
+org.eclipse.jdt.core.codeComplete.deprecationCheck=disabled
+org.eclipse.jdt.core.codeComplete.discouragedReferenceCheck=disabled
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.forbiddenReferenceCheck=enabled
+org.eclipse.jdt.core.codeComplete.forceImplicitQualification=disabled
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.subwordMatch=disabled
+org.eclipse.jdt.core.codeComplete.suggestStaticImports=enabled
+org.eclipse.jdt.core.codeComplete.visibilityCheck=enabled
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.lambda.genericSignature=do not generate
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.shareCommonFinallyBlocks=disabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.emulateJavacBug8031744=enabled
+org.eclipse.jdt.core.compiler.generateClassFiles=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deadCodeInTrivialIfStatement=disabled
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingMethodWithoutSuperInvocation=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.tasks=warning
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore
+org.eclipse.jdt.core.compiler.problem.uninternedIdentityComparison=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeArgumentsForMethodInvocation=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.processAnnotations=disabled
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.storeAnnotations=disabled
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.computeJavaBuildOrder=ignore
+org.eclipse.jdt.core.encoding=utf8
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_selector_in_method_invocation_on_expression_first_line=true
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter=0
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type=49
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assertion_message=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_arrow=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_colon=16
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_record_components=16
+org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_switch_case_with_arrow=20
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_annotations=0
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_record_constructor=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_record_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_permitted_types=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_permitted_types=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_switch_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_switch_case_with_arrow_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.text_block_indentation=0
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_before_switch_case_arrow_operator=false
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
+org.eclipse.jdt.core.timeoutForParameterNameFromAttachedJavadoc=50
diff --git a/README.md b/README.md
index 17ce371..995fb6e 100644
--- a/README.md
+++ b/README.md
@@ -916,4 +916,45 @@ System.out.println(response.acuse);
//En caso de obtener error, este puede obtenerse de los siguientes campos
System.out.println(response.message);
System.out.println(response.messageDetail);
+```
+
+# Servicio PDF #
+Servicio para generar PDF de un XML previamente timbrado.
+Se permite especificar una de las plantillas genericas o una plantilla personalizada en caso de contar con una.
+
+### Crear instancia de la clase.
+* Usuario y contraseña.
+ ```java
+ SWPdfService app = new SWPdfService(Utils.userSW, Utils.passwordSW, "http://api.test.sw.com.mx", "http://services.test.sw.com.mx");
+ ```
+* Token
+ ```java
+ SWPdfService app = new SWPdfService(Utils.tokenSW, "http://api.test.sw.com.mx");
+ ```
+## Generar PDF Default
+Generar PDF con plantilla por defecto CFDI 4.0.
+```java
+PdfResponse response = null;
+response = (PdfResponse) app.GeneratePdf(stamp.cfdi, this.logoB64);
+```
+## Generar PDF Default Extras
+Generar PDF con plantilla por defecto CFDI 4.0 con datos adicionales.
+```java
+HashMap extras = new HashMap();
+PdfResponse response = null;
+response = (PdfResponse) app.GeneratePdf(stamp.cfdi, this.logoB64, extras);
+```
+## Generar PDF Plantilla Generica.
+Generar PDF con plantilla generica.
+```java
+HashMap extras = new HashMap();
+PdfResponse response = null;
+response = (PdfResponse) app.GeneratePdf(stamp.cfdi, PdfTemplates.payment20, this.logoB64, extras);
+```
+## Generar PDF Plantilla Personalizada
+Generar PDF especificando una plantilla como string.
+```java
+HashMap extras = new HashMap();
+PdfResponse response = null;
+response = (PdfResponse) app.GeneratePdf(stamp.cfdi, "cfdi40", this.logoB64, extras);
```
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 8fe4098..aad3231 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
ISO-8859-1
SW-JAVA
- 1.0.6.7
+ 1.0.7.1
jar
https://github.com/lunasoft/sw-sdk-java
diff --git a/src/main/java/Services/Pdf/SWPdfService.java b/src/main/java/Services/Pdf/SWPdfService.java
index 25a03fe..bd4a46d 100644
--- a/src/main/java/Services/Pdf/SWPdfService.java
+++ b/src/main/java/Services/Pdf/SWPdfService.java
@@ -1,47 +1,118 @@
package Services.Pdf;
import java.io.IOException;
-
+import java.util.Map;
import Exceptions.AuthException;
import Exceptions.GeneralException;
import Services.SWService;
+import Utils.Helpers.PdfTemplates;
+import Utils.Helpers.RequestHelper;
import Utils.Requests.Pdf.PdfOptionsRequest;
import Utils.Requests.Pdf.PdfRequest;
import Utils.Responses.IResponse;
public class SWPdfService extends SWService {
-
- public SWPdfService(String user, String password, String URI) throws AuthException {
- super(user, password, URI);
+ /**
+ * Crear una instancia de la clase SWPdfService.
+ * @param user Email del usuario.
+ * @param password Contrasena del usuario.
+ * @param urlApi Url API.
+ * @param url Url Services.
+ * @throws AuthException
+ */
+ public SWPdfService(String user, String password, String urlApi, String url) throws AuthException {
+ super(user, password, url, urlApi);
}
-
- public SWPdfService(String token, String URI) {
- super(token, URI);
+ /**
+ * Crear una instancia de la clase SWPdfService.
+ * @param token Token de autenticacion.
+ * @param urlApi Url API.
+ */
+ public SWPdfService(String token, String urlApi) {
+ super(token, urlApi);
}
-
- public SWPdfService(String user, String password, String URI, String proxyHost, int proxyPort) throws AuthException {
- super(user, password, URI, proxyHost, proxyPort);
+ /**
+ * Crear una instancia de la clase SWPdfService.
+ * @param user Email del usuario.
+ * @param password Contrasena del usuario.
+ * @param urlApi Url API.
+ * @param url Url Services.
+ * @param proxyHost Proxy.
+ * @param proxyPort Puerto Proxy.
+ * @throws AuthException
+ */
+ public SWPdfService(String user, String password, String urlApi, String url, String proxyHost, int proxyPort) throws AuthException {
+ super(user, password, url, urlApi, proxyHost, proxyPort);
}
-
- public SWPdfService(String token, String URI, String proxyHost, int proxyPort) {
- super(token, URI, proxyHost, proxyPort);
+ /**
+ * Crear una instancia de la clase SWPdfService.
+ * @param token Token de autenticacion.
+ * @param urlApi Url API.
+ * @param proxyHost Proxy.
+ * @param proxyPort Puerto Proxy.
+ */
+ public SWPdfService(String token, String urlApi, String proxyHost, int proxyPort) {
+ super(token, urlApi, proxyHost, proxyPort);
+ }
+ /**
+ * Servicio para generar PDF con plantilla por defecto CFDI 4.0
+ * @param xml String CFDI formato XML.
+ * @param b64Logo Logo en B64.
+ * @return {@link Utils.Responses.Pdf.PdfResponse}
+ * @throws AuthException
+ * @throws GeneralException
+ * @throws IOException
+ */
+ public IResponse GeneratePdf(String xml, String b64Logo) throws AuthException, GeneralException, IOException {
+ PdfOptionsRequest settings = new PdfOptionsRequest(getToken(), RequestHelper.stringEmptyOrNull(getURIAPI()) ? getURI() : getURIAPI(), xml, b64Logo, getProxyHost(), getProxyPort());
+ PdfRequest req = new PdfRequest();
+ return req.sendRequest(settings);
}
-
- public IResponse GeneratePdf(String xml) throws AuthException, GeneralException, IOException {
- PdfOptionsRequest settings = new PdfOptionsRequest(getToken(),getURI(), xml, getProxyHost(), getProxyPort());
+ /**
+ * Servicio para generar PDF con plantilla por defecto CFDI 4.0.
+ * @param xml String CFDI formato XML.
+ * @param b64Logo Logo en B64.
+ * @param extras Especifica datos adicionales.
+ * @return {@link Utils.Responses.Pdf.PdfResponse}
+ * @throws AuthException
+ * @throws GeneralException
+ * @throws IOException
+ */
+ public IResponse GeneratePdf(String xml, String b64Logo, Map extras) throws AuthException, GeneralException, IOException {
+ PdfOptionsRequest settings = new PdfOptionsRequest(getToken(), RequestHelper.stringEmptyOrNull(getURIAPI()) ? getURI() : getURIAPI(), xml, b64Logo, extras, getProxyHost(), getProxyPort());
PdfRequest req = new PdfRequest();
return req.sendRequest(settings);
}
-
- public IResponse GeneratePdf(String xml, String extras) throws AuthException, GeneralException, IOException {
- PdfOptionsRequest settings = new PdfOptionsRequest(getToken(),getURI(), xml, extras, getProxyHost(), getProxyPort());
+ /**
+ * Servicio para generar PDF con plantilla personalizada.
+ * @param xml String CFDI formato XML.
+ * @param templateId Identificador de la plantilla.
+ * @param b64Logo Logo en B64.
+ * @param extras Especifica parametros extras.
+ * @return {@link Utils.Responses.Pdf.PdfResponse}
+ * @throws AuthException
+ * @throws GeneralException
+ * @throws IOException
+ */
+ public IResponse GeneratePdf(String xml, String templateId, String b64Logo, Map extras) throws AuthException, GeneralException, IOException {
+ PdfOptionsRequest settings = new PdfOptionsRequest(getToken(), RequestHelper.stringEmptyOrNull(getURIAPI()) ? getURI() : getURIAPI(), xml, templateId, b64Logo, extras, getProxyHost(), getProxyPort());
PdfRequest req = new PdfRequest();
return req.sendRequest(settings);
}
-
- public IResponse GeneratePdf(String xml, String extras, String templateId) throws AuthException, GeneralException, IOException {
- PdfOptionsRequest settings = new PdfOptionsRequest(getToken(),getURI(), xml, extras, templateId, getProxyHost(), getProxyPort());
+ /**
+ * Servicio para generar PDF con plantilla generica.
+ * @param xml String CFDI formato XML.
+ * @param templateId Identificador de la plantilla.
+ * @param b64Logo Logo en B64.
+ * @param extras Especifica parametros extras.
+ * @return {@link Utils.Responses.Pdf.PdfResponse}
+ * @throws AuthException
+ * @throws GeneralException
+ * @throws IOException
+ */
+ public IResponse GeneratePdf(String xml, PdfTemplates templateId, String b64Logo, Map extras) throws AuthException, GeneralException, IOException {
+ PdfOptionsRequest settings = new PdfOptionsRequest(getToken(), RequestHelper.stringEmptyOrNull(getURIAPI()) ? getURI() : getURIAPI(), xml, templateId.toString(), b64Logo, extras, getProxyHost(), getProxyPort());
PdfRequest req = new PdfRequest();
return req.sendRequest(settings);
}
diff --git a/src/main/java/Services/SWService.java b/src/main/java/Services/SWService.java
index 798c17c..ab17be0 100644
--- a/src/main/java/Services/SWService.java
+++ b/src/main/java/Services/SWService.java
@@ -11,6 +11,7 @@
public abstract class SWService {
private String URI;
+ private String URIAPI;
private String Token = null;
private String User = null;
private String Password = null;
@@ -24,23 +25,21 @@ public String getToken() throws AuthException, GeneralException, IOException {
}
return Token;
}
-
public String getUser() {
return User;
}
-
public String getPassword() {
return Password;
}
-
public String getURI() {
return URI;
}
-
+ public String getURIAPI(){
+ return URIAPI;
+ }
public String getProxyHost() {
return ProxyHost;
}
-
public int getProxyPort() {
return ProxyPort;
}
@@ -58,8 +57,22 @@ protected SWService(String user, String password, String URI) throws AuthExcepti
} catch (IOException e) {
throw new AuthException(409, e.getMessage());
}
- }
-
+ }
+ protected SWService(String user, String password, String URI, String URIAPI) throws AuthException {
+ User = user;
+ Password = password;
+ this.URI = URI;
+ this.URIAPI = URIAPI;
+ try {
+ generateToken();
+ } catch (AuthException e) {
+ throw new AuthException(e.getHttpStatusCode(), e.getErrorMSG());
+ } catch (GeneralException e) {
+ throw new AuthException(e.getHttpStatusCode(), e.getErrorMSG());
+ } catch (IOException e) {
+ throw new AuthException(409, e.getMessage());
+ }
+ }
protected SWService(String user, String password, String URI, String ProxyHost, int ProxyPort) throws AuthException {
User = user;
Password = password;
@@ -76,7 +89,23 @@ protected SWService(String user, String password, String URI, String ProxyHost,
throw new AuthException(409, e.getMessage());
}
}
-
+ protected SWService(String user, String password, String URI, String URIAPI, String ProxyHost, int ProxyPort) throws AuthException {
+ User = user;
+ Password = password;
+ this.ProxyHost = ProxyHost;
+ this.ProxyPort = ProxyPort;
+ this.URI = URI;
+ this.URIAPI = URIAPI;
+ try {
+ generateToken();
+ } catch (AuthException e) {
+ throw new AuthException(e.getHttpStatusCode(), e.getErrorMSG());
+ } catch (GeneralException e) {
+ throw new AuthException(e.getHttpStatusCode(), e.getErrorMSG());
+ } catch (IOException e) {
+ throw new AuthException(409, e.getMessage());
+ }
+ }
protected SWService(String token, String URI) {
Token = token;
this.URI = URI;
@@ -109,7 +138,7 @@ public void setPassword(String password) {
public void generateToken() throws AuthException, GeneralException, IOException {
if (User == null || Password == null) {
- throw new AuthException(400, "no existen elementos de autenticación");
+ throw new AuthException(400, "no existen elementos de autenticación");
}
AuthOptionsRequest settings = new AuthOptionsRequest(URI, getUser(), getPassword(), getProxyHost(), getProxyPort());
AuthRequest req = new AuthRequest();
diff --git a/src/main/java/Utils/Constants.java b/src/main/java/Utils/Constants.java
index 2cdbf1e..fb44eba 100644
--- a/src/main/java/Utils/Constants.java
+++ b/src/main/java/Utils/Constants.java
@@ -14,9 +14,7 @@ public class Constants {
public static String CANCELATION_UUID_PATH = "/cfdi33/cancel/";
public static String BALANCE_ACCOUNT_PATH = "/account/balance/";
public static String VALIDATE_XML_PATH = "/validate/cfdi33";
- public static String VALIDATE_LRFC_PATH = "/lrfc/";
- public static String VALIDATE_LCO_PATH = "/lco/";
- public static String GENERATE_PDF_PATH = "/pdf/v1/generate";
+ public static String GENERATE_PDF_PATH = "/pdf/v1/api/GeneratePdf";
public static String ACEPTAR_RECHAZAR_CANCELACION_CSD_PATH = "/acceptreject/csd";
public static String ACEPTAR_RECHAZAR_CANCELACION_XML_PATH = "/acceptreject/xml";
public static String ACEPTAR_RECHAZAR_CANCELACION_PFX_PATH = "/acceptreject/pfx";
diff --git a/src/main/java/Utils/Helpers/PdfTemplates.java b/src/main/java/Utils/Helpers/PdfTemplates.java
new file mode 100644
index 0000000..1048a54
--- /dev/null
+++ b/src/main/java/Utils/Helpers/PdfTemplates.java
@@ -0,0 +1,38 @@
+package Utils.Helpers;
+/**
+ * Plantilas Genericas
+ */
+public enum PdfTemplates {
+ /**
+ * CFDI 3.3
+ */
+ cfdi33,
+ /**
+ * CFDI 4.0
+ */
+ cfdi40,
+ /**
+ * Pagos 1.0
+ */
+ payment,
+ /**
+ * Pagos 2.0
+ */
+ payment20,
+ /**
+ * Nomina Rev. B
+ */
+ payroll,
+ /**
+ * Nomina Rev. C
+ */
+ payroll40,
+ /**
+ * Carta Porte 2.0 CFDI 3.3
+ */
+ billoflading20,
+ /**
+ * Carta Porte 2.0 CFDI 4.0
+ */
+ billoflading40
+}
diff --git a/src/main/java/Utils/Requests/Pdf/PdfOptionsRequest.java b/src/main/java/Utils/Requests/Pdf/PdfOptionsRequest.java
index 7707d0e..a222dbd 100644
--- a/src/main/java/Utils/Requests/Pdf/PdfOptionsRequest.java
+++ b/src/main/java/Utils/Requests/Pdf/PdfOptionsRequest.java
@@ -1,25 +1,34 @@
package Utils.Requests.Pdf;
+import java.util.Map;
+
import Utils.Constants;
+import Utils.Helpers.PdfTemplates;
import Utils.Requests.IRequest;
public class PdfOptionsRequest extends IRequest {
private String xml;
private String templateId;
- private String extras;
+ private String b64Logo;
+ private Map extras;
- public PdfOptionsRequest(String token, String URI, String xml, String proxyHost, int proxyPort) {
+ public PdfOptionsRequest(String token, String URI, String xml, String b64Logo, String proxyHost, int proxyPort) {
super(token, URI + Constants.GENERATE_PDF_PATH, proxyHost, proxyPort);
this.xml = xml;
+ this.b64Logo = b64Logo;
+ this.templateId = PdfTemplates.cfdi40.toString();
}
- public PdfOptionsRequest(String token, String URI, String xml, String extras, String proxyHost, int proxyPort) {
+ public PdfOptionsRequest(String token, String URI, String xml, String b64Logo, Map extras, String proxyHost, int proxyPort) {
super(token, URI + Constants.GENERATE_PDF_PATH, proxyHost, proxyPort);
this.xml = xml;
+ this.b64Logo = b64Logo;
this.extras = extras;
+ this.templateId = PdfTemplates.cfdi40.toString();
}
- public PdfOptionsRequest(String token, String URI, String xml, String extras, String templateId, String proxyHost, int proxyPort) {
+ public PdfOptionsRequest(String token, String URI, String xml, String templateId, String b64Logo, Map extras, String proxyHost, int proxyPort) {
super(token, URI + Constants.GENERATE_PDF_PATH, proxyHost, proxyPort);
this.xml = xml;
+ this.b64Logo = b64Logo;
this.extras = extras;
this.templateId = templateId;
}
@@ -27,11 +36,12 @@ public PdfOptionsRequest(String token, String URI, String xml, String extras, St
public String getTemplateId() {
return templateId;
}
-
- public String getExtras() {
+ public Map getExtras() {
return extras;
}
-
+ public String getB64Logo() {
+ return b64Logo;
+ }
public String getXml() {
return xml;
}
diff --git a/src/main/java/Utils/Requests/Pdf/PdfRequest.java b/src/main/java/Utils/Requests/Pdf/PdfRequest.java
index 48d4163..c82b895 100644
--- a/src/main/java/Utils/Requests/Pdf/PdfRequest.java
+++ b/src/main/java/Utils/Requests/Pdf/PdfRequest.java
@@ -5,9 +5,10 @@
import java.util.UUID;
import org.apache.http.HttpEntity;
+import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
@@ -26,67 +27,58 @@
public class PdfRequest implements IRequestor{
- public IResponse sendRequest(IRequest request) throws GeneralException, AuthException {
+ public IResponse sendRequest(IRequest request) throws GeneralException, AuthException, IOException {
try {
- String boundary = UUID.randomUUID().toString();
- String xmlStr = ((PdfOptionsRequest) request).getXml();
- String raw = "--"+boundary+"\r\nContent-Disposition: form-data; name=file; filename=file\r\nContent-Type: application/xml\r\n\r\n"+xmlStr+"\r\n--"+boundary+"--";
+ JSONObject requestJSON = new JSONObject();
+ requestJSON.put("xmlContent", ((PdfOptionsRequest) request).getXml());
+ requestJSON.put("logo", ((PdfOptionsRequest) request).getB64Logo());
+ requestJSON.put("extras", ((PdfOptionsRequest) request).getExtras());
+ requestJSON.put("templateId", ((PdfOptionsRequest) request).getTemplateId());
+
CloseableHttpClient client = HttpClients.createDefault();
HttpPost http = new HttpPost(request.URI);
- RequestHelper.setTimeOut(request.options, xmlStr.length());
+ RequestHelper.setTimeOut(request.options, requestJSON.toString().length());
RequestHelper.setProxy(request.options, request.proxyHost, request.proxyPort);
http.setConfig(request.options.build());
http.setHeader("Authorization", "Bearer " + request.Token);
- http.addHeader("Content-Type", "multipart/form-data; boundary="+boundary);
- if(((PdfOptionsRequest) request).getTemplateId() != null && !((PdfOptionsRequest) request).getTemplateId().isEmpty()) {
- http.setHeader("TemplateId",((PdfOptionsRequest) request).getTemplateId());
- }
- else {
- http.setHeader("TemplateId","6c757687-7979-4a5b-b4e0-fe5d35d1f970");
- }
+ http.addHeader("Content-Type", "application/json");
+
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
Charset chars = Charset.forName("UTF-8");
builder.setCharset(chars);
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
- builder.addTextBody("file", raw, ContentType.DEFAULT_BINARY);
- if(((PdfOptionsRequest) request).getTemplateId() != null && !((PdfOptionsRequest) request).getTemplateId().isEmpty()) {
- builder.addTextBody("extras", ((PdfOptionsRequest) request).getExtras(), ContentType.APPLICATION_JSON);
- }
- http.setEntity(builder.build());
-
- CloseableHttpResponse responseB = client.execute(http);
-
- HttpEntity entity = responseB.getEntity();
-
- String responseString = EntityUtils.toString(entity, "UTF-8");
- int statusE = responseB.getStatusLine().getStatusCode();
- client.close();
- responseB.close();
- System.out.println(responseString);
- if(!responseString.isEmpty() && statusE < 500) {
- JSONObject body = new JSONObject(responseString);
- if(statusE==200){
- JSONObject data = new JSONObject(body.get("data").toString());
- return new PdfResponse(statusE,body.get("message").toString(),data.get("contentB64").toString(),data.getInt("contentSizeBytes"),data.get("uuid").toString(),data.get("serie").toString(),data.get("folio").toString(),data.get("stampDate").toString(),data.get("issuedDate").toString(),data.get("rfcIssuer").toString(),data.get("rfcReceptor").toString(),data.get("total").toString(),"OK","OK");
- }
- else {
- String messageDetail = "";
- if (!body.isNull("messageDetail")) {
- messageDetail = body.getString("messageDetail");
- }
- return new PdfResponse(statusE, body.getString("message"), body.getString("message"), messageDetail);
- }
- }
- else {
- return new PdfResponse(statusE,"error",responseB.getStatusLine().getReasonPhrase(), responseString);
- }
- }
- catch (JSONException e){
- throw new GeneralException(500,e.getMessage());
- } catch (IOException e) {
- e.printStackTrace();
- throw new GeneralException(500,e.getMessage());
+
+
+ StringEntity sEntity = new StringEntity(requestJSON.toString(), "UTF-8");
+ http.setEntity(builder.build());
+ http.setEntity(sEntity);
+ CloseableHttpResponse responseB = client.execute(http);
+ HttpEntity entity = responseB.getEntity();
+ String responseString = EntityUtils.toString(entity, "UTF-8");
+ int status = responseB.getStatusLine().getStatusCode();
+ client.close();
+ responseB.close();
+ if (!responseString.isEmpty() && status < 500) {
+ JSONObject body = new JSONObject(responseString);
+ String message = body.isNull("message") ? "" : body.getString("message");
+ String messageDetail = body.isNull("messageDetail") ? "" : body.getString("messageDetail");
+ if (status == 200) {
+ JSONObject data = body.getJSONObject("data");
+ return new PdfResponse(status, body.getString("status"), data.getString("contentB64"), data.getInt("contentSizeBytes"),
+ data.getString("uuid"), data.getString("serie"), data.getString("folio"), data.getString("stampDate"),
+ data.getString("issuedDate"), data.getString("rfcIssuer"), data.getString("rfcReceptor"), data.getString("total"),
+ message, messageDetail);
+ } else {
+ return new PdfResponse(status, body.getString("status"), message, messageDetail);
+ }
+ } else {
+ return new PdfResponse(status, "error", responseB.getStatusLine().getReasonPhrase(),
+ responseString);
+ }
+ } catch (JSONException e) {
+ throw new GeneralException(500, e.getMessage());
+ } catch (ClientProtocolException e) {
+ throw new GeneralException(500, e.getMessage());
}
}
-
}
diff --git a/src/main/java/Utils/Responses/Pdf/PdfResponse.java b/src/main/java/Utils/Responses/Pdf/PdfResponse.java
index 65f7710..4d7e098 100644
--- a/src/main/java/Utils/Responses/Pdf/PdfResponse.java
+++ b/src/main/java/Utils/Responses/Pdf/PdfResponse.java
@@ -13,7 +13,8 @@ public class PdfResponse extends IResponse{
public String rfcIssuer;
public String rfcReceptor;
public String total;
- public PdfResponse(int httpStatusCode, String status, String contentB64, int contentSizeBytes, String uuid, String serie, String folio, String stampDate, String issuedDate, String rfcIssuer,String rfcReceptor, String total, String msg, String msgDetail) {
+ public PdfResponse(int httpStatusCode, String status, String contentB64, int contentSizeBytes, String uuid, String serie, String folio,
+ String stampDate, String issuedDate, String rfcIssuer, String rfcReceptor, String total, String msg, String msgDetail) {
super(httpStatusCode, status, msg, msgDetail);
this.contentB64 = contentB64;
this.contentSizeBytes = contentSizeBytes;
diff --git a/src/test/java/Tests/Cfdi40/ComercioExterior11Test.java b/src/test/java/Tests/Cfdi40/ComercioExterior11Test.java
index 2e37d4d..776a45f 100644
--- a/src/test/java/Tests/Cfdi40/ComercioExterior11Test.java
+++ b/src/test/java/Tests/Cfdi40/ComercioExterior11Test.java
@@ -2,6 +2,8 @@
import org.junit.Test;
import org.junit.Assert;
+import org.junit.Ignore;
+
import java.io.IOException;
import Exceptions.AuthException;
import Tests.helpers.StampService;
@@ -25,7 +27,7 @@ public class ComercioExterior11Test {
/**
* Timbrado de CFDI versión 4.0 de tipo ingreso con complemento comercio exterior mediante el servicio de timbrado versión 1 de la librerÃa sdk-java18 mediante usuario y contraseña con respuesta versión 1
*/
- @Test
+ @Ignore
public void testStampV1ComercioExteriorResponseV1() {
try {
SuccessV1Response response = stampService.StampResponseV1("src/test/resources/CFDI40/ComercioExterior11/CFDI40_ComercioExterior.xml", "V1", true, false);
@@ -45,7 +47,7 @@ public void testStampV1ComercioExteriorResponseV1() {
/**
* Timbrado de CFDI versión 4.0 de tipo ingreso con complemento comercio exterior con diferentes monedas mediante el servicio de timbrado versión 2 de la librerÃa sdk-java18 mediante usuario y contraseña con respuesta versión 2 en base64
*/
- @Test
+ @Ignore
public void testStampV2ComercioExteriorDiferentesMonedasResponseV2B64() {
try {
SuccessV2Response response = stampService.StampResponseV2("src/test/resources/CFDI40/ComercioExterior11/CFDI40_ComercioExterior_DiferentesMonedas.xml", "V2", true, true);
@@ -66,7 +68,7 @@ public void testStampV2ComercioExteriorDiferentesMonedasResponseV2B64() {
/**
* Timbrado de CFDI versión 4.0 de tipo ingreso con complemento comercio exterior con diferentes monedas mediante el servicio de timbrado versión 1 sin sellar (Issue) de la librerÃa sdk-java18 mediante usuario y contraseña con respuesta versión 4
*/
- @Test
+ @Ignore
public void testIssueV1ComercioExteriorDiferentesMonedasResponseV4() {
try {
SuccessV4Response response = stampService.StampResponseV4("src/test/resources/CFDI40/ComercioExterior11/CFDI40_ComercioExterior_DiferentesMonedas.xml", "IssueV1", false, false);
@@ -86,7 +88,7 @@ public void testIssueV1ComercioExteriorDiferentesMonedasResponseV4() {
/**
* Timbrado de CFDI versión 4.0 de tipo ingreso con complemento comercio exterior mediante el servicio de timbrado versión 2 sin sellar (Issue) de la librerÃa sdk-java18 mediante usuario y contraseña con respuesta versión 3
*/
- @Test
+ @Ignore
public void testIssueV2ComercioExteriorResponseV3() {
try {
SuccessV3Response response = stampService.StampResponseV3("src/test/resources/CFDI40/ComercioExterior11/CFDI40_ComercioExterior.xml", "IssueV2", false, false);
@@ -106,7 +108,7 @@ public void testIssueV2ComercioExteriorResponseV3() {
/**
* Timbrado de CFDI versión 4.0 de tipo ingreso con complemento comercio exterior mediante el servicio de timbrado versión 1 (Json) de la librerÃa sdk-java18 mediante usuario y contraseña con respuesta versión 3
*/
- @Test
+ @Ignore
public void testIssueJsonV1ComercioExteriorResponseV3() {
try {
SuccessV3Response response = stampService.StampResponseV3("src/test/resources/CFDI40/ComercioExterior11/CFDI40_ComercioExterior.json", "IssueJsonV1", false, false);
@@ -126,7 +128,7 @@ public void testIssueJsonV1ComercioExteriorResponseV3() {
/**
* Timbrado de CFDI versión 4.0 de tipo ingreso con complemento comercio exterior con diferentes monedas mediante el servicio de timbrado versión 1 (Json) de la librerÃa sdk-java18 mediante usuario y contraseña con respuesta versión 4
*/
- @Test
+ @Ignore
public void testIssueJsonV1ComercioExteriorDiferentesMonedasResponseV4() {
try {
SuccessV4Response response = stampService.StampResponseV4("src/test/resources/CFDI40/ComercioExterior11/CFDI40_ComercioExterior_DiferentesMonedas.json", "IssueJsonV1", false, false);
diff --git a/src/test/java/Tests/Pdf/SWPdfServiceTest.java b/src/test/java/Tests/Pdf/SWPdfServiceTest.java
index 6c49a99..63e286a 100644
--- a/src/test/java/Tests/Pdf/SWPdfServiceTest.java
+++ b/src/test/java/Tests/Pdf/SWPdfServiceTest.java
@@ -1,69 +1,272 @@
package Tests.Pdf;
-
import Exceptions.AuthException;
import Exceptions.GeneralException;
+import Services.Issue.SWIssueService;
import Services.Pdf.SWPdfService;
import Tests.Utils;
+import Utils.Helpers.PdfTemplates;
+import Utils.Responses.IResponse;
import Utils.Responses.Pdf.PdfResponse;
+import Utils.Responses.Stamp.SuccessV3Response;
import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
import org.junit.Assert;
-import org.junit.Ignore;
-
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestName;
public class SWPdfServiceTest {
-
- public String xml = " ";
-
- @Ignore
- public void testPdfService() throws AuthException, GeneralException, IOException {
- SWPdfService app = new SWPdfService(Utils.tokenSW, Utils.urlSW);
- PdfResponse response = null;
- response = (PdfResponse) app.GeneratePdf(xml);
-
- System.out.println(response.Status);
- System.out.println(response.HttpStatusCode);
- System.out.println(response.contentB64);
- System.out.println(response.contentSizeBytes);
- System.out.println(response.uuid);
- System.out.println(response.serie);
- System.out.println(response.folio);
- System.out.println(response.stampDate);
- System.out.println(response.issuedDate);
- System.out.println(response.rfcIssuer);
- System.out.println(response.rfcReceptor);
- System.out.println(response.total);
-
- String expect_status = "success";
- Assert.assertTrue(expect_status.equalsIgnoreCase(response.Status));
+ Utils settings = new Utils();
+ String baseDir = "src/test/resources/CFDI40/";
+ String logoB64 = settings.getResource("logoSw.png");
+ SWIssueService issue = new SWIssueService(Utils.tokenSW, Utils.urlSW);
+
+ @Rule
+ public TestName testName = new TestName();
+
+ @Test
+ public void GeneratePdf_ByUser_Success() throws AuthException, GeneralException, IOException {
+ SuccessV3Response stamp = (SuccessV3Response) issue
+ .IssueXml(settings.getCFDI(baseDir + "CFDI40/CFDI40_Ingreso.xml",
+ false, "v3", false), "v3");
+ if (stamp.Status.equals("success")) {
+ SWPdfService app = new SWPdfService(Utils.userSW, Utils.passwordSW, Utils.urlApiSW, Utils.urlSW);
+ PdfResponse response = null;
+ response = (PdfResponse) app.GeneratePdf(stamp.cfdi, logoB64);
+ Utils.showTestLog(testName, response.Status);
+ Assert.assertEquals(response.Status, "success");
+ Assert.assertTrue(!response.contentB64.isEmpty());
+ Assert.assertTrue(response.contentSizeBytes > 0);
+ Assert.assertTrue(!response.uuid.isEmpty());
+ Assert.assertTrue(!response.serie.isEmpty());
+ Assert.assertTrue(!response.folio.isEmpty());
+ Assert.assertTrue(!response.stampDate.isEmpty());
+ Assert.assertTrue(!response.issuedDate.isEmpty());
+ Assert.assertTrue(!response.rfcIssuer.isEmpty());
+ Assert.assertTrue(!response.rfcReceptor.isEmpty());
+ Assert.assertTrue(!response.total.isEmpty());
+ } else {
+ Assert.assertTrue(false);
+ }
}
- @Ignore
- public void testPdfService_incorrectToken() throws Exception {
-
- SWPdfService app = new SWPdfService("wrong this", Utils.urlSW);
+
+ @Test(expected = AuthException.class)
+ public void GeneratePdf_ByUser_InvalidPass_Error() throws AuthException, GeneralException, IOException {
+ try {
+ new SWPdfService(Utils.userSW, "InvalidPassword", Utils.urlApiSW, Utils.urlSW);
+ } catch (AuthException ex) {
+ Utils.showTestLog(testName, ex.getMessage());
+ throw ex;
+ }
+ }
+
+ @Test
+ public void GeneratePdf_ByToken_Success() throws AuthException, GeneralException, IOException {
+ SuccessV3Response stamp = (SuccessV3Response) issue
+ .IssueXml(settings.getCFDI(baseDir + "CFDI40/CFDI40_Ingreso.xml",
+ false, "v3", false), "v3");
+ if (stamp.Status.equals("success")) {
+ SWPdfService app = new SWPdfService(Utils.tokenSW, Utils.urlApiSW);
+ PdfResponse response = null;
+ response = (PdfResponse) app.GeneratePdf(stamp.cfdi, this.logoB64);
+ Utils.showTestLog(testName, response.Status);
+ Assert.assertEquals(response.Status, "success");
+ Assert.assertTrue(!response.contentB64.isEmpty());
+ Assert.assertTrue(response.contentSizeBytes > 0);
+ Assert.assertTrue(!response.uuid.isEmpty());
+ Assert.assertTrue(!response.serie.isEmpty());
+ Assert.assertTrue(!response.folio.isEmpty());
+ Assert.assertTrue(!response.stampDate.isEmpty());
+ Assert.assertTrue(!response.issuedDate.isEmpty());
+ Assert.assertTrue(!response.rfcIssuer.isEmpty());
+ Assert.assertTrue(!response.rfcReceptor.isEmpty());
+ Assert.assertTrue(!response.total.isEmpty());
+ } else {
+ Assert.assertTrue(false);
+ }
+ }
+
+ @Test
+ public void GeneratePdf_ByToken_InvalidToken_Error() throws AuthException, GeneralException, IOException {
+
+ SWPdfService app = new SWPdfService("wrong this", Utils.urlApiSW);
PdfResponse response = null;
- response = (PdfResponse) app.GeneratePdf(xml);
-
- System.out.println(response.Status);
- System.out.println(response.HttpStatusCode);
- System.out.println(response.message);
- System.out.println(response.messageDetail);
- String expect_message = "Access Denied";
- Assert.assertTrue(expect_message.equalsIgnoreCase(response.message));
+ response = (PdfResponse) app.GeneratePdf("", this.logoB64);
+ Utils.showTestLog(testName, response.Status);
+ Assert.assertEquals(response.Status, "error");
+ Assert.assertTrue(!response.message.isEmpty());
+ Assert.assertEquals(response.message, "El token debe contener 3 partes");
}
- @Ignore
- public void testPdfService_emptyUserParams() throws AuthException, GeneralException {
- SWPdfService app = new SWPdfService("", "", Utils.urlSW);
-
- try {
- app.GeneratePdf(xml);
- }
- catch(Exception e){
- System.out.println("Something bad happened");
- System.out.println(e.getMessage());
- Assert.assertNotNull("Something bad happened", e);
+
+ @Test
+ public void GeneratePdf_TemplateAsEnum_Success() throws AuthException, GeneralException, IOException {
+ HashMap extras = new HashMap();
+ extras.put("Observaciones", "Observaciones ejemplo");
+ extras.put("DatosExtras", "Tel. 0000000000, Empresas SW");
+ SuccessV3Response stamp = (SuccessV3Response) issue
+ .IssueXml(settings.getCFDI(baseDir + "CFDI40/CFDI40_Ingreso.xml",
+ false, "v3", false), "v3");
+ if (stamp.Status.equals("success")) {
+ SWPdfService app = new SWPdfService(Utils.tokenSW, Utils.urlApiSW);
+ PdfResponse response = null;
+ response = (PdfResponse) app.GeneratePdf(stamp.cfdi, PdfTemplates.cfdi40, this.logoB64, extras);
+ Utils.showTestLog(testName, response.Status);
+ Assert.assertEquals(response.Status, "success");
+ Assert.assertTrue(!response.contentB64.isEmpty());
+ Assert.assertTrue(response.contentSizeBytes > 0);
+ Assert.assertTrue(!response.uuid.isEmpty());
+ Assert.assertTrue(!response.serie.isEmpty());
+ Assert.assertTrue(!response.folio.isEmpty());
+ Assert.assertTrue(!response.stampDate.isEmpty());
+ Assert.assertTrue(!response.issuedDate.isEmpty());
+ Assert.assertTrue(!response.rfcIssuer.isEmpty());
+ Assert.assertTrue(!response.rfcReceptor.isEmpty());
+ Assert.assertTrue(!response.total.isEmpty());
+ } else {
+ Assert.assertTrue(false);
+ }
+ }
+
+ @Test
+ public void GeneratePdf_TemplateAsString__Success() throws AuthException, GeneralException, IOException {
+ SuccessV3Response stamp = (SuccessV3Response) issue
+ .IssueXml(settings.getCFDI(baseDir + "CFDI40/CFDI40_Ingreso.xml",
+ false, "v3", false), "v3");
+ if (stamp.Status.equals("success")) {
+ SWPdfService app = new SWPdfService(Utils.tokenSW, Utils.urlApiSW);
+ PdfResponse response = null;
+ response = (PdfResponse) app.GeneratePdf(stamp.cfdi, "cfdi40", this.logoB64, null);
+ Utils.showTestLog(testName, response.Status);
+ Assert.assertEquals(response.Status, "success");
+ Assert.assertTrue(!response.contentB64.isEmpty());
+ Assert.assertTrue(response.contentSizeBytes > 0);
+ Assert.assertTrue(!response.uuid.isEmpty());
+ Assert.assertTrue(!response.serie.isEmpty());
+ Assert.assertTrue(!response.folio.isEmpty());
+ Assert.assertTrue(!response.stampDate.isEmpty());
+ Assert.assertTrue(!response.issuedDate.isEmpty());
+ Assert.assertTrue(!response.rfcIssuer.isEmpty());
+ Assert.assertTrue(!response.rfcReceptor.isEmpty());
+ Assert.assertTrue(!response.total.isEmpty());
+ } else {
+ Assert.assertTrue(false);
+ }
+ }
+
+ @Test
+ public void GeneratePdf_AllParams__Success() throws AuthException, GeneralException, IOException {
+ HashMap extras = new HashMap();
+ extras.put("Observaciones", "Observaciones ejemplo");
+ extras.put("DatosExtras", "Tel. 0000000000, Empresas SW");
+ SuccessV3Response stamp = (SuccessV3Response) issue
+ .IssueXml(settings.getCFDI(baseDir + "CFDI40/CFDI40_Ingreso.xml",
+ false, "v3", false), "v3");
+ if (stamp.Status.equals("success")) {
+ SWPdfService app = new SWPdfService(Utils.tokenSW, Utils.urlApiSW);
+ PdfResponse response = null;
+ response = (PdfResponse) app.GeneratePdf(stamp.cfdi, PdfTemplates.cfdi40, this.logoB64, extras);
+ Utils.showTestLog(testName, response.Status);
+ Assert.assertEquals(response.Status, "success");
+ Assert.assertTrue(!response.contentB64.isEmpty());
+ Assert.assertTrue(response.contentSizeBytes > 0);
+ Assert.assertTrue(!response.uuid.isEmpty());
+ Assert.assertTrue(!response.serie.isEmpty());
+ Assert.assertTrue(!response.folio.isEmpty());
+ Assert.assertTrue(!response.stampDate.isEmpty());
+ Assert.assertTrue(!response.issuedDate.isEmpty());
+ Assert.assertTrue(!response.rfcIssuer.isEmpty());
+ Assert.assertTrue(!response.rfcReceptor.isEmpty());
+ Assert.assertTrue(!response.total.isEmpty());
+ } else {
+ Assert.assertTrue(false);
+ }
+ }
+ @Test
+ public void GeneratePdf_Pagos20__Success() throws AuthException, GeneralException, IOException {
+ HashMap extras = new HashMap();
+ extras.put("Observaciones", "Observaciones ejemplo");
+ extras.put("DatosExtras", "Tel. 0000000000, Empresas SW");
+ SuccessV3Response stamp = (SuccessV3Response) issue
+ .IssueXml(settings.getCFDI(baseDir + "Pagos20/CFDI40_Pago.xml",
+ false, "v3", false), "v3");
+ if (stamp.Status.equals("success")) {
+ SWPdfService app = new SWPdfService(Utils.tokenSW, Utils.urlApiSW);
+ PdfResponse response = null;
+ response = (PdfResponse) app.GeneratePdf(stamp.cfdi, PdfTemplates.payment20, this.logoB64, extras);
+ Utils.showTestLog(testName, response.Status);
+ Assert.assertEquals(response.Status, "success");
+ Assert.assertTrue(!response.contentB64.isEmpty());
+ Assert.assertTrue(response.contentSizeBytes > 0);
+ Assert.assertTrue(!response.uuid.isEmpty());
+ Assert.assertTrue(!response.serie.isEmpty());
+ Assert.assertTrue(!response.folio.isEmpty());
+ Assert.assertTrue(!response.stampDate.isEmpty());
+ Assert.assertTrue(!response.issuedDate.isEmpty());
+ Assert.assertTrue(!response.rfcIssuer.isEmpty());
+ Assert.assertTrue(!response.rfcReceptor.isEmpty());
+ Assert.assertTrue(!response.total.isEmpty());
+ } else {
+ Assert.assertTrue(false);
+ }
+ }
+ @Test
+ public void GeneratePdf_Nomina12__Success() throws AuthException, GeneralException, IOException {
+ HashMap extras = new HashMap();
+ extras.put("Observaciones", "Observaciones ejemplo");
+ extras.put("DatosExtras", "Tel. 0000000000, Empresas SW");
+ SuccessV3Response stamp = (SuccessV3Response) issue
+ .IssueXml(settings.getCFDI(baseDir + "Nomina12/CFDI40_Nomina.xml",
+ false, "v3", false), "v3");
+ if (stamp.Status.equals("success")) {
+ SWPdfService app = new SWPdfService(Utils.tokenSW, Utils.urlApiSW);
+ PdfResponse response = null;
+ response = (PdfResponse) app.GeneratePdf(stamp.cfdi, PdfTemplates.payroll40, this.logoB64, extras);
+ Utils.showTestLog(testName, response.Status);
+ Assert.assertEquals(response.Status, "success");
+ Assert.assertTrue(!response.contentB64.isEmpty());
+ Assert.assertTrue(response.contentSizeBytes > 0);
+ Assert.assertTrue(!response.uuid.isEmpty());
+ Assert.assertTrue(!response.serie.isEmpty());
+ Assert.assertTrue(!response.folio.isEmpty());
+ Assert.assertTrue(!response.stampDate.isEmpty());
+ Assert.assertTrue(!response.issuedDate.isEmpty());
+ Assert.assertTrue(!response.rfcIssuer.isEmpty());
+ Assert.assertTrue(!response.rfcReceptor.isEmpty());
+ Assert.assertTrue(!response.total.isEmpty());
+ } else {
+ Assert.assertTrue(false);
+ }
+ }
+ @Test
+ public void GeneratePdf_CP20__Success() throws AuthException, GeneralException, IOException {
+ HashMap extras = new HashMap();
+ extras.put("Observaciones", "Observaciones ejemplo");
+ extras.put("DatosExtras", "Tel. 0000000000, Empresas SW");
+ SuccessV3Response stamp = (SuccessV3Response) issue
+ .IssueXml(settings.getCFDI(baseDir + "CartaPorte20/CFDI40_Traslado_CartaPorte_Autotransporte.xml",
+ false, "v3", false), "v3");
+ if (stamp.Status.equals("success")) {
+ SWPdfService app = new SWPdfService(Utils.tokenSW, Utils.urlApiSW);
+ PdfResponse response = null;
+ response = (PdfResponse) app.GeneratePdf(stamp.cfdi, PdfTemplates.billoflading40, this.logoB64, extras);
+ Utils.showTestLog(testName, response.Status);
+ Assert.assertEquals(response.Status, "success");
+ Assert.assertTrue(!response.contentB64.isEmpty());
+ Assert.assertTrue(response.contentSizeBytes > 0);
+ Assert.assertTrue(!response.uuid.isEmpty());
+ Assert.assertTrue(!response.serie.isEmpty());
+ Assert.assertTrue(!response.folio.isEmpty());
+ Assert.assertTrue(!response.stampDate.isEmpty());
+ Assert.assertTrue(!response.issuedDate.isEmpty());
+ Assert.assertTrue(!response.rfcIssuer.isEmpty());
+ Assert.assertTrue(!response.rfcReceptor.isEmpty());
+ Assert.assertTrue(!response.total.isEmpty());
+ } else {
+ Assert.assertTrue(false);
}
}
}
diff --git a/src/test/java/Tests/Utils.java b/src/test/java/Tests/Utils.java
index 09bf68d..575bb24 100644
--- a/src/test/java/Tests/Utils.java
+++ b/src/test/java/Tests/Utils.java
@@ -16,6 +16,8 @@
import javax.xml.parsers.DocumentBuilder;
import javax.xml.transform.dom.DOMSource;
import org.apache.commons.codec.binary.Base64;
+import org.junit.rules.TestName;
+
import javax.xml.transform.stream.StreamResult;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
@@ -29,6 +31,7 @@
*/
public class Utils {
public static String urlSW = "http://services.test.sw.com.mx";
+ public static String urlApiSW = "http://api.test.sw.com.mx";
public static String userSW = System.getenv("SDKTEST_USER");
public static String passwordSW = System.getenv("SDKTEST_PASSWORD");
public static String tokenSW = System.getenv("SDKTEST_TOKEN");
@@ -82,7 +85,7 @@ public String getJsonCFDI(String fileName, boolean isBase64) {
if (data != null) {
UUID uuid = UUID.randomUUID();
String randomUUIDString = uuid.toString().replace("-", "");
- data.put("Folio", randomUUIDString + "sdk-java");
+ data.put("Folio", randomUUIDString + "sdkjava");
data.put("Fecha", getDateCFDI());
}
@@ -235,5 +238,21 @@ public static String getLlaveB64(){
}
return "";
- }
+ }
+
+ public String getResource(String fileName){
+ byte[] fileContent;
+ try {
+ fileContent = Files.readAllBytes(Paths.get("src/test/resources/Extras/" + fileName));
+ return encodeBase64(new String(fileContent, "UTF-8"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ return "";
+ }
+ public static void showTestLog(TestName testName, String status){
+ System.out.println(testName.getMethodName());
+ System.out.println(status + "\n");
+ }
}
diff --git a/src/test/resources/CFDI40/Addenda/CFDI40_Addenda.xml b/src/test/resources/CFDI40/Addenda/CFDI40_Addenda.xml
index 51587ab..a83bb56 100644
--- a/src/test/resources/CFDI40/Addenda/CFDI40_Addenda.xml
+++ b/src/test/resources/CFDI40/Addenda/CFDI40_Addenda.xml
@@ -1,35 +1,23 @@
-
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" NoCertificado="30001000000400002434">
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
abc
+ abc
+ abc
diff --git a/src/test/resources/CFDI40/CFDI40/CFDI40_Egreso_NotaDeCredito.json b/src/test/resources/CFDI40/CFDI40/CFDI40_Egreso_NotaDeCredito.json
index 958176e..03808ae 100644
--- a/src/test/resources/CFDI40/CFDI40/CFDI40_Egreso_NotaDeCredito.json
+++ b/src/test/resources/CFDI40/CFDI40/CFDI40_Egreso_NotaDeCredito.json
@@ -16,6 +16,7 @@
"Exportacion": "01",
"LugarExpedicion": "45610",
"FormaPago": "99",
+ "MetodoPago": "PUE",
"CfdiRelacionados": [
{
"TipoRelacion": "01",
diff --git a/src/test/resources/CFDI40/CFDI40/CFDI40_Egreso_NotaDeCredito.xml b/src/test/resources/CFDI40/CFDI40/CFDI40_Egreso_NotaDeCredito.xml
index ebc9d4b..fcaf3a1 100644
--- a/src/test/resources/CFDI40/CFDI40/CFDI40_Egreso_NotaDeCredito.xml
+++ b/src/test/resources/CFDI40/CFDI40/CFDI40_Egreso_NotaDeCredito.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso.json b/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso.json
index eb506af..59ec088 100644
--- a/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso.json
+++ b/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso.json
@@ -16,6 +16,7 @@
"Exportacion": "01",
"LugarExpedicion": "45610",
"FormaPago": "99",
+ "MetodoPago": "PUE",
"Emisor": {
"Rfc": "EKU9003173C9",
"Nombre": "ESCUELA KEMPER URGATE",
diff --git a/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso.xml b/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso.xml
index 98e491b..4d78757 100644
--- a/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso.xml
+++ b/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso.xml
@@ -1,27 +1,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso_ACuentaTerceros.json b/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso_ACuentaTerceros.json
index 6cd36ff..cbdb214 100644
--- a/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso_ACuentaTerceros.json
+++ b/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso_ACuentaTerceros.json
@@ -16,6 +16,7 @@
"Exportacion": "01",
"LugarExpedicion": "45610",
"FormaPago": "99",
+ "MetodoPago": "PUE",
"Emisor": {
"Rfc": "EKU9003173C9",
"Nombre": "ESCUELA KEMPER URGATE",
diff --git a/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso_KitParte.json b/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso_KitParte.json
index f6bd167..720f269 100644
--- a/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso_KitParte.json
+++ b/src/test/resources/CFDI40/CFDI40/CFDI40_Ingreso_KitParte.json
@@ -16,6 +16,7 @@
"Exportacion": "01",
"LugarExpedicion": "45610",
"FormaPago": "99",
+ "MetodoPago": "PUE",
"CfdiRelacionados": [
{
"TipoRelacion": "01",
diff --git a/src/test/resources/CFDI40/CFDI40/CFDI40_Traslado.json b/src/test/resources/CFDI40/CFDI40/CFDI40_Traslado.json
index 9a2bc12..5d5eab1 100644
--- a/src/test/resources/CFDI40/CFDI40/CFDI40_Traslado.json
+++ b/src/test/resources/CFDI40/CFDI40/CFDI40_Traslado.json
@@ -6,9 +6,7 @@
"Sello": "",
"NoCertificado": "",
"Certificado": "",
- "CondicionesDePago": "CondicionesDePago",
"SubTotal": "0.00",
- "Descuento": "0.00",
"Moneda": "AMD",
"TipoCambio": "1",
"Total": "0.00",
diff --git a/src/test/resources/CFDI40/CFDI40/CFDI40_Traslado.xml b/src/test/resources/CFDI40/CFDI40/CFDI40_Traslado.xml
index 21a6976..1c89322 100644
--- a/src/test/resources/CFDI40/CFDI40/CFDI40_Traslado.xml
+++ b/src/test/resources/CFDI40/CFDI40/CFDI40_Traslado.xml
@@ -1,11 +1,13 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_Autotransporte.xml b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_Autotransporte.xml
index de0882c..03f2068 100644
--- a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_Autotransporte.xml
+++ b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_Autotransporte.xml
@@ -9,8 +9,8 @@
-
-
+
+
diff --git a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteAereo.xml b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteAereo.xml
index 45fc928..8048c14 100644
--- a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteAereo.xml
+++ b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteAereo.xml
@@ -9,8 +9,8 @@
-
-
+
+
diff --git a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteFerroviario.xml b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteFerroviario.xml
index 31df725..cc1e5ce 100644
--- a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteFerroviario.xml
+++ b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteFerroviario.xml
@@ -9,8 +9,8 @@
-
-
+
+
diff --git a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteMaritimo.xml b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteMaritimo.xml
index d66b5e4..f7291cb 100644
--- a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteMaritimo.xml
+++ b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Ingreso_CartaPorte_TransporteMaritimo.xml
@@ -1,5 +1,8 @@
-
+
@@ -9,8 +12,8 @@
-
-
+
+
@@ -25,31 +28,31 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_Autotransporte.json b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_Autotransporte.json
index cbff077..4b3f978 100644
--- a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_Autotransporte.json
+++ b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_Autotransporte.json
@@ -7,7 +7,6 @@
"TipoDeComprobante": "T",
"LugarExpedicion": "25350",
"Exportacion": "01",
- "Descuento": "0",
"SubTotal": "0",
"Total": "0",
"Emisor": {
diff --git a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_Autotransporte.xml b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_Autotransporte.xml
index cb9533d..f1e0749 100644
--- a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_Autotransporte.xml
+++ b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_Autotransporte.xml
@@ -1,45 +1,37 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
diff --git a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteAereo.xml b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteAereo.xml
index 2e1e20a..8962f17 100644
--- a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteAereo.xml
+++ b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteAereo.xml
@@ -1,33 +1,35 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteFerroviario.xml b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteFerroviario.xml
index af314f2..665cff2 100644
--- a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteFerroviario.xml
+++ b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteFerroviario.xml
@@ -1,44 +1,41 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteMaritimo.xml b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteMaritimo.xml
index e6c5816..d69c34a 100644
--- a/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteMaritimo.xml
+++ b/src/test/resources/CFDI40/CartaPorte20/CFDI40_Traslado_CartaPorte_TransporteMaritimo.xml
@@ -1,39 +1,41 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/Detallista131/CFDI40_Detallista.xml b/src/test/resources/CFDI40/Detallista131/CFDI40_Detallista.xml
index 5c50bd7..100ce3d 100644
--- a/src/test/resources/CFDI40/Detallista131/CFDI40_Detallista.xml
+++ b/src/test/resources/CFDI40/Detallista131/CFDI40_Detallista.xml
@@ -12,8 +12,8 @@
-
-
+
+
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina.json b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina.json
index 18bab86..ac43293 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina.json
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina.json
@@ -2,11 +2,10 @@
"Version": "4.0",
"Serie": "SW",
"Folio": "123456",
- "Fecha": "2022-03-29T00:00:00",
+ "Fecha": "2022-07-21T00:00:00",
"Sello": "",
"NoCertificado": "",
"Certificado": "",
- "CondicionesDePago": "CondicionesDePago",
"SubTotal": "5000.00",
"Descuento": "300.00",
"Moneda": "MXN",
@@ -70,7 +69,7 @@
"RiesgoPuesto": "1",
"PeriodicidadPago": "04",
"CuentaBancaria": "1111111111",
- "Banco": "062",
+ "Banco": "002",
"SalarioBaseCotApor": "490.22",
"SalarioDiarioIntegrado": "146.47",
"ClaveEntFed": "JAL"
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina.xml b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina.xml
index a2fb2eb..da3d127 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina.xml
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina.xml
@@ -1,14 +1,16 @@
-
+
-
-
+
+
-
+
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Extraordinaria.json b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Extraordinaria.json
index ada1522..4938cb9 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Extraordinaria.json
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Extraordinaria.json
@@ -2,11 +2,10 @@
"Version": "4.0",
"Serie": "SW",
"Folio": "123456",
- "Fecha": "2022-03-29T00:00:00",
+ "Fecha": "2022-07-21T00:00:00",
"Sello": "",
"NoCertificado": "",
"Certificado": "",
- "CondicionesDePago": "CondicionesDePago",
"SubTotal": "10000.00",
"Descuento": "0",
"Moneda": "MXN",
@@ -17,78 +16,78 @@
"MetodoPago": "PPD",
"LugarExpedicion": "45610",
"Emisor": {
- "Rfc": "EKU9003173C9",
- "Nombre": "ESCUELA KEMPER URGATE",
- "RegimenFiscal": "603"
+ "Rfc": "EKU9003173C9",
+ "Nombre": "ESCUELA KEMPER URGATE",
+ "RegimenFiscal": "603"
},
"Receptor": {
- "Rfc": "XOJI740919U48",
- "Nombre": "INGRID XODAR JIMENEZ",
- "DomicilioFiscalReceptor": "88965",
- "RegimenFiscalReceptor": "605",
- "UsoCFDI": "CN01"
+ "Rfc": "XOJI740919U48",
+ "Nombre": "INGRID XODAR JIMENEZ",
+ "DomicilioFiscalReceptor": "88965",
+ "RegimenFiscalReceptor": "605",
+ "UsoCFDI": "CN01"
},
"Conceptos": [
- {
- "ClaveProdServ": "84111505",
- "Cantidad": "1",
- "ClaveUnidad": "ACT",
- "Descripcion": "Pago de nómina",
- "ValorUnitario": "10000.00",
- "Importe": "10000.00",
- "Descuento": "0",
- "ObjetoImp": "01"
- }
+ {
+ "ClaveProdServ": "84111505",
+ "Cantidad": "1",
+ "ClaveUnidad": "ACT",
+ "Descripcion": "Pago de nómina",
+ "ValorUnitario": "10000.00",
+ "Importe": "10000.00",
+ "Descuento": "0",
+ "ObjetoImp": "01"
+ }
],
"Complemento": {
- "Any": [
- {
- "Nomina12:Nomina": {
- "Version": "1.2",
- "TipoNomina": "E",
- "FechaPago": "2022-02-01",
- "FechaInicialPago": "2022-02-01",
- "FechaFinalPago": "2022-02-01",
- "NumDiasPagados": "30",
- "TotalPercepciones": "10000.00",
- "Emisor": {
- "RegistroPatronal": "B5510768108",
- "RfcPatronOrigen": "EKU9003173C9"
- },
- "Receptor": {
- "Curp": "XEXX010101HNEXXXA4",
- "NumSeguridadSocial": "000000",
- "FechaInicioRelLaboral": "2015-01-01",
- "Antigüedad": "P364W",
- "TipoContrato": "01",
- "TipoJornada": "01",
- "TipoRegimen": "03",
- "NumEmpleado": "120",
- "Departamento": "Desarrollo",
- "Puesto": "Ingeniero de Software",
- "RiesgoPuesto": "1",
- "PeriodicidadPago": "99",
- "CuentaBancaria": "1111111111",
- "Banco": "062",
- "SalarioDiarioIntegrado": "146.47",
- "ClaveEntFed": "JAL"
- },
- "Percepciones": {
- "TotalSueldos": "10000.00",
- "TotalGravado": "0",
- "TotalExento": "10000.00",
- "Percepcion": [
- {
- "TipoPercepcion": "002",
- "Clave": "00500",
- "Concepto": "Gratificación Anual (Aguinaldo)",
- "ImporteGravado": "0.00",
- "ImporteExento": "10000.00"
+ "Any": [
+ {
+ "Nomina12:Nomina": {
+ "Version": "1.2",
+ "TipoNomina": "E",
+ "FechaPago": "2022-02-01",
+ "FechaInicialPago": "2022-02-01",
+ "FechaFinalPago": "2022-02-01",
+ "NumDiasPagados": "30",
+ "TotalPercepciones": "10000.00",
+ "Emisor": {
+ "RegistroPatronal": "B5510768108",
+ "RfcPatronOrigen": "EKU9003173C9"
+ },
+ "Receptor": {
+ "Curp": "XEXX010101HNEXXXA4",
+ "NumSeguridadSocial": "000000",
+ "FechaInicioRelLaboral": "2015-01-01",
+ "Antigüedad": "P364W",
+ "TipoContrato": "01",
+ "TipoJornada": "01",
+ "TipoRegimen": "03",
+ "NumEmpleado": "120",
+ "Departamento": "Desarrollo",
+ "Puesto": "Ingeniero de Software",
+ "RiesgoPuesto": "1",
+ "PeriodicidadPago": "99",
+ "CuentaBancaria": "1111111111",
+ "Banco": "002",
+ "SalarioDiarioIntegrado": "146.47",
+ "ClaveEntFed": "JAL"
+ },
+ "Percepciones": {
+ "TotalSueldos": "10000.00",
+ "TotalGravado": "0",
+ "TotalExento": "10000.00",
+ "Percepcion": [
+ {
+ "TipoPercepcion": "002",
+ "Clave": "00500",
+ "Concepto": "Gratificación Anual (Aguinaldo)",
+ "ImporteGravado": "0.00",
+ "ImporteExento": "10000.00"
+ }
+ ]
+ }
}
- ]
}
- }
- }
- ]
+ ]
}
}
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Extraordinaria.xml b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Extraordinaria.xml
index a31e9ce..d042ae1 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Extraordinaria.xml
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Extraordinaria.xml
@@ -1,5 +1,7 @@
-
+
@@ -8,7 +10,7 @@
-
+
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_HorasExtra.json b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_HorasExtra.json
index ef71642..bb01f72 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_HorasExtra.json
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_HorasExtra.json
@@ -2,11 +2,10 @@
"Version": "4.0",
"Serie": "SW",
"Folio": "123456",
- "Fecha": "2022-03-29T00:00:00",
+ "Fecha": "2022-10-03T00:00:00",
"Sello": "",
"NoCertificado": "",
"Certificado": "",
- "CondicionesDePago": "CondicionesDePago",
"SubTotal": "5100.00",
"Descuento": "300.00",
"Moneda": "MXN",
@@ -70,7 +69,7 @@
"RiesgoPuesto": "1",
"PeriodicidadPago": "04",
"CuentaBancaria": "1111111111",
- "Banco": "062",
+ "Banco": "002",
"SalarioBaseCotApor": "490.22",
"SalarioDiarioIntegrado": "146.47",
"ClaveEntFed": "JAL"
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_HorasExtra.xml b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_HorasExtra.xml
index 9470daa..d1a930d 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_HorasExtra.xml
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_HorasExtra.xml
@@ -1,5 +1,7 @@
-
+
@@ -8,7 +10,7 @@
-
+
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Incapacidades.json b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Incapacidades.json
index 864fc03..7be245f 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Incapacidades.json
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Incapacidades.json
@@ -2,11 +2,10 @@
"Version": "4.0",
"Serie": "SW",
"Folio": "123456",
- "Fecha": "2022-03-29T00:00:00",
+ "Fecha": "2022-07-21T00:00:00",
"Sello": "",
"NoCertificado": "",
"Certificado": "",
- "CondicionesDePago": "CondicionesDePago",
"SubTotal": "5000.00",
"Descuento": "300.00",
"Moneda": "MXN",
@@ -70,7 +69,7 @@
"RiesgoPuesto": "1",
"PeriodicidadPago": "04",
"CuentaBancaria": "1111111111",
- "Banco": "062",
+ "Banco": "002",
"SalarioBaseCotApor": "490.22",
"SalarioDiarioIntegrado": "146.47",
"ClaveEntFed": "JAL"
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Incapacidades.xml b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Incapacidades.xml
index 643da1c..deb0c79 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Incapacidades.xml
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_Incapacidades.xml
@@ -1,5 +1,7 @@
-
+
@@ -8,7 +10,7 @@
-
+
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro.json b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro.json
index 7b7c600..1135531 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro.json
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro.json
@@ -2,11 +2,10 @@
"Version": "4.0",
"Serie": "SW",
"Folio": "123456",
- "Fecha": "2022-03-29T00:00:00",
+ "Fecha": "2022-07-21T00:00:00",
"Sello": "",
"NoCertificado": "",
"Certificado": "",
- "CondicionesDePago": "CondicionesDePago",
"SubTotal": "10000.00",
"Descuento": "0",
"Moneda": "MXN",
@@ -17,83 +16,83 @@
"MetodoPago": "PPD",
"LugarExpedicion": "45610",
"Emisor": {
- "Rfc": "EKU9003173C9",
- "Nombre": "ESCUELA KEMPER URGATE",
- "RegimenFiscal": "603"
+ "Rfc": "EKU9003173C9",
+ "Nombre": "ESCUELA KEMPER URGATE",
+ "RegimenFiscal": "603"
},
"Receptor": {
- "Rfc": "XOJI740919U48",
- "Nombre": "INGRID XODAR JIMENEZ",
- "DomicilioFiscalReceptor": "88965",
- "RegimenFiscalReceptor": "605",
- "UsoCFDI": "CN01"
+ "Rfc": "XOJI740919U48",
+ "Nombre": "INGRID XODAR JIMENEZ",
+ "DomicilioFiscalReceptor": "88965",
+ "RegimenFiscalReceptor": "605",
+ "UsoCFDI": "CN01"
},
"Conceptos": [
- {
- "ClaveProdServ": "84111505",
- "Cantidad": "1",
- "ClaveUnidad": "ACT",
- "Descripcion": "Pago de nómina",
- "ValorUnitario": "10000.00",
- "Importe": "10000.00",
- "Descuento": "0",
- "ObjetoImp": "01"
- }
+ {
+ "ClaveProdServ": "84111505",
+ "Cantidad": "1",
+ "ClaveUnidad": "ACT",
+ "Descripcion": "Pago de nómina",
+ "ValorUnitario": "10000.00",
+ "Importe": "10000.00",
+ "Descuento": "0",
+ "ObjetoImp": "01"
+ }
],
"Complemento": {
- "Any": [
- {
- "Nomina12:Nomina": {
- "Version": "1.2",
- "TipoNomina": "E",
- "FechaPago": "2022-02-01",
- "FechaInicialPago": "2022-02-01",
- "FechaFinalPago": "2022-02-01",
- "NumDiasPagados": "30",
- "TotalPercepciones": "10000.00",
- "Emisor": {
- "RegistroPatronal": "B5510768108",
- "RfcPatronOrigen": "EKU9003173C9"
- },
- "Receptor": {
- "Curp": "XEXX010101HNEXXXA4",
- "NumSeguridadSocial": "000000",
- "FechaInicioRelLaboral": "2015-01-01",
- "Antigüedad": "P364W",
- "TipoContrato": "01",
- "TipoJornada": "01",
- "TipoRegimen": "03",
- "NumEmpleado": "120",
- "Departamento": "Desarrollo",
- "Puesto": "Ingeniero de Software",
- "RiesgoPuesto": "1",
- "PeriodicidadPago": "99",
- "CuentaBancaria": "1111111111",
- "Banco": "062",
- "SalarioDiarioIntegrado": "146.47",
- "ClaveEntFed": "JAL"
- },
- "Percepciones": {
- "TotalJubilacionPensionRetiro": "10000.00",
- "TotalGravado": "0",
- "TotalExento": "10000.00",
- "Percepcion": [
- {
- "TipoPercepcion": "039",
- "Clave": "00500",
- "Concepto": "Jubilaciones, pensiones o haberes de retiro",
- "ImporteGravado": "0.00",
- "ImporteExento": "10000.00"
+ "Any": [
+ {
+ "Nomina12:Nomina": {
+ "Version": "1.2",
+ "TipoNomina": "E",
+ "FechaPago": "2022-02-01",
+ "FechaInicialPago": "2022-02-01",
+ "FechaFinalPago": "2022-02-01",
+ "NumDiasPagados": "30",
+ "TotalPercepciones": "10000.00",
+ "Emisor": {
+ "RegistroPatronal": "B5510768108",
+ "RfcPatronOrigen": "EKU9003173C9"
+ },
+ "Receptor": {
+ "Curp": "XEXX010101HNEXXXA4",
+ "NumSeguridadSocial": "000000",
+ "FechaInicioRelLaboral": "2015-01-01",
+ "Antigüedad": "P364W",
+ "TipoContrato": "01",
+ "TipoJornada": "01",
+ "TipoRegimen": "03",
+ "NumEmpleado": "120",
+ "Departamento": "Desarrollo",
+ "Puesto": "Ingeniero de Software",
+ "RiesgoPuesto": "1",
+ "PeriodicidadPago": "99",
+ "CuentaBancaria": "1111111111",
+ "Banco": "002",
+ "SalarioDiarioIntegrado": "146.47",
+ "ClaveEntFed": "JAL"
+ },
+ "Percepciones": {
+ "TotalJubilacionPensionRetiro": "10000.00",
+ "TotalGravado": "0",
+ "TotalExento": "10000.00",
+ "Percepcion": [
+ {
+ "TipoPercepcion": "039",
+ "Clave": "00500",
+ "Concepto": "Jubilaciones, pensiones o haberes de retiro",
+ "ImporteGravado": "0.00",
+ "ImporteExento": "10000.00"
+ }
+ ],
+ "JubilacionPensionRetiro": {
+ "IngresoAcumulable": "10000.00",
+ "IngresoNoAcumulable": "0.00",
+ "TotalUnaExhibicion": "10000.00"
+ }
+ }
}
- ],
- "JubilacionPensionRetiro": {
- "IngresoAcumulable": "10000.00",
- "IngresoNoAcumulable": "0.00",
- "TotalUnaExhibicion": "10000.00"
- }
}
- }
- }
- ]
+ ]
}
}
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro.xml b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro.xml
index 3783ed1..9c73ab2 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro.xml
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro.xml
@@ -1,5 +1,7 @@
-
+
@@ -8,8 +10,8 @@
-
-
+
+
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro2.json b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro2.json
index 46af13c..67b07ef 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro2.json
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro2.json
@@ -2,11 +2,10 @@
"Version": "4.0",
"Serie": "SW",
"Folio": "123456",
- "Fecha": "2022-03-29T00:00:00",
+ "Fecha": "2022-07-21T00:00:00",
"Sello": "",
"NoCertificado": "",
"Certificado": "",
- "CondicionesDePago": "CondicionesDePago",
"SubTotal": "10000.00",
"Descuento": "0",
"Moneda": "MXN",
@@ -17,84 +16,84 @@
"MetodoPago": "PPD",
"LugarExpedicion": "45610",
"Emisor": {
- "Rfc": "EKU9003173C9",
- "Nombre": "ESCUELA KEMPER URGATE",
- "RegimenFiscal": "603"
+ "Rfc": "EKU9003173C9",
+ "Nombre": "ESCUELA KEMPER URGATE",
+ "RegimenFiscal": "603"
},
"Receptor": {
- "Rfc": "XOJI740919U48",
- "Nombre": "INGRID XODAR JIMENEZ",
- "DomicilioFiscalReceptor": "88965",
- "RegimenFiscalReceptor": "605",
- "UsoCFDI": "CN01"
+ "Rfc": "XOJI740919U48",
+ "Nombre": "INGRID XODAR JIMENEZ",
+ "DomicilioFiscalReceptor": "88965",
+ "RegimenFiscalReceptor": "605",
+ "UsoCFDI": "CN01"
},
"Conceptos": [
- {
- "ClaveProdServ": "84111505",
- "Cantidad": "1",
- "ClaveUnidad": "ACT",
- "Descripcion": "Pago de nómina",
- "ValorUnitario": "10000.00",
- "Importe": "10000.00",
- "Descuento": "0",
- "ObjetoImp": "01"
- }
+ {
+ "ClaveProdServ": "84111505",
+ "Cantidad": "1",
+ "ClaveUnidad": "ACT",
+ "Descripcion": "Pago de nómina",
+ "ValorUnitario": "10000.00",
+ "Importe": "10000.00",
+ "Descuento": "0",
+ "ObjetoImp": "01"
+ }
],
"Complemento": {
- "Any": [
- {
- "Nomina12:Nomina": {
- "Version": "1.2",
- "TipoNomina": "E",
- "FechaPago": "2022-02-01",
- "FechaInicialPago": "2022-02-01",
- "FechaFinalPago": "2022-02-01",
- "NumDiasPagados": "30",
- "TotalPercepciones": "10000.00",
- "Emisor": {
- "RegistroPatronal": "B5510768108",
- "RfcPatronOrigen": "EKU9003173C9"
- },
- "Receptor": {
- "Curp": "XEXX010101HNEXXXA4",
- "NumSeguridadSocial": "000000",
- "FechaInicioRelLaboral": "2015-01-01",
- "Antigüedad": "P364W",
- "TipoContrato": "01",
- "TipoJornada": "01",
- "TipoRegimen": "03",
- "NumEmpleado": "120",
- "Departamento": "Desarrollo",
- "Puesto": "Ingeniero de Software",
- "RiesgoPuesto": "1",
- "PeriodicidadPago": "99",
- "CuentaBancaria": "1111111111",
- "Banco": "062",
- "SalarioDiarioIntegrado": "146.47",
- "ClaveEntFed": "JAL"
- },
- "Percepciones": {
- "TotalJubilacionPensionRetiro": "10000.00",
- "TotalGravado": "0",
- "TotalExento": "10000.00",
- "Percepcion": [
- {
- "TipoPercepcion": "044",
- "Clave": "00500",
- "Concepto": "Jubilaciones, pensiones o haberes de retiro",
- "ImporteGravado": "0.00",
- "ImporteExento": "10000.00"
+ "Any": [
+ {
+ "Nomina12:Nomina": {
+ "Version": "1.2",
+ "TipoNomina": "E",
+ "FechaPago": "2022-02-01",
+ "FechaInicialPago": "2022-02-01",
+ "FechaFinalPago": "2022-02-01",
+ "NumDiasPagados": "30",
+ "TotalPercepciones": "10000.00",
+ "Emisor": {
+ "RegistroPatronal": "B5510768108",
+ "RfcPatronOrigen": "EKU9003173C9"
+ },
+ "Receptor": {
+ "Curp": "XEXX010101HNEXXXA4",
+ "NumSeguridadSocial": "000000",
+ "FechaInicioRelLaboral": "2015-01-01",
+ "Antigüedad": "P364W",
+ "TipoContrato": "01",
+ "TipoJornada": "01",
+ "TipoRegimen": "03",
+ "NumEmpleado": "120",
+ "Departamento": "Desarrollo",
+ "Puesto": "Ingeniero de Software",
+ "RiesgoPuesto": "1",
+ "PeriodicidadPago": "99",
+ "CuentaBancaria": "1111111111",
+ "Banco": "002",
+ "SalarioDiarioIntegrado": "146.47",
+ "ClaveEntFed": "JAL"
+ },
+ "Percepciones": {
+ "TotalJubilacionPensionRetiro": "10000.00",
+ "TotalGravado": "0",
+ "TotalExento": "10000.00",
+ "Percepcion": [
+ {
+ "TipoPercepcion": "044",
+ "Clave": "00500",
+ "Concepto": "Jubilaciones, pensiones o haberes de retiro",
+ "ImporteGravado": "0.00",
+ "ImporteExento": "10000.00"
+ }
+ ],
+ "JubilacionPensionRetiro": {
+ "IngresoAcumulable": "10000.00",
+ "IngresoNoAcumulable": "0.00",
+ "TotalParcialidad": "3000.00",
+ "MontoDiario": "100.00"
+ }
+ }
}
- ],
- "JubilacionPensionRetiro": {
- "IngresoAcumulable": "10000.00",
- "IngresoNoAcumulable": "0.00",
- "TotalParcialidad": "3000.00",
- "MontoDiario": "100.00"
- }
}
- }
- }
- ]
+ ]
}
}
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro2.xml b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro2.xml
index dca7b45..2158061 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro2.xml
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_JubilacionPensionRetiro2.xml
@@ -1,5 +1,7 @@
-
+
@@ -8,8 +10,8 @@
-
-
+
+
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SeparacionIndemnizacion.json b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SeparacionIndemnizacion.json
index 4a483c2..a011e7b 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SeparacionIndemnizacion.json
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SeparacionIndemnizacion.json
@@ -2,11 +2,10 @@
"Version": "4.0",
"Serie": "SW",
"Folio": "123456",
- "Fecha": "2022-03-29T00:00:00",
+ "Fecha": "2022-07-21T00:00:00",
"Sello": "",
"NoCertificado": "",
"Certificado": "",
- "CondicionesDePago": "CondicionesDePago",
"SubTotal": "10000.00",
"Descuento": "0",
"Moneda": "MXN",
@@ -17,92 +16,92 @@
"MetodoPago": "PPD",
"LugarExpedicion": "45610",
"Emisor": {
- "Rfc": "EKU9003173C9",
- "Nombre": "ESCUELA KEMPER URGATE",
- "RegimenFiscal": "603"
+ "Rfc": "EKU9003173C9",
+ "Nombre": "ESCUELA KEMPER URGATE",
+ "RegimenFiscal": "603"
},
"Receptor": {
- "Rfc": "XOJI740919U48",
- "Nombre": "INGRID XODAR JIMENEZ",
- "DomicilioFiscalReceptor": "88965",
- "RegimenFiscalReceptor": "605",
- "UsoCFDI": "CN01"
+ "Rfc": "XOJI740919U48",
+ "Nombre": "INGRID XODAR JIMENEZ",
+ "DomicilioFiscalReceptor": "88965",
+ "RegimenFiscalReceptor": "605",
+ "UsoCFDI": "CN01"
},
"Conceptos": [
- {
- "ClaveProdServ": "84111505",
- "Cantidad": "1",
- "ClaveUnidad": "ACT",
- "Descripcion": "Pago de nómina",
- "ValorUnitario": "10000.00",
- "Importe": "10000.00",
- "Descuento": "0",
- "ObjetoImp": "01"
- }
+ {
+ "ClaveProdServ": "84111505",
+ "Cantidad": "1",
+ "ClaveUnidad": "ACT",
+ "Descripcion": "Pago de nómina",
+ "ValorUnitario": "10000.00",
+ "Importe": "10000.00",
+ "Descuento": "0",
+ "ObjetoImp": "01"
+ }
],
"Complemento": {
- "Any": [
- {
- "Nomina12:Nomina": {
- "Version": "1.2",
- "TipoNomina": "E",
- "FechaPago": "2022-02-01",
- "FechaInicialPago": "2022-02-01",
- "FechaFinalPago": "2022-02-01",
- "NumDiasPagados": "30",
- "TotalPercepciones": "10000.00",
- "Emisor": {
- "RegistroPatronal": "B5510768108",
- "RfcPatronOrigen": "EKU9003173C9"
- },
- "Receptor": {
- "Curp": "XEXX010101HNEXXXA4",
- "NumSeguridadSocial": "000000",
- "FechaInicioRelLaboral": "2015-01-01",
- "Antigüedad": "P364W",
- "TipoContrato": "01",
- "TipoJornada": "01",
- "TipoRegimen": "03",
- "NumEmpleado": "120",
- "Departamento": "Desarrollo",
- "Puesto": "Ingeniero de Software",
- "RiesgoPuesto": "1",
- "PeriodicidadPago": "99",
- "CuentaBancaria": "1111111111",
- "Banco": "062",
- "SalarioDiarioIntegrado": "146.47",
- "ClaveEntFed": "JAL"
- },
- "Percepciones": {
- "TotalSeparacionIndemnizacion": "10500.00",
- "TotalGravado": "0",
- "TotalExento": "10500.00",
- "Percepcion": [
- {
- "TipoPercepcion": "023",
- "Clave": "00500",
- "Concepto": "Pagos por separación",
- "ImporteGravado": "0.00",
- "ImporteExento": "10000.00"
- },
- {
- "TipoPercepcion": "025",
- "Clave": "00100",
- "Concepto": "Indemnizaciones",
- "ImporteGravado": "0.00",
- "ImporteExento": "500.00"
+ "Any": [
+ {
+ "Nomina12:Nomina": {
+ "Version": "1.2",
+ "TipoNomina": "E",
+ "FechaPago": "2022-02-01",
+ "FechaInicialPago": "2022-02-01",
+ "FechaFinalPago": "2022-02-01",
+ "NumDiasPagados": "30",
+ "TotalPercepciones": "10000.00",
+ "Emisor": {
+ "RegistroPatronal": "B5510768108",
+ "RfcPatronOrigen": "EKU9003173C9"
+ },
+ "Receptor": {
+ "Curp": "XEXX010101HNEXXXA4",
+ "NumSeguridadSocial": "000000",
+ "FechaInicioRelLaboral": "2015-01-01",
+ "Antigüedad": "P364W",
+ "TipoContrato": "01",
+ "TipoJornada": "01",
+ "TipoRegimen": "03",
+ "NumEmpleado": "120",
+ "Departamento": "Desarrollo",
+ "Puesto": "Ingeniero de Software",
+ "RiesgoPuesto": "1",
+ "PeriodicidadPago": "99",
+ "CuentaBancaria": "1111111111",
+ "Banco": "002",
+ "SalarioDiarioIntegrado": "146.47",
+ "ClaveEntFed": "JAL"
+ },
+ "Percepciones": {
+ "TotalSeparacionIndemnizacion": "10500.00",
+ "TotalGravado": "0",
+ "TotalExento": "10500.00",
+ "Percepcion": [
+ {
+ "TipoPercepcion": "023",
+ "Clave": "00500",
+ "Concepto": "Pagos por separación",
+ "ImporteGravado": "0.00",
+ "ImporteExento": "10000.00"
+ },
+ {
+ "TipoPercepcion": "025",
+ "Clave": "00100",
+ "Concepto": "Indemnizaciones",
+ "ImporteGravado": "0.00",
+ "ImporteExento": "500.00"
+ }
+ ],
+ "SeparacionIndemnizacion": {
+ "TotalPagado": "10500.00",
+ "NumAñosServicio": "1",
+ "UltimoSueldoMensOrd": "10000.00",
+ "IngresoAcumulable": "10000.00",
+ "IngresoNoAcumulable": "0.00"
+ }
+ }
}
- ],
- "SeparacionIndemnizacion": {
- "TotalPagado": "10500.00",
- "NumAñosServicio": "1",
- "UltimoSueldoMensOrd": "10000.00",
- "IngresoAcumulable": "10000.00",
- "IngresoNoAcumulable": "0.00"
- }
}
- }
- }
- ]
+ ]
}
}
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SeparacionIndemnizacion.xml b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SeparacionIndemnizacion.xml
index 6e157b2..c52a11d 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SeparacionIndemnizacion.xml
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SeparacionIndemnizacion.xml
@@ -1,5 +1,7 @@
-
+
@@ -8,7 +10,7 @@
-
+
@@ -16,5 +18,4 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SinDeducciones.json b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SinDeducciones.json
index a3eed28..caeeb3b 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SinDeducciones.json
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SinDeducciones.json
@@ -2,11 +2,10 @@
"Version": "4.0",
"Serie": "SW",
"Folio": "123456",
- "Fecha": "2022-03-29T00:00:00",
+ "Fecha": "2022-07-21T00:00:00",
"Sello": "",
"NoCertificado": "",
"Certificado": "",
- "CondicionesDePago": "CondicionesDePago",
"SubTotal": "5000.00",
"Descuento": "0",
"Moneda": "MXN",
@@ -17,79 +16,79 @@
"MetodoPago": "PPD",
"LugarExpedicion": "45610",
"Emisor": {
- "Rfc": "EKU9003173C9",
- "Nombre": "ESCUELA KEMPER URGATE",
- "RegimenFiscal": "603"
+ "Rfc": "EKU9003173C9",
+ "Nombre": "ESCUELA KEMPER URGATE",
+ "RegimenFiscal": "603"
},
"Receptor": {
- "Rfc": "XOJI740919U48",
- "Nombre": "INGRID XODAR JIMENEZ",
- "DomicilioFiscalReceptor": "88965",
- "RegimenFiscalReceptor": "605",
- "UsoCFDI": "CN01"
+ "Rfc": "XOJI740919U48",
+ "Nombre": "INGRID XODAR JIMENEZ",
+ "DomicilioFiscalReceptor": "88965",
+ "RegimenFiscalReceptor": "605",
+ "UsoCFDI": "CN01"
},
"Conceptos": [
- {
- "ClaveProdServ": "84111505",
- "Cantidad": "1",
- "ClaveUnidad": "ACT",
- "Descripcion": "Pago de nómina",
- "ValorUnitario": "5000.00",
- "Importe": "5000.00",
- "Descuento": "0.00",
- "ObjetoImp": "01"
- }
+ {
+ "ClaveProdServ": "84111505",
+ "Cantidad": "1",
+ "ClaveUnidad": "ACT",
+ "Descripcion": "Pago de nómina",
+ "ValorUnitario": "5000.00",
+ "Importe": "5000.00",
+ "Descuento": "0.00",
+ "ObjetoImp": "01"
+ }
],
"Complemento": {
- "Any": [
- {
- "Nomina12:Nomina": {
- "Version": "1.2",
- "TipoNomina": "O",
- "FechaPago": "2022-02-01",
- "FechaInicialPago": "2022-01-16",
- "FechaFinalPago": "2022-01-31",
- "NumDiasPagados": "15",
- "TotalPercepciones": "5000.00",
- "Emisor": {
- "RegistroPatronal": "B5510768108",
- "RfcPatronOrigen": "EKU9003173C9"
- },
- "Receptor": {
- "Curp": "XEXX010101HNEXXXA4",
- "NumSeguridadSocial": "000000",
- "FechaInicioRelLaboral": "2015-01-01",
- "Antigüedad": "P364W",
- "TipoContrato": "01",
- "TipoJornada": "01",
- "TipoRegimen": "03",
- "NumEmpleado": "120",
- "Departamento": "Desarrollo",
- "Puesto": "Ingeniero de Software",
- "RiesgoPuesto": "1",
- "PeriodicidadPago": "04",
- "CuentaBancaria": "1111111111",
- "Banco": "062",
- "SalarioBaseCotApor": "490.22",
- "SalarioDiarioIntegrado": "146.47",
- "ClaveEntFed": "JAL"
- },
- "Percepciones": {
- "TotalSueldos": "5000.0",
- "TotalGravado": "2808.8",
- "TotalExento": "2191.2",
- "Percepcion": [
- {
- "TipoPercepcion": "001",
- "Clave": "00500",
- "Concepto": "Sueldos, Salarios Rayas y Jornales",
- "ImporteGravado": "2808.8",
- "ImporteExento": "2191.2"
+ "Any": [
+ {
+ "Nomina12:Nomina": {
+ "Version": "1.2",
+ "TipoNomina": "O",
+ "FechaPago": "2022-02-01",
+ "FechaInicialPago": "2022-01-16",
+ "FechaFinalPago": "2022-01-31",
+ "NumDiasPagados": "15",
+ "TotalPercepciones": "5000.00",
+ "Emisor": {
+ "RegistroPatronal": "B5510768108",
+ "RfcPatronOrigen": "EKU9003173C9"
+ },
+ "Receptor": {
+ "Curp": "XEXX010101HNEXXXA4",
+ "NumSeguridadSocial": "000000",
+ "FechaInicioRelLaboral": "2015-01-01",
+ "Antigüedad": "P364W",
+ "TipoContrato": "01",
+ "TipoJornada": "01",
+ "TipoRegimen": "03",
+ "NumEmpleado": "120",
+ "Departamento": "Desarrollo",
+ "Puesto": "Ingeniero de Software",
+ "RiesgoPuesto": "1",
+ "PeriodicidadPago": "04",
+ "CuentaBancaria": "1111111111",
+ "Banco": "002",
+ "SalarioBaseCotApor": "490.22",
+ "SalarioDiarioIntegrado": "146.47",
+ "ClaveEntFed": "JAL"
+ },
+ "Percepciones": {
+ "TotalSueldos": "5000.0",
+ "TotalGravado": "2808.8",
+ "TotalExento": "2191.2",
+ "Percepcion": [
+ {
+ "TipoPercepcion": "001",
+ "Clave": "00500",
+ "Concepto": "Sueldos, Salarios Rayas y Jornales",
+ "ImporteGravado": "2808.8",
+ "ImporteExento": "2191.2"
+ }
+ ]
+ }
}
- ]
}
- }
- }
- ]
+ ]
}
}
\ No newline at end of file
diff --git a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SinDeducciones.xml b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SinDeducciones.xml
index 2869ca1..7ac696b 100644
--- a/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SinDeducciones.xml
+++ b/src/test/resources/CFDI40/Nomina12/CFDI40_Nomina_SinDeducciones.xml
@@ -1,5 +1,7 @@
-
+
@@ -8,7 +10,7 @@
-
+
diff --git a/src/test/resources/CFDI40/Pagos20/CFDI40_Pago.xml b/src/test/resources/CFDI40/Pagos20/CFDI40_Pago.xml
index 27e61d1..4ad8589 100644
--- a/src/test/resources/CFDI40/Pagos20/CFDI40_Pago.xml
+++ b/src/test/resources/CFDI40/Pagos20/CFDI40_Pago.xml
@@ -1,16 +1,35 @@
-
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/Extras/logoSw.png b/src/test/resources/Extras/logoSw.png
new file mode 100644
index 0000000..9c9ac0d
--- /dev/null
+++ b/src/test/resources/Extras/logoSw.png
@@ -0,0 +1 @@
+
\ No newline at end of file