-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathfactura.php
119 lines (100 loc) · 3.17 KB
/
factura.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php
declare(strict_types=1);
use Greenter\Model\Client\Client;
use Greenter\Model\Company\Company;
use Greenter\Model\Company\Address;
use Greenter\Model\Sale\FormaPagos\FormaPagoContado;
use Greenter\Model\Sale\Invoice;
use Greenter\Model\Sale\SaleDetail;
use Greenter\Model\Sale\Legend;
use Greenter\See;
require __DIR__.'/vendor/autoload.php';
/**@var $see See*/
$see = require __DIR__.'/config.php';
// Cliente
$client = new Client();
$client->setTipoDoc('6')
->setNumDoc('20000000001')
->setRznSocial('EMPRESA X');
// Emisor
$address = new Address();
$address->setUbigueo('150101')
->setDepartamento('LIMA')
->setProvincia('LIMA')
->setDistrito('LIMA')
->setUrbanizacion('-')
->setDireccion('Av. Villa Nueva 221')
->setCodLocal('0000'); // Codigo de establecimiento asignado por SUNAT, 0000 de lo contrario.
$company = new Company();
$company->setRuc('20123456789')
->setRazonSocial('GREEN SAC')
->setNombreComercial('GREEN')
->setAddress($address);
// Venta
$invoice = (new Invoice())
->setUblVersion('2.1')
->setTipoOperacion('0101') // Venta - Catalog. 51
->setTipoDoc('01') // Factura - Catalog. 01
->setSerie('F001')
->setCorrelativo('1')
->setFechaEmision(new DateTime('2020-08-24 13:05:00-05:00'))
->setFormaPago(new FormaPagoContado())
->setTipoMoneda('PEN') // Sol - Catalog. 02
->setCompany($company)
->setClient($client)
->setMtoOperGravadas(100.00)
->setMtoIGV(18.00)
->setTotalImpuestos(18.00)
->setValorVenta(100.00)
->setSubTotal(118.00)
->setMtoImpVenta(118.00)
;
$item = (new SaleDetail())
->setCodProducto('P001')
->setUnidad('NIU') // Unidad - Catalog. 03
->setCantidad(2)
->setDescripcion('PRODUCTO 1')
->setMtoBaseIgv(100)
->setPorcentajeIgv(18.00) // 18%
->setIgv(18.00)
->setTipAfeIgv('10') // Gravado Op. Onerosa - Catalog. 07
->setTotalImpuestos(18.00)
->setMtoValorVenta(100.00)
->setMtoValorUnitario(50.00)
->setMtoPrecioUnitario(59.00)
;
$legend = (new Legend())
->setCode('1000') // Monto en letras - Catalog. 52
->setValue('SON DOSCIENTOS TREINTA Y SEIS CON 00/100 SOLES');
$invoice->setDetails([$item])
->setLegends([$legend]);
// Envío a SUNAT
$result = $see->send($invoice);
// Guardar XML firmado digitalmente.
file_put_contents($invoice->getName().'.xml',
$see->getFactory()->getLastXml());
// Verificamos que la conexión con SUNAT fue exitosa.
if (!$result->isSuccess()) {
// Mostrar error al conectarse a SUNAT.
echo 'Codigo Error: '.$result->getError()->getCode();
echo 'Mensaje Error: '.$result->getError()->getMessage();
exit();
}
// Guardamos el CDR
file_put_contents('R-'.$invoice->getName().'.zip', $result->getCdrZip());
// CDR Resultado
$cdr = $result->getCdrResponse();
$code = (int)$cdr->getCode();
if ($code === 0) {
echo 'ESTADO: ACEPTADA'.PHP_EOL;
} else if ($code >= 4000) {
echo 'ESTADO: ACEPTADA CON OBSERVACIONES:'.PHP_EOL;
var_dump($cdr->getNotes());
} else if ($code >= 2000 && $code <= 3999) {
echo 'ESTADO: RECHAZADA'.PHP_EOL;
} else {
/* Esto no debería darse */
/*code: 0100 a 1999 */
echo 'Excepción';
}
echo $cdr->getDescription().PHP_EOL;