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