diff --git a/docs/doxygen.conf b/docs/doxygen.conf index 63e75090..4f997218 100644 --- a/docs/doxygen.conf +++ b/docs/doxygen.conf @@ -1,4 +1,4 @@ -# Doxyfile 1.8.18 +# Doxyfile 1.9.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -227,6 +227,14 @@ QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. @@ -315,7 +323,10 @@ OPTIMIZE_OUTPUT_SLICE = NO # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. EXTENSION_MAPPING = @@ -449,6 +460,19 @@ TYPEDEF_HIDES_STRUCT = NO LOOKUP_CACHE_SIZE = 0 +# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which efficively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -512,6 +536,13 @@ EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation @@ -549,11 +580,18 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# (including Cygwin) ands Mac users are advised to set this option to NO. +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. # The default value is: system dependent. CASE_SENSE_NAMES = NO @@ -792,7 +830,10 @@ WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. # The default value is: NO. WARN_AS_ERROR = NO @@ -828,8 +869,8 @@ INPUT = ../src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: https://www.gnu.org/software/libiconv/) for the list of -# possible encodings. +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 @@ -842,13 +883,15 @@ INPUT_ENCODING = UTF-8 # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, # *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), -# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen -# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, -# *.vhdl, *.ucf, *.qsf and *.ice. +# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, +# *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -1108,6 +1151,44 @@ USE_HTAGS = NO VERBATIM_HEADERS = YES +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled and the CLANG_ADD_INC_PATHS tag is set to +# YES then doxygen will add the directory of each input to the include path. +# The default value is: YES. + +CLANG_ADD_INC_PATHS = YES + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- @@ -1119,13 +1200,6 @@ VERBATIM_HEADERS = YES ALPHABETICAL_INDEX = YES -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored @@ -1296,10 +1370,11 @@ HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: https://developer.apple.com/xcode/), introduced with OSX -# 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. @@ -1341,8 +1416,8 @@ DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. +# (see: +# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML @@ -1372,7 +1447,7 @@ CHM_FILE = HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). +# (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1417,7 +1492,8 @@ QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1425,8 +1501,8 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- -# folders). +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1434,16 +1510,16 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = @@ -1455,9 +1531,9 @@ QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = @@ -1538,8 +1614,8 @@ EXT_LINKS_IN_WINDOW = NO # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for # the HTML output. These images will generally look nicer at scaled resolutions. -# Possible values are: png The default and svg Looks nicer but requires the -# pdf2svg tool. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). # The default value is: png. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1584,7 +1660,7 @@ USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. @@ -1614,7 +1690,8 @@ MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1661,7 +1738,8 @@ SERVER_BASED_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). +# Xapian (see: +# https://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. @@ -1674,8 +1752,9 @@ EXTERNAL_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). See the section "External Indexing and -# Searching" for details. +# Xapian (see: +# https://xapian.org/). See the section "External Indexing and Searching" for +# details. # This tag requires that the tag SEARCHENGINE is set to YES. SEARCHENGINE_URL = @@ -1839,9 +1918,11 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES, to get a -# higher quality PDF documentation. +# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as +# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX +# files. Set this option to YES, to get a higher quality PDF documentation. +# +# See also section LATEX_CMD_NAME for selecting the engine. # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -2352,10 +2433,32 @@ UML_LOOK = NO # but if the number exceeds 15, the total amount of fields shown is limited to # 10. # Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. +# This tag requires that the tag UML_LOOK is set to YES. UML_LIMIT_NUM_FIELDS = 10 +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will wrapped across multiple lines. Some heuristics are apply +# to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their # instances. @@ -2545,9 +2648,11 @@ DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc and +# plantuml temporary files. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. -DOT_CLEANUP = YES \ No newline at end of file +DOT_CLEANUP = YES diff --git a/docs/layout.xml b/docs/layout.xml index e12790f9..4233a7bd 100644 --- a/docs/layout.xml +++ b/docs/layout.xml @@ -1,195 +1,228 @@ - + - - - + + + + - - + + - - + + + + + + - - - + + + + + + + + + + + + + - - + + - + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - + + + + + + + + + + + - - - + + + - + - - - - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + - + - - - - - + + + + + - - - - - - - - - + + + + + + + + + + + + + + - + - - - - - - + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + - - + + - - + + - + - \ No newline at end of file + diff --git a/src/Intacct/Credentials/Endpoint.php b/src/Intacct/Credentials/Endpoint.php index 1e8780a9..4f0f19fe 100644 --- a/src/Intacct/Credentials/Endpoint.php +++ b/src/Intacct/Credentials/Endpoint.php @@ -31,6 +31,8 @@ class Endpoint /** @var string */ const DOMAIN_NAME = 'intacct.com'; + const FULL_QUALIFIED_DOMAIN_NAME = self::DOMAIN_NAME . "."; + /** @var string */ private $url; @@ -48,6 +50,16 @@ public function __construct(ClientConfig $config) } } + private function isDomainValid(string $hostName) { + $checkMainDomain = "." . self::DOMAIN_NAME; + $checkFQDNDomain = "." . self::FULL_QUALIFIED_DOMAIN_NAME; + + // if hostname is 1-1 for Main or FQDN, it is valid + return (substr($hostName, -strlen($checkMainDomain)) === $checkMainDomain) || + (substr($hostName, -strlen($checkFQDNDomain)) === $checkFQDNDomain); + + } + /** * @return string */ @@ -77,10 +89,9 @@ public function setUrl(string $url) 'Endpoint URL is not a valid URL.' ); } + $host = parse_url($url, PHP_URL_HOST); - $check = '.' . self::DOMAIN_NAME; - $len = strlen($check); - if (substr($host, -$len) !== $check) { + if (!$this->isDomainValid($host)) { throw new \InvalidArgumentException( 'Endpoint URL is not a valid ' . self::DOMAIN_NAME . ' domain name.' ); diff --git a/src/Intacct/Functions/AccountsReceivable/AbstractInvoice.php b/src/Intacct/Functions/AccountsReceivable/AbstractInvoice.php index e9262554..73704dc4 100644 --- a/src/Intacct/Functions/AccountsReceivable/AbstractInvoice.php +++ b/src/Intacct/Functions/AccountsReceivable/AbstractInvoice.php @@ -92,6 +92,9 @@ abstract class AbstractInvoice extends AbstractFunction /** @var string */ protected $attachmentsId; + /** @var string */ + protected $taxSolutionId; + /** @var AbstractInvoiceLine[] */ protected $lines = []; @@ -535,6 +538,22 @@ public function setAttachmentsId($attachmentsId) $this->attachmentsId = $attachmentsId; } + /** + * @return string + */ + public function getTaxSolutionId() + { + return $this->taxSolutionId; + } + + /** + * @param string $taxSolutionId + */ + public function setTaxSolutionId(string $taxSolutionId) + { + $this->taxSolutionId = $taxSolutionId; + } + /** * Get invoice lines * diff --git a/src/Intacct/Functions/AccountsReceivable/AbstractInvoiceLine.php b/src/Intacct/Functions/AccountsReceivable/AbstractInvoiceLine.php index 42258d8a..d392f5f7 100644 --- a/src/Intacct/Functions/AccountsReceivable/AbstractInvoiceLine.php +++ b/src/Intacct/Functions/AccountsReceivable/AbstractInvoiceLine.php @@ -94,6 +94,9 @@ abstract class AbstractInvoiceLine /** @var string */ protected $warehouseId; + /** @var AbstractInvoiceLineTaxEntries[] */ + protected $taxEntry = []; + /** * Get account label * @@ -554,5 +557,21 @@ public function setWarehouseId($warehouseId) $this->warehouseId = $warehouseId; } + /** + * @return AbstractInvoiceLineTaxEntries[] + */ + public function getTaxEntry(): array + { + return $this->taxEntry; + } + + /** + * @param AbstractInvoiceLineTaxEntries[] $taxEntry + */ + public function setTaxEntry(array $taxEntry): void + { + $this->taxEntry = $taxEntry; + } + abstract public function writeXml(XMLWriter &$xml); } diff --git a/src/Intacct/Functions/AccountsReceivable/AbstractInvoiceLineTaxEntries.php b/src/Intacct/Functions/AccountsReceivable/AbstractInvoiceLineTaxEntries.php new file mode 100644 index 00000000..8ddf3c43 --- /dev/null +++ b/src/Intacct/Functions/AccountsReceivable/AbstractInvoiceLineTaxEntries.php @@ -0,0 +1,74 @@ +taxId; + } + + /** + * Set Tax Id + * + * @param string $taxId + */ + public function setTaxId($taxId): void + { + $this->taxId = $taxId; + } + + /** + * Get Tax Value + * + * @return float|string + */ + public function getTaxValue() + { + return $this->taxValue; + } + + /** + * Set Tax Value + * + * @param float|string $taxValue + */ + public function setTaxValue($taxValue): void + { + $this->taxValue = $taxValue; + } + + abstract public function writeXml(XMLWriter &$xml); + +} \ No newline at end of file diff --git a/src/Intacct/Functions/AccountsReceivable/InvoiceCreate.php b/src/Intacct/Functions/AccountsReceivable/InvoiceCreate.php index 09ec5efe..7108930a 100644 --- a/src/Intacct/Functions/AccountsReceivable/InvoiceCreate.php +++ b/src/Intacct/Functions/AccountsReceivable/InvoiceCreate.php @@ -83,6 +83,7 @@ public function writeXml(XMLWriter &$xml) $xml->writeElement('nogl', $this->isDoNotPostToGL()); $xml->writeElement('supdocid', $this->getAttachmentsId()); + $xml->writeElement('taxsolutionid', $this->getTaxSolutionId()); $this->writeXmlExplicitCustomFields($xml); diff --git a/src/Intacct/Functions/AccountsReceivable/InvoiceLineCreate.php b/src/Intacct/Functions/AccountsReceivable/InvoiceLineCreate.php index 03468201..e80e6e11 100644 --- a/src/Intacct/Functions/AccountsReceivable/InvoiceLineCreate.php +++ b/src/Intacct/Functions/AccountsReceivable/InvoiceLineCreate.php @@ -74,6 +74,15 @@ public function writeXml(XMLWriter &$xml) $xml->writeElement('contractid', $this->getContractId()); $xml->writeElement('warehouseid', $this->getWarehouseId()); + // if there are tax entries, lets add them to our xml + if(!empty($this->getTaxEntry())) { + $xml->startElement('taxentries'); + foreach ($this->getTaxEntry() as $taxentry) { + $taxentry->writeXml($xml); + } + $xml->endElement(); //taxentries + } + $xml->endElement(); //lineitem } } diff --git a/src/Intacct/Functions/AccountsReceivable/InvoiceLineTaxEntriesCreate.php b/src/Intacct/Functions/AccountsReceivable/InvoiceLineTaxEntriesCreate.php new file mode 100644 index 00000000..2bc82931 --- /dev/null +++ b/src/Intacct/Functions/AccountsReceivable/InvoiceLineTaxEntriesCreate.php @@ -0,0 +1,37 @@ +startElement('taxentry'); + + $xml->writeElement('detailid', $this->getTaxId()); + $xml->writeElement('trx_tax', $this->getTaxValue()); + + $xml->endElement(); + } +} \ No newline at end of file diff --git a/src/Intacct/Xml/RequestHandler.php b/src/Intacct/Xml/RequestHandler.php index e2e45a85..13cd5748 100644 --- a/src/Intacct/Xml/RequestHandler.php +++ b/src/Intacct/Xml/RequestHandler.php @@ -33,7 +33,7 @@ class RequestHandler { /** @var string */ - const VERSION = '2.3.0'; + const VERSION = '3.1.0'; /** @var ClientConfig */ private $clientConfig; diff --git a/test/Intacct/Credentials/EndpointTest.php b/test/Intacct/Credentials/EndpointTest.php index fbc41ecd..9ba9cd7a 100644 --- a/test/Intacct/Credentials/EndpointTest.php +++ b/test/Intacct/Credentials/EndpointTest.php @@ -81,4 +81,12 @@ public function testInvalidIntacctUrlEndpoint(): void new Endpoint($config); } + + public function testFQDNUrlEndpoint(): void + { + $config = new ClientConfig(); + $config->setEndpointUrl("https://api.intacct.com./ia/xml/xmlgw.phtml"); + $endpoint = new Endpoint($config); + $this->assertEquals('https://api.intacct.com./ia/xml/xmlgw.phtml', $endpoint); + } } diff --git a/test/Intacct/Functions/AccountsReceivable/InvoiceCreateTest.php b/test/Intacct/Functions/AccountsReceivable/InvoiceCreateTest.php index e4c23531..3067fce0 100644 --- a/test/Intacct/Functions/AccountsReceivable/InvoiceCreateTest.php +++ b/test/Intacct/Functions/AccountsReceivable/InvoiceCreateTest.php @@ -118,6 +118,7 @@ public function testParamOverrides(): void Intacct Daily Rate false 6942 + taxsolution customfield1 @@ -128,6 +129,12 @@ public function testParamOverrides(): void 76343.43 + + + TaxName + 10 + + @@ -161,12 +168,18 @@ public function testParamOverrides(): void $arInvoice->setExchangeRateType('Intacct Daily Rate'); $arInvoice->setDoNotPostToGL(false); $arInvoice->setAttachmentsId('6942'); + $arInvoice->setTaxSolutionId('taxsolution'); $arInvoice->setCustomFields([ 'customfield1' => 'customvalue1' ]); + $taxEntries = new InvoiceLineTaxEntriesCreate(); + $taxEntries->setTaxId('TaxName'); + $taxEntries->setTaxValue(10); + $line1 = new InvoiceLineCreate(); $line1->setTransactionAmount(76343.43); + $line1->setTaxEntry([$taxEntries]); $arInvoice->setLines([ $line1, diff --git a/test/Intacct/Functions/AccountsReceivable/InvoiceLineCreateTest.php b/test/Intacct/Functions/AccountsReceivable/InvoiceLineCreateTest.php index aac5b220..eded2991 100644 --- a/test/Intacct/Functions/AccountsReceivable/InvoiceLineCreateTest.php +++ b/test/Intacct/Functions/AccountsReceivable/InvoiceLineCreateTest.php @@ -88,6 +88,12 @@ public function testParamOverrides(): void Item1 Class1 Warehouse1 + + + TaxName + 10 + + EOF; @@ -122,6 +128,12 @@ public function testParamOverrides(): void 'customfield1' => 'customvalue1', ]); + $taxEntries = new InvoiceLineTaxEntriesCreate(); + $taxEntries->setTaxId('TaxName'); + $taxEntries->setTaxValue(10); + + $line->setTaxEntry([$taxEntries]); + $line->writeXml($xml); $this->assertXmlStringEqualsXmlString($expected, $xml->flush()); diff --git a/test/Intacct/Functions/AccountsReceivable/InvoiceLineTaxEntriesCreateTest.php b/test/Intacct/Functions/AccountsReceivable/InvoiceLineTaxEntriesCreateTest.php new file mode 100644 index 00000000..7027741b --- /dev/null +++ b/test/Intacct/Functions/AccountsReceivable/InvoiceLineTaxEntriesCreateTest.php @@ -0,0 +1,76 @@ + + + TaxName + +EOF; + + $xml = new XMLWriter(); + $xml->openMemory(); + $xml->setIndent(true); + $xml->setIndentString(' '); + $xml->startDocument(); + + $taxentries = new InvoiceLineTaxEntriesCreate(); + $taxentries->setTaxId('TaxName'); + + $taxentries->writeXml($xml); + + $this->assertXmlStringEqualsXmlString($expected, $xml->flush()); + } + + public function testParamOverrides(): void + { + $expected = << + + TaxName + 10 + +EOF; + + $xml = new XMLWriter(); + $xml->openMemory(); + $xml->setIndent(true); + $xml->setIndentString(' '); + $xml->startDocument(); + + $taxEntries = new InvoiceLineTaxEntriesCreate(); + $taxEntries->setTaxId('TaxName'); + $taxEntries->setTaxValue(10); + + $taxEntries->writeXml($xml); + + $this->assertXmlStringEqualsXmlString($expected, $xml->flush()); + } +} \ No newline at end of file