Completed
Push — master ( 8eafd3...e0792d )
by Giancarlos
02:49
created

See::sendXmlFile()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 8
nc 1
nop 1
dl 0
loc 13
ccs 3
cts 3
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: Administrador
5
 * Date: 16/10/2017
6
 * Time: 04:23 PM.
7
 */
8
9
namespace Greenter;
10
11
use DOMDocument;
12
use Exception;
13
use Greenter\Builder\BuilderInterface;
14
use Greenter\Factory\FeFactory;
15
use Greenter\Model\DocumentInterface;
16
use Greenter\Model\Summary\Summary;
17
use Greenter\Model\Voided\Reversion;
18
use Greenter\Model\Voided\Voided;
19
use Greenter\Services\SenderInterface;
20
use Greenter\Validator\ErrorCodeProviderInterface;
21
use Greenter\Ws\Reader\XmlFilenameExtractor;
22
use Greenter\Ws\Reader\XmlReader;
23
use Greenter\Ws\Resolver\XmlTypeResolver;
24
use Greenter\Ws\Services\BillSender;
25
use Greenter\Ws\Services\ExtService;
26
use Greenter\Ws\Services\SoapClient;
27
use Greenter\Ws\Services\SummarySender;
28
use Greenter\XMLSecLibs\Sunat\SignedXml;
29
30
/**
31
 * Sistema de Emision del Contribuyente.
32
 *
33
 * Class See
34
 */
