Completed
Push — master ( 815325...e72f32 )
by Giancarlos
05:22
created

See::setBuilderOptions()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 1
crap 1
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 Greenter\Builder\BuilderInterface;
12
use Greenter\Factory\FeFactory;
13
use Greenter\Model\DocumentInterface;
14
use Greenter\Model\Summary\Summary;
15
use Greenter\Model\Voided\Reversion;
16
use Greenter\Model\Voided\Voided;
17
use Greenter\Services\SenderInterface;
18
use Greenter\Ws\Services\BillSender;
19
use Greenter\Ws\Services\ExtService;
20
use Greenter\Ws\Services\SoapClient;
21
use Greenter\Ws\Services\SummarySender;
22
use Greenter\XMLSecLibs\Sunat\SunatXmlSecAdapter;
23
24
/**
25
 * Sistema de Emision del Contribuyente.
26
 *
27
 * Class See
28
 */
29
class See
30
{
31
    /**
32
     * @var FeFactory
33
     */
34
    private $factory;
35
36
    /**
37
     * @var SoapClient
38
     */
39
    private $wsClient;
40
41
    /**
42
     * @var array
43
     */
44
    private $builders;
45
46
    /**
47
     * @var array
48
     */
49
    private $summarys;
50
51
    /**
52
     * @var SunatXmlSecAdapter
53
     */
54
    private $signer;
55
56
    /**
57
     * Twig Render Options.
58
     *
59
     * @var array
60
     */
61
    private $options = ['autoescape' => false];
62
63
    /**
64
     * See constructor.
65
     */
66 30
    public function __construct()
67
    {
68 30
        $this->factory = new FeFactory();
69 30
        $this->wsClient = new SoapClient();
70 30
        $this->signer = new SunatXmlSecAdapter();
71 30
        $this->builders = [
72 30
            Model\Sale\Invoice::class => Xml\Builder\InvoiceBuilder::class,
73 30
            Model\Sale\Note::class => Xml\Builder\NoteBuilder::class,
74 30
            Model\Summary\Summary::class => Xml\Builder\SummaryBuilder::class,
75 30
            Model\Voided\Voided::class => Xml\Builder\VoidedBuilder::class,
76 30
            Model\Despatch\Despatch::class => Xml\Builder\DespatchBuilder::class,
77 30
            Model\Retention\Retention::class => Xml\Builder\RetentionBuilder::class,
78 30
            Model\Perception\Perception::class => Xml\Builder\PerceptionBuilder::class,
79 30
            Model\Voided\Reversion::class => Xml\Builder\VoidedBuilder::class,
80
        ];
81 30
        $this->summarys = [Summary::class, Summary::class, Voided::class, Reversion::class];
82 30
        $this->factory->setSigner($this->signer);
83 30
    }
84
85
    /**
86
     * Set Xml Builder Options.
87
     *
88
     * @param array $options
89
     */
90 30
    public function setBuilderOptions(array $options)
91
    {
92 30
        $this->options = array_merge($this->options, $options);
93 30
    }
94
95
    /**
96
     * @param string $directory
97
     */
98 18
    public function setCachePath($directory)
99
    {
100 18
        $this->options['cache'] = $directory;
101 18
    }
102
103
    /**
104
     * @param string $certificate
105
     */
106 30
    public function setCertificate($certificate)
107
    {
108 30
        $this->signer->setCertificate($certificate);
109 30
    }
110
111
    /**
112
     * @param string $user
113
     * @param string $password
114
     */
115 30
    public function setCredentials($user, $password)
116
    {
117 30
        $this->wsClient->setCredentials($user, $password);
118 30
    }
119
120
    /**
121
     * @param string $service
122
     */
123 30
    public function setService($service)
124
    {
125 30
        $this->wsClient->setService($service);
126 30
    }
127
128
    /**
129
     * Get signed xml from document.
130
     *
131
     * @param DocumentInterface $document
132
     *
133
     * @return string
134
     */
135 10
    public function getXmlSigned(DocumentInterface $document)
136
    {
137 10
        $classDoc = get_class($document);
138
139 10
        return $this->factory
140 10
            ->setBuilder($this->getBuilder($classDoc))
141 10
            ->getXmmlSigned($document);
142
    }
143
144
    /**
145
     * Envia documento.
146
     *
147
     * @param DocumentInterface $document
148
     *
149
     * @return Model\Response\BaseResult
150
     */
151 18
    public function send(DocumentInterface $document)
152
    {
153 18
        $classDoc = get_class($document);
154 18
        $this->factory
155 18
            ->setBuilder($this->getBuilder($classDoc))
156 18
            ->setSender($this->getSender($classDoc));
157
158 18
        return $this->factory->send($document);
159
    }
160
161
    /**
162
     * @param $ticket
163
     *
164
     * @return Model\Response\StatusResult
165
     */
166 2
    public function getStatus($ticket)
167
    {
168 2
        $sender = new ExtService();
169 2
        $sender->setClient($this->wsClient);
170
171 2
        return $sender->getStatus($ticket);
172
    }
173
174
    /**
175
     * @return FeFactory
176
     */
177 6
    public function getFactory()
178
    {
179 6
        return $this->factory;
180
    }
181
182
    /**
183
     * @param string $class
184
     *
185
     * @return BuilderInterface
186
     */
187 28
    private function getBuilder($class)
188
    {
189 28
        $builder = $this->builders[$class];
190
191 28
        return new $builder($this->options);
192
    }
193
194
    /**
195
     * @param string $class
196
     *
197
     * @return SenderInterface
198
     */
199 18
    private function getSender($class)
200
    {
201 18
        $sender = in_array($class, $this->summarys) ? new SummarySender() : new BillSender();
202 18
        $sender->setClient($this->wsClient);
203
204 18
        return $sender;
205
    }
206
}
207