35
class See
36
{
37
    /**
38
     * @var FeFactory
39
     */
40
    private $factory;
41
42
    /**
43
     * @var SoapClient
44
     */
45
    private $wsClient;
46
47
    /**
48
     * @var array
49
     */
50
    private $builders;
51
52
    /**
53
     * @var array
54
     */
55
    private $summarys;
56
57
    /**
58
     * @var SignedXml
59
     */
60
    private $signer;
61
62
    /**
63
     * @var ErrorCodeProviderInterface
64
     */
65
    private $codeProvider;
66
67
    /**
68
     * Twig Render Options.
69
     *
70
     * @var array
71
     */
72 19
    private $options = ['autoescape' => false];
73
74 19
    /**
75 19
     * See constructor.
76 19
     */
77 19
    public function __construct()
78
    {
79
        $this->factory = new FeFactory();
80
        $this->wsClient = new SoapClient();
81
        $this->signer = new SignedXml();
82
        $this->builders = [
83
            Model\Sale\Invoice::class => Xml\Builder\InvoiceBuilder::class,
84
            Model\Sale\Note::class => Xml\Builder\NoteBuilder::class,
85
            Model\Summary\Summary::class => Xml\Builder\SummaryBuilder::class,
86
            Model\Voided\Voided::class => Xml\Builder\VoidedBuilder::class,
87 19
            Model\Despatch\Despatch::class => Xml\Builder\DespatchBuilder::class,
88 19
            Model\Retention\Retention::class => Xml\Builder\RetentionBuilder::class,
89 19
            Model\Perception\Perception::class => Xml\Builder\PerceptionBuilder::class,
90
            Model\Voided\Reversion::class => Xml\Builder\VoidedBuilder::class,
91
        ];
92
        $this->summarys = [Summary::class, Summary::class, Voided::class, Reversion::class];
93
        $this->factory->setSigner($this->signer);
94
    }
95
96 19
    /**
97
     * Set Xml Builder Options.
98 19
     *
99 19
     * @param array $options
100
     */
101
    public function setBuilderOptions(array $options)
102
    {
103
        $this->options = array_merge($this->options, $options);
104 13
    }
105
106 13
    /**
107 13
     * @param string $directory
108
     */
109
    public function setCachePath($directory)
110
    {
111
        $this->options['cache'] = $directory;
112 19
    }
113
114 19
    /**
115 19
     * @param string $certificate
116
     */
117
    public function setCertificate($certificate)
118
    {
119
        $this->signer->setCertificate($certificate);
120
    }
121 19
122
    /**
123 19
     * @param string $user
124 19
     * @param string $password
125
     */
126
    public function setCredentials($user, $password)
127
    {
128
        $this->wsClient->setCredentials($user, $password);
129 19
    }
130
131 19
    /**
132 19
     * @param string $service
133
     */
134
    public function setService($service)
135
    {
136
        $this->wsClient->setService($service);
137
    }
138
139 13
    /**
140
     * Set error code provider.
141 13
     *
142 13
     * @param ErrorCodeProviderInterface $codeProvider
143
     */
144
    public function setCodeProvider($codeProvider)
145
    {
146
        $this->codeProvider = $codeProvider;
147
    }
148
149
    /**
150
     * Get signed xml from document.
151 6
     *
152
     * @param DocumentInterface $document
153 6
     *
154
     * @return string
155 6
     */
156 6
    public function getXmlSigned(DocumentInterface $document)
157 6
    {
158
        $classDoc = get_class($document);
159
160
        return $this->factory
161
            ->setBuilder($this->getBuilder($classDoc))
162
            ->getXmlSigned($document);
163
    }
164
165
    /**
166
     * Envia documento.
167 12
     *
168
     * @param DocumentInterface $document
169 12
     *
170 12
     * @return Model\Response\BaseResult
171 12
     */
172 12
    public function send(DocumentInterface $document)
173
    {
174 12
        $classDoc = get_class($document);
175
        $this->factory
176
            ->setBuilder($this->getBuilder($classDoc))
177
            ->setSender($this->getSender($classDoc));
178
179
        return $this->factory->send($document);
180
    }
181
182
    /**
183
     * Envia xml generado.
184
     *
185 1
     * @param string $type Document Type
186
     * @param string $name Xml Name
187 1
     * @param string $xml  Xml Content
188 1
     *
189 1
     * @return Model\Response\BaseResult
190
     */
191 1
    public function sendXml($type, $name, $xml)
192
    {
193
        $this->factory
194
            ->setBuilder($this->getBuilder($type))
195
            ->setSender($this->getSender($type));
196
197
        return $this->factory->sendXml($name, $xml);
198
    }
199 1
200
    /**
201 1
     * Envia XML generado previamente.
202 1
     *
203
     * @param string $xmlContent
204 1
     *
205
     * @return Model\Response\BaseResult
206
     *
207
     * @throws Exception
208
     */
209
    public function sendXmlFile($xmlContent)
210 6
    {
211
        $doc = new DOMDocument();
212 6
        $doc->loadXML($xmlContent);
213
214
        $reader = new XmlReader();
215
        $resolver = new XmlTypeResolver($reader);
216
        $type = $resolver->getType($doc);
217
218
        $extractor = new XmlFilenameExtractor($reader);
219
        $name = $extractor->getFilename($doc);
220 18
221
        return $this->sendXml($type, $name, $xmlContent);
222 18
    }
223
224 18
    /**
225
     * @param $ticket
226
     *
227
     * @return Model\Response\StatusResult
228
     */
229
    public function getStatus($ticket)
230
    {
231
        $sender = new ExtService();
232 13
        $sender->setClient($this->wsClient);
233
234 13
        return $sender->getStatus($ticket);
235 13
    }
236 13
237 9
    /**
238
     * @return FeFactory
239
     */
240 13
    public function getFactory()
241
    {
242
        return $this->factory;
243
    }
244
245
    /**
246
     * @param string $class
247
     *
248
     * @return BuilderInterface
249
     */
250
    private function getBuilder($class)
251
    {
252
        $builder = $this->builders[$class];
253
254
        return new $builder($this->options);
255
    }
256
257
    /**
258
     * @param string $class
259
     *
260
     * @return SenderInterface
261
     */
262
    private function getSender($class)
263
    {
264
        $sender = in_array($class, $this->summarys) ? new SummarySender() : new BillSender();
265
        $sender->setClient($this->wsClient);
266
        if ($this->codeProvider) {
267
            $sender->setCodeProvider($this->codeProvider);
268
        }
269
270
        return $sender;
271
    }
272
}
